WK系列 SPI扩展 UART驱动移植参考
1、WK系列SPI扩展UART芯片简介
1.1 WK系列简介
目前WK系列能实现SPI扩展uart的芯片包括 WK2124、WK2204、WK2168、WK2132。目前WK2124、WK2204、WK2168能实现SPI扩展4路UART,WK2132能实现扩展2路UART。目前这几款芯片使用的都是相同的linux驱动。
WK系列扩展的子通道的UART具备如下功能特点:
每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps的通信速率。
每个子通道具备收/发独立的256 级FIFO,FIFO的中断可按用户需求进行编程触发点且具备超时中断功能。
1.2 WK SPI拓展串口驱动简介
硬件连接示意图
A、 WK芯片作SPI从设备和CPU端的主SPI需要连接的信号有CS信号(此信号不能一直拉低,需要用主spi的cs信号控制)、CLK信号、MOSI信号、MISO信号,具体连接方式如上图。
B、IRQ信号为WK芯片的中断输出信号,需要连接到CPU具有外部中断功能的GPIO上。
1.3 驱动基本框架
如下图为WK驱动和系统之间关系示意图。
A、WK驱动工作在linux 内核层,向上提供4个串口设备节点供应用层用户调用。也就是说WK驱动注册成功以后,在/dev/ 目录下会生成 ttysWK0、ttysWK1、ttysWK2、ttysWK3 共4个串口设备节点,应用层就可以按照操作普通串口节点的方式操作。
B、WK驱动需要和WK芯片进行数据交互,数据交互是通过SPI总线进行的,所以WK驱动会调用SPI总线驱动接口进行数据收发。
2、WK SPI拓展UART驱动移植
2.1 准备工作
A 、硬件平台简介
目前我司采用Rockchip的RK3288/RK3399作为我们驱动的开发平台。
B、 软件平台介绍
目前我们是在ubuntu (内核3.1)上做的驱动调试和测试。该驱动也适用于3.1-到4.0内核,基本上不用怎么修改。
C、驱动文件介绍
驱动的主要文件包括:
Wk2xxx_spi.c wk2xxx.h Makefile
2.2 驱动移植
A 、修改DTS
由于驱动需要用到SPI和中断资源,所以修改DTS的时候,主要是修改和SPI和中断相关的部分。
WK芯片作为SPI从设置,只支持SPI的0模式,其次SPI总线最高速率不要超过10M。
如图 DTS 项目1 compatible 选项主要实现驱动中SPI总线的匹配
这个地方设置的名字,是需要和驱动中图片中的地方保持一致。
如图DTS 项目2 设置SPI的最高速率10Mhz
如图DTS 项目3 设置驱动会用到的中断引脚
B、驱动编译
目前测试的时候,我们是直接把驱动编译为模块,然后加载的。
把驱动程序放到对应交叉编译环境,直接make一下(Makefile需要修改对应的编译器)。然后会生成对应的wk2xxx_spi.ko文件。
C、加载驱动
把驱动放到RK3288的开发板上,并加载驱动。如图:
驱动加载成功以后,可以在/dev下生成几个串口设备ttysWK0/ ttysWK1 ttysWK2 /ttysWK3
D 、 通过串口发送数据
我们使用扩展出来的串口ttysWK0发送数据,测试驱动是否可以正常运行。
命令如下:
那么这个时候在TX1引脚上会输出相应的数据,我们可以用usb转串口把TX1输出的传输到PC上显示出来,如下图所示。
3、驱动调试与修改
在驱动的移植过程中,通常都不是一帆风顺的,都会遇见各种问题,那么下面我把经常遇见的问题列出来,供大家参考。
3.1 SPI总线设备和设备驱动匹配问题。
SPI驱动在注册的过程中,需要实现spi驱动和设备之间的匹配,spi_bus_type总线匹配的依据是名字,也就是我们之前提到的DTS和驱动中需要保持一致的
,在匹配成功以后,spi_driver的probe方法就会被调用。也就是如下函数会被调用:
如果没有匹配成功,可能的问题:
- DTS和驱动中的compatible 名字不一致
- DTS修改以后没有重新编译更新到开发板
- 其他原因
3.2 、SPI接口与WK2124之间的通信
前面说的SPI总线匹配成功了,但是不同平台之间可能还是会存在差异,所以我们还要进一步确认SPI和WK2124之间的通信是否正常。通常我们是通过读写WK2124的寄存器来判断的,可以读GENA这个寄存器。这个寄存器的高4位固定为0011,低4位可编程。
我们在static int wk2xxx_probe(struct spi_device *spi)函数中加入一段测试程序,如下图:
正确情况下对应的打印:
如果出现高4位不是0X3X,那么可能是以下原因:
A 、SPI接口时序问题,包括cs信号控制、SPI模式等,正确的读GENA时序如下图:
B 、 SPI接口连接问题,MOSI和MISO信号接反了。
C、芯片电源不正常或者引脚虚焊等。
3.3 子串口波特率问题
WK芯片子串口的波特率是由芯片外部晶振分频而来,也就是说,外部晶振不一样,那么WK芯片相同波特率的寄存器配置值是不一样的。目前驱动中的波特率寄存器配置值都是按照11.0592Mhz的时钟计算的配置值,如果晶体不一样,那么是需要修改波特率寄存器的配置值的。
修改函数是:如下图中红色框中的寄存器配置值。
static void wk2xxx_termios( struct uart_port *port, struct ktermios *termios,
struct ktermios *old)
3.4 中断信号 IRQ
驱动收发数据依赖于中断信号,如果中断信号没有连接或者连接错误,那么子串口是不能进行数据收发。