linux(RK3308)添加CH9434(SPI串口扩展)驱动
linux(RK3308)添加CH9434(SPI串口扩展)驱动
1、CH9434驱动下载
https://www.wch.cn/downloads/CH9434EVT_ZIP.html
2、驱动移植
2.1、移植准备
1、查看系统是否支持DTS设备树支持,若支持DTS可以直接在DTS文件中定义SPI节点。如下所示:
&spi2 {
status = "okay";
max-freq = <5000000>; //spi internal clk, don't modify
dma-names = "tx", "rx"; //enable dma
pinctrl-names = "default"; //pinctrl according to you board
pinctrl-0 = <&spi2_clk &spi2_csn0 &spi2_miso &spi2_mosi>;
ch9434: ch9434@0 {
compatible = "wch,ch943x";
reg = <0>;
spi-max-frequency = <5000000>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PB6 IRQ_TYPE_LEVEL_LOW>;
};
};
&spi2 {
status = "disabled";
max-freq = <50000000>; //spi internal clk, don't modify
pinctrl-names = "default";
pinctrl-0 = <&spi2_clk &spi2_csn0 &spi2_miso &spi2_mosi>;
ch9434: ch9434@1{
compatible = "wch,ch943x";
reg = <0>;
spi-max-frequency = <1000000>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PB6 IRQ_TYPE_LEVEL_LOW>;
};
};
2、配置IO中断引脚,确认CH9434芯片INT中断请求所连接的CPU的IO编号。次IO需支持中断功能。此编号可以直接在CH9434源码中指定:GPIO_NUMBER;若支持DTS设备树获取,可使用设备树指定,需要打开宏定义:USE_IRQ_FROM_DTS。
此外,注意有些平台上中断申请方式可能与驱动中默认实现方式不同,此时需修改ch9434.c文件中ch943x_spi_probe的相关代码。
注:默认情况下请不要修改uart时钟,若确实需修改以支持部分非标波特率,可在ch943x_probe中修改:
freq = 32 * 1000000 * 15 / clkdiv;
2.2、静态编译驱动
1、将驱动源码拷贝到内核目录中:/kernel_src/drivers/tty/serial
2、向/kernel_src/drivers/tty/serial/Konfig中添加:
config SERIAL_CH9434
tristate "SERIAL_CH9434 serial support"
depends on SPI
select SERIAL_CORE
help
This selects support for ch9434 serial ports.
3、向/kernel_src/drivers/tty/serial/Makefile中添加:
自动加载:
obj-$(CONFIG_SERIAL_CH9434) += ch9434.o //obj-y表示把ch9434.o文件编译进内核
#注:是CONFIG_SERIAL_CH9434不是CONFIG_SERIAL_CH943X,如果是CONFIG_SERIAL_CH943X,驱动源码将不会被编译。
4、运行make menuconfig,选择驱动/tty/serial下的ch9434 serial support,然后保存配置。
5、最后呈现出的结果是在kernel配置文件中存在:CONFIG_SERIAL_CH9434=y的选项
手动加载:
obj-m += ch9434.o //obj-m表示把文件ch9434.o作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 "ch9434.ko" 文件
insmod ch9434.ko //手动拉起驱动
3、加载驱动
3.1、驱动加载
驱动加载成功,会打印出如下效果。
[ 0.131751] ch9434: SPI driver for spi to serial chip ch9434, etc.
[ 0.131751] ch9434: V1.00 On 2020.06.17
[ 0.131751] rockchip-spi ff140000.spi: no high_speed pinctrl state
[ 0.138983] ch943x_spi spi2.0: gpio_to_irq:52, spi->irq:66
[ 0.139019] ch943x_spi spi2.0: change to SPI MODE 3!
[ 0.139223] ch943x_spi spi2.0: ch943x_port_write - reg:0x81, val:0x 0
[ 0.139334] ch943x_spi spi2.0: ch943x_port_write - reg:0x84, val:0x 0
[ 0.139443] ch943x_spi spi2.0: ch943x_port_read - reg:0x 6, val:0xff
[ 0.139843] ch943x_spi spi2.0: ch943x_port_write - reg:0x91, val:0x 0
[ 0.139921] ch943x_spi spi2.0: ch943x_port_write - reg:0x94, val:0x 0
[ 0.139997] ch943x_spi spi2.0: ch943x_port_read - reg:0x16, val:0xff
[ 0.140379] ch943x_spi spi2.0: ch943x_port_write - reg:0xa1, val:0x 0
[ 0.140458] ch943x_spi spi2.0: ch943x_port_write - reg:0xa4, val:0x 0
[ 0.140539] ch943x_spi spi2.0: ch943x_port_read - reg:0x26, val:0xff
[ 0.140886] ch943x_spi spi2.0: ch943x_port_write - reg:0xb1, val:0x 0
[ 0.140963] ch943x_spi spi2.0: ch943x_port_write - reg:0xb4, val:0x 0
[ 0.141042] ch943x_spi spi2.0: ch943x_port_read - reg:0x36, val:0xff
[ 0.141431] ch943x_spi spi2.0: ch943x_port_write - reg:0xc8, val:0xcd
3.2、查看串口节点
进入/dev/目录,可以看到出现ttyWCH0、ttyWCH1、ttyWCH2和ttyWCH3设备节点,表示加载成功。
# ls /dev/
block mmcblk1p3 stdout
char mmcblk1p4 tty
console mmcblk1p5 ttyFIQ0
cpu_dma_latency mmcblk1p6 ttyS0
disk mmcblk1p7 ttyS1
fd mmcblk1p8 ttyS2
full mmcblk1p9 ttyS3
hwrng mmcblk1rpmb ttyS4
iio:device0 network_latency ttyWCH0
input network_throughput ttyWCH1
kmsg null ttyWCH2
log ptmx ttyWCH3
mem pts urandom
memory_bandwidth random usb-ffs
mmcblk1 rfkill vendor_storage
mmcblk1boot0 shm zero
mmcblk1boot1 snd zram0
mmcblk1p1 stderr
mmcblk1p2 stdin
#
4、日志打印
1、需要给内核传输loglevel等级,如下:
chosen {
bootargs = "earlycon=uart8250,mmio32,0xff0e0000 swiotlb=1 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext2 rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1 loglevel=8";
};
注:loglevel:内核打印等级
2、开启ch943驱动源码的打印,如下:
转载说明:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律