D-Chip i.mx6增加UART串列埠的步驟
初次使用i.MX6進行專案開發的時候,對於很多人來說就是找不到BSP對應原始碼檔案的位置,下面使用怎麼新增UART串列埠的步驟,對這些比較重要的BSP檔案進行講解,如果需要新增其他裝置或者介面,一下方法也可以作為參考。(測試的專案板子為珠海鼎芯的i.MX6開發板)
IMX6一共支援5個UART,下面對如何在軟體上初始化這5個UART的方法進行舉例說明:
1. 初始化UART口涉及到3個檔案:
(1) arch/arm/mach-mx6/board-mx6q_sabresd.h此檔案用來定義初始化IMX6對應需要用到的IO口的功能。
(2) arch/arm/mach-mx6/board-mx6q_sabresd.c此檔案為IMX6的板級初始化文化,UART也在此檔案進行初始化,預設已經初始化了UART1和UART3.
(3) arch/arm/plat-mxc/include/mach/iomux-mx6q.h此檔案為IMX6所有IO及其每個IO所有功能的定義集合,使用者可通過此檔案來查詢某個IO的功能定義。
2. 對board-mx6q_sabresd.h檔案的修改
在iomux_v3_cfg_t mx6q_sabresd_pads中已經對UART1和UART3進行了定義:
MX6Q_PAD_CSI0_DAT10__UART1_TXD,
MX6Q_PAD_CSI0_DAT11__UART1_RXD,
MX6Q_PAD_EIM_D24__UART3_TXD,
MX6Q_PAD_EIM_D25__UART3_RXD,
下面舉例說明增加UART2的定義,以接受腳RXD為例:
(1) 在iomux-mx6q.h中搜索uart2(使用sourceinsight搜尋原始碼):
此為部分搜尋的結果。
(2) 對照核心板原理圖UART2的接收腳為管腳EIM_D27,對照搜尋結果可得到UART2的接收腳為MX6Q_PAD_EIM_D27__UART2_RXD,對應此管腳功能有如下:
可以看到uart功能只是EIM_D27此管腳的其中一種功能。
(3) 把MX6Q_PAD_EIM_D27__UART2_RXD此定義新增到
iomux_v3_cfg_t mx6q_sabresd_pads中,如下:
static iomux_v3_cfg_t mx6q_sabresd_pads[] ={
/*AUDMUX */
············
············
MX6Q_PAD_CSI0_DAT10__UART1_TXD,
MX6Q_PAD_CSI0_DAT11__UART1_RXD,
MX6Q_PAD_EIM_D27__UART2_RXD,
MX6Q_PAD_EIM_D24__UART3_TXD,
MX6Q_PAD_EIM_D25__UART3_RXD,
`·················
};
(4) 同理可以得到UART2的其他管腳對應定義,下面為UART2對應所有管腳定義:
MX6Q_PAD_EIM_D26__UART2_TXD,
MX6Q_PAD_EIM_D27__UART2_RXD,
MX6Q_PAD_EIM_D28__UART2_CTS,
MX6Q_PAD_EIM_D29__UART2_RTS,
都增加到iomux_v3_cfg_t mx6q_sabresd_pads中。
(5) 確保在board-mx6q_sabresd.h中沒有把EIM_D27定義成其他功能,比如
MX6Q_PAD_EIM_D27__GPIO_3_27,如果有請註釋掉。UART2的其他3種功能引腳也是一樣,確保對應IMX6的管腳只進行了一種功能定義。
3. 對board-mx6q_sabresd.c檔案的修改
(1) 在此檔案開始,會對IMX6定義成普通IO,也就是GPIO的引腳進行再定義,如下圖:
IMX_GPIO_NR(,)這個用來定義IMX6管腳為GPIO,
如果把UART2的RXD腳,也就是EIM_D27管腳定義為GPIO,對應iomux-mx6q.h中的定義為MX6Q_PAD_EIM_D27__GPIO_3_27,則在這個檔案中定義為IMX_GPIO_NR(3,27).
所以在board-mx6q_sabresd.c檔案開頭部分,要確保沒有出現IMX_GPIO_NR(3,27),如果有,請註釋掉。
EIM_D27已經定義為UART接收功能,不能再次同時定義為GPIO的功能。
對應UART2的其他引腳也是一樣,確保在這裡沒有給定義為GPIO
(2) 增加對uart2的初始化。
Board-mx6q_sabresd.c中初始化uart函式為:
如圖,此函式已經對UART1和UART2進行了初始化,
imx6q_add_imx_uart(0, NULL);對應UART1
imx6q_add_imx_uart(2, NULL);對應UART3
在這個函式增加對UART2的初始化,為:
static inline voidmx6q_sabresd_init_uart(void)
{
imx6q_add_imx_uart(2,NULL);
imx6q_add_imx_uart(1, NULL);
imx6q_add_imx_uart(0,NULL);
}
(3) 確保在此檔案中沒有其他地方對uart的初始化
做完以上步驟,軟體中對UART2的初始化就完成了。
如想新增對其他UART的支援,可按照以上方法來進行。
注:1.一定要確保IO口功能定義的唯一性,就是一次只能定義一種功能
2.確保初始化的唯一性,不要對同一個功能(如UART2)在同一個檔案裡面進行重複的初始化。