[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