Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1173551
  • 博文数量: 105
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 962
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-29 15:22
文章分类

全部博文(105)

文章存档

2021年(1)

2019年(3)

2018年(1)

2017年(11)

2016年(47)

2015年(32)

2014年(4)

2012年(6)

我的朋友

分类: 嵌入式

2015-06-24 09:56:35

                                                ----XR21V1414 USB转串口  

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

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

  
一、XR21V1414 USB转串口

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

把驱动解压到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图如下:



阅读(12281) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~