IOMUX(引腳功能復(fù)用)是一項(xiàng)關(guān)鍵硬件設(shè)計(jì)技術(shù),旨在幫助芯片廠(chǎng)商更高效地利用有限的引腳資源。它借助內(nèi)部寄存器,允許開(kāi)發(fā)者通過(guò)軟件將同一物理引腳靈活配置為多種不同功能,例如GPIO、UART或I2C等。由于此項(xiàng)配置的具體實(shí)現(xiàn)因SoC平臺(tái)而異,本文特以【RK3588】ELF 2開(kāi)發(fā)板上的I2C6引腳為例,系統(tǒng)說(shuō)明從硬件規(guī)格查詢(xún)到軟件驅(qū)動(dòng)配置的完整步驟。
?
在開(kāi)始配置之前,首先需要了解【RK3588】ELF ?2開(kāi)發(fā)板的接口布局特點(diǎn)。ELF 2開(kāi)發(fā)板的40Pin 2.54mm連接器兼容樹(shù)莓派40Pin連接器,集成了I2C、SPI、UART等常用通信接口及多路GPIO;而20Pin 2.54mm連接器則額外引出40Pin連接器未涵蓋的接口或拓展接口,包括SARADC、PWM和GPIO等。
?
引腳選擇原則:進(jìn)行引腳復(fù)用時(shí),應(yīng)優(yōu)先選擇40Pin或20Pin連接器上的引腳,這類(lèi)引腳位于開(kāi)發(fā)板標(biāo)準(zhǔn)排針接口,無(wú)需額外焊接,接線(xiàn)更加便捷。
?
引腳復(fù)用表路徑:ELF 2開(kāi)發(fā)板資料包\05-硬件資料\05-4 管腳分配表
打開(kāi)引腳復(fù)用表后,可以看到Alt0~Alt9列是引腳的核心復(fù)用功能區(qū),這10列分別代表該引腳可配置的10種備選功能(部分未啟用列可能為空)。在表格中搜索"I2C6",所有Alt列中包含"I2C6"的行都會(huì)被篩選出來(lái)。
?
雖然支持復(fù)用為I2C6功能的引腳很多,但結(jié)合"優(yōu)先選擇40Pin或20Pin連接器引腳"的原則,最終選定P4_38和P4_40引腳:其中P4_38復(fù)用為I2C6_SCL_M4功能,P4_40復(fù)用為I2C6_SDA_M4功能。

?
硬件原理圖路徑:ELF 2開(kāi)發(fā)板資料包\05-硬件資料\05-0 PDF原理圖
從硬件原理圖可知,【RK3588】ELF 2開(kāi)發(fā)板共使用4個(gè)連接器,其中"P4"代表第4號(hào)連接器。需要先定位到該連接器,再查找其38號(hào)和40號(hào)引腳。
P4_38引腳對(duì)應(yīng)開(kāi)發(fā)板功能:GPIO2_C4--GPIO3_A1(左側(cè)GPIO2_C4為3576開(kāi)發(fā)板引腳功能,右側(cè)GPIO3_A1為3588芯片引腳功能)
P4_40引腳對(duì)應(yīng)開(kāi)發(fā)板功能:GPIO2_C3--GPIO3_A0(左側(cè)GPIO2_C3為3576開(kāi)發(fā)板引腳功能,右側(cè)GPIO3_A0為3588芯片引腳功能)
?

?
核心板的功能引腳通過(guò)連接器傳輸?shù)降装?,下面需要確認(rèn)目標(biāo)引腳在底板上的具體物理接口位置。
?
在原理圖中分別搜索GPIO2_C4--GPIO3_A1和GPIO2_C3--GPIO3_A0網(wǎng)絡(luò)標(biāo)號(hào):
GPIO2_C4--GPIO3_A1(P4_38引腳對(duì)應(yīng)的網(wǎng)絡(luò)標(biāo)號(hào))對(duì)應(yīng)開(kāi)發(fā)板P26接口的32引腳。
?
GPIO2_C3--GPIO3_A0(P4_40引腳對(duì)應(yīng)的網(wǎng)絡(luò)標(biāo)號(hào))對(duì)應(yīng)開(kāi)發(fā)板P26接口的35引腳。
?

?
在完成硬件引腳確認(rèn)后,接下來(lái)需要進(jìn)行軟件層面的配置工作,主要包括設(shè)備樹(shù)中的IOMUX配置和設(shè)備節(jié)點(diǎn)配置。
?
確定引腳后,需要在設(shè)備樹(shù)中配置IOMUX參數(shù)以確保引腳正確工作在I2C6模式。打開(kāi)以下文件:
kernel/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi
找到UART3相關(guān)定義,其中uart3m1_xfer節(jié)點(diǎn)已明確配置GPIO3_A1(I2C6_SCL_M4)和GPIO3_A0(I2C6_SDA_M4)的復(fù)用參數(shù),配置內(nèi)容如下:

?
完成IOMUX配置后,需要在設(shè)備樹(shù)中啟用I2C6設(shè)備節(jié)點(diǎn)。打開(kāi)以下文字文件 :
kernel/arch/arm64/boot/dts/rockchip/elf2-3588-common.dtsi
添加I2C6節(jié)點(diǎn)引用,指定引腳配置為i2c6m4_xfer,啟用節(jié)點(diǎn)功能,并在該節(jié)點(diǎn)下添加光線(xiàn)傳感器設(shè)備,配置如下:
&i2c6 {? ? ? ? status =?"okay";? ? ? ? pinctrl-0?= <&i2c6m4_xfer>;? ? ? ? bh1750:bh1750@23?{? ? ? ? ? ? ? ? compatible =?"elfboard,bh1750";? ? ? ? ? ? ? ? reg = <0x23>;? ? ? ? ? ? ? ? status =?"okay";? ? ? ? };};

?
配置完成后,需要重新編譯內(nèi)核以生成包含新配置的鏡像文件。
執(zhí)行編譯命令,生成內(nèi)核鏡像:
elf@ubuntu:~/work/ELF2-linux-source$?./build.sh kernel
編譯完成后,將在 kernel 目錄下生成 boot.img 內(nèi)核鏡像文件。
?
編譯生成新的內(nèi)核鏡像后,需將其燒錄到開(kāi)發(fā)板并完成基礎(chǔ)驗(yàn)證。
1.將kernel目錄下生成的boot.img內(nèi)核鏡像文件燒錄到開(kāi)發(fā)板。
2.開(kāi)發(fā)板啟動(dòng)后,/dev目錄會(huì)自動(dòng)生成I2C6對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)i2c-6,通過(guò)以下命令驗(yàn)證節(jié)點(diǎn)是否存在:
root@elf2-buildroot:~#?ls?/dev/i2c-*

?
1.測(cè)試驅(qū)動(dòng)、測(cè)試應(yīng)用下載
https://forlinx-book.yuque.com/umxagc/vzgvcx/xoclfmmeispbak3h
?
2.硬件引腳連接(左邊為光線(xiàn)傳感器引腳,右邊為【RK3588】ELF 2開(kāi)發(fā)板引腳):
SDA-------I2C6--SDA(P26的35引腳)
SCL--------I2C6--SCL(P26的32引腳)
VCC-------3.3V(P26的1引腳)
GND-------GND(P26的6引腳)
光線(xiàn)傳感器與【RK3588】ELF 2開(kāi)發(fā)板連接如圖:

?
將驅(qū)動(dòng)文件(bh1750.c、Makefile)、應(yīng)用文件(bh1750app.c)復(fù)制到開(kāi)發(fā)環(huán)境的/home/elf/work路徑下。
?
配置環(huán)境變量,在終端執(zhí)行以下命令,添加交叉編譯工具鏈路徑:
elf@ubuntu:~/work$?export?PATH=$PATH:/home/elf/aarch64-buildroot-linux-gnu_sdk-buildroot/usr/bin
?
打開(kāi)Makefile文件進(jìn)行如下修改:

將1處替換為L(zhǎng)inux kernel所在路徑。
將2、3處替換為交叉編譯工具前綴/home/elf/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-linux-。
?
在/home/elf/work目錄下執(zhí)行make命令,生成bh1750.ko驅(qū)動(dòng)模塊:
elf@ubuntu:~/work$?make

?
執(zhí)行交叉編譯命令,生成可執(zhí)行文件:
elf@ubuntu:~/work$?aarch64-linux-gcc bh1750app.c -o bh1750appelf@ubuntu:~/work$?file bh1750app

通過(guò)file命令確認(rèn)應(yīng)用為ARM架構(gòu)(支持開(kāi)發(fā)板運(yùn)行)。
?
將bh1750.ko驅(qū)動(dòng)模塊和bh1750app應(yīng)用通過(guò)U盤(pán)拷貝至開(kāi)發(fā)板/root目錄。
執(zhí)行以下命令加載驅(qū)動(dòng),生成設(shè)備節(jié)點(diǎn)/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:?3root@elf2-buildroot:~# [ ?232.139288] rk3x-i2c fec80000.i2c: SCL hold by slave, check your device.root@elf2-buildroot:~# ls /dev/bh1750/dev/bh1750
?
運(yùn)行測(cè)試應(yīng)用,執(zhí)行應(yīng)用程序讀取光線(xiàn)傳感器數(shù)值:
root@elf2-buildroot:~# ./bh1750app /dev/bh1750

?
通過(guò)上述步驟操作,即可完成【RK3588】ELF 2開(kāi)發(fā)板的I2C功能復(fù)用配置。本文旨在為各位嵌入式開(kāi)發(fā)愛(ài)好者提供切實(shí)可行的操作參考,若在實(shí)際調(diào)試過(guò)程中遇到任何問(wèn)題,歡迎隨時(shí)交流探討。
?
