ARM LINUX 扩展串口

ARM LINUX 扩展串口

分类: 嵌入式

----XR21V1414 USB转串口

----16C554 总线扩展串口

不同的项目,有些项目经常需要转串口。有两种方式,一种用USB去扩,另一种用16C554 去扩。这两种从本质上来说,是一样的。成本上也不相上下。如果两种方式在项目设计中都可以的话,建议采用总线的方式。因为扩展串口总是会出现一些问题,没有原生串口好用。但总线方式相对来说问题更少,而USB扩串口,相信在PC机上就领略了它的脾气。


一、XR21V1414 USB转串口

USB 扩串口方案还是很多的。这里以我用过的XR21V1414为例。首先去官网上下载一个内核对应的驱动,我是采用Linux 2.6.18-3.4.x这种兼容模式的驱动。链接:

http://www.exar.com/common/content/default.aspx?id=10296

把驱动解压到drivers/usb/serial/ 下面,然后修改相应的Makefile ,Kconifg 就行了。这样就可以支持1410,1412,1414 ,分别是1路,2路,4路。如果usb 不够用的话,可以采用GL850G usb hub 去扩展,然后再接XR21V1414。


点击(此处)折叠或打开

  1. Makefile :
  2. obj-$(CONFIG_USB_SERIAL_EXAR_XR21V14XX) += vizzini.o
  3. Kconfig :
  4. config USB_SERIAL_EXAR_XR21V14XX
  5. tristate "USB serial exar xr21v14XX 4 Port Serial Driver"
  6. help
  7. Say Y here if you want to use 4 port usb to serial adapter.


二、16C554
总线扩展串口

总线扩展串口,16C55 系列比较常用,也比较好用,内核支持得很好了。这是一个古老的驱动。st16c554是一款集成了4路标准异步串行收发器的串口扩展芯片,它的操作方法和寄存器用法与8250完全相同,因此我们可以用linux内经典的8250驱动来驱动st16c554。


点击(此处)折叠或打开

  1. //定义好设备文件
  2. #include <linux/serial_8250.h>

  3. #define PORT(_base,_irq) \
  4. { //不是iobase,arm IO和MEMORY统一编址
  5. .mapbase = (unsigned long)_base, \
  6. .irq = _irq, \
  7. .uartclk = 115200*16, \
  8. .iotype = UPIO_MEM, \ // 表示8位读写
  9. .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_AUTO_IRQ , \
  10. .regshift = 1, \
  11. }


.mapbase指的是16C554的物理基地址,注意不是membase,iobase;.uartclk是16C554晶振的频率,其最高波特率为.uartclk/16;.iotype指的是访问类型,与硬件的连接相关,UPIO_MEM指的是8位总线连接,而UPIO_MEM32表示为32位总线访问方式,即访问16C554的寄存器时,读取32位数,取低8位;.regshift也跟硬件的物理连接相关,指的是访问16C554的每个地址时的偏移,也就是16C554的A0对应CPU的A几;


点击(此处)折叠或打开

  1. static struct plat_serial8250_port serial_8250_data[] = {
  2. PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 0)<<1))), gpio_to_irq(CPUNAME_GPIO33)),
  3. PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 8)<<1))), gpio_to_irq(CPUNAME_GPIO34)),
  4. PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 16)<<1))), gpio_to_irq(CPUNAME_GPIO35)),
  5. PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 24)<<1))), gpio_to_irq(CPUNAME_GPIO36)),

  6. {},
  7. };

  8. static struct platform_device serial_device = {
  9. .name = "serial8250",
  10. .id = 0,
  11. .dev = {
  12. .platform_data = serial_8250_data,
  13. },
  14. };


  15. //初始化设备与GPIO 口
  16. weim_cs_config(); //总线的初始化要在这之前完成

  17. gpio_request(CPUNAME_GPIO34, "34");
  18. gpio_direction_input(CPUNAME_GPIO34 );
  19. gpio_request(CPUNAME_GPIO35, "35");
  20. gpio_direction_input(CPUNAME_GPIO35 );
  21. gpio_request(CPUNAME_GPIO36, "36");
  22. gpio_direction_input(CPUNAME_GPIO36 );
  23. gpio_request(CPUNAME_GPIO33, "33");
  24. gpio_direction_input(CPUNAME_GPIO33 );
  25. platform_device_register(&serial_device); //注册设备


//driver/serial/ 下8250.c

在device driver/char/serial/ 下面
内核config图如下:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值