WK2124 linux 驱动移植

 

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方法就会被调用。也就是如下函数会被调用:

如果没有匹配成功,可能的问题:

  1. DTS和驱动中的compatible 名字不一致
  2. DTS修改以后没有重新编译更新到开发板
  3. 其他原因

 

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

驱动收发数据依赖于中断信号,如果中断信号没有连接或者连接错误,那么子串口是不能进行数据收发。

 

发布了2 篇原创文章 · 获赞 1 · 访问量 920
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览