本文轉自:<北京迅爲i.mx6ull終結者開發板使用手冊-第九十一章>
硬件平臺:迅爲i.MX6ULL開發板
本章節使用的資料已經放到了開發板網盤資料中,路徑爲:11_Linux系統開發進階\86_章節使用資料。
本章節介紹如何在i.MX6ULL終結者上配置8路串口,驅動程序內核已經自帶,我們只需要根據NXP官方提供的手冊來修改設備樹。設備樹文件在Linux內核的arch/arm/boot/dts/目錄下(使用迅爲提供的的Linux內核,在終結者ULL光盤資料\i.MX6ULL終結者光盤資料\05_uboot linux源碼\目錄下),本例程中主要用到測試程序uart_write_read.c,設備樹文件imx6ull-14x14-evk.dts,imx6ull.dtsi,還有imx6ul-pinfunc.h。
配置UART用到的引腳在芯片手冊(終結者ULL光盤資料\i.MX6ULL終結者光盤資料\03_開發板硬件資料\02_芯片資料\2、I.MX6ULL芯片資料\IMX6ULL參考手冊)中已經找到,如下圖:\
下面就開始把這些引腳複用爲串口,逐一配置到設備樹。
因爲 UART1是調試串口,我們最後再設置它。在imx6ull.dtsi文件中,可以看出串口結點0~7對應uart1~8。可根據/dev/下的設備結點ttymxc*來調試。
以配置串口2爲例,逐步配置設備樹,本文檔其餘的7路串口都用相同的方法配置。
首先通過查NXP的芯片手冊(終結者ULL光盤資料\i.MX6ULL終結者光盤資料\03_開發板硬件資料\02_芯片資料\2、I.MX6ULL芯片資料\IMX6ULL參考手冊),搜索「UART2」找到 UART2的引腳,
用同樣的方法在芯片手冊搜索接收引腳, 搜索到UART2兩個引腳:
發送引腳IOMUXC_SW_MUX_CTL_PAD_UART2_TX_DATA,
接收引腳IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA,
然後我們在imx6ul-pinfunc.h中搜索發送引腳「PAD_UART2_TX_DATA」,找到了「MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX」,即MX6UL_引腳名_複用功能。
用相同的方法搜索「PAD_UART2_RX_DATA」,找到後在設備樹文件arch/arm/boot/dts/imx6ull-14x14-evk.dts中添加pinctrl信息(自帶的已經添加好),電氣屬性值爲」0x1b0b1」,修改成如下所示:
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
>;
};
本實驗中沒有用到流控,註釋掉668和669行,然後查找其他pinctrl有沒有使用這兩個引腳,如果有,註釋掉其他pinctrl。搜索「PAD_UART2_TX_DATA」,查找到pinctrl_uart2dte使用了這兩個引腳,我們直接把pinctrl_uart2dte註釋掉或刪掉。
如下圖:
再查找引用此pinctrl_uart2dte的節點,註釋掉然後查找使用此pinctrl的節點標籤,有的話註釋掉。
查找「PAD_UART2_RX_DATA」,發現有pinctrl_remote_control使用了這個,引腳,註釋掉
然後添加節點標籤&uart2(源碼已經),只使用pinctrl_uart2,satus改爲「okay」,註釋掉「fsl,uart-has-rtscts」。
打開imx6ull.dtsi,更改標籤uart2設備屬性status爲」okay」,
編譯make dtbs,在開發板上運行起來後,串口2的設備結點就是/dev/目錄下的ttymxc1,查找原理圖中兩個引腳的位置(終結者ULL光盤資料\i.MX6ULL終結者光盤資料\03_開發板硬件資料\01_開發板原理圖\核心板原理圖),將兩個引腳短接,接收引腳得到數據後測試程序會打印接收到的字節個數,執行測試程序,引腳位置:
運行測試程序:
出現此結果說明引腳配置成功。
通過 imx6ull的芯片手冊(終結者ULL光盤資料\i.MX6ULL終結者光盤資料\03_開發板硬件資料\02_芯片資料\2、I.MX6ULL芯片資料\IMX6ULL參考手冊)查找到UART3的引腳爲:
發送引腳IOMUXC_SW_MUX_CTL_PAD_UART3_TX_DATA,
接收引腳IOMUXC_SW_MUX_CTL_PAD_UART3_RX_DATA,
和UART2的步驟基本一樣,在arch/arm/boot/dts/imx6ull-14x14-evk.dts配置pinctrl:
pinctrl_uart3: uart3grp {
fsl,pins = <
MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x1b0b1
>;
};
然後查找使用這兩個引腳的其他pinctrl,直接註釋掉。
添加uart3節點標籤:
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
status = "okay";
};
在imx6ull.dtsi中更改uart3的status屬性:
這兩個引腳對應的原理圖爲:
短接後測試/dev/ttymxc2節點:
查找到 UART5對應的引腳爲:
發送引腳IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA,
接收引腳IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA,
在arch/arm/boot/dts/imx6ull-14x14-evk.dts中配置pinctrl:
pinctrl_uart4: uart4grp {
fsl,pins = <
MX6UL_PAD_UART4_RX_DATA__UART4_DCE_RX 0x1b0b1
MX6UL_PAD_UART4_TX_DATA__UART4_DCE_TX 0x1b0b1
>;
};
去掉複用的pinctrl:
然後添加uart4節點標籤:
&uart4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart4>;
status = "okay";
};
在imx6ull.dtsi中改uart4的status屬性爲「okay」:
引腳位置:
測試/dev/ttymxc3,短接兩個引腳,出現以下結果正確:
在imx6ull芯片手冊查找到UART5對應的引腳爲
發送引腳IOMUXC_SW_MUX_CTL_PAD_UART5_TX_DATA0,
接收引腳IOMUXC_SW_MUX_CTL_PAD_UART5_RX_DATA ,經過反覆調試和翻手冊,需要更改imx6ul-pinfunc.h文件中的一個宏定義:
查找「 MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX」,因爲用的是i.MX6ULL,imx6ull芯片手冊中說明要複用爲串口5要選擇ALT0模式,即在指定寄存器寫」111」,轉化爲16進製爲0x7,所以在imx6ul-pinfunc.h中將「MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX」後面的0x5修改爲0x7,如果用的是i.MX6UL則保持0x5不動,如下圖:
在設備樹文件添加pinctrl:
pinctrl_uart5: uart5grp {
fsl,pins = <
MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX 0x1b0b1
MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX 0x1b0b1
>;
};
去掉引用這兩個引腳的pinctrl:
添加節點標籤:
在imx6ull.dtsi更改status屬性爲 」okay」:
兩個引腳位置:
執行 ./uart /dev/ttymxc4
打印出接收到的字符個數即成功。
在imx6ull芯片手冊中查找到UART6的引腳
IOMUXC_SW_MUX_CTL_PAD_CSI_MCLK和IOMUXC_SW_MUX_CTL_PAD_CSI_PIXCLK,
然後在imx6ull-14x14-evk.dts配置pinctrl:
pinctrl_uart6: uart6grp {
fsl,pins = <
MX6UL_PAD_CSI_MCLK__UART6_DCE_TX 0x1b0b1
MX6UL_PAD_CSI_PIXCLK__UART6_DCE_RX 0x1b0b1
>;
};
去掉佔用這兩個引腳的其他pinctrl,找到」pinctrl_csi1」,修改成如下圖:
添加節點:
在imx6ull.dtsi文件中修改uart6的status屬性:
兩個引腳對應的原理圖:
短接後測試: ./uart /dev/ttymxc5出現如下結果說明配置成功。
UART7和UART8的引腳與網絡接口複用,在目標板上調試時不能再用NFS掛載根文件系統。
UART7引腳爲:
IOMUXC_SW_MUX_CTL_PAD_ENET2_RX_EN,IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_DATA0,
然後根據imx6ul-pinfun.h添加pinctrl:
pinctrl_uart7: uart7grp {
fsl,pins = <
MX6UL_PAD_ENET2_RX_EN__UART7_DCE_TX 0x1b0b0
MX6UL_PAD_ENET2_TX_DATA0__UART7_DCE_RX 0x1b0b0
>;
};
然後查找使用這兩個引腳的pinctrl,註釋掉:
添加標籤:
在imx6ull.dtsi中更改status屬性爲「okay」。
對應的原理圖位置:
測試./uart /dev/ttymxc6
UART8使用的引腳爲:
IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_DATA1,IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_EN,
配置 pinctrl:
pinctrl_uart8: uart8grp {
fsl,pins = <
MX6UL_PAD_ENET2_TX_DATA1__UART8_DCE_TX 0x1b0b0
MX6UL_PAD_ENET2_TX_EN__UART8_DCE_RX 0x1b0b0
>;
};
註釋掉佔用這兩個引腳的pinctrl:
添加&uart8:
在imx6ull.dtsi更改status屬性爲「okay」:
原理圖位置:
測試節點爲/dev/ttymxc7測試方法和效果與uart2一樣。
在uboot階段把串口1設置成了調試串口,即uboot參數」console=ttymxc0」,爲了測試,我們將console參數設置爲null,這樣串口一不再打印 Linux終端信息。
首先修改腳本將測試程序設置成開機自啓動:
setenv console null
saveenv
更新設備樹,然後輸入boot啓動,內核啓動後會有如下顯示:
測試程序中發送串口每隔1s發送一次,PC終端軟件會將接收到的信息「hello world !」顯示出來,也可以使用串口調試軟件測試收發功能:
到此八路串口配置完成。