硬件平台:迅為i.MX6ULL開發板
本文轉自:<北京迅為i.mx6ull終結者開發板使用手冊-第九十一章>
1 文檔說明
本章節使用的資料已經放到了開發板網盤資料中,路徑為: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 UART2配置
以配置串口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_開發板原理圖\核心板原理圖),將兩個引腳短接,接收引腳得到數據后測試程序會打印接收到的字節個數,執行測試程序,引腳位置:
運行測試程序:
出現此結果說明引腳配置成功。
3 UART3配置
通過 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節點:
4 UART4配置
查找到 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,短接兩個引腳,出現以下結果正確:
5 UART5配置
在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
打印出接收到的字符個數即成功。
6 UART6配置
在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出現如下結果說明配置成功。
7 UART7配置
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
8 UART8配置
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一樣。
9 UART1使用方法
在uboot階段把串口1設置成了調試串口,即uboot參數”console=ttymxc0”,為了測試,我們將console參數設置為null,這樣串口一不再打印 Linux終端信息。
首先修改腳本將測試程序設置成開機自啟動:
setenv console null
saveenv
更新設備樹,然后輸入boot啟動,內核啟動后會有如下顯示:
測試程序中發送串口每隔1s發送一次,PC終端軟件會將接收到的信息“hello world !”顯示出來,也可以使用串口調試軟件測試收發功能:
到此八路串口配置完成。