程序的目的是用DNW实现USB下载文件,并开启DMA。这个在bootloader中下载内核和根文件系统很方便,比串口快多了。板子是友善之臂的sbc2410,s3c2410的CPU,基于ARM920T核。
1、关于DNW
用DNW从USB host端发文件到device端,它会对这个文件进行封装,最后的数据包形式为:addr(4bytes)+size(4bytes)+data(n)+cs(2bytes)。写程序时,要注意解包,把真正的data写到addr中,结束后如有必要,还要对size进行处理。
2、关于DMA的使用
首先,各个DMA相关寄存器肯定要配置好,如DISRCC,DIDSTC,DISRC,DIDST,DCON,DMASKTRIG等。
程序中根据DCON设置的DMA模式来对前面几个地址寄存器操作,如源地址固定(是OUT事务,反复从EP_FIFO中接收),目的地址每次增加(是写入的地址,每次要向后移)。在配置寄存器时,DMASKTRIG要处于STOP状态,配好之后再打开通道。配置DISRCC和DIDSTC,要注意APB和AHB不能弄错,否则就写不了数据了。
此外, USB负责OUT的端点控制寄存器也必须被配置,如:
OUT_CSR2_REG(控制OUT_PKT_READY标志位,此端点的INTMASK)
EP3_DMA_UNIT(根据DCON2)
EP3_DMA_CON(EP3的DMA使能,是否启动DMA,很关键)
以上都配置完成后,只要USB端点和DMA控制器都使能了,DMA不需要CPU控制就开始传输数据了,此过程可以查看DCDST的值以及目的地址addr的内容,以确定是否写真正的写数据了。DCDST很有用,如果程序跑飞了,也可以通过它看出来。
记录下调试过程中犯的错误:
1、之前EP0的USB枚举并没有完全成功,第一步的RESET宏值弄错了,根本就没有实现RESET,竟然也能枚举成功,却导致后面EP3无法产生中断。
2、给DCON2[19:0]赋值时,要用“或”,以免把前面的位给用“0”覆盖了,导致无法发生DMA中断(CURR_TC interrupt位),低级错误。。。
3、APB,AHB的宏值弄反,郁闷半天。。。
4、最好不用自定义的变量来控制程序流程,整体把握难度大,毕竟人脑不是电脑。。。最后选用DCDST来控制整个DMA过程,最终结束程序。
阅读(1924) | 评论(0) | 转发(0) |