6410 实现 linux 串口驱动详解
为了实现串口通信,需要在嵌入式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的接收和传输的。
②特点
四、寄存器配置(略请开发者阅读芯片资料和参考下列代码中的注释)
五、驱动源码:
- #include <linux/module.h>
- #include <linux/ioport.h>
- #include <linux/io.h>
- #include <linux/platform_device.h>
- #include <linux/init.h>
- #include <linux/serial_core.h>
- #include <linux/serial.h>
- #include <asm/irq.h>
- #include <mach/hardware.h>
- #include <plat/regs-serial.h>
- #include "samsung.h"
- static int s3c6400_serial_setsource(struct uart_port *port,
- struct s3c24xx_uart_clksrc *clk)
- {
- unsigned long ucon = rd_regl(port, S3C2410_UCON);
- if (strcmp(clk->name, "uclk0") == 0) {
- ucon &= ~S3C6400_UCON_CLKMASK;
- ucon |= S3C6400_UCON_UCLK0;
- } else if (strcmp(clk->name, "uclk1") == 0)
- ucon |= S3C6400_UCON_UCLK1;
- else if (strcmp(clk->name, "pclk") == 0) {
- /* See notes about transitioning from UCLK to PCLK */
- ucon &= ~S3C6400_UCON_UCLK0;
- } else {
- printk(KERN_ERR "unknown clock source %s\n", clk->name);
- return -EINVAL;
- }
- wr_regl(port, S3C2410_UCON, ucon);
- return 0;
- }
- static int s3c6400_serial_getsource(struct uart_port *port,
- struct s3c24xx_uart_clksrc *clk)
- {
- u32 ucon = rd_regl(port, S3C2410_UCON);
- clk->divisor = 1;
- switch (ucon & S3C6400_UCON_CLKMASK) {
- case S3C6400_UCON_UCLK0:
- clk->name = "uclk0";
- break;
- case S3C6400_UCON_UCLK1:
- clk->name = "uclk1";
- break;
- case S3C6400_UCON_PCLK:
- case S3C6400_UCON_PCLK2:
- clk->name = "pclk";
- break;
- }
- return 0;
- }
- static int s3c6400_serial_resetport(struct uart_port *port,
- struct s3c2410_uartcfg *cfg)
- {
- unsigned long ucon = rd_regl(port, S3C2410_UCON);
- dbg("s3c6400_serial_resetport: port=%p (%08lx), cfg=%p\n",
- port, port->mapbase, cfg);
- /* ensure we don't change the clock settings... */
- ucon &= S3C6400_UCON_CLKMASK;
- wr_regl(port, S3C2410_UCON, ucon | cfg->ucon);
- wr_regl(port, S3C2410_ULCON, cfg->ulcon);
- /* reset both fifos */
- wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
- wr_regl(port, S3C2410_UFCON, cfg->ufcon);
- return 0;
- }
- static struct s3c24xx_uart_info s3c6400_uart_inf = {
- .name = "Samsung S3C6400 UART",
- .type = PORT_S3C6400,
- .fifosize = 64,
- .has_divslot = 1,
- .rx_fifomask = S3C2440_UFSTAT_RXMASK,
- .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT,
- .rx_fifofull = S3C2440_UFSTAT_RXFULL,
- .tx_fifofull = S3C2440_UFSTAT_TXFULL,
- .tx_fifomask = S3C2440_UFSTAT_TXMASK,
- .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT,
- .get_clksrc = s3c6400_serial_getsource,
- .set_clksrc = s3c6400_serial_setsource,
- .reset_port = s3c6400_serial_resetport,
- };
- /* device management */
- static int s3c6400_serial_probe(struct platform_device *dev)
- {
- dbg("s3c6400_serial_probe: dev=%p\n", dev);
- return s3c24xx_serial_probe(dev, &s3c6400_uart_inf);
- }
- static struct platform_driver s3c6400_serial_driver = {
- .probe = s3c6400_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
- .name = "s3c6400-uart",
- .owner = THIS_MODULE,
- },
- };
- s3c24xx_console_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
- static int __init s3c6400_serial_init(void)
- {
- return s3c24xx_serial_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
- }
- static void __exit s3c6400_serial_exit(void)
- {
- platform_driver_unregister(&s3c6400_serial_driver);
- }
- module_init(s3c6400_serial_init);
- module_exit(s3c6400_serial_exit);
- MODULE_AUTHOR("muge0913");
- MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:s3c6400-uart");
6410 实现 linux 串口驱动详解相关推荐
- Linux串口编程详解
Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...
- linux摄像头V4L2 subdev,linux 摄像头驱动 详解linux 摄像头驱动编写
想了解详解linux 摄像头驱动编写的相关内容吗,feixiaoxing在本文为您仔细讲解linux 摄像头驱动的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,摄像头驱动,下面 ...
- linux GPIO驱动详解
注意:在/arch/arm/mach-s3c2410/include/mach/gpio-fns.h源代码中有如下说明: 16/* These functions are in the to-be- ...
- qt linux 串口eventdriven,详解 Qt 串口通信程序全程图文 (1)
Qt 串口通信程序全程图文 是本文介绍的内容,在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourc ...
- linux串口对调,Linux串口调试详解
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 目标机添加串口设备 一般嵌入式主板的默认镜像可能只配置了调试串口,并用于 consol ...
- linux下使用串口调试设备,Linux串口调试详解
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 目标机添加串口设备 一般嵌入式主板的默认镜像可能只配置了调试串口,并用于 consol ...
- linux串口配置详解
参考 :https://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html 转载于:https://www.cnblogs.com/Ch ...
- Linux串口驱动(3) - open详解
1. 用户空间open的操作实现 串口设备是被注册为字符设备的,在注册过程中填充了struct file_operations tty_fops结构体,该结构体中的成员open.read.write等 ...
- linux usb gadget驱动详解(一)
由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...
最新文章
- fedora18 fedora17安装显卡驱动和网卡驱动
- windows服务autofac注入quartz任务
- java 流程控制篇 2021/02/26持续更新中
- 希捷扩展PCIe产品组合 推出两款新闪存加速卡
- Java开源项目Hibernate包作用详解
- 度量 数据突变_使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?
- 矢量的模 matlab,单模光纤基模色散曲线矢量分析的Matlab实现
- 计算机打印错误,打印机错误正在打印处理方法,教您电脑打印机错误正在打印处理方法...
- java snakeyaml_SnakeYaml快速入门和使用
- π型滤波频率计算_π型电感滤波电路计算
- 网站建设需要多少钱?与什么有关系?
- 优盘在计算机上无法显示,u盘在电脑上识别不出来怎么办_u盘在电脑不显示如何修复-win7之家...
- Destroying assets is not permitted to avoid data loss.解决思路
- 计算机中堆栈的应用举例,西门子S7-200PLC中涉及堆栈操作的指令和梯形图应用实例...
- 防火墙添加ip白名单_防火墙白名单设置方法firewalld
- 存储圈装逼必上TOP 10网站
- yeah邮箱功能测试
- OpenNI SDK 2.0
- 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版
- multiusb key找不到驱动程序_尤大-Vue中为什么不建议用index作为key?
热门文章
- 小米笔记本服务器系统,小米笔记本Pro GTX版
- ttf能改成gfont吗_一楼业主把半地下室窗户改成门,出来就是下沉式小花园,摊上事了...
- 微信windows版_刚刚微信内测更新!可以批量管理好友,太方便了
- 中3d库后接负载_什么是假负载?如何利用假负载维修变频器?
- Apache Flink 零基础入门(一):基础概念解析
- 二十八、电力窃漏电案例模型构建
- 警告!你的隐私正在被上亿网友围观偷看!
- Python小知识 | 这些技能你不会?(一)
- 又到 6 月底,想来和你聊一聊毕业季,愿你前程似锦!
- linux自动挂载usb光驱,Linux下使用Usbmount实现USB设备自动挂载