RK3399 驱动开发 _ 06 - wk2124 串口驱动开发

文章目录

  • 前言
  • 一、WK2124
    • 1.概述
    • 2.源码下载
  • 二、Linux 驱动
    • 1. 驱动简介
    • 2. 驱动源码修改
    • 3. 内核中设备树dts修改
    • 4. 驱动模块编译
  • 三、测试
    • 1.重新编译并烧录
    • 2.编译并加载驱动模块
    • 3.查看注册到内核的串口设备节点


前言

在RK3399平台开发过程中,经常需要用到串口扩展芯片。本文介绍一款SPI转串口的扩展芯片WK2124。


一、WK2124

1.概述

WK2124是SPI接口的4通道UART器件,实现了SPI扩展4个串口的功能。

WK2124有以下特性:

  • 低功耗设计,可以配置自动休眠,自动唤醒模式(us级唤醒)
  • SPI接口最高速度10M bit/s,模式0,仅支持SPI从模式,支持最长256字节连续收发
  • 每个子串口为全双工,波特率可以独立设置,最高可以达到2Mbps
  • 可以实现对单个子串口软件复位

2.源码下载

wk2124 spi 驱动源码下载
RK3399 驱动开发 _ 06 - wk2124 串口驱动开发_第1张图片

二、Linux 驱动

主控:RK3399.
系统:Android8.1
内核 : Kernel 4.4.167

1. 驱动简介

  • 驱动向上使用串口驱动框架,注册四个串口设备节点供应用调用;
  • 驱动向下使用SPI驱动框架,与WK2124进行通信。

2. 驱动源码修改

驱动源码使用官方提供的参考驱动,但由于官网驱动使用linux 5.4版本,直接用linux4.4 编译会报错,需要进行如下修改:

1. 屏蔽 uapi/linux/sched/types.h 头文件
// #include 

2. 设置晶振,由于本人设备使用24M 晶振,故:
#define WK_CRASTAL_CLK (24000000)

3. 设置 RST 和CS 宏定义,设备实际硬件使用了RST和CS引脚,故需打开相关宏定义:
#define WK_RSTGPIO_FUNCTION
#define WK_CSGPIO_FUNCTION

4. 其他部分与原厂参考程序保持一致。

优化后的驱动源码下载链接

3. 内核中设备树dts修改

&spi2 {
	status = "okay";

	spi_wk2xxx: spi_wk2xxx@00{
		status = "okay";
		compatible = "wkmic,spi-wk2xxx";
		reg = <0x00>;
		spi-max-frequency = <10000000>;
		reset_gpio = <&gpio2 6 GPIO_ACTIVE_HIGH>;
		irq_gpio = <&gpio1 4 IRQ_TYPE_EDGE_FALLING>;
		cs-gpios = <&gpio2 12 GPIO_ACTIVE_HIGH>;
	};
};

特别说明:
设备树dts中 .compatible 需与 wk2xxx_spi.c 中保持一致。
RK3399 驱动开发 _ 06 - wk2124 串口驱动开发_第2张图片

4. 驱动模块编译

开启调试日志:

/*************The debug control **********************************/
#define _DEBUG_WK_FUNCTION
//#define _DEBUG_WK_RX
//#define _DEBUG_WK_TX
#define _DEBUG_WK_IRQ
//#define _DEBUG_WK_VALUE
//#define _DEBUG_WK_TEST

Makefile 文件修改:

ARCH:= arm64
MVTOOL_PREFIX = sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
CROSS_COMPILE= $(MVTOOL_PREFIX)
KDIR := sdk/kernel/

TARGET				=wk2xxx_spi
EXEC = $(TARGET)
obj-m :=$(TARGET).o
PWD :=$(shell pwd)
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
	rm -rf *.o *~core.depend.*.cmd *.ko *.mod.c .tmp_versions Module.symvers  modules.order $(TARGET) 

三、测试

1.重新编译并烧录

重新编译内核并烧录生效。

2.编译并加载驱动模块

1. 将编译好的驱动模块 wk2xxx_spi.ko push 到设备中:
adb push wk2xxx_spi.ko /data/local

2. 加载驱动模块到设备:
su root
cd /data/local
insmod wk2xxx_spi.ko

3. 加载成功后,出现以下log :

RK3399 驱动开发 _ 06 - wk2124 串口驱动开发_第3张图片

3.查看注册到内核的串口设备节点

1.查看串口设备节点:
rk3399_mid:/ $ ls /dev/
可以看出驱动生效,生成了4个串口节点:
ttysWK0
ttysWK1
ttysWK2
ttysWK3

2.可以通过相关串口工具对生成的串口节点进行测试

RK3399 驱动开发 _ 06 - wk2124 串口驱动开发_第4张图片


你可能感兴趣的:(驱动开发)