设为首页 收藏本站
查看: 838|回复: 0

[经验分享] tiny4412 串口驱动分析九

[复制链接]

尚未签到

发表于 2015-12-4 09:05:14 | 显示全部楼层 |阅读模式
  作者:彭东林
  邮箱: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;
else
WARN_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。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-147054-1-1.html 上篇帖子: Python在linux中输出带颜色的文字的方法 下篇帖子: 用Python抢枪过年的火车票
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表