在做linux下串口驱动、I2C驱动、摄像头驱动的时候,我手里刚好有运行正常的裸板运行的ADS程序,并且在裸板条件下串口、I2C、摄像头都运行正常。我现在要做的工作就是把这些代码移植到linux下,并让他们稳定运行。这里把我进行移植的一些收获写一下:
1,裸板下的寄存器地址在linux下是不能直接用的,最后都需要用ioremap_nocache来做地址变换;
2,用ioramap做地址变换的时候最好在程序最一开始把所有寄存器都变换好,不然如果在有中断处理程序的时候,中断处理程序中是不能使用ioremap的,因为ioremap是会导致系统等待或睡眠的,但是如果中断处理程序如果是快速中断,即不能被打断的中断,那么ioremap就会造成系统异常。
3,裸板的中断请求和linux的中断请求方式不大一样,linux下调用request_irq代替裸板中的请求就可以了。
4,裸板的内存分配和linux当中也不一样,在移植摄像头驱动的时候,裸板代码只使用了一个全局数组来存放视频采集的数据,用做DMA处理,但是在linux下就不能使用全局数组,必须调用内存分配函数kmalloc等,并使用GFP_DMA这个标志来开辟专用于DMA的内存。并且在把内存地址传给寄存器的时候,还需要把虚拟地址转换为物理地址才可以。