AM3359多路串口支持

来源:互联网 发布:网络禁书大合集男主 编辑:程序博客网 时间:2024/06/07 11:48

AM3359共支持6路串口,我目前测试了前5路都是通的,第6路留作它用了,没有测试。配置只要涉及三个部分:

  1 引脚配置

  把对应引脚配成串口引脚。这里要注意在你的文件里查找,确认这个引脚没有被配成其它功能,否则的话使用的是最后被配置的功能,导致串口不通。

  2 时钟模块使能

  uart1-uart5使用的是L4HS提供的时钟,所以确保CM_PER_L4HS_CLKCTRL,CM_PER_L4HS_CLKSTCTRL这两个配置是使能的。这两个模块的上电复位值是使能了这个时钟模块的,如果关闭了,赋予上电复位默认值即可使能。然后分别初始化uart1-uart5这5个独立的时钟模块,如CM_PER_UART1_CLKCTRL,赋予2,使能时钟模块。这5各模块默认时钟是关闭的。

  3 串口控制寄存器的初始化

  我使用的是u-boot2011,如果是这个版本的,串口0是控制台是通的,仿照  串口0

 #define CONFIG_SYS_NS16550_COM1  0x44e09000    /* UART0  */  

   添加 支持串口1

  #define CONFIG_SYS_NS16550_COM20x48022000    /* UART1  */

 其它路类似,结果是不行的。程序实际只初始化了一路串口。这个可以通过查看串口0和其它路串口寄存器得到验证。

如果要支持多路串口初始化,必须添加

#define CONFIG_SERIAL_MULTI1

否则的话,只支持一路控制台的串口初始化。

但是加上 CONFIG_SERIAL_MULTI支持多路串口后,我的uboot编译不通过。提示arch/arm/cpu/armv7/omap-common下的spl.c中的serial_ini未定义。

这里先不追究这个问题。实际上串口控制器的初始化,可以在uboot里直接用命令行,把ns16550.c的NS16550_init()函数写成命令行,baud_divisor是16,因为初始化的控制器的时候我们会选择串口16x模式。

初始化之后向发送寄存器写个数据,可以用示波器从发送引脚测到。

  vxWorks串口支持

  vxWokrs里仿照串口0,添加对多路串口的支持。编译之后,运行,devs可以查看有对应的设备文件。但是仍然是不通的。vxWorks6.7里串口文件使用的是target/src/hwif/sio/vxbNs16550sio.c,这个文件的初始化函数较uboot的ns16550.c对MDR1寄存器的初始化。MDR1寄存器有个配置选项是设置接口为UART 16XMode。老的ns16550文件默认接口就是串口,不需要设置这个寄存器。而AM3359的串口模块是支持多模式的,也就是说这个模块即可以配置成串口也可以配成其它功能的接口,如SIRmode,FIR mode等。而上电复位之后的默认状态是disable这个模块的。所以如果使用的是老的ns16550文件,只需在初始化设备文件里给这个寄存器赋初值0即可。修改之后在target/src/hwif目录下 make CPU=ARMARCH6 TOOL=GNU重新编译vxbNs16550sio.c产生新的vxbNs16550sio.o库文件供vxWorks内核编译时调用即可。


  

0 0
原创粉丝点击