Forums » Software Development »
OMAPL138 DSP-EDMA3 transfer from EMIFA when Linux is running on ARM
Added by Christian Rückl about 11 years ago
Hi,
I'm not sure if this forum is the right place to post this question but i will do it an hopefully anybody can help me.
First I developed my DSP-application without having the Linux an the ARM core running. The DSP app shell copy datas from the EMIFA to internal memory with the help of the EDMA3-Controller.
Without Linux running, the app works well - as expected. Now, I started Linux on ARM side and loaded the DSP app thru the debugger and i don't see on my connected ossziloscope any action on the EMIFA. When I check the EDMA3CC1 registers, and PaRAM sets, I see that my EVENT (Timer) triggers the EDMA3 transfers and the PaRAM-Sets are updated but no EMIFA access....
When I access the same address then with the EDMA3 controller by CPU, the EMIFA interface works correctly. It seems, that the EMIFA doesn't react on EDMA3 transfers or the EDMA3-TC doesn't issue any transfer to the EMIFA. I couldn't found any helpful stuff in the internet and also not in the TI-Forum.
I'm using the addressrange 0x66000002 - 0x6600000C (CS5).
Please let me know if anybody has an idea about this.
Thanks,
Christian
Replies (4)
RE: OMAPL138 DSP-EDMA3 transfer from EMIFA when Linux is running on ARM - Added by Michael Williamson about 11 years ago
I suspect that linux may be using the same EDMA resources or interrupts.
I think that the linux ARM-9 port may use a timer and interrupt for generating it's local scheduler clock. You might try a different timer.
-Mike
RE: OMAPL138 DSP-EDMA3 transfer from EMIFA when Linux is running on ARM - Added by Christian Rückl about 11 years ago
Thanks Mike for your quick answer!
I don't think so that it has something with my used timer(Timer64P3) to do. I put the suspend source of this timer to the DSP and when i stop the DSP with the debugger, the ARM system is well running. And I can see that this timer works as expected. generates every one microsecond a pulse on an external pin and at the same time the event 26 for EDMACC1. The Events seems to be reached the CC in the correct way, the PaRAM-set updates as also as expected.
Now, I saw that there isn't any update of the corresponding transfer controller... How can it be that the Channel controller don't send the transfers to the TC when the ARM is running with linux??? I'm absolutely confuesd
Christian
RE: OMAPL138 DSP-EDMA3 transfer from EMIFA when Linux is running on ARM - Added by Christian Rückl about 11 years ago
I got an response from TI. this behavior has probably something to do with the used IRQ channel on ARM side. ARM uses IRQ 93 and 94 which are related to the EDMA3CC1. This is the CC what I use. Only for testing purpose, I want to deactivate these IRQ in Linux but unfortunately I'm not able to do this. I think there isn't any possibility to deactivate these IRQ's in the user space - Is it? Or is it necessary to do this changes in the Kernel? If only possible in the Kernel, how do I have to modify the "baseboard-industrialio.c" file?
Thanks,
Christian
RE: OMAPL138 DSP-EDMA3 transfer from EMIFA when Linux is running on ARM - Added by Christian Rückl about 11 years ago
Another update...
Now Ti reports that I have to say the linuxkernel to reserve the DMA-channels what I using on the dsp. In my case channel 26 on CC1. I did this by getting out the following code from the "board-da850-evm.c" and put it in my config-file:
/*
* The following EDMA channels/slots are not being used by drivers (for
* example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM, hence
* they are being reserved for codecs on the DSP side.
/
static const s16 da850_dma0_rsv_chans[][2] = {
/ (offset, number) */
{ 8, 6},
{24, 4},
{30, 2},
{-1, -1}
};
static const s16 da850_dma0_rsv_slots[][2] = {
/* (offset, number) */
{ 8, 6},
{24, 4},
{30, 50},
{-1, -1}
};
static const s16 da850_dma1_rsv_chans[][2] = {
/* (offset, number) */
{ 0, 28},
{30, 2},
{-1, -1}
};
static const s16 da850_dma1_rsv_slots[][2] = {
/* (offset, number) */
{ 0, 28},
{30, 90},
{-1, -1}
};
static struct edma_rsv_info da850_edma_cc0_rsv = {
.rsv_chans = da850_dma0_rsv_chans,
.rsv_slots = da850_dma0_rsv_slots,
};
static struct edma_rsv_info da850_edma_cc1_rsv = {
.rsv_chans = da850_dma1_rsv_chans,
.rsv_slots = da850_dma1_rsv_slots,
};
static struct edma_rsv_info *da850_edma_rsv2 = {
&da850_edma_cc0_rsv,
&da850_edma_cc1_rsv,
};
da850_register_edma(da850_edma_rsv);
The kernel was built without errors and is running but my problem isn't solved.
Is it correct when I selecting in the menueconfig for bulding the kernel the "Critical Link MityDSP-L138/MityARM-1808 SoM" entry that the file "board-mityomapl138" will be used? If yes i could also put the code above in this file instead of my boardconfig-file...
Do you know something about channel reservation in Linux Kernel?
Thanks,
Christian