- 论坛徽章:
- 0
|
DMA3中断始终没产生啊......
UART2的设置,我在 uart_init_port()里完成了。
local_irq_save(flags);
GPHCON = (GPHCON&0xff00ff)|0x00aa00;
GPHUP = 0x7ff; // The pull up function is disabled GPH[10:0]
UART_ULCON2 = 0x03;
UART_UCON2 = (UART_UCON2 & 0xff0) | 0x006 | IS_LOOPBACK;
UART_UFCON2 = 0x30; // 0011 0000 bit0先不使能
UART_UBRDIV2 = 26; // 初始波特率为 115200 */
local_irq_restore(flags);
针对UART2的DMA的设置,似乎是在dma.c中完成。(dma.c为开发板上系统中提供的源码)
(因为我没有对DMA寄存器进行配置,但调用dma.c里的函数后,那些寄存器都设置好了。)
(不过也比较奇怪,在dma.c中的 dma_irq_handler()里,连清中断标志与清未决寄存器都没有看见。)
在驱动程序初始化init中,调用了dma.c中的。
s3c2410_request_dma( "UART2", s->dma_ch, NULL, uart_dma_in_callback );
并且在这个函数里request_irq()申请了中断号INT_DMA3(为20),并且申请成功了。
而后,针对UART2的DMA的寄存器在s3c2410_request_dma()后为:有输出信息:
uart_read(407): DISRCC3 = 0x 3
uart_read(40: DIDSTC3 = 0x 0
uart_read(409): DCON3 = 0x a0c00400
uart_read(410): DSTAT3 = 0x 0
uart_read(411): DMTRIG3 = 0x 2
uart_read(412): DISRC3 = 0x 50008024
uart_read(413): DIDST3 = 0x 33a94000
uart_read(414): DCDST3 = 0x 0
uart_read(415): DCSRC3 = 0x 0
uart_read(416): UCON2 = 0x 6
uart_read(417): UFCON2 = 0x 31
uart_read(41: SRCPND = 0x 0
uart_read(419): INTPND = 0x 0
uart_read(420): INTMSK = 0x a3e3bffb
里面DMA相关的寄存器都配置好了,
(源地址设置好了,即UART_URXH2)
(目的地址也设置好了,我看是DMA环形缓冲区第一个buf的物理首地址)
(DISRCC3 与DIDSTC3 也设置对了。)
(在dma.c中的函数里设置的,我没有管)
中断相关寄存器我也没有管。(发现自己对INTMSK ,INTMOD,SUBSRCPND设置了,结果也一样)
在dma.c中将INTMSK 也设置对了,其bit20即DMA3的屏蔽位设为0了,允许中断
随后就对DMA的缓冲区(申请了3个)进行了申请。
接着将申请的缓冲区加入了DMA的环形缓冲队列。s3c2410_dma_queue_buffer();
随后,程序就一直在read的down_interruptible(&b->sem)里等待DMA3中断里释放信号量。
每次都是经过140s左右的样子,就出现 我的一楼帖子 的错误。
我觉得是不是linux发现read中在等待信号量的释放,而这个信号量一直没有释放,
一段时间以后,就会:
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing
为什么就没有DMA3的中断呢?我还漏掉了什么?DMA与UART2寄存器我感觉都设置好了。
(我通过另一个板子向跑此程序的试验箱上的UART2一直发送数据,这一点确定)
(波特率也没问题。因为我用中断的方式成功地读取到了数据)
麻烦高手指点,感谢!(我又更新了一下的源码 见此贴附件) |
|