zoukankan      html  css  js  c++  java
  • linux USB 编程

    Linux USB架构

     

     

     

    可以看出一个USB体系需要4个驱动:USB设备驱动(主要编写这部分)USB主控制器驱动Gadget驱动UDC驱动

     

    USB主要有4个功能:

    MassStorage:大容量存储,如硬盘,U盘。

    USB-HID:人体接口设备,鼠标,键盘。

    RNDIS:网卡。

    CDC-ACMu转串口。

     

    USB描述符:

     

    USB驱动程序位于不同的内核子系统和USB主控制器之间,USB核心为USB驱动提供了用于访问和控制USB硬件的软件接口,使得USB设备驱动程序不必考虑USB硬件控制器。

     

     

    从上图看,一个USB驱动是对应一个接口的,所以一个设备可能有多个驱动。

    USB总线驱动与设备

    驱动结构体

    一个USB驱动使用struct usb_driver来描述(每种总线都有driver这种结构):

     

     

    而上图中设备列表中的usb_device_id如下:

     

     

    填充上面的ip_table需要定义通过USB_DEVICE来定义一种USB设备的USB_DEVICE(vend,prod)

     

    上面是定义一种,下面的宏是定义一类

     

    注册驱动:

     

    设备结构体

     

     

    配置描述符:

    配置结构体:

    Linux内核使用Struct usb_host_config来描述一个USB配置

     

    配置描述符结构体:

     

     

    接口描述符:

    接口结构体:

    Linux kernel使用struct usb_interface来描述usb接口:

     

    接口设置结构体

    设置和配置是有区别的:

    一个配置包含一个或多个接口

    一个接口包含一个或多个设置

    下面是一个例子:

     

     

    Linux kernel使用struct usb_host_interface来描述USB接口设置:

     

    接口描述符结构体

     

    端点描述符:

    端点结构体

    Linux kernel使用struct usb_host_endpoint来描述USB端点:

     

    端点描述符结构体

    Linux内核使用struct usb_endpoint_decriptor来对USB描述符中的端点描述符进行描述

     

     

    URB

    USB请求块是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是USB主机与设备通信的“电波”。

    URB处理的流程如下:

    1. USB设备驱动程序创建并且初始化一个访问特定USB设备特定端点的urb,并提交给USB core

    2. USB core提交urbUSB主控制器驱动程序;

    3. USB主控制器驱动程序根据该urb描述的信息,来访问USB设备。

    4. 当设备访问结束后,USB主控制器驱动程序通知USB设备驱动程序。

    流程一

    创建urb

     

    初始化URB

     

     

    流程二

     

    流程三,流程四:

     





  • 相关阅读:
    vue-cli(vue脚手架)简单流程
    windows环境之node.js安装与环境配置
    fiddler的下载和简单使用
    Linux 配置nginx 代理tomcat,配置ssl
    来聊一聊导出数据问题
    作为一个开发人员应该具备怎么样技术栈和职业素养
    NODEJS的误打误撞
    聊一下程序员的日常
    openstack安装部署私有云详细图文
    openstack:OpenStack架构详解,
  • 原文地址:https://www.cnblogs.com/dchipnau/p/5255353.html
Copyright © 2011-2022 走看看