• Linux 串口、usb转串口驱动分析(2-1) 【转】


    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186851

     

    Linux 串口、usb转串口驱动分析1

    内核版本:2.6.35.6                                                                        荣鹏140319

    声明:图和个别段落(我做了小的修改)是直接从网上截取

    目标:主要是想对Linux 串口、usb转串口驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如字符设备驱动、平台驱动等也不进行详细说明原理。如果有任何错误地方,请指出,谢谢!

    一、整体概述

    linux下的串口或者usb转串口驱动都是依赖linux内核提供的tty核心、tty线路规划和tty驱动,所以牵涉到很多层次,之所以有这么多层次,肯定是有它们存在意义的。

    举例来说,像串口或者usb转串口的驱动,最终可以确定的是以字符设备驱动提供给上层使用,于是tty核心层就对这部分通用的实现进行了封装,但这不是最重要的,最重要的是tty核心层里同时实现了一种数据格式化机制,这就是tty线路规划,这样的好处是可以分别针对不同类设备的线路规划,比如针对终端io的,比如针对网络的ppp还有slip还有蓝牙还有IrDA等,这些的实现不需要考虑底层硬件,也就是说这些串口到具体协议的转换的实现与硬件相分离了,这就是tty核心及tty线路规划存在的目地。

    那为什么会有tty驱动层呢? 也许你觉得我们的串口驱动可以直接通过tty核心提供的功能就可以实现了。 这个确实是可以,但是linux内核因为要兼容世界上存在的各种串口设备,所以针对串口额外实现了一个serial核心层,针对usb转串口额外实现了usb-serial核心层,它们就是所谓的tty驱动层。我们的串口或者usb转串口实现就是与tty驱动层打交道,当然串口芯片或者usb转串口芯片有很多种,所以不同的芯片都要有对应的驱动,但是它们都是基于tty驱动层实现,这个是可以肯定的。

    所以,我们要写串口驱动,最好还是对这些层次有些了解。

    整体框架图如下:
                       

    这图是直接摘抄网上的。其实,我认为在tty驱动层下还应该有个具体的驱动,比如如果是8250串口控制器芯片,那么应该有个8250的驱动,然后才是硬件。

    更准确的图我认为如下图所示:

     

    更详细的如下图所示:


            

    下面摘抄网上的

    (1)、tty线程规程

         以特殊的方式格式化从一个用户或者硬件收到的数据,这种格式化常常采用一个协议转换的形式,如虚拟终端、PPP、Bluetooth、Ir等。

    (2)、tty设备发送数据流程

        tty核心从一个用户获取将要发送给一个tty设备的数据,tty核心将数据传递给tty线路规程驱动,接着数据被传递到tty驱动,tty驱动将数据转换为可以发送的硬件格式。

    (3)、tty设备接收数据流程

       从tty硬件接收到的数据向上交给tty驱动,进入tty线路规程驱动,再进入tty核心,在此被用户获取。尽管tty核心与tty之间的数据传输会经历tty线路规程的转换,但是tty驱动与tty核心之间也可以直接传输数据。

    再摘抄2张网上的图:

                  

    tty设备的数据流通图:

     

  • 相关阅读:
    vs code快捷键
    封装一个运动函数
    关于数组操作方式的总结
    学习html/css基础的重点笔记
    web新手——新闻列表这样写不容易出错
    AppCan——生成Web/微信App版,调用微信JSAPI支付方式,提示WeixinJSBridge内置对象undefined
    vue slot 占位符
    vue /deep/ css 不用1级1级找了
    vue 双向绑定 2个{{}}
    axios 请求接口 f12可以返回值 但是控制台打印报错
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4956708.html
Copyright © 2020-2023  润新知