NXP

D-Chip i.mx6增加UART串口的步骤

2019-07-12 13:12发布

              初次使用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)在同一个文件里面进行重复的初始化。