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