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驱动开发】串口相关推荐

  1. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  2. 最全Linux驱动开发全流程详细解析(持续更新)

    Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...

  3. 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. 我要转行Linux驱动开发了,驱动开发的工作是什么样的情况,希望大神给点建议,也希望大家给我一点鼓励

    我刚大学毕业的时候是2010年,什么都不会,只会点c,后来介绍去做JavME,做了一年,后又做了一阵子Java企业级开发.感觉这不是我想要的工作,在这段时间里面,除了实际编程能力有了提高,其他的没学会 ...

  5. Linux驱动开发——串口设备驱动

    Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...

  6. 嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

    回顾下移远4G模块移植过程, 还是蛮简单的.一通百通,无论是其他4G模块都是一样的.这里记录下过程,分享给有需要的人.环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里 ...

  7. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  8. Linux驱动开发环境配置(内核源码树构造)

    来源:季义钦BLOG 作者:季义钦 初次接触Linux驱动程序开发,买了一本<Linux设备驱动程序>,第一件事当然就是构建开发环境了!!! 它上面有一个Hello World的列子: / ...

  9. linux驱动开发的经典书籍

    Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本 ...

  10. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

最新文章

  1. 安装搜狗输入法之后 Linux Mint 19.1 字体发虚解决方案
  2. python 时间序列分析之ARIMA(不使用第三方库)
  3. 宝山区佳力图服务器空调维修价格,成都佳力图空调维修师傅
  4. python需要联网运行吗_如何暂停在终端中运行的python脚本
  5. MySQL自定义查询字段排序
  6. es过滤指定数据 java_elasticsearch 结构化搜索_在案例中实战基于range filter来进行范围过滤...
  7. idea实现抽象类的所有抽象方法_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点
  8. Matlab Tricks(九)—— 矩阵行/列的增广(删除)
  9. Tomcat日志乱码问题解决方法
  10. 工业控制系统的体系架构
  11. 进程间的通信方式有哪些?
  12. 365 水壶问题(递归、数学-裴蜀定理)
  13. DS18B20测量温度
  14. 程序员直男也有的浪漫,快来给朋友制作一款定时微信推送服务吧
  15. 【CXY】JAVA基础 之 Runtime
  16. 十大优质外盘炒黄金平台排名
  17. java占位符填充_Java占位符
  18. python中pytest教程_Pytest安装新手详细教程
  19. 头条2019.3.16笔试题
  20. 堆排序算法(java实现)

热门文章

  1. Firefox Focus 9.0 将新增广告拦截插件
  2. CSDN-markdown编辑器语法——背景色
  3. 十五届恩智浦智能车杀青
  4. pwnable.tw dubblesort
  5. 平板计算机触摸屏失灵修复小技巧,触摸屏失灵有哪些修复小技巧?
  6. java实现格拉布斯准则_格拉布斯准则附件.pdf
  7. 常用 ASCII 码整理
  8. 海量数据排序问题一一 100G 数据,只有 100M 内存,怎么排序?
  9. 【论文笔记】—低光图像增强—Zero-reference—ZeroDCE—2020-CVPR
  10. python利用pyhive 连接hive