1. 程式人生 > >D-Chip i.mx6增加UART串列埠的步驟

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(327).

所以在board-mx6q_sabresd.c檔案開頭部分,要確保沒有出現IMX_GPIO_NR(327),如果有,請註釋掉。

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)在同一個檔案裡面進行重複的初始化。