序:
这是笔者第一次做SPI接口的驱动,由于对SPI接口的不熟悉,再加上遇到主从设备的SPI接口有一定的差异,导致被坑了很久。当然,这次驱动开发过程中不仅在技术上有所收获,更重要的收获是,懂得了在驱动开发中遇到问题后怎样有效的处理。下面将从开发流程、配置SPI控制器相关须知、用户空间SPI驱动、Linux设备模型与platform总线(虚拟“平台”总线)、Linux SPI驱动框架5方面做总结。如果不使用用户空间驱动的方式,只需了解前两方面即可。由于时间仓促加之本人水平有限,文中可能存在不妥之处,还请广大读者朋友与之交流指正。
时间地点:2017.7.7于成都
一、开发流程
1.确认从设备完好。如果有测试程序能测试从设备相应功能,是最好的确认方法,不仅能测试设备是否完好,还能得到设备工作数据,比如获取加密芯片的版本号,得到的数据对以后的开发有很重要的对比意义。
2.确认主设备提供给从设备的供电是否正常。首先测量供电电压是否是从设备所接受范围(过低工作可能不正常,过高可能会烧坏从设备)
3.确认主设备SPI接口引脚是否正常。要先把复用功能的IO引脚功能选择成SPI(可以自己配置寄存器选择复用功能,但推荐通过板级代码配置)。将主从设备进行连接,如果有现成的SPI驱动,可以直接进行测试主设备SPI引脚是否有波形输出,确认输出是否正常。如果没有现成驱动,可以选择用户空间驱动写一个测试程序(其实一般内核都提供有各种驱动的测试程序,在内核目录的Documentation目录下)。可以用测试程序随意发些数据,用示波器看看各引脚有没有相应的波形。
4.选择用户空间驱动或者内核空间驱动(自己配置寄存器)进行开发。
二、配置SPI控制器相关须知
1.SPI(SerialPeripheral Interface)接口特点:SPI首先由Motorola公司提出并使用,现在标准的SPI,四线式,全双工,同步的串行通信总线。标准的SPI包含SSn(片选线)、SCLK(时钟线)、MOSI(主出从入线)、MISO(主入从出线)四根线。其中名称在不同的地方可以不同,如SSn可以叫CS、CSB等,MOSI可以叫SDO ,MISO可以叫SDI。在有些实际应用中可能将标准的SPI进行简化或者扩展,例如如果不需要使用片选可以去掉,不需要在同一个时钟周期内进行发送和接收的情况可以使用半双工,需要将位宽从标准的1位扩展到多位可以采用并行(就需要更多的数据线)。
2.S