嵌入式Linux之串口驱动结构

串口驱动相关数据结构

struct uart_driver;		//串口驱动结构
struct uart_port;		//端口结构,串口驱动只有一个,端口却有多个,一个端口对应一个实际的串口
struct uart_ops;		//函数操作集
struct uart_state;		//状态结构
struct uart_info;		//串口信息结构

数据结构详细介绍进此:http://www.cnblogs.com/hello2mhb/p/3341291.html


(一)初始化串口流程

         ~~~~~~~~         《samsung.c》文件中对串口进行了初始化。

  1. 注册:uart_register_driver
  2. 初始化:
    2.1 取出uart_port
    2.2 初始化uart_port:获取硬件地址->获取中断编号->复位串口FIFO
    2.3 添加端口(串口):uart_add_one_port
    2.4 创建属性文件:device_create_file,在/sys目录下创建相应的属性文件
    2.5 初始化动态频率调节:s3c24xx_serial_cpufreq_register

(二)打开设备流程

         ~~~~~~~~         《samsung.c》文件中: s3c24xx_serial_startup对串口进行了打开。

  1. 使能接收:rx_enabled
  2. 注册接收中断:request_irq
  3. 使能发送:tx_enabled
  4. 注册发送中断:request_irq

(三)数据发送流程

         ~~~~~~~~         读写数据会用到循环缓冲,在uart_write函数中将用户的数据写入到循环缓冲中,在s3c24xx_serial_tx_chars,函数中将循环缓冲中的数据写入到寄存器。

《tty_io.c》文件中如下定义:

static ssize_t tty_write(struct file *file, const char __user *buf,
						size_t count, loff_t *ppos)

函数调用流程:

tty_write ——> do_tty_write ——> copy_from_user  /*通过此调用流程完成写数据操作*/

串口发送数据中断处理函数:s3c24xx_serial_tx_chars

  1. 先发送一个标志,相当于串口和PC的通知,例如串口询问PC是否可以开始发送,PC回应我现在有数据而且还没处理完,你先等等。
    这里写图片描述

  2. 判断循环缓冲或者串口状态是否可以发送
    这里写图片描述

  3. 利用循环缓冲写入数据,一次中断最多发送256个字符(count=256)
    这里写图片描述
    3.1 判断发送FIFO时候是空的
    3.2 如果FIFO为空,从循环缓冲中取出数据开始写入,否则退出写入
    3.3 调整循环缓冲的位置

  4. 计算循环缓冲数据量,如果循环缓冲中的数据低于某个数量(这里是256),通知应用程序可再次往串口写入。(就是唤醒之前发送时阻塞的进程)
    这里写图片描述

  5. 判断循环缓冲的数据,如果为空,关闭发送中断
    这里写图片描述


(四)数据接收流程

串口接收数据中断处理函数:s3c24xx_serial_rx_chars
  ~  

  1. 读取寄存器
    这里写图片描述
  2. 检测FIFO数据量,如果为0,退出读取
    这里写图片描述
  3. 读取寄存器UERSTAT,从URXH,读取接收到的字符
    这里写图片描述
  4. 流控
    这里写图片描述
  5. 根据UERSTAT寄存器记录错误类型
  6. 如果收到sysrq字符,进行特殊处理
  7. 将接收到的字符送入串口驱动
  8. 把串口驱动收到的数据送入线路规程

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觉皇嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值