----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。
-
Makefile :
-
obj-$(CONFIG_USB_SERIAL_EXAR_XR21V14XX) += vizzini.o
-
Kconfig :
-
config USB_SERIAL_EXAR_XR21V14XX
-
tristate "USB serial exar xr21v14XX 4 Port Serial Driver"
-
help
-
Say Y here if you want to use 4 port usb to serial adapter.
二、16C554 总线扩展串口
总线扩展串口,16C55 系列比较常用,也比较好用,内核支持得很好了。这是一个古老的驱动。st16c554是一款集成了4路标准异步串行收发器的串口扩展芯片,它的操作方法和寄存器用法与8250完全相同,因此我们可以用linux内经典的8250驱动来驱动st16c554。
-
//定义好设备文件
-
#include <linux/serial_8250.h>
-
-
#define PORT(_base,_irq) \
-
{ //不是iobase,arm IO和MEMORY统一编址
-
.mapbase = (unsigned long)_base, \
-
.irq = _irq, \
-
.uartclk = 115200*16, \
-
.iotype = UPIO_MEM, \ // 表示8位读写
-
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_AUTO_IRQ , \
-
.regshift = 1, \
-
}
.mapbase指的是16C554的物理基地址,注意不是membase,iobase;.uartclk是16C554晶振的频率,其最高波特率为.uartclk/16;.iotype指的是访问类型,与硬件的连接相关,UPIO_MEM指的是8位总线连接,而UPIO_MEM32表示为32位总线访问方式,即访问16C554的寄存器时,读取32位数,取低8位;.regshift也跟硬件的物理连接相关,指的是访问16C554的每个地址时的偏移,也就是16C554的A0对应CPU的A几;
-
static struct plat_serial8250_port serial_8250_data[] = {
-
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 0)<<1))), gpio_to_irq(CPUNAME_GPIO33)),
-
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 8)<<1))), gpio_to_irq(CPUNAME_GPIO34)),
-
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 16)<<1))), gpio_to_irq(CPUNAME_GPIO35)),
-
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 24)<<1))), gpio_to_irq(CPUNAME_GPIO36)),
-
-
{},
-
};
-
-
static struct platform_device serial_device = {
-
.name = "serial8250",
-
.id = 0,
-
.dev = {
-
.platform_data = serial_8250_data,
-
},
-
};
-
-
-
//初始化设备与GPIO 口
-
weim_cs_config(); //总线的初始化要在这之前完成
-
-
gpio_request(CPUNAME_GPIO34, "34");
-
gpio_direction_input(CPUNAME_GPIO34 );
-
gpio_request(CPUNAME_GPIO35, "35");
-
gpio_direction_input(CPUNAME_GPIO35 );
-
gpio_request(CPUNAME_GPIO36, "36");
-
gpio_direction_input(CPUNAME_GPIO36 );
-
gpio_request(CPUNAME_GPIO33, "33");
-
gpio_direction_input(CPUNAME_GPIO33 );
-
platform_device_register(&serial_device); //注册设备
//driver/serial/ 下8250.c
在device driver/char/serial/ 下面
内核config图如下:
阅读(1600) | 评论(0) | 转发(0) |