目前,linux系统是不支持spi从机功能,有个项目,A33 与单片机采用spi高速通讯,考虑到速度,只能设置A33 spi为从机模式。
一:硬件修改
主spi的一个io,连接到从机的一个中断io口:主机选择从机通讯时,这个io为低,从机利用中断可以立即准备好数据
主spi立即发出spi clk信号,与从机通讯。
二:软件修改
分析:1:默认的spi驱动只支持主spi,不支持从spi,驱动的流程上肯定要修改。
2:必须考虑DMA和FIFO传输的不同,特别是DMA部分。查看驱动,由于是主spi的框架,在通讯中是要wait的,通讯后会释放DMA资源,这样是无法用在从机spi系统的。
这是一个关键问题:去掉释放DMA的动作,修改DMA传输,在DMA传输完后再释放DMA资源。
3:由于A33的spi设置为从机,那就必须考虑2个问题:无法预知主机什么时候发起spi通信,如何处理spi主机发起的通讯和android应用层发出的spi控制信息。
第一个问题,用工作队列可以解决,第二问题,用锁可以解决。
4: 全志A33 spi从机配置
看规格书,把init中的spi模式寄存器数值修改为从机。
工作流程:
必须用异步方式传输数据。在init spi时新建一个work,负责spi数据传输。
1:android上层准备好数据,立即下发到spi,驱动立即保存好数据(DMA或FIFO BUF),然后把全局变量gHasSpiData设为1,退出,返回上层成功标识。
2:利用中断,产生一次工作队列的调度,实现异步传输。
3:工作队列的内容:配置好DMA,等待spi主机访问数据。上锁,等传输结束释放资源,解锁。
通过以上修改,linux的spi 从机功能实现。实际测试,系统稳定可靠。
个