[PATCH] Added interrupt handler for DMA channel 0, 1 & 2

Pavel Pisa ppisa4lists at pikron.com
Sun Aug 21 22:17:18 UTC 2016


Hello Mudit,

please, send information what is RTEMS GIT revision are
your changes based on. See comment below

On Saturday 20 of August 2016 17:04:19 Mudit Jain wrote:
> Added macros for DMA channels 0-12
> Added interrupt handlers for DMA 0, 1 & 2
>
> The added IRQs are in accordance with the
> BCM Peripherals Datasheet and also have been verified
> with the linux source code for RPi
> ---
>  c/src/lib/libbsp/arm/raspberrypi/include/irq.h | 17 ++++++++++
>  c/src/lib/libbsp/arm/raspberrypi/irq/irq.c     | 45
> ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+)
>
> diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/irq.h
> b/c/src/lib/libbsp/arm/raspberrypi/include/irq.h index 8436c2d..50616e1
> 100644
> --- a/c/src/lib/libbsp/arm/raspberrypi/include/irq.h
> +++ b/c/src/lib/libbsp/arm/raspberrypi/include/irq.h
> @@ -35,6 +35,23 @@
>
>  #define BCM2835_INTC_TOTAL_IRQ       64 + 8
>
> +/* DMA Interrupt is routed to IRQ 16 for DMA Channel 0,
> +   IRQ 17 for Channel 1, and so on till IRQ 28 for Channel 12.
> + */
> +
> +#define BCM2835_IRQ_ID_DMA_CH0       16
> +#define BCM2835_IRQ_ID_DMA_CH1       17
> +#define BCM2835_IRQ_ID_DMA_CH2       18
> +#define BCM2835_IRQ_ID_DMA_CH3       19
> +#define BCM2835_IRQ_ID_DMA_CH4       20
> +#define BCM2835_IRQ_ID_DMA_CH5       21
> +#define BCM2835_IRQ_ID_DMA_CH6       22
> +#define BCM2835_IRQ_ID_DMA_CH7       23
> +#define BCM2835_IRQ_ID_DMA_CH8       24
> +#define BCM2835_IRQ_ID_DMA_CH9       25
> +#define BCM2835_IRQ_ID_DMA_CH10      26
> +#define BCM2835_IRQ_ID_DMA_CH11      27
> +#define BCM2835_IRQ_ID_DMA_CH12      28
>
>  #define BCM2835_IRQ_ID_AUX           29
>  #define BCM2835_IRQ_ID_SPI_SLAVE     43
> diff --git a/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c
> b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c index 7b3b2be..3279b35 100644
> --- a/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c
> +++ b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c
> @@ -64,6 +64,21 @@ void bsp_interrupt_dispatch(void)
>    {
>        vector = BCM2835_IRQ_ID_UART;
>    }
> +  /* DMA 0 */
> +  else if ( BCM2835_REG(BCM2835_IRQ_PENDING1) & BCM2835_BIT(16) )
> +  {
> +      vector = BCM2835_IRQ_ID_DMA_CH0;
> +  }
> +  /* DMA 1 */
> +  else if ( BCM2835_REG(BCM2835_IRQ_PENDING1) & BCM2835_BIT(17) )
> +  {
> +      vector = BCM2835_IRQ_ID_DMA_CH1;
> +  }
> +  /* DMA 2 */
> +  else if ( BCM2835_REG(BCM2835_IRQ_PENDING1) & BCM2835_BIT(18) )
> +  {
> +      vector = BCM2835_IRQ_ID_DMA_CH2;
> +  }

I hope, I have eliminated need for all these individual peripherals
specific code in raspberrypi/irq/irq.c .
See the commit

https://git.rtems.org/rtems/commit/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c?id=d216c5d6a2325551accb836429a6ac9cc2b2f4b7

Try rebase your changes for other files to actual RTEMS GIT master.
If there is some problem which prevents to your code to run
with master then it is necessary to find what is broken
on master. I try to help with it.

May it be that there is some problem with irq.c code, I have
tested it only by timer IRQ because other are not used by mater yet.
But code written the way that it should be fully generic by now.
It should support all 72 interrupt sources.

>    /* GPIO 0*/
>    else if ( BCM2835_REG(BCM2835_IRQ_PENDING2) & BCM2835_BIT(17) )
>    {
> @@ -114,6 +129,21 @@ rtems_status_code
> bsp_interrupt_vector_enable(rtems_vector_number vector) {
>        BCM2835_REG(BCM2835_IRQ_ENABLE2) =  BCM2835_BIT(25);
>    }
> +  /* DMA 0 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH0 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_ENABLE1) =  BCM2835_BIT(16);
> +  }
> +  /* DMA 1 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH1 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_ENABLE1) =  BCM2835_BIT(17);
> +  }
> +  /* DMA 2 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH2 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_ENABLE1) =  BCM2835_BIT(18);
> +  }

Should be solved by master already.

>    /* GPIO 0 */
>    else if ( vector == BCM2835_IRQ_ID_GPIO_0 )
>    {
> @@ -164,6 +194,21 @@ rtems_status_code
> bsp_interrupt_vector_disable(rtems_vector_number vector) {
>        BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(25);
>    }
> +  /* DMA 0 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH0 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_DISABLE1) = BCM2835_BIT(16);
> +  }
> +  /* DMA 1 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH1 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_DISABLE1) = BCM2835_BIT(17);
> +  }
> +  /* DMA 2 */
> +  else if ( vector == BCM2835_IRQ_ID_DMA_CH2 )
> +  {
> +      BCM2835_REG(BCM2835_IRQ_DISABLE1) = BCM2835_BIT(18);
> +  }

Should be solved by master already.

>    /* GPIO 0 */
>    else if ( vector == BCM2835_IRQ_ID_GPIO_0 )
>    {

If you have problem with rebase then you can format patch,
use editor to delete parts concerning files which should
be untouched, then reset some branch back before patch series
or to master and then apply modified patches.
Again, I can help.

I would be happy if you write some summary about testing, which
attempts has been done, what worked, what failed and what has
not been tested. Ideally, it should be done for work
on your branch before rebase and after rebase to master.

Best wishes,

               Pavel


More information about the devel mailing list