----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图如下:

ARM LINUX 扩展串口相关推荐

  1. ft4232树莓派linux扩展串口,如何实现STM32和树莓派串口透传?

    最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下: 第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信: 第二步:确保第一步成功后,将树莓派和STM32连接,进 ...

  2. ft4232树莓派linux扩展串口,树莓派Linux串口编程实现自发自收

    串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串 ...

  3. Arm Linux平台串口通信,二进制数据流

    项目需要通过串口传输音频数据,由于音频数据包含不可显示的字节,属于二进制数据流,因此需要对linux端的串口读取程序设定一些参数.完整的串口配置代码如下: int fd = open("/d ...

  4. arm linux串口控制led,通信程序设计 - Linux下ARM和单片机的串口通信设计

    3 通信程序设计 ARM 与单片机的串口通信程序包括两方面: 一方面是作为上位机的ARM 的串口通信程序,另一方面是作为下位机的单片机的串口通信程序.在通信之前必须制定合理的通信协议以保证通信的可靠性 ...

  5. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...

  6. linux设备驱动,tty串口编程 如何查看linux下串口是否可用?串口名称等

    如何查看linux下串口是否可用?串口名称等? http://zhidao.baidu.com/question/419148559.html 查看串口是否可用,可以对串口发送数据比如对com1口,e ...

  7. Booting ARM Linux

    原版英文文档位置: \linux-4.9.145\Documentation\arm\Booting 启动ARM Linux =================作者:Russell King 日期:2 ...

  8. ARM Linux 3.x的设备树(Device Tree)【转】

    转自:http://blog.csdn.net/21cnbao/article/details/8457546 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM Devi ...

  9. 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)

    在 arm 设备中串口是很常用的一个外设,不仅可以用来打印信息,还可以用于外接设备和其他传感器通信.根据不同的电平,串口分为 TTL 和 RS232,但是在Linux内核中的驱动程序是一样的,在串口上 ...

  10. Linux下串口编程遇 接收数据错误问题及原因

    近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一:另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二. 由于问题莫名其 ...

最新文章

  1. MySQL数据库左连接查询left join ... on
  2. java正则表达式及api_Java魔法堂:深入正则表达式API
  3. qt中label画圆代表指示灯_【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能...
  4. C#抽象类和抽象方法的特征和用途
  5. Linux 常见目录与区别
  6. C++ 友元(友元函数和友元类)
  7. 搞懂开源框架设计思想真的这么重要吗?终获offer
  8. Serverless 服务选型
  9. php for 每次增加2,php – 为什么foreach会将refcount增加2而不是1?
  10. mysql 5.7.11 压缩包安装办法遇到故障后彻底卸载办法
  11. Web Activities 简介
  12. SQL查询语句基本练习
  13. 00 - JavaScript 简介
  14. 计算机二级报考哪个科目比较好?
  15. windows便签快捷键_超级实用的Windows快捷键
  16. 微软又犯二了!WebApi中不支持MVC的OutputCache
  17. FFMPEG :resource temporarily unavailable
  18. Codeforces 887D - Ratings and Reality Shows
  19. 这些程序员常用快捷键你了解吗?让你的双手在键盘上起舞
  20. Domain Generalization数据集整理

热门文章

  1. Jetpack:Room超详细使用踩坑指南!
  2. 隐私泄露距离你我有多远?APP扩大个人隐私收集,增大隐私保护难度
  3. mac下面如何修改只读文件(Read-only file system)
  4. 牛客小白月赛1 F.三视图
  5. Error while obtaining start requests
  6. usr目录linux,linux系统/usr目录的意义与内容
  7. 那一年,我进传销了……(作者亲身经历)
  8. OSChina 周二乱弹 —— 我的手机指纹解锁和别人不一样
  9. Android动画全篇系列(二)——补间动画
  10. office2013安装与卸载