Linux uart驱动及应用_第1页
Linux uart驱动及应用_第2页
Linux uart驱动及应用_第3页
Linux uart驱动及应用_第4页
Linux uart驱动及应用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

define TTY MAJOR4 define TTYAUX MAJOR5 Tty 终端设备的统称 一般分为 控制台 串口和 pty dev ttySn 串行端口终端 串口 串行端口被看做字符设备 4 66 设备号 devices platform serial8250 tty ttyS2 4 67 devices platform serial8250 tty ttyS3 4 68 devices platform serial8250 tty ttyS4 echo test dev ttyS2 可接串口来测试 ttyS2 Pty pseudo tty 虚拟 伪 终端 pts pseudo terminal slave 与 ptmx pseudo terminal master 配合使用实现 pty 打开一个伪 terminal 那么将会在 devpts 文件系统 dev pts 下创建一个对应的 pts 字符文件 通过 tty 命令 或者 who am i 查看当前终端 可以看出此伪 terminal 对应着 pts3 再打开一个伪 terminal 此伪 terminal 对应着 pts4 两个终端间传输信息 dev tty 就是当前使用的终端 设备号 5 0 tty 可以是 pts3 也可以是 tty1 控制台终端 控制台终端 tty0 代表当前使用的控制台终端 设备号 4 0 Ubuntu 下 图像界面下通过 Ctrl Alt F1 F6 可以切换到 tty1 到 tty6 Ctrl Alt F7 切会图像界面 Pts3 发送到 tty1 dev console 是指向当前 console 设备号 5 1 Tty 核心 struct tty driver alloc tty driver int lines struct tty driver driver driver kzalloc sizeof struct tty driver GFP KERNEL if driver kref init driver magic TTY DRIVER MAGIC driver num lines 次设备个数 later we ll move allocation of tables here return driver 分配一个结构体 tty driver 初始化其 magic num int tty register driver struct tty driver driver if driver flags if driver major error alloc chrdev region else dev MKDEV driver major driver minor start error register chrdev region dev driver num driver name 如果没有指定主设备号 则分配并注册 否则直接注册设备号 if p driver ttys struct tty struct p driver termios struct ktermios p driver num else driver ttys NULL driver termios NULL cdev init 初始化设备操作函数集 driver cdev owner driver owner error cdev add 注册字符设备 mutex lock list add 此 driver tty drivers 加到链表 tty drivers 上 mutex unlock if driver flags i num i d tty register device driver i NULL 如果没有指定 TTY DRIVER DYNAMIC DEV 则注册 tty 设备 在 sysfs 上建立相应的文件 proc tty register driver driver driver flags TTY DRIVER INSTALLED 标记为已安装 return 0 struct tty struct struct tty driver driver struct tty ldisc ldisc 下面分析一下 tty fops static const struct file operations tty fops llseek no llseek read tty read write tty write poll tty poll unlocked ioctl tty ioctl compat ioctl tty compat ioctl open tty open release tty release fasync tty fasync tty write do tty write tty ldisc ops write tty read tty ldisc ops read tty ldisc 在哪里赋值 在 tty open 里 tty open tty init dev initialize tty struct tty ldisc init 在 initialize tty struct 里还有 tty ops driver ops Tty 线路规程 void tty ldisc init struct tty struct tty struct tty ldisc ld tty ldisc get N TTY ldops tty ldiscs disc ld ops ldops tty ldisc assign tty ld tty ldisc ld 全局变量 tty ldiscs 在哪里赋值 start kernel console init tty ldisc begin tty register ldisc tty ldiscs disc tty ldisc N TTY struct tty ldisc ops tty ldisc N TTY magic TTY LDISC MAGIC name n tty open n tty open close n tty close flush buffer n tty flush buffer chars in buffer n tty chars in buffer read n tty read write n tty write ioctl n tty ioctl set termios n tty set termios poll n tty poll receive buf n tty receive buf write wakeup n tty write wakeup n tty write tty ops write 即 driver ops write n tty read 没有直接掉用下一层的 read 使用了 tty read buf 进行交互 Tty 驱动程序 struct uart driver struct uart state state struct tty driver tty driver uart register driver tty register driver int uart register driver struct uart driver drv drv state kzalloc sizeof struct uart state drv nr GFP KERNEL 分配 uart state 一个端口对应一个 normal alloc tty driver drv nr 分配 tty driver drv tty driver normal normal owner drv owner normal driver name drv driver name normal name drv dev name normal major drv major normal minor start drv minor normal type TTY DRIVER TYPE SERIAL normal subtype SERIAL TYPE NORMAL normal init termios tty std termios 安全设置值 参考 ddr3 P542 termios 结构 normal init termios c cflag B9600 CS8 CREAD HUPCL CLOCAL normal init termios c ispeed normal init termios c ospeed 9600 normal flags TTY DRIVER REAL RAW TTY DRIVER DYNAMIC DEV normal driver state drv tty set operations normal 里面执行了 uart driver tty driver ops uart ops Initialise the UART state s 初始化所有端口 uart state for i 0 i nr i struct uart state state drv state i struct tty port port tty port init port port ops port close delay 500 5 seconds port closing wait 30000 30 seconds tasklet init retval tty register driver normal uart add one port 注册一个 port 核心作用可以看做赋值了 uart port 其中包 含了最低层的操作函数集 struct uart port const struct uart ops ops uart write uart start uart start port ops start tx TI OMAP 分析 dra6xx init omap serial init omap serial init port omap serial init port 初始化了 uart 并赋值到 oh dev attr 注册了 omap uart 设备 在 serial omap init 注册了其驱动 static int init serial omap init void int ret ret uart register driver ret platform driver register 匹配成功调用 serial omap probe serial omap probe 调用 uart add one port 注册了端口 端口的操作函数集 serial omap pops 读 serial omap irq receive chars tty flip buffer push flush to ldisc disc ops receive buf 补充知识 线路规程是可以设置的 默认的就是 tty ldisc N TTY 下面看一个新的 先注册一个线路规程 就是加到全局变量 tty ldiscs 里 static int init serport init void int retval retval tty register ldisc N MOUSE 就是 tty ldiscs N MOUSE serport ldisc 应用层通过 ldisc N MOUSE if ioctl fd TIOCSETD ldisc 对应内核会调用 tty ioctl tiocsetd tty set ldisc 这样有什么用呢 例如 串口触摸屏 UART serport ldisc 修改线路规程 SERIO INPUT DEVICE EVENT 具体参考代码 serport c 注册新的线路规程 touchit213 c 注册 serio 驱动 需要注意的 Serio 设备是在 serport ldisc read 里面注册的 也就是在使用之前 必须先调用 read 一下 才会注册设备 然后 serio 才会匹配成功 匹配成功之后会调用其 connect 函数 在 connect 里面注册 input device 没有指定输入设备 event 使用通用的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论