0  引言

嵌入式linux系统环境以其易于移植裁减、内核小、效率高、完整、原代码开放及性能优异等特点,在嵌入式领域得到了非常广泛的应用。Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的驱动程序。市场上USB设备控制器芯片种类繁多,大多数用户需要针对特定应用来开发相关的USB设备控制器驱动程序,才能使设备正常工作在linux操作系统下。

1 USB设备端驱动系统

Linux Gadget子系统主要分为三层:第一层为芯片驱动层,负责将各种USB device控制器抽象为统一的函数接口,以供上层驱动程序调用;第二层主要是对操作函数的简单封装;第三层为设备驱动层,可根据系统的需求实现所对应的功能。图1所示是Linux Gadget子系统的驱动层次。Linux Gadget子系统的设备驱动层主要根据各个类别的规范及协议实现各种设备的驱动,本设计需要使一个嵌入式设备拥有移动硬盘的功能,所以,可以根据海量存储类的规范及协议来实现该功能。

1.1 UDC驱动的基本构架

图2所示是UDC驱动的基本构架图。在控制器驱动程序中,首先应注册platform驱动,调用其probe函数搜索设备,并在probe函数内初始化usb_ep和usb_gadget等结构,然后注册设备,并申请中断,接着等待中断进入中断服务子程序,最后声明和实现usb_gadget_register_driver注册函数并输出给上层驱动。在该过程中,联系它们的纽带是一些全局结构体变量。

1.2 Gadget API

Gadget API为Gadget系统定义了统一的数据结构和接口函数,它和主机端的USB Core地位类似,但功能仅限于提供编程接口,如用结构体usb_gadget_ops和usb_ep_ops对设备控制器驱动操作函数和端点操作函数进行重新封装。比较特殊的是Gadget驱动程序注册函数usb_gadget_register_driver,它们是由设备控制器(UDC)驱动直接提供的,用于将UDC绑定到gadget driver。这增加了Gadget Driver和UDC之间的依赖性。

在设备端,Gadget系统虽然类似主机驱动系统分了三层结构,但Gadget API只定义了一些数据结构、宏和功能函数,并对UDC驱动程序进行了简单包装,而没有驱动管理等功能。

1.3设备应用驱动程序

设备端应用程序(Gadget Driver)用于控制USB设备功能的实现,使设备表现出“网络连接”、“打印机”或“大容量存储设备”等特性。本文以大容量移动存储设备为例来实现移动硬盘的功能。

BULK ONLY传输指的是主机和大容量存储设备之间的一种数据传输方式。

2设备端驱动调度

在嵌入式Linux操作系统中,Gadget driver和Gadget API可完成部分USB协议处理、BULK ONLY等传输协议以及指令的解析处理,用户只需要在设备控制器驱动程序中完成部分USB协议处理和Gadget API的衔接工作。

图3所示的流程图给出了USB设备端驱动程序的基本调度思想。该方案的主要思路是被动的接受主机端的传输命令(任何类型的通信都由USB主机发起,USB设备间不能直接通信),然后通过中断触发的方式完成主机端的数据传输。当产生设备端中断时,设备控制器驱动程序首先判断中断类型。当其为批量传输端点IN中断时,驱动程序会将该EP下链接的REQ中的数据依次写入USB2.0 OTG IP的设备控制器的内存区;当其为批量传输OUT中断时,驱动程序会将设备控制器内存区的数据读入REQ中的buffer中;当其为端点0的控制传输中断时,驱动程序将读取端点缓冲区的数据,并解析当前的设备请求。如果主机传输给设备的设备请求为USB REO SEDRESS(设置设备地址)、USB_REQ_GET_STATUS(获取设备状态)、USB_REQ_SET_FEATURE(设置设备特性),设备控制器驱动程序会自行响应请求。但是,如果是其它设备请求,如GET_DESCRIPTOR(获取设备描述符)时,设备控制器驱动便会将该请求提交给Gadget Driver,然后由Gadget Driver排队将该设备请求提交给端点,以等待下次控制端点中断。

控制传输比较复杂,它需要完成建立阶段、数据传输阶段和状态阶段。整个控制端点中断的处理可通过四个状态实现,分别是:端点0空闲(EP0_IDLE)、 数据IN传输(EP0 IN DATA_PHASE)、数据OUT传输(EP0 OUT DATA_PHASE)和状态阶段(EPO_STATUS)。  EP0_IDLE状态主要处理建立阶段的setup令牌,并根据获得的设备请求处理能够处理的设备请求,同时把不能处理的设备请求(如获取设备描述符,配置描述符等)提交给上层Gadget Driver;EP0_OUT_DATA_PHASE状态主要处理数据阶段的OUT传输;EP0_OUT_DATA_PHASE状态主要处理数据阶段的IN传输;EP0_STATUS状态则主要完成控制传输过程中的状态阶段。

在图3所示的流程图中,EP0为控制传输端点,EP1、EP2、EP3为批量传输端点,它们主要包括端点传输类型、端点缓冲区大小等信息。REQ为Gadget Driver提交的端点请求,主要包含传输的数据长度和地址。

嵌入式linux 配置usb otg,嵌入式linux系统环境下USB设备的驱动实现相关推荐

  1. kail linux配置无线网络,Kali Linux 无线渗透测试入门指南 第一章 配置无线环境

    第一章 配置无线环境 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 简介 如果我要在八个小时之内砍倒一棵树,我会花六个小时来磨我的斧子. -- 亚伯拉罕· ...

  2. linux配置端口ipv6地址,linux配置ipv6地址命令

    linux配置ipv6地址命令 模块加载: /etc/module.conf中增加下列行: alias net-pf-10 ipv6 配置ipv6: /etc/sysconfig/network中增加 ...

  3. linux配置apache不管用,Linux中apache配置文件详解

    Linux中apache配置文件:/etc/httpd/conf/httpd.conf ServerTokens OS//当服务器响应主机头(header)信息时显示Apache的版本和操作系统名称 ...

  4. 配置 sql server linux,配置SQL Server on Linux(2)

    1. 前言 前一篇配置SQL Server on Linux(1),地址:http://www.cnblogs.com/fishparadise/p/8125203.html ,是关于更改数据库排序规 ...

  5. linux常用命令、linux系统、linux属于什么操作系统、linux系统安装、linux怎么读、linux和windows的区别、linux配置ip地址、linux系统一般用来,在线查询工具

    linux vi编辑器常用命令 linux 查看ip linux find -name 查找文件名 linux shell linux 查看端口占用 linux 删除文件命令 linux cp命令复制 ...

  6. linux配置互信权限问题,Linux互信及互信失效问题

    Linux互信的由来 在当前的服务器操作系统中,Linux操作系统占多数,接触过Linux系统的人都知道:通常情况下,登陆Linux系统需要输入用户名和密码. 用户名和密码本身是一种安全认证机制,可以 ...

  7. USB OTG简介、与普通USB线的区别

    USB有三类接口A类接口                     -----------最常见的扁平接口,四芯  VCC   GND   D+   D- B类接口                    ...

  8. esp32 s3 USB OTG Arduino可以下载固件 USB COM不可以的解决方法

    要想USB COM口下载固件, 方法就是按住boost键上电, 就能从 USB COM口用Arduino下载固件. USB OTG口可以直接下载固件.也还以为配置有问题, USB OTG USB CO ...

  9. 嵌入式linux 配置usb otg,嵌入式系统设计中的USB OTG方案

    速外设操作时最大为80mA.TD1120整个芯片支持功率节省模式,包括主机控制器以及外设控制器的延缓模式以使功率消耗最小化www.cechina.cn,延长系统电池寿命,对于移动设备来说,电池寿命是很 ...

最新文章

  1. R语言vtreat包自动处理dataframe的缺失值、使用分组的中位数来标准化数据列中每个数据的值(和中位数表连接并基于中位数进行数据标化)、计算数据列的中位数或者均值并进行数据标准化
  2. FastJson 打Release 包解析失败
  3. 端口如何支持非localhost访问_Spring Boot 教程:CORS 支持
  4. 错误提示 - QQMGameBoxUpdater 无法找到入口(GetFileVersionInfoExW)
  5. 你对JVM三色标记的理解嘛?
  6. 恕我直言,IDEA的Debug,你可能只用了10%
  7. linux-shell面试题 之二
  8. 代码更换ui图片_用技术的方式,在UI设计稿中设置随机码,保证高清
  9. 浮点数学运算是否被破坏?
  10. ctr z撤回反向_Ctrl+Z 的反快捷键是什么
  11. Thinkphp5个人技术博客网站源码
  12. Leetcode---1818绝对差值和
  13. java 以10为底的对数_log以10为底0.5的对数怎么算
  14. zotero导出PDF
  15. Ubuntu系统安装及su安装
  16. 使用python脚本抢购天猫和淘宝商品,0秒下单
  17. Android实现头像上传至数据库与保存 简易新闻(十七 下)
  18. MTK机器原始OTA更新方法
  19. Java 操作数据库插入失败原因
  20. ChatGPT教程之 02 ChatGPT 正在经历托马斯爱迪生的时刻,为什么需要获得突破性技术

热门文章

  1. 分数的拆分原理和方法_常见的节税原理你知道吗?
  2. java后台json传递,后台json传递
  3. 控制台应用和空项目有什么区别_在公司做的项目和自己在学校做的有什么区别?...
  4. python文件封装成jar_【Python】Python文件打包为可执行文件
  5. __asm___错误:“”前应有'=',',',',','asm'或'_attribute_'
  6. 算法图解:如何用两个栈实现一个队列?
  7. 从JVM入手,聊聊Java的学习和复习!
  8. 图论模型迪杰斯特拉算法
  9. Python爬虫淘宝商品详情页价格、类似数据
  10. 全网最详细的docker配置nginx http2 优化高速访问