【Linux驱动开发】串口
UART驱动
串口驱动框架由SOC原厂编写,只需要在设备树中添加使用的串口节点信息,系统启动后,串口设备和驱动匹配成功,生成/dev/ttymxcX(X=0,1,2...)文件。UART驱动程序本质是一个platform驱动
Linux定义uart_driver结构体表示UART驱动,include/linux/serial_core.h。
struct uart_driver {struct module *owner;const char *driver_name; /* 驱动名 */const char *dev_name; /* 设备名 */int major; /* 主设备号 */int minor; /* 次设备号 */int nr; /* 设备数 */struct console *cons; /* 控制台 *//** these are private; the low level driver should not* touch these; they should be initialised to NULL*/struct uart_state *state;struct tty_driver *tty_driver;
};
使用uart_register_driver注册uart_driver。
int uart_register_driver(struct uart_driver *drv)
- drv:要注册的uart_driver。
- 返回值:0,成功;负值,失败。
使用uart_unregister_driver注销uart_driver。
void uart_unregister_driver(struct uart_driver *drv)
- drv:要注销的uart_driver。
- 返回值:无。
uart_port结构体表示一个具体的port端口,include/linux/serial_core.h。其中
struct uart_port {/* ... */const struct uart_ops *ops;/* ... */
};struct uart_ops {unsigned int (*tx_empty)(struct uart_port *);void (*set_mctrl)(struct uart_port *, unsigned int mctrl);unsigned int (*get_mctrl)(struct uart_port *);void (*stop_tx)(struct uart_port *);void (*start_tx)(struct uart_port *);void (*throttle)(struct uart_port *);void (*unthrottle)(struct uart_port *);void (*send_xchar)(struct uart_port *, char ch);void (*stop_rx)(struct uart_port *);void (*enable_ms)(struct uart_port *);void (*break_ctl)(struct uart_port *, int ctl);int (*startup)(struct uart_port *);void (*shutdown)(struct uart_port *);void (*flush_buffer)(struct uart_port *);void (*set_termios)(struct uart_port *, struct ktermios *new,struct ktermios *old);void (*set_ldisc)(struct uart_port *, struct ktermios *);void (*pm)(struct uart_port *, unsigned int state,unsigned int oldstate);/** Return a string describing the type of the port*/const char *(*type)(struct uart_port *);/** Release IO and memory resources used by the port.* This includes iounmap if necessary.*/void (*release_port)(struct uart_port *);/** Request IO and memory resources used by the port.* This includes iomapping the port if necessary.*/int (*request_port)(struct uart_port *);void (*config_port)(struct uart_port *, int);int (*verify_port)(struct uart_port *, struct serial_struct *);int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
#ifdef CONFIG_CONSOLE_POLLint (*poll_init)(struct uart_port *);void (*poll_put_char)(struct uart_port *, unsigned char);int (*poll_get_char)(struct uart_port *);
#endif
};
const struct uart_ops *ops;包含UART具体驱动函数,Linux系统收发数据都是调用ops中的函数。uart_ops结构体中函数具体含义在Documentation/serial/driver文档查看。
使用uart_add_one_port将uart_port添加到uart_driver中。
int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
- drv:uart_driver。
- uport:要添加到uart_driver中的port。
- 返回值:0,成功;负值,失败。
使用uart_remove_one_port将uart_port从uart_driver移除。
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
- drv:uart_driver。
- uport:要从uart_driver卸载的port。
- 返回值:0,成功;负值,失败。
【Linux驱动开发】串口相关推荐
- 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 最全Linux驱动开发全流程详细解析(持续更新)
Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...
- 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 我要转行Linux驱动开发了,驱动开发的工作是什么样的情况,希望大神给点建议,也希望大家给我一点鼓励
我刚大学毕业的时候是2010年,什么都不会,只会点c,后来介绍去做JavME,做了一年,后又做了一阵子Java企业级开发.感觉这不是我想要的工作,在这段时间里面,除了实际编程能力有了提高,其他的没学会 ...
- Linux驱动开发——串口设备驱动
Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...
- 嵌入式linux驱动开发之移远4G模块EC800驱动移植指南
回顾下移远4G模块移植过程, 还是蛮简单的.一通百通,无论是其他4G模块都是一样的.这里记录下过程,分享给有需要的人.环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Linux驱动开发环境配置(内核源码树构造)
来源:季义钦BLOG 作者:季义钦 初次接触Linux驱动程序开发,买了一本<Linux设备驱动程序>,第一件事当然就是构建开发环境了!!! 它上面有一个Hello World的列子: / ...
- linux驱动开发的经典书籍
Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
最新文章
- 安装搜狗输入法之后 Linux Mint 19.1 字体发虚解决方案
- python 时间序列分析之ARIMA(不使用第三方库)
- 宝山区佳力图服务器空调维修价格,成都佳力图空调维修师傅
- python需要联网运行吗_如何暂停在终端中运行的python脚本
- MySQL自定义查询字段排序
- es过滤指定数据 java_elasticsearch 结构化搜索_在案例中实战基于range filter来进行范围过滤...
- idea实现抽象类的所有抽象方法_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点
- Matlab Tricks(九)—— 矩阵行/列的增广(删除)
- Tomcat日志乱码问题解决方法
- 工业控制系统的体系架构
- 进程间的通信方式有哪些?
- 365 水壶问题(递归、数学-裴蜀定理)
- DS18B20测量温度
- 程序员直男也有的浪漫,快来给朋友制作一款定时微信推送服务吧
- 【CXY】JAVA基础 之 Runtime
- 十大优质外盘炒黄金平台排名
- java占位符填充_Java占位符
- python中pytest教程_Pytest安装新手详细教程
- 头条2019.3.16笔试题
- 堆排序算法(java实现)