平臺:迅為iMX6UL開發板
說明:PWM 配置和測試方法 測試中不需要新增額外驅動,是基於系統使用者態的 sysfs,可以使用命令來直接操作底層。 1 iMX6UL的PWM簡介 開啟 iMX6UL 的 datasheet,搜尋 PWM 關鍵詞,如下圖所示。 PWM5-PWM8 的地址如下。 PWM1-PWM4 的地址如下。 可以知道 iMX6UL 最多可以支援 8 路 PWM 輸出,也查出了實體地址。 2 iMX6UL的PWM0測試 所有的 ARM 板,預設情況下背光都是採用的 PWM 來調整的,那麼它的 PWM 時鐘地址 等引數肯定是配置好的,我們可以先使用背光對應 PWM 來做初步的測試。 2.1 硬體簡介 開啟 iMX6UL 的底板原理圖,如下圖所示,可以看到背光使用的 PWM 網路標號是 “BLT_PWM”。 如下圖所示,“BLT_PWM”和“GPIO_8”接到了一起。 在核心板原理圖中搜索“GPIO_8”,可以查到對應的這個網路標號對應的 PAD 為 “GPIO1_IO08”,如下圖所示。 2.2 裝置樹檔案分析和修改 在核心原始碼目錄下,開啟“arch/arm/boot/dts/imx6ul-14x14-evk.dts ”裝置樹檔案, 在其中搜索“GPIO1_IO08”,如下圖所示,管腳已經配置了。 接著搜尋“pinctrl_pwm1”,檢視在哪裡註冊了,如下圖所示,可以看到“pwm1”中 呼叫了。 接著搜尋“pwm1”,可以看到 pwm1 在背光碟機動中呼叫了,這裡仿照下圖,將其註釋 掉。 請注意:如果這裡註釋掉,螢幕將無法使用,如果需要使用螢幕,務必在測試完成之後恢 復原樣。 然後重新編譯裝置樹檔案,燒寫到開發板中。 2.3 pwm0測試 燒寫新的映象之後,在串列埠控制檯中依次輸入以下命令: echo 0 > sys/class/pwm/pwmchip0/export echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle 第一個命令為設定 pwm 輸出,跳出 pwm0 目錄下的節點; 第二個命令為使能 pwm0; 第三個命令為設定週期; 第三個命令為設定佔空比。 最後使用示波器測試下面 R129 電阻,可以看到 pwm 輸出。 3 PWM2分析和測試 PWM1 測試因為核心中肯定將時鐘和 IO 配置好了,我們只需要將背光設備註釋掉就可以 完成測試。本小節介紹 PWM2,更進一步介紹時鐘和 IO 配置以及 PWM2 註冊。 3.1 datasheet和原理圖分析 在 datasheet中,搜尋 PWM2,如下圖所示,可以看到“GPIO1_IO09”這個 pad 可以 被配置為 PWM2。 在核心板原理圖上,搜尋“GPIO1_IO09”,如下圖所示,可知網路標號為 “GPIO_9”。 在底板原理圖中搜索“GPIO_9”,如下圖所示,可以看出它通過 J38 的管腳 5 引出。 通過在原理圖中搜索可以發現這個管腳沒有接到其它裝置上。 3.3 時鐘配置 回到核心原始碼,很明顯在“arch/arm/boot/dts/imx6ul-14x14-evk.dts”裝置樹檔案中 沒有對 PWM1 進行時鐘配置,但是我們在前面測試 PWM1 的時候是能成功的,這表明它一 定在其它地方配置了。 開啟裝置樹檔案,檢視其包含的標頭檔案,如下圖所示,應該是和裝置樹同一目錄目錄下的 “imx6ul.dtsi”。 將其開啟,搜尋“pwm1”,如下圖所示。 如上圖所示,可以看到 pwm1 中引用了實體地址“0208_0000”,引用時鐘 PWM 時鐘 配置“IMX6UL_CLK_PWM1”。在最前面介紹 PWM 的時候,其實有提到實體地址,如下圖 所示,這裡和 datasheet上是一致(肯定一致,不然前面測試一定不行)。 接著看 pwm2,預設定義了,但是沒有將 PWM 時鐘開啟,如下圖所示,將兩個 “IMX6UL_CLK_DUMMY”修改為“IMX6UL_CLK_PWM2”。 至此 PWM2 的時鐘配置完成,其它 PWM 時鐘也可以依照這樣的方式,在這個檔案中打 開時鐘或者新增,新增的話,要注意其中的中斷號,PWM1 為 83,PWM2 為 84,依次類 推,仿照著來就成。 3.4 管腳配置和設備註冊 前一小節介紹了時鐘配置,回到“arch/arm/boot/dts/imx6ul-14x14-evk.dts”裝置樹 檔案,先搜尋“PWM2”和“pwm2”,這裡搜尋 PWM2 是因為有其它 pad 是可能被配置 為 pwm2,如果有配置配置,則巨集定義中一定有 PWM2。搜尋發現“PWM2”和“pwm2” 都沒有。 然後搜尋“GPIO1_IO09”,發現被定義為 SD1 的 reset,直接註釋掉,如下圖所示。 如下圖所示,在 pinctrl_pwm1 後面新增 pinctrl_pwm2,將“GPIO1_IO09”配置為 PWM2 模式。 上圖新增的程式碼如下: pinctrl_pwm2: pwm2grp { fsl,pins = < MX6UL_PAD_GPIO1_IO09__PWM2_OUT 0x110b0 >; }; 接著新增 PWM2 設備註冊的程式碼,如下圖所示。 上圖新增的程式碼如下: &pwm2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_pwm2>; status = "okay"; }; 至此,時鐘,管腳配置,設備註冊全部完成。 重新編譯燒寫到開發板。 3.5 測試 新的映象燒寫之後,依次使用以下命令: echo 0 > sys/class/pwm/pwmchip1/export echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable echo 1000000 > /sys/class/pwm/pwmchip1/pwm0/period echo 500000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle 然後使用示波器測試 J38 的管腳 5,可以觀察到有脈衝波訊號。 剩餘的 6 路 PWM 可以按照本文件介紹的思路實現,使用者如果有需要,可以自行實現。 轉自:http://www. |
|