tiny4412 串口驱动分析九 --- shell终端
作者:彭东林
邮箱:pengdonglin137@163.com
开发板:tiny4412ADK+S700 4GB Flash
主机:Wind7 64位
虚拟机:Vmware+Ubuntu12_04
u-boot:U-Boot 2010.12
Linux内核版本:linux-3.0.31
Android版本:android-4.1.2
在上面我们知道了/dev/ttySACx是如何生成的,此外还可以看到在/dev下还有设备结点/dev/console,以及/dev/tty等设备结点。
可以看到向/dev/ttySAC0、/dev/console和/dev/tty输入字符,然后这些字符会输出到串口终端上:
但是如果使用adb shell登陆后,现象不同:
其中,左边的窗口是在adb shell下,右边的窗口是串口终端的显示,可以看到如果在adb shell下向 /dev/ttySAC0和 /dev/console下写入字符的话,这个字符并没有在adb shell终端下显示,相反却在串口终端中显示出来,当在adb shell终端下向/dev/tty下写入字符时,就在adb shell终端下显示出来了,并没有影响到串口终端的显示。
上面的这些现象背后的原因是什么呢?下面我们开始分析内核源码来解释。
首先需要知道这些设备结点是怎么生成的:
late_initcall(chr_dev_init);
---- tty_init() (drivers/tty/tty_io.c)
int __init tty_init(void) {cdev_init(&tty_cdev, &tty_fops);if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)panic("Couldn't register /dev/tty driver\n");device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");cdev_init(&console_cdev, &console_fops);if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)panic("Couldn't register /dev/console driver\n");consdev = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL,"console");if (IS_ERR(consdev))consdev = NULL;elseWARN_ON(device_create_file(consdev, &dev_attr_active) < 0);return 0; }
在这里会在/dev/下生成console和tty两个设备结点,他们对应的fops分别是tty_fops和console_fops。
在上面分析的tty_register_device函数会生成/dev/ttySACx,它对应的fops在函数tty_register_driver中设置为了tty_fops。所以这里的关键是分析tty_fops和console_fops是如何实现的。
对比发现,console_fops和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, };static const struct file_operations console_fops = {.llseek = no_llseek,.read = tty_read,.write = redirected_tty_write,.poll = tty_poll,.unlocked_ioctl = tty_ioctl,.compat_ioctl = tty_compat_ioctl,.open = tty_open,.release = tty_release,.fasync = tty_fasync, };
执行echo “peng” > /dev/ttySAC0的时候,会先调用tty_open然后调用tty_write,最后调用tty_release。
tiny4412 串口驱动分析九 --- shell终端相关推荐
- linux串口驱动分析
linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...
- wince串口驱动分析(转)
wince串口驱动分析 串行通讯接口主要是指UART(通用串行)和IRDA两种.通常的串行连接电气连接上有3wire和9wire两种.3wire的接线方式下定义了发送.接收和地三根连接.其用途就如名称 ...
- linux串口驱动分析【转】
转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...
- linux串口发送数据程序,linux串口驱动分析——发送数据
一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...
- 由串口驱动分析rt-thread设备驱动框架
内核对象管理框架简析 rt-thread中,线程.信号量.互斥锁.设备等等都是"内核对象",_object_container是一个数组,包含所有的内核对象信息. 对象信息的定义 ...
- ARM架构处理器MT6572的LK(可以理解为UBOOT)uart串口驱动分析【代码注释】
提示: 分析注释的部分,一般都会字体加粗或设置为红色字体. 本文包含如下代码: mediatek/platform/mt6572/lk/platform.c medi ...
- LINUX串口驱动分析——发送数据
https://www.cnblogs.com/51qianrushi/p/4324845.html
- 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本
串口驱动分两阶段初始化 第一阶段 串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void) ...
- 4412linux编写串口驱动,Tiny4412之串口(Uart)驱动编写
一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...
最新文章
- 第2关:利用栈判断字符串括号是否匹配
- Linux Shell编程第四篇case语句
- HTML5 获得canvas油漆环境
- hdu 2019 数列有序!(c语言)
- 根据我4年Facebook营销经验,和大家聊聊做不好Facebook广告的原因!
- main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?
- D3D自定义的设备丢失对象
- excel删除行 uipath_工作再忙,也要学会这10个最经典的Excel小技巧
- powershell excel 导入 sqlserver
- 数据驱动编程之表驱动法
- 利用不共线三点求解并联机构动系在定系中的位姿的另一种解法
- matlab悬臂梁有限元分析
- matlab矩阵特征值分解,矩阵特征值分解与奇异值分解含义解析及应用
- mysql 基础 红黑联盟_[转载]mysql日期加减 – mysql数据库栏目 – 红黑联盟
- MAC m1 node vue ui 编译项目时报错:node_modules/.bin/vue-cli-service: Permission denied 解决
- 【解决】阿拉伯语等右向左排版文字CSS解决方案
- 公众号文章留言评论功能开通方法(详解)
- zeppelin源码分析(0)——zeppelin要解决什么问题
- CSAPP Final Exam Preparation: reading solution records (2b continued)
- 水滴公司更名为水滴科技集团,王慧文担任监事
热门文章
- 六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate)...
- Object类-try-catch-finally-throw-throws-自定义异常
- PHP预定义常量DIRECTORY_SEPARATOR
- POJ 2075 Tangled in Cables
- Android相机的实现
- .NET开发人员必知的八个网站
- pythonprint()_python基础1 print()函数
- 假设一个随机性和因果性的双重态
- 用弹性振子力学系统方法计算一组反对角矩阵的质量和频率n+m=8
- 神经网络迭代次数的数学构成