IOMUX(引脚功能复用)是一项关键硬件设计技术,旨在帮助芯片厂商更高效地利用有限的引脚资源。它借助内部寄存器,允许开发者通过软件将同一物理引脚灵活配置为多种不同功能,例如GPIO、UART或I2C等。由于此项配置的具体实现因SoC平台而异,本文特以【RK3588】ELF 2开发板上的I2C6引脚为例,系统说明从硬件规格查询到软件驱动配置的完整步骤。
在开始配置之前,首先需要了解【RK3588】ELF 2开发板的接口布局特点。ELF 2开发板的40Pin 2.54mm连接器兼容树莓派40Pin连接器,集成了I2C、SPI、UART等常用通信接口及多路GPIO;而20Pin 2.54mm连接器则额外引出40Pin连接器未涵盖的接口或拓展接口,包括SARADC、PWM和GPIO等。
引脚选择原则:进行引脚复用时,应优先选择40Pin或20Pin连接器上的引脚,这类引脚位于开发板标准排针接口,无需额外焊接,接线更加便捷。
引脚复用表路径:ELF 2开发板资料包\05-硬件资料\05-4 管脚分配表
打开引脚复用表后,可以看到Alt0~Alt9列是引脚的核心复用功能区,这10列分别代表该引脚可配置的10种备选功能(部分未启用列可能为空)。在表格中搜索"I2C6",所有Alt列中包含"I2C6"的行都会被筛选出来。
虽然支持复用为I2C6功能的引脚很多,但结合"优先选择40Pin或20Pin连接器引脚"的原则,最终选定P4_38和P4_40引脚:其中P4_38复用为I2C6_SCL_M4功能,P4_40复用为I2C6_SDA_M4功能。
硬件原理图路径:ELF 2开发板资料包\05-硬件资料\05-0 PDF原理图
从硬件原理图可知,【RK3588】ELF 2开发板共使用4个连接器,其中"P4"代表第4号连接器。需要先定位到该连接器,再查找其38号和40号引脚。
P4_38引脚对应开发板功能:GPIO2_C4--GPIO3_A1(左侧GPIO2_C4为3576开发板引脚功能,右侧GPIO3_A1为3588芯片引脚功能)
P4_40引脚对应开发板功能:GPIO2_C3--GPIO3_A0(左侧GPIO2_C3为3576开发板引脚功能,右侧GPIO3_A0为3588芯片引脚功能)
核心板的功能引脚通过连接器传输到底板,下面需要确认目标引脚在底板上的具体物理接口位置。
在原理图中分别搜索GPIO2_C4--GPIO3_A1和GPIO2_C3--GPIO3_A0网络标号:
GPIO2_C4--GPIO3_A1(P4_38引脚对应的网络标号)对应开发板P26接口的32引脚。
GPIO2_C3--GPIO3_A0(P4_40引脚对应的网络标号)对应开发板P26接口的35引脚。
在完成硬件引脚确认后,接下来需要进行软件层面的配置工作,主要包括设备树中的IOMUX配置和设备节点配置。
确定引脚后,需要在设备树中配置IOMUX参数以确保引脚正确工作在I2C6模式。打开以下文件:
kernel/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi
找到UART3相关定义,其中uart3m1_xfer节点已明确配置GPIO3_A1(I2C6_SCL_M4)和GPIO3_A0(I2C6_SDA_M4)的复用参数,配置内容如下:
完成IOMUX配置后,需要在设备树中启用I2C6设备节点。打开以下文字文件 :
kernel/arch/arm64/boot/dts/rockchip/elf2-3588-common.dtsi
添加I2C6节点引用,指定引脚配置为i2c6m4_xfer,启用节点功能,并在该节点下添加光线传感器设备,配置如下:
&i2c6 { status = "okay"; pinctrl-0 = <&i2c6m4_xfer>; bh1750:bh1750@23 { compatible = "elfboard,bh1750"; reg = <0x23>; status = "okay"; }; };
配置完成后,需要重新编译内核以生成包含新配置的镜像文件。
执行编译命令,生成内核镜像:
elf@ubuntu:~/work/ELF2-linux-source$./build.sh kernel
编译完成后,将在 kernel 目录下生成 boot.img 内核镜像文件。
编译生成新的内核镜像后,需将其烧录到开发板并完成基础验证。
1.将kernel目录下生成的boot.img内核镜像文件烧录到开发板。
2.开发板启动后,/dev目录会自动生成I2C6对应的设备节点i2c-6,通过以下命令验证节点是否存在:
root@elf2-buildroot:~#ls/dev/i2c-*
1.测试驱动、测试应用下载
https://forlinx-book.yuque.com/umxagc/vzgvcx/xoclfmmeispbak3h
2.硬件引脚连接(左边为光线传感器引脚,右边为【RK3588】ELF 2开发板引脚):
SDA-------I2C6--SDA(P26的35引脚)
SCL--------I2C6--SCL(P26的32引脚)
VCC-------3.3V(P26的1引脚)
GND-------GND(P26的6引脚)
光线传感器与【RK3588】ELF 2开发板连接如图:
将驱动文件(bh1750.c、Makefile)、应用文件(bh1750app.c)复制到开发环境的/home/elf/work路径下。
配置环境变量,在终端执行以下命令,添加交叉编译工具链路径:
elf@ubuntu:~/work$exportPATH=$PATH:/home/elf/aarch64-buildroot-linux-gnu_sdk-buildroot/usr/bin
打开Makefile文件进行如下修改:
将1处替换为Linux kernel所在路径。
将2、3处替换为交叉编译工具前缀/home/elf/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-linux-。
在/home/elf/work目录下执行make命令,生成bh1750.ko驱动模块:
elf@ubuntu:~/work$make
执行交叉编译命令,生成可执行文件:
elf@ubuntu:~/work$ aarch64-linux-gcc bh1750app.c -o bh1750app elf@ubuntu:~/work$ file bh1750app
通过file命令确认应用为ARM架构(支持开发板运行)。
将bh1750.ko驱动模块和bh1750app应用通过U盘拷贝至开发板/root目录。
执行以下命令加载驱动,生成设备节点/dev/bh1750:
root@elf2-buildroot:~# insmod bh1750.ko [ 231.934533] bh1750: loading out-of-tree module taints kernel. [ 232.139143] rk3x-i2c fec80000.i2c: timeout, ipd: 0x90, state: 3 root@elf2-buildroot:~# [ 232.139288] rk3x-i2c fec80000.i2c: SCL hold by slave, check your device. root@elf2-buildroot:~# ls /dev/bh1750 /dev/bh1750
运行测试应用,执行应用程序读取光线传感器数值:
root@elf2-buildroot:~# ./bh1750app /dev/bh1750
通过上述步骤操作,即可完成【RK3588】ELF 2开发板的I2C功能复用配置。本文旨在为各位嵌入式开发爱好者提供切实可行的操作参考,若在实际调试过程中遇到任何问题,欢迎随时交流探讨。
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com