作者:彭东林

邮箱: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终端相关推荐

  1. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  2. wince串口驱动分析(转)

    wince串口驱动分析 串行通讯接口主要是指UART(通用串行)和IRDA两种.通常的串行连接电气连接上有3wire和9wire两种.3wire的接线方式下定义了发送.接收和地三根连接.其用途就如名称 ...

  3. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  4. linux串口发送数据程序,linux串口驱动分析——发送数据

    一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...

  5. 由串口驱动分析rt-thread设备驱动框架

    内核对象管理框架简析 rt-thread中,线程.信号量.互斥锁.设备等等都是"内核对象",_object_container是一个数组,包含所有的内核对象信息. 对象信息的定义 ...

  6. ARM架构处理器MT6572的LK(可以理解为UBOOT)uart串口驱动分析【代码注释】

    提示:      分析注释的部分,一般都会字体加粗或设置为红色字体. 本文包含如下代码:       mediatek/platform/mt6572/lk/platform.c       medi ...

  7. LINUX串口驱动分析——发送数据

    https://www.cnblogs.com/51qianrushi/p/4324845.html

  8. 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本

    串口驱动分两阶段初始化 第一阶段  串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void)    ...

  9. 4412linux编写串口驱动,Tiny4412之串口(Uart)驱动编写

    一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...

最新文章

  1. 第2关:利用栈判断字符串括号是否匹配
  2. Linux Shell编程第四篇case语句
  3. HTML5 获得canvas油漆环境
  4. hdu 2019 数列有序!(c语言)
  5. 根据我4年Facebook营销经验,和大家聊聊做不好Facebook广告的原因!
  6. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?
  7. D3D自定义的设备丢失对象
  8. excel删除行 uipath_工作再忙,也要学会这10个最经典的Excel小技巧
  9. powershell excel 导入 sqlserver
  10. 数据驱动编程之表驱动法
  11. 利用不共线三点求解并联机构动系在定系中的位姿的另一种解法
  12. matlab悬臂梁有限元分析
  13. matlab矩阵特征值分解,矩阵特征值分解与奇异值分解含义解析及应用
  14. mysql 基础 红黑联盟_[转载]mysql日期加减 – mysql数据库栏目 – 红黑联盟
  15. MAC m1 node vue ui 编译项目时报错:node_modules/.bin/vue-cli-service: Permission denied 解决
  16. 【解决】阿拉伯语等右向左排版文字CSS解决方案
  17. 公众号文章留言评论功能开通方法(详解)
  18. zeppelin源码分析(0)——zeppelin要解决什么问题
  19. CSAPP Final Exam Preparation: reading solution records (2b continued)
  20. 水滴公司更名为水滴科技集团,王慧文担任监事

热门文章

  1. 六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate)...
  2. Object类-try-catch-finally-throw-throws-自定义异常
  3. PHP预定义常量DIRECTORY_SEPARATOR
  4. POJ 2075 Tangled in Cables
  5. Android相机的实现
  6. .NET开发人员必知的八个网站
  7. pythonprint()_python基础1 print()函数
  8. 假设一个随机性和因果性的双重态
  9. 用弹性振子力学系统方法计算一组反对角矩阵的质量和频率n+m=8
  10. 神经网络迭代次数的数学构成