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。
点击(此处)折叠或打开
- 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图如下:
ARM LINUX 扩展串口相关推荐
- ft4232树莓派linux扩展串口,如何实现STM32和树莓派串口透传?
最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下: 第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信: 第二步:确保第一步成功后,将树莓派和STM32连接,进 ...
- ft4232树莓派linux扩展串口,树莓派Linux串口编程实现自发自收
串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串 ...
- Arm Linux平台串口通信,二进制数据流
项目需要通过串口传输音频数据,由于音频数据包含不可显示的字节,属于二进制数据流,因此需要对linux端的串口读取程序设定一些参数.完整的串口配置代码如下: int fd = open("/d ...
- arm linux串口控制led,通信程序设计 - Linux下ARM和单片机的串口通信设计
3 通信程序设计 ARM 与单片机的串口通信程序包括两方面: 一方面是作为上位机的ARM 的串口通信程序,另一方面是作为下位机的单片机的串口通信程序.在通信之前必须制定合理的通信协议以保证通信的可靠性 ...
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...
- linux设备驱动,tty串口编程 如何查看linux下串口是否可用?串口名称等
如何查看linux下串口是否可用?串口名称等? http://zhidao.baidu.com/question/419148559.html 查看串口是否可用,可以对串口发送数据比如对com1口,e ...
- Booting ARM Linux
原版英文文档位置: \linux-4.9.145\Documentation\arm\Booting 启动ARM Linux =================作者:Russell King 日期:2 ...
- ARM Linux 3.x的设备树(Device Tree)【转】
转自:http://blog.csdn.net/21cnbao/article/details/8457546 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM Devi ...
- 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)
在 arm 设备中串口是很常用的一个外设,不仅可以用来打印信息,还可以用于外接设备和其他传感器通信.根据不同的电平,串口分为 TTL 和 RS232,但是在Linux内核中的驱动程序是一样的,在串口上 ...
- Linux下串口编程遇 接收数据错误问题及原因
近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一:另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二. 由于问题莫名其 ...
最新文章
- MySQL数据库左连接查询left join ... on
- java正则表达式及api_Java魔法堂:深入正则表达式API
- qt中label画圆代表指示灯_【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能...
- C#抽象类和抽象方法的特征和用途
- Linux 常见目录与区别
- C++ 友元(友元函数和友元类)
- 搞懂开源框架设计思想真的这么重要吗?终获offer
- Serverless 服务选型
- php for 每次增加2,php – 为什么foreach会将refcount增加2而不是1?
- mysql 5.7.11 压缩包安装办法遇到故障后彻底卸载办法
- Web Activities 简介
- SQL查询语句基本练习
- 00 - JavaScript 简介
- 计算机二级报考哪个科目比较好?
- windows便签快捷键_超级实用的Windows快捷键
- 微软又犯二了!WebApi中不支持MVC的OutputCache
- FFMPEG :resource temporarily unavailable
- Codeforces 887D - Ratings and Reality Shows
- 这些程序员常用快捷键你了解吗?让你的双手在键盘上起舞
- Domain Generalization数据集整理