IOMUX(引腳功能復(fù)用)是芯片廠商為高效利用有限硬件引腳資源而設(shè)計(jì)的關(guān)鍵技術(shù),它允許單個(gè)物理引腳通過(guò)軟件配置為多種不同的功能(如GPIO、UART、I2C等)。不同SoC芯片的配置方式各異,本文將以【RK3588】ELF 2開(kāi)發(fā)板的復(fù)用PWM1為例,詳細(xì)闡述從硬件查找到軟件配置的完整流程。
?
在開(kāi)始配置之前,首先需要了解【RK3588】ELF 2開(kāi)發(fā)板的接口布局特點(diǎn)。開(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連接器上的引腳,這類引腳位于開(kāi)發(fā)板標(biāo)準(zhǔn)排針接口,無(wú)需額外焊接,接線更加便捷。
?
引腳復(fù)用表路徑:ELF 2開(kāi)發(fā)板資料包\05-硬件資料\05-4 管腳分配表
打開(kāi)引腳復(fù)用表后,可以看到Alt0~Alt9列是引腳的核心復(fù)用功能區(qū),這10列分別代表該引腳可配置的10種備選功能(部分未啟用列可能為空)。在表格中搜索"PWM1",所有Alt列中包含"PWM1"的行都會(huì)被篩選出來(lái)。
?
雖然支持復(fù)用為PWM1功能的引腳很多,但結(jié)合"優(yōu)先選擇40Pin或20Pin連接器引腳"的原則,最終選定P2_79引腳:P2_79復(fù)用為PWM1_M2功能。
?
硬件原理圖路徑:ELF 2開(kāi)發(fā)板資料包\05-硬件資料\05-0 PDF原理圖
從硬件原理圖可知,【RK3588】ELF 2開(kāi)發(fā)板共使用4個(gè)連接器,其中"P2"代表第2號(hào)連接器。需要先定位到該連接器,再查找其79號(hào)引腳。
P2_79引腳對(duì)應(yīng)開(kāi)發(fā)板功能:SPI1--SPI4--CS(左側(cè)SPI1-CS為3576開(kāi)發(fā)板引腳功能,右側(cè)SPI4-CS為358開(kāi)發(fā)板引腳功能)

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

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

?
完成IOMUX配置后,打開(kāi)以下文件,在設(shè)備樹(shù)中關(guān)閉原本的SPI功能,啟用PWM1功能。
(kernel/arch/arm64/boot/dts/rockchip/elf2-3588-common.dtsi)

添加PWM1節(jié)點(diǎn)引用,指定引腳為pwm1m2_pins,啟用節(jié)點(diǎn)功能。
?
配置完成后,需要重新編譯內(nèi)核以生成包含新配置的鏡像文件。
執(zhí)行編譯命令,生成內(nèi)核鏡像:
elf@ubuntu:~/work/ELF2-linux-source$?./build.sh kernel
編譯完成后,將在kernel目錄下生成boot.img內(nèi)核鏡像文件。
?
編譯生成新的內(nèi)核鏡像后,下一步是將其燒錄到開(kāi)發(fā)板并進(jìn)行驗(yàn)證。
將kernel目錄下生成的boot.img內(nèi)核鏡像文件燒錄到開(kāi)發(fā)板。
開(kāi)發(fā)板啟動(dòng)后,在 /dev 目錄下會(huì)生成新的PWM節(jié)點(diǎn),可通過(guò)以下命令驗(yàn)證:
root-buildroot:~# ls?/sys/class/pwm/pwmchip0 ?pwmchip1 ?pwmchip2 ?pwmchip3
?
由于PWM驅(qū)動(dòng)中生成的節(jié)點(diǎn)是依次向下枚舉的,所以pwmchip0節(jié)點(diǎn)對(duì)應(yīng)的是設(shè)備樹(shù)中的PWM1,pwmchip1節(jié)點(diǎn)對(duì)應(yīng)的是設(shè)備樹(shù)中的PWM2,pwmchip2節(jié)點(diǎn)對(duì)應(yīng)的是設(shè)備樹(shù)中的PWM4,pwmchip3節(jié)點(diǎn)對(duì)應(yīng)的是設(shè)備樹(shù)中的PWM5。
?
確認(rèn)設(shè)備節(jié)點(diǎn)生成后,需要進(jìn)行完整的功能測(cè)試以確保PWM1正常工作。
將PWM接口的設(shè)備通過(guò)PWM引腳與板卡進(jìn)行連接,上電之后PWM引腳狀態(tài)為高電平。
設(shè)置PWM1為輸出:
root-buildroot:~# echo?0?>?/sys/class/pwm/pwmchip0/export
?
設(shè)置PWM周期,單位為ns。
root-buildroot:~# echo?1000000?>?/sys/class/pwm/pwmchip0/pwm0/period
?
設(shè)置極性。
root-buildroot:~# echo normal?>?/sys/class/pwm/pwmchip0/pwm0/polarity
?
設(shè)置PWM占空比為50%。
root-buildroot:~# echo?500000?>?/sys/class/pwm/pwmchip0/pwm0/duty_cycle
?
使能PWM功能。
root-buildroot:~# echo?1?>?/sys/class/pwm/pwmchip0/pwm0/enable
?
失能PWM功能。
root-buildroot:~# echo?0?>?/sys/class/pwm/pwmchip0/pwm0/enable
通過(guò)以上步驟,即可完成【RK3588】ELF 2開(kāi)發(fā)板PWM1復(fù)用的配置與功能驗(yàn)證。
