为了实现串口通信,需要在嵌入式linux下编写相应的驱动程序。在嵌入式系统中,串口被看做终端设备tty。终端设备是unix体系中一个非常重要的对象,内容非常复杂,它是整个unix人机交互的基础,其地位并不亚于文件系统在操作系统中的作用。笔者muge0913在此对uart驱动进行整理。

本文章仅供技术交流请勿商用。转载请标明出处:http://blog.csdn.net/muge0913/article/details/7060254

一、串口概述

串口分为:同步传输(usrt)和异步传输(uart),其中异步传输是嵌入系统中最长用的通信设备,串口常被当做控制台使用。

①同步传输:发送端和接收端使用同一个时钟。其时序如下:

②异步传输:在数据传输过程中,接收时钟和发送时钟是不同步的,即在串行总线上并没有时钟线。

传输前有相应的起始位,然后紧接着发送数据位(5~8位有用户定义),最后是奇偶校验位和停止位。如图:

二、串口物理层连接问题

因为串口电缆有交叉和直连接之分,其接口有公头和母头之分,所以其连接有6中连接方式:

   ①两头公头的直线电缆

   ②两头母头的交叉线

   ③两头公头的交叉线

   ④两个母头的直线电缆

   ⑤一公头一母头的直线电缆

   ⑥一公头一母头的交叉线

在大多数的异步通信中不需要流的控制,所以3根线就能满座嵌入式设备通信的要求,但是为了保持兼容常常使用下面的连接方法:

三、arm11中的uart

①概述:

S3C6410X的UART提供四个独立的异步串行I / O(SIO)端口。异步串行I / O(SIO)端口,每个都可以在基于中断或基于DMA模式。换句话说,UART可以产生中断或DMA请求MEM和UART之间的数据传输。UART也可支持最大3Mbps的比特率。每个UART通道包含两个64字节的FIFO的接收和传输的。

②特点

四、寄存器配置(略请开发者阅读芯片资料和参考下列代码中的注释

五、驱动源码:

[cpp] view plaincopyprint?
  1. #include <linux/module.h>
  2. #include <linux/ioport.h>
  3. #include <linux/io.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/init.h>
  6. #include <linux/serial_core.h>
  7. #include <linux/serial.h>
  8. #include <asm/irq.h>
  9. #include <mach/hardware.h>
  10. #include <plat/regs-serial.h>
  11. #include "samsung.h"
  12. static int s3c6400_serial_setsource(struct uart_port *port,
  13. struct s3c24xx_uart_clksrc *clk)
  14. {
  15. unsigned long ucon = rd_regl(port, S3C2410_UCON);
  16. if (strcmp(clk->name, "uclk0") == 0) {
  17. ucon &= ~S3C6400_UCON_CLKMASK;
  18. ucon |= S3C6400_UCON_UCLK0;
  19. } else if (strcmp(clk->name, "uclk1") == 0)
  20. ucon |= S3C6400_UCON_UCLK1;
  21. else if (strcmp(clk->name, "pclk") == 0) {
  22. /* See notes about transitioning from UCLK to PCLK */
  23. ucon &= ~S3C6400_UCON_UCLK0;
  24. } else {
  25. printk(KERN_ERR "unknown clock source %s\n", clk->name);
  26. return -EINVAL;
  27. }
  28. wr_regl(port, S3C2410_UCON, ucon);
  29. return 0;
  30. }
  31. static int s3c6400_serial_getsource(struct uart_port *port,
  32. struct s3c24xx_uart_clksrc *clk)
  33. {
  34. u32 ucon = rd_regl(port, S3C2410_UCON);
  35. clk->divisor = 1;
  36. switch (ucon & S3C6400_UCON_CLKMASK) {
  37. case S3C6400_UCON_UCLK0:
  38. clk->name = "uclk0";
  39. break;
  40. case S3C6400_UCON_UCLK1:
  41. clk->name = "uclk1";
  42. break;
  43. case S3C6400_UCON_PCLK:
  44. case S3C6400_UCON_PCLK2:
  45. clk->name = "pclk";
  46. break;
  47. }
  48. return 0;
  49. }
  50. static int s3c6400_serial_resetport(struct uart_port *port,
  51. struct s3c2410_uartcfg *cfg)
  52. {
  53. unsigned long ucon = rd_regl(port, S3C2410_UCON);
  54. dbg("s3c6400_serial_resetport: port=%p (%08lx), cfg=%p\n",
  55. port, port->mapbase, cfg);
  56. /* ensure we don't change the clock settings... */
  57. ucon &= S3C6400_UCON_CLKMASK;
  58. wr_regl(port, S3C2410_UCON,  ucon | cfg->ucon);
  59. wr_regl(port, S3C2410_ULCON, cfg->ulcon);
  60. /* reset both fifos */
  61. wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
  62. wr_regl(port, S3C2410_UFCON, cfg->ufcon);
  63. return 0;
  64. }
  65. static struct s3c24xx_uart_info s3c6400_uart_inf = {
  66. .name       = "Samsung S3C6400 UART",
  67. .type       = PORT_S3C6400,
  68. .fifosize   = 64,
  69. .has_divslot    = 1,
  70. .rx_fifomask    = S3C2440_UFSTAT_RXMASK,
  71. .rx_fifoshift   = S3C2440_UFSTAT_RXSHIFT,
  72. .rx_fifofull    = S3C2440_UFSTAT_RXFULL,
  73. .tx_fifofull    = S3C2440_UFSTAT_TXFULL,
  74. .tx_fifomask    = S3C2440_UFSTAT_TXMASK,
  75. .tx_fifoshift   = S3C2440_UFSTAT_TXSHIFT,
  76. .get_clksrc = s3c6400_serial_getsource,
  77. .set_clksrc = s3c6400_serial_setsource,
  78. .reset_port = s3c6400_serial_resetport,
  79. };
  80. /* device management */
  81. static int s3c6400_serial_probe(struct platform_device *dev)
  82. {
  83. dbg("s3c6400_serial_probe: dev=%p\n", dev);
  84. return s3c24xx_serial_probe(dev, &s3c6400_uart_inf);
  85. }
  86. static struct platform_driver s3c6400_serial_driver = {
  87. .probe      = s3c6400_serial_probe,
  88. .remove     = __devexit_p(s3c24xx_serial_remove),
  89. .driver     = {
  90. .name   = "s3c6400-uart",
  91. .owner  = THIS_MODULE,
  92. },
  93. };
  94. s3c24xx_console_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
  95. static int __init s3c6400_serial_init(void)
  96. {
  97. return s3c24xx_serial_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
  98. }
  99. static void __exit s3c6400_serial_exit(void)
  100. {
  101. platform_driver_unregister(&s3c6400_serial_driver);
  102. }
  103. module_init(s3c6400_serial_init);
  104. module_exit(s3c6400_serial_exit);
  105. MODULE_AUTHOR("muge0913");
  106. MODULE_LICENSE("GPL v2");
  107. MODULE_ALIAS("platform:s3c6400-uart");

6410 实现 linux 串口驱动详解相关推荐

  1. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

  2. linux摄像头V4L2 subdev,linux 摄像头驱动 详解linux 摄像头驱动编写

    想了解详解linux 摄像头驱动编写的相关内容吗,feixiaoxing在本文为您仔细讲解linux 摄像头驱动的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,摄像头驱动,下面 ...

  3. linux GPIO驱动详解

    注意:在/arch/arm/mach-s3c2410/include/mach/gpio-fns.h源代码中有如下说明:  16/* These functions are in the to-be- ...

  4. qt linux 串口eventdriven,详解 Qt 串口通信程序全程图文 (1)

    Qt 串口通信程序全程图文 是本文介绍的内容,在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourc ...

  5. linux串口对调,Linux串口调试详解

    测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 目标机添加串口设备 一般嵌入式主板的默认镜像可能只配置了调试串口,并用于 consol ...

  6. linux下使用串口调试设备,Linux串口调试详解

    测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 目标机添加串口设备 一般嵌入式主板的默认镜像可能只配置了调试串口,并用于 consol ...

  7. linux串口配置详解

    参考 :https://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html 转载于:https://www.cnblogs.com/Ch ...

  8. Linux串口驱动(3) - open详解

    1. 用户空间open的操作实现 串口设备是被注册为字符设备的,在注册过程中填充了struct file_operations tty_fops结构体,该结构体中的成员open.read.write等 ...

  9. linux usb gadget驱动详解(一)

    由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...

最新文章

  1. fedora18 fedora17安装显卡驱动和网卡驱动
  2. windows服务autofac注入quartz任务
  3. java 流程控制篇 2021/02/26持续更新中
  4. 希捷扩展PCIe产品组合 推出两款新闪存加速卡
  5. Java开源项目Hibernate包作用详解
  6. 度量 数据突变_使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?
  7. 矢量的模 matlab,单模光纤基模色散曲线矢量分析的Matlab实现
  8. 计算机打印错误,打印机错误正在打印处理方法,教您电脑打印机错误正在打印处理方法...
  9. java snakeyaml_SnakeYaml快速入门和使用
  10. π型滤波频率计算_π型电感滤波电路计算
  11. 网站建设需要多少钱?与什么有关系?
  12. 优盘在计算机上无法显示,u盘在电脑上识别不出来怎么办_u盘在电脑不显示如何修复-win7之家...
  13. Destroying assets is not permitted to avoid data loss.解决思路
  14. 计算机中堆栈的应用举例,西门子S7-200PLC中涉及堆栈操作的指令和梯形图应用实例...
  15. 防火墙添加ip白名单_防火墙白名单设置方法firewalld
  16. 存储圈装逼必上TOP 10网站
  17. yeah邮箱功能测试
  18. OpenNI SDK 2.0
  19. 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版
  20. multiusb key找不到驱动程序_尤大-Vue中为什么不建议用index作为key?

热门文章

  1. 小米笔记本服务器系统,小米笔记本Pro GTX版
  2. ttf能改成gfont吗_一楼业主把半地下室窗户改成门,出来就是下沉式小花园,摊上事了...
  3. 微信windows版_刚刚微信内测更新!可以批量管理好友,太方便了
  4. 中3d库后接负载_什么是假负载?如何利用假负载维修变频器?
  5. Apache Flink 零基础入门(一):基础概念解析
  6. 二十八、电力窃漏电案例模型构建
  7. 警告!你的隐私正在被上亿网友围观偷看!
  8. Python小知识 | 这些技能你不会?(一)
  9. 又到 6 月底,想来和你聊一聊毕业季,愿你前程似锦!
  10. linux自动挂载usb光驱,Linux下使用Usbmount实现USB设备自动挂载