0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在嵌入式Linux操作系统中完成USB设备驱动设计

电子设计 来源:郭婷 作者:电子设计 2019-05-21 08:01 次阅读

随着计算机外围硬件的扩展,各种外围设备使用不同的总线接口,导致计算机外部各种总线繁多,管理困难,USB总线可以解决这些问题,因此而诞生。USB总线提供统一的外设的接口方式,并且支持热插拔,方便了厂商开发设备和用户使用设备。USB(通用串行总线)是由Microsft,Compad,Inter和NEC等推出的外围总线接口,目前已发展到2.0标准最高支持480Mb/s的速率,最多可以支持127个外设。

嵌入式Linux是一款源代码完全免费的新兴操作系统,用户可以用户可以通过网络等其他途径免费获得,并可以任意修改其源代码,这是其他的操作系统做不到的。正是由于这一点,Linux得到了广泛的应用。

1 Linux中USB设备驱动程序框架及数据结构

1.1 USB的体系结构

USB接口标准支持外部设备和主机之间进行数据传送。在USB结构中主机顶设各种类型外设使用的总线宽度。当外设和主机在运行时,USB总线允许使用,设置,添加和拆除外设。

在USB体系结构中一个USB系统可以分成USB设备、USB主机和USB互联3个部分。USB互联是USB设备和USB主机之间进行连接通信的操作,主要包括:

1)总线拓扑结构:UsB主机和USB设备之间的连接方式;

2)数据流模式:描述USB通信系统数据如何从产生方传递到使用方;

3)USB调度:USB总线是一个共享连接,对可以使用的连按进行调度以支持同步数据传输,并避免优先级判断的开销。

USB的物理连接是有层次的星型结构,如图1所示。

在嵌入式Linux操作系统中完成USB设备驱动设计

图1 USB体系拓扑结构图

从图中可以看出USB集线器在一个节点上连接多个设备,每条线段都是点点连接,每个USB集线器在星形的中心。从主机到设备或者USB集线器,或USB集线器到设备都是点点连接。

1.2 USB驱动程序的结构

USN总线在技术层面上是非常简单的,它是一个单主方式实现的,主机轮询各种不同的外围设备,USB另外一个重要的特性是它只担当设备和主控制器之间通讯通道的角色,对所发送的数据没有任何特殊的内容和结构上的要求。

Linux支持两种类型的USB驱动,宿主系统上的驱动程序和设备上的驱动程序。宿主USB驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制设备如何作为一个USB设备和主机通讯。这里主要讨论设备驱动。

USB的基本通信的形式基本通过端点的东西。USB端点只能往一个方向传输数据,从主机到设备或从设备到主机。USB端点分别具有不同的传输数据的方式,他们有4种类型,分别是:1)控制端点用来控制对USB设备不同部分的访问。他们用于配置设备,获取设备信息,获取设备的状态报告,发送命令到设备。它是一种非周期性的可靠的传输。2)中断端点就是设备传输数据时以一个固定的速率来传输少量的数据。这些端点是鼠标和USB键盘所使用的主要传输方式。它通常用于发送数据到USB设备以控制设备,一般不用来传输大量数据。USB协议保证这些传输有足够的保留带宽来传输数据。3)等时端点同样可以传输大批量的数据,但数据是否到达没有保障,这些端点用于可以应付数据丢失的情况,这类设备更注重于保持一定的恒定的数据流,实时的数据收集都使用这类端点。4)批量端点传输大量的数据。这些端点通常比中断端点大的多他们常用于需要确保没有数据丢失的传输设备。USB协议不保证这些传输始终可以在特定的时间内完成。如果总线上的空间不足以发送整个批量包。它将被分割为多个包进行传输。

当一个USB设备连接到主机时,主机会给这个设备分配一个1~127之间的唯一的设备号同时读取该设备的描述符,该设备描述符是描述设备信息及其属性的数据结构,USB以一种层次化的结构定义设备的描述符,设备描述符给出了USB设备的一般信息,包括对设备及所有设备配置起全程作用的信息,一个USB设备只能有一个设备描述符,配置描述符中的信息与设备特定的配置相关,一个USB设备可以有一个或多个配置描述符,每一个配置描述符又由一个或多个接口描述符组成,接口描述符的信息是与设备驱动程序的开发密切相关,可以一个接口对应一个设备驱动程序也可以多个接口对应一个设备驱动程序,接口描述符由零个或多个端点描述符组成,端点描述符定义了在一个给定的设备里实现的实际寄存器,这些描述符定义了每个寄存器的功能和特定的信息如端点要求的传输类型、传输方向、带宽要求、查询间隔等。另外,还有一个可选的宇符串描述符,它以UNCOND码的格式给出了一些可读的信息,这些信息通常是有关设备生产厂商、设备名设备序列号等,通过这些不同层次的描述符,主机设备驱动程序就可以知道具体设备的相关信息,从而对设备进行相应控制。

在嵌入式Linux操作系统中完成USB设备驱动设计

图2 USB驱动程序层次图

随着计算机外围硬件的扩展,各种外围设备使用不同的总线接口,导致计算机外部各种总线繁多,管理困难,USB总线可以解决这些问题,因此而诞生。USB总线提供统一的外设的接口方式,并且支持热插拔,方便了厂商开发设备和用户使用设备。USB(通用串行总线)是由Microsft,Compad,Inter和NEC等推出的外围总线接口,目前已发展到2.0标准最高支持480Mb/s的速率,最多可以支持127个外设。

嵌入式Linux是一款源代码完全免费的新兴操作系统,用户可以用户可以通过网络等其他途径免费获得,并可以任意修改其源代码,这是其他的操作系统做不到的。正是由于这一点,Linux得到了广泛的应用。

1 Linux中USB设备驱动程序框架及数据结构

1.1 USB的体系结构

USB接口标准支持外部设备和主机之间进行数据传送。在USB结构中主机顶设各种类型外设使用的总线宽度。当外设和主机在运行时,USB总线允许使用,设置,添加和拆除外设。

在USB体系结构中一个USB系统可以分成USB设备、USB主机和USB互联3个部分。USB互联是USB设备和USB主机之间进行连接通信的操作,主要包括:

1)总线拓扑结构:UsB主机和USB设备之间的连接方式;

2)数据流模式:描述USB通信系统数据如何从产生方传递到使用方;

3)USB调度:USB总线是一个共享连接,对可以使用的连按进行调度以支持同步数据传输,并避免优先级判断的开销。

USB的物理连接是有层次的星型结构,如图1所示。

在嵌入式Linux操作系统中完成USB设备驱动设计

图1 USB体系拓扑结构图

从图中可以看出USB集线器在一个节点上连接多个设备,每条线段都是点点连接,每个USB集线器在星形的中心。从主机到设备或者USB集线器,或USB集线器到设备都是点点连接。

1.2 USB驱动程序的结构

USN总线在技术层面上是非常简单的,它是一个单主方式实现的,主机轮询各种不同的外围设备,USB另外一个重要的特性是它只担当设备和主控制器之间通讯通道的角色,对所发送的数据没有任何特殊的内容和结构上的要求。

Linux支持两种类型的USB驱动,宿主系统上的驱动程序和设备上的驱动程序。宿主USB驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制设备如何作为一个USB设备和主机通讯。这里主要讨论设备驱动。

USB的基本通信的形式基本通过端点的东西。USB端点只能往一个方向传输数据,从主机到设备或从设备到主机。USB端点分别具有不同的传输数据的方式,他们有4种类型,分别是:1)控制端点用来控制对USB设备不同部分的访问。他们用于配置设备,获取设备信息,获取设备的状态报告,发送命令到设备。它是一种非周期性的可靠的传输。2)中断端点就是设备传输数据时以一个固定的速率来传输少量的数据。这些端点是鼠标和USB键盘所使用的主要传输方式。它通常用于发送数据到USB设备以控制设备,一般不用来传输大量数据。USB协议保证这些传输有足够的保留带宽来传输数据。3)等时端点同样可以传输大批量的数据,但数据是否到达没有保障,这些端点用于可以应付数据丢失的情况,这类设备更注重于保持一定的恒定的数据流,实时的数据收集都使用这类端点。4)批量端点传输大量的数据。这些端点通常比中断端点大的多他们常用于需要确保没有数据丢失的传输设备。USB协议不保证这些传输始终可以在特定的时间内完成。如果总线上的空间不足以发送整个批量包。它将被分割为多个包进行传输。

当一个USB设备连接到主机时,主机会给这个设备分配一个1~127之间的唯一的设备号同时读取该设备的描述符,该设备描述符是描述设备信息及其属性的数据结构,USB以一种层次化的结构定义设备的描述符,设备描述符给出了USB设备的一般信息,包括对设备及所有设备配置起全程作用的信息,一个USB设备只能有一个设备描述符,配置描述符中的信息与设备特定的配置相关,一个USB设备可以有一个或多个配置描述符,每一个配置描述符又由一个或多个接口描述符组成,接口描述符的信息是与设备驱动程序的开发密切相关,可以一个接口对应一个设备驱动程序也可以多个接口对应一个设备驱动程序,接口描述符由零个或多个端点描述符组成,端点描述符定义了在一个给定的设备里实现的实际寄存器,这些描述符定义了每个寄存器的功能和特定的信息如端点要求的传输类型、传输方向、带宽要求、查询间隔等。另外,还有一个可选的宇符串描述符,它以UNCOND码的格式给出了一些可读的信息,这些信息通常是有关设备生产厂商、设备名设备序列号等,通过这些不同层次的描述符,主机设备驱动程序就可以知道具体设备的相关信息,从而对设备进行相应控制。

在嵌入式Linux操作系统中完成USB设备驱动设计

图2 USB驱动程序层次图

1.3 USB驱动程序框架

1.3.1 基本数据结构

usb-skel设备使用自定义结构usb_skel记录设备驱动用到的所有描述符,该结构定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

1.3.2 驱动程序初始化和注销

同其他所有的Linux设备驱动程序一样,usb-skel驱动使用module_init()宏初始化函数,使用module_exit()宏注销函数。usb-skel驱动的初始化函数usb_skel_init()函数,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

sb_skel_init()函数调用内核提供的usb_register()函数注册了一个usb_driver类型的结构变量,该变量定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

其中usb_skel设备的USB ID映射表定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

在USB驱动中调用usb_deregister()函数注销usb-skel设备驱动,函数定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

1.3.3 初始化设备

从skel_driver结构可以知道usb-skel设备的初始化函数是skel_probe()函数,设备初始化主要是探测设备类型,分配USB设备用到的urb资源,注册USB设备操作函数等。

skel_class结构变量记录了usb-skel设备信息,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

name变量使用%d通配符表示一个整型变量,当一个usb-skel类型的设备连接到USB总先后会2按照子设备编号自动设置设备名称。Fops设备操作函数结构变量,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

1.3.4 设备注销

skel_disconnect()函数在注销设备时被调用,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

2 USB串口驱动

2. 1 驱动初始化函数

usb_serial_init()函数是一个典型的USB设备驱动初始化函数,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

函数首先调用alloc_tty_driver()函数分配一个串口驱动描述符;然后设置串口驱动的属性,包括驱动的主从设备号、设备类型、串口初始化参数等;串口驱动描述符设置完毕后,调用usb_register()函数注册USB串口设备。

2. 2 驱动释放函数

在嵌入式Linux操作系统中完成USB设备驱动设计

2.3 串口操作函数

USB串口设备驱动使用了一个tty_operations类型的结构,该结构包含了串口的所有操作,定义如下:

在嵌入式Linux操作系统中完成USB设备驱动设计

按上述的步骤和方法通过lnsmod命令成功实现了USB驱动程序的加载,成功的通过USB串口进行了数据的读写。

3 结论

新出的Linux2.6内核加入了对USB2.0的支持,重新定义了usb_class_driver结构体。同时对探测函数probe和usb_submit_urb做了修改,包含了advanced linux sound Archiecture可以更安全的使用USB设备。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7572

    浏览量

    260452
  • Linux
    +关注

    关注

    87

    文章

    11028

    浏览量

    207231
  • 计算机
    +关注

    关注

    19

    文章

    6840

    浏览量

    85699
收藏 人收藏

    评论

    相关推荐

    嵌入式LinuxUSB蓝牙设备驱动

    设备驱动,从而有助于蓝牙设备嵌入式领域广泛应用。【关键词】:蓝牙驱动;;
    发表于 04-24 09:30

    微内核操作系统嵌入式平台上的应用

    。  可靠性是指嵌入式设备特别是工业设备嵌入式系统经常需要连续运行数以年计的时间而不出差错。
    发表于 09-01 13:41

    嵌入式Linux系统设备驱动程序怎么编写?

    Linux是一个遵循POSIX标准的免费操作系统。具有BSD和SYSV的扩展特性。与其他操作系统相比,嵌入式Linux
    发表于 03-31 08:15

    嵌入式操作系统有哪些

      1.嵌入式Linux  嵌入式Linux(Embedded Linux)是标准Linux经过
    发表于 06-20 15:13

    怎么学习嵌入式Linux操作系统

    2.怎么学习嵌入式Linux操作系统本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。实际工作
    发表于 07-13 07:52

    嵌入式操作系统的发展

    一.嵌入式操作系统1.嵌入式操作系统的发展(1)Tiny OS操作系统1)开源深度轻量级操作系统
    发表于 10-27 07:26

    嵌入式Linux操作系统

    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:(1)掌握主流嵌入式微处理器的结构与原理(初步定为arm9)(2
    发表于 10-27 10:22

    Linux作为嵌入式操作系统具有哪些优势

    嵌入式Linux操作系统是将Linux操作系统进行裁剪,使Linux
    发表于 11-04 08:38

    嵌入式Linux之Android操作系统

    嵌入式LinuxLinux内核的改编版,用于嵌入式系统嵌入式
    发表于 11-04 08:18

    嵌入式Linux操作系统

      嵌入式Linux新兴的嵌入式操作系统领域内也获得了飞速发展和广泛应用。而对于那些希望尽快进入嵌入式
    发表于 11-05 08:47

    嵌入式Linux操作系统的使用

    这是第一次接触嵌入式设计课程,课程设计内容目标如下:1、了解嵌入式技术;2、掌握嵌入式Linux操作系统的使用;(命令)3、掌握
    发表于 11-08 06:43

    基于Linux嵌入式操作系统

    2.2 实时操作系统的评价指标三、基于Linux嵌入式操作系统3.1 ARMLinux简介3.2 uCLinux简介四、嵌入式
    发表于 11-08 09:05

    Linux嵌入式操作系统移植

      如果就“Linux嵌入式操作系统移植”打个比喻,那么“Linux嵌入式操作系统移植”就像是给
    发表于 12-16 07:18

    嵌入式linux、arm嵌入式操作系统的相关资料分享

    开发工具链异常处理linux内核裁剪与移植GCC命令基本用法系统调用与中断进程间通信接口中断驱动程序引导程序C语言与汇编语言嵌入式操作系统
    发表于 12-27 07:35

    有无操作系统嵌入式Linux驱动设备有何区别?

    有无操作系统嵌入式Linux驱动设备有何区别? 嵌入式系统
    的头像 发表于 10-29 17:29 507次阅读