权智A133P 安卓10移植SPI转串WK2124驱动

硬件连接示意图

权智A133P 安卓10移植SPI转串WK2124驱动_第1张图片
主控CPU通过SPI总线与WK2XXX芯相连接。WK2XXX控制4个UART的数据收发。
其中重要的参数有CS片选线和IRQ中断引脚。

LInux串口驱动框架

权智A133P 安卓10移植SPI转串WK2124驱动_第2张图片
当WK2XXX驱动在内核注册成功后,会在/dev目录下面生成ttysWK0,ttysWK1,ttysWK2,ttysWK3节点。上层通过open,read,write调用ttysWK。

TTY驱动架构

权智A133P 安卓10移植SPI转串WK2124驱动_第3张图片
一般来说 tty 架构可以分成两层:一层是下层我们的串口驱动层,直接操作
WK2XXX 芯片,同时向上提供一组标准的接口,这组接口通过结构体 struct uart_ops
来实现,该结构体涵盖了驱动对串口的所有操作。还有一层是上层 tty 层,包括
tty_core、line_discipline.他们各自实现实现一个 ops 结构,用户空间通过 tty 注册的字符设备节点来访问驱动。

用户空间与驱动层之间数据交互

权智A133P 安卓10移植SPI转串WK2124驱动_第4张图片
用户空间和驱动层之间在数据传递上并不是直接传递的。当 write()写数据时,
用户空间仅仅是把数据传递给 tty 缓冲区,然后驱动程序收到发送数据的指令,
然后按照一定的流程去发送数据;当接收数据的时候,驱动层首先把接收的数
据放入 tty 缓冲区,用户空间 read()去读数据,那么就能从 tty 缓冲区读出子串
口接收的数据。

驱动层接收和发送数据都依赖于中断。

具体的示意图如下:
权智A133P 安卓10移植SPI转串WK2124驱动_第5张图片

驱动移植

目录结构

        modified:   drivers/spi/Kconfig
        modified:   drivers/spi/Makefile
        modified:   drivers/spi/wk2xxx_spi.c

Makefile修改:

+++ b/arch/arm64/configs/a133p_common_defconfig
@@ -327,7 +327,7 @@ CONFIG_SENSORS_SC7A20=y
 # CONFIG_LEGACY_PTYS is not set
 +CONFIG_SPI_WK2124=y
 CONFIG_GPIOLIB=y
 CONFIG_GPIO_GENERIC_PLATFORM=y
 CONFIG_AXP803_POWER=y

将WK2124编译进内核

Kconfig修改:

--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -761,6 +761,10 @@ config SPI_TLE62X0
          sysfs interface, with each line presented as a kind of GPIO
          exposing both switch control and diagnostic feedback.
 
+
+config SPI_WK2124
+       bool "wk2124 spi to uart"
+
 #
 # Add new SPI protocol masters in alphabetical order above this line
 #

设备树修改:
设备树主要修改两个个GPIO,分别是cs-gpios和irq_gpio。
权智A133P 安卓10移植SPI转串WK2124驱动_第6张图片
根据硬件原理图可以知道IRQ的GPIO为PH14。CS连接到SPI1_CS上面去了。
权智A133P 安卓10移植SPI转串WK2124驱动_第7张图片
主控SPI_CS的GPIO为PD10。
设备树节点修改如下:

&spi1 {
	status = "okay";
	max-freq = <48000000>;
		wk2xxx_spi: wk2xxx_spi@00{
		status = "okay";
		compatible = "wkmic,wk2xxx_spi";
		reg = <0x00>;
		spi-max-frequency = <10000000>;
		reset_gpio = <&pio PB 3 1 1 1 1>;
		irq_gpio  = <&pio PH 14 6 0 0 0>;
		cs-gpios = <&pio PD 10 1 1 0 0>;
	};
};

1、status:如果要启用 SPI,那么设置为 okay,如不启用,设置为 disable
成都为开微电子
2、wk2xxx_spi@00:由于硬件使用的是 SPI1 的 cs0 引脚,所以设置为 00.如果使用
cs1,则设置为 01
3、compatible:这里的属性必须与驱动中的结构体:of_device_id 中的成员
compatible 保持一致。这个是 SPI 驱动匹配的关键。
4、reg:此处与 wk2xxx_spi@00:保持一致。此处设置为:00
5、spi-max-frequency:此处设置 spi 使用的最高频率。wk2xxx 芯片 spi 最高支
持 10000000。
6、reset_gpio:该选项在 SPI 驱动当中不是必须的。该 gpio 和 WK2xxx 芯片的复位
引脚相连,用于控制芯片的复位。根据实际使用的 gpio 去修改。
7、irq_gpio: 该 gpio 和 wk2xxx 芯片的 IRQ 引脚相连,用于接收 wk2xxx 芯片传递
来的中断信号。估计具体使用的 GPIO 去修改。
8、SPI 的工作模式设置,默认工作在 0 模式,所以在 dts 中没有单独设置。

驱动测试

权智A133P 安卓10移植SPI转串WK2124驱动_第8张图片
在电脑上面用串口助手,通过RS232与开发板串口连接
然后打开串口,用echo发数据到串口,看串口工具能否收到,如果能正常收到则说明驱动已经移植成功。

参考文档:https://blog.csdn.net/qq_29890089/article/details/120064117

你可能感兴趣的:(LInux嵌入式,linux,android,嵌入式硬件,嵌入式软件,开发板)