1、Firefly-RK3399平台简介
目前我是用的是Firefly-RK3399这款开发板。作为Firefly新一代的顶级开源平台,Firefly-RK3399功能强大。具体情况参考Firefly-3399开发板信息。
实际上开源主板AIO-RK3399J(AIO-3399J开发板信息)中是直接有使用WK2124这款芯片,作为扩展串口的芯片。
2、WK2124简介
WK2124是WK推出的一款SPI扩展4串口芯片,该芯片功能强大。支持10M设置更高的SPI接口速率,每个子串口独立,可以设置不同的波特率和数据格式;每个子串口支持最高2M的波特率,每个子串口都有独立的256Byte的硬件接收FIFO和256Byte的发送FIFO。合理使用该芯片,实际上可以扩展出更多串口,比如4、8、12、16甚至更多的串口。
3、WK2124驱动简介
从WK(为开)可以获得该芯片的驱动代码和一些其他相关资料。
目前我做测试的用的是如下的代码:wk2xxx_spi.c v2.4
1)、 硬件连接示意图
(1) WK芯片作SPI从设备和CPU端的主SPI需要连接的信号有CS信号(此信号不能一直拉低,需要用主SPI的CS信号控制)、CLK信号、MOSI信号、MISO信号,具体连接方式如上图。
(2)、IRQ信号为WK芯片的中断输出信号,需要连接到CPU具有外部中断功能的GPIO上。IRQ引脚外部需要加上拉电阻。
(3)RST作为复位引脚,在SPI拓展4串口的时候,可以不用连接到CPU.直接使用阻容复位电路。
2)、驱动基本框架
驱动框架示意图 :
(1)、WK驱动工作在linux 内核层,向上提供4个串口设备节点供应用层用户调用。也就是说WK驱动注册成功以后,在/dev/ 目录下会生成 ttysWK0、ttysWK1、ttysWK2、ttysWK3 共4个串口设备节点,应用层就可以按照操作普通串口节点的方式操作。
(2)、WK驱动需要和WK芯片进行数据交互,数据交互是通过SPI总线进行的,所以WK驱动会调用SPI总线驱动接口进行数据收发。
3)、驱动内容
驱动具体的内容和介绍,参考为开提供的移植手册。
驱动源码:
4、WK2124驱动和内核一起编译
(1)在内核源代码加入WK2124驱动源码
在内核源码目录加入WK2124的驱动,并修改驱动源代码的文件名为spi-wk2xxx.c
如下图:
通常在Firefly-RK339的SDK下面,都会有入上图的文件,但是这个驱动是比较老的驱动,只需要用最新的驱动去代替就可以。
(2)修改SDK目录/kernel /drivers/spi/ 下的配置文件和makefile
1、在Kconfig里面加入:
config SPI_WK2XXX
tristate "wk2xxx Spi Switch Uart"
depends on SPI
help
Say Y to get the third party encryption service.
如下图:
(2)修改makefile
如下图,在Makefile的结尾加入:
obj-$(CONFIG_SPI_WK2XXX) += spi-wk2xxx.o
需要注释掉上图绿色的地方。这个应该是firefly增加的一个和编译相关的程序,现在不需要了。
(3) make menuconfig
将该驱动选择编译进入内核。
(4)修改DTS
a、修改rk3399-firefly-port.dtsi
在spi1节点中加入:
b、修改rk3399-firefly.dts
其实上面的两个也可以合并在一起。只是为了rkfirefly-rk3399和其他一些开发平台兼容性更好适配,才分开写的。
(5)、编译并下载镜像、测试驱动
镜像加载完成以后,我们可以在/dev/ 下看见设备节点,如下图:
5、常见问题答疑
1)由于WK2124的驱动可以看成是一个SPI的设备驱动,所以该驱动依赖于SPI总线驱动。如果总线驱动没有加载,那么WK2124的驱动也是没有办法加载的。
2)由于驱动在加载的时候,驱动会去读取芯片寄存器GENA,如果默认值不对,那么驱动就会停止加载。所以如果SPI上没有芯片或者SPI读写操作还有问题,那么驱动是加载不了的。
3)中断相关,由于收发数据依赖于中断信号,如果中断信号有问题,那么收发数据是没有办法进行,但是打开串口不受影响。