Liu Hua, I think the information at: <http://wiki.davincidsp.com/index.php?title=Configuring_GPIO_Interrupts> (which also contains info on how to recover from an interrupt) has the details about what you need to know.
R. Williams ---------- Original Message ----------- From: Liu Hua <[email protected]> To: [email protected] Cc: [email protected] Sent: Sat, 7 Nov 2009 01:37:39 +0800 Subject: Re: emda event trigger mode > Thanks very much. > Now I can use gpio to trigger once but later it can not work. > > Since I can not let CPU respone to the interrupt. I can not use > request_irq(gpio_to_irq()....IRQF_TRIGGER_RISING) to set the GPIO. > > 1. I configure the GPIO using the following code: > > /* set GPIO 6 as input */ > gpio_direction_input(6); > /* set GPIO 6 as rise edge rigger */ > p_gpio = (struct gpio_controller *__iomem)IO_ADDRESS( > DAVINCI_GPIO_BASE + 0x10); > mask = (1 << 6); > __raw_writel(mask, &p_gpio->clr_falling); > tmp = mask | __raw_readl(&p_gpio->set_rising); > __raw_writel(tmp, &p_gpio->set_rising); > > at the same time, The 18 bit of EINT0 is not set. This is an > enable bit of gpio6 interrupt. > > 2. I use EMDA channel 38 to receive the data from FPGA, its trigger > event is GPIO6 interrupt. > > emif_data->dma_ch = DM355_DMA_EMIFRECV; /* channel 38 */ > ret = davinci_request_dma(emif_data->dma_ch, > "EMIF-RECV", emif_callback, > emif_data, &edma_chan_num, > &tcc, EVENTQ_1); > > 3. in the linux_2.6.18_pro500, there's a bitmap variable named > "edma2event_map", which recodes the current edma channels using event > trigger mode. I have already set the corresponding bit of channel 38 > in it. The bitmap value I have is 0xCD00330Cu, 0x80000040u. > > After I configure the EDMA channel, I call function > "davinci_start_dma", which will : > mask = 1 << (lch - 32); > /* Clear any pending error */ > dma_write(mask, EDMA_EMCRH); > /* Clear any SER */ > dma_write(mask, EDMA_SH_SECRH(0)); > /* enable the EERH */ > dma_write(mask, EDMA_SH_EESRH(0)); > /* clear the ERH */ > dma_write(mask, EDMA_SH_ECRH(0)); > > 4. When GPIO6 rise edge comes, it triggers the EMDA and generate an > edma interrupt. In the callback funcion "emif_callback", I reclaim the > buffer, and also call these functions: > /* clear the interrupt status register */ > __raw_writel((1 << 6), &p_gpio->intstat); > davinci_stop_dma(((struct emif_fh*)data)->dma_ch); > davinci_clean_channel(((struct emif_fh*)data)->dma_ch); > > Then I reconfigure the EDMA and call davinci_start_dma like the > first time in this callback function. > By the way, the "emif_callback" is in interrupt context. > > But, now GPIO6 can not trigger the EDMA any more. > > Can you help me. Thanks very much in advance. > > Best Regards > Richard LIU > > 2009/11/6 <[email protected]>: > > Greetings, > > > > Liu Hua Wrote: > >> Now I want to using event trigger mode to reduce the interrupt. The > >> GPIO will trigger the EDMA itself without software. The User Guide > >> says "The GPIO interrupt is the trigger event." Should I enable the > >> corresponding GPIO interrupt? If so, there are two interrupts again. > >> Or I can disable this interrupt. The bit in GPIO interrupt status > >> register is enough to complete the job. > > > > We use a DM6441, but from the docs it looks like a similar setup so: > > > > It sounds from your description that you most of the way there. > > > > What you need to do is enable the EDMA event trapping by setting > > the "event enable set register EESR/EESRH". Since you'll need to > > know when it is done, also enable the EDMA interrupt for the > > GPIO channel in "interrupt enable register IER". > > > > This means that when the GPIO interrupt status is asserted, > > the EDMA will fire off as long the PaRam set that channel is > > associated with is valid. After it completes it will trigger > > the EDMA completion interrupt (which I think you already handle). > > > > Just remember to clear the interrupt flags in the EDMA interrupt > > pending register (IPR) or you will miss events. > > > >> How could I let GPIO trigger the EDMA and at the same time, > >> DM355 not respone to the interurupt ? > > > > You can disable the GPIO interrupt handler and enable the EDMA > > interrupt (16 on DM355 I believe). The EDMA controller doesn't > > care whether you are actually handling the interrupt that triggered > > the event or not. > > > > When you get the EDMA interrupt, check for the TC code as you do > > now and all should be well. > > > > Please see the EDMA doc for more info at: > > http://focus.ti.com/lit/ug/spruee4a/spruee4a.pdf > > > > Hope that helps, > > David > > > > -- > > DAVID A. KONDRAD > > Software Design Engineer > > Legrand Home Systems Division > > > > http://www.legrand.us/onq > > > > This email, and any document attached hereto, may contain > > confidential and/or privileged information. If you are not the > > intended recipient (or have received this email in error) please > > notify the sender immediately and destroy this email. Any > > unauthorized, direct or indirect, copying, disclosure, distribution > > or other use of the material or parts thereof is strictly > > forbidden. > > > > _______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source ------- End of Original Message -------
_______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
