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

0  引言

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

1 USB设备端驱动系统

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

a1636cd0643c90b90e0e4b58f0724c80.png

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的衔接工作。

e98563302f3c381ea28373cf5aeb5d94.png

图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提交的端点请求,主要包含传输的数据长度和地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android Chrome浏览器快捷键

核心提示:在本教程中将为你介绍android Chrome浏览器快捷键! 众所周知,Google Android系统中内置的网页浏览器是桌面版Chrome浏览器的简化版本Chrome Lite,同样采用了开源的Webkit核心,安卓中文网整理了适用于搭载实体键盘G1的Ch…

linux 裸设备使用,linux裸设备使用

一、配置:RHAS4:1,将硬盘分区:#fdisk -l#fdisk /dev/sdb2,绑定:方式一:#raw /dev/raw/rawN /dev/sdbN#raw -qa#vi /etc/rc.localraw /dev/raw/rawN /dev/sdbN方式二:#vi /etc/sysconfig/rawdevi…

在iOS设备上如何使用Chrome浏览器的书签

核心提示:谷歌Chrome浏览器iOS版正式登陆AppStore。不过有很多人安装以后没有找到书签工具,以为没有。其实不然。iOS设备上的Chrome浏览器是内置有书签工具的,和Safari相比,不是很明显。只有搭配相应的App时,才能体现出…

linux p7zip密码,linux下7zip使用方法

现在流行的压缩软件有WIN平台下的winrar, winzip。Linux下则是bzip2, gzip等等。现在有一个叫做7z的压缩软件,号称是目前压缩比最大的软件。WIN平台下使用的是图形界面,使用方法和winrar差不了多少。但是在Linux下,7z可以使用的是命令行方式。…

下载腾讯视频里的视频_手机腾讯视频如何升级新版本

软件是否好用,还得大家下载腾讯视频安装才知道。本文分享怎么下载腾讯视频里的视频_手机腾讯视频如何升级新版本腾讯视频升级新版本。腾讯视频电影频道拥有大量高清在线电影资源,热门高清电影、好评电影、电影预告都可以在线观看,不去电影院也…

linux 上下文切换监控,[Linux] 查看进程的上下文切换pidstat

各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换。进程是由内核管理和调度的,所以进程的切换只能发生在内核态…

爱奇艺怎么看不了电视剧和视频

不管这个爱奇艺好用与否,都有一大批用户,本文小编分享“爱奇艺怎么看不了电视剧和视频”。爱奇艺客户端为您推荐更多精选热门视频,通过多条件筛选快速定位匹配结果,提供多种画质、多种语言切换播放和下载,支持边下载边…

linux arm9视频哪个好,谈谈ARM7与ARM9的区别

本文是写给准备学习ARM技术,而又没想好要学ARM7还是ARM9或者对ARM7与ARM9的区别不是很了解的初学者。希望本文对你们有点用处。由于职业的关系,经常会回答一些ARM初学者的问题,虽然问题千奇百怪,但以下两个问题绝对很有代表性。AR…

腾讯视频如何退出登陆

本文给大家整理了腾讯视频如何退出登陆方面的内容。腾讯视频支持在线进行加载,离线观看。 有时候我们要用一下别人的腾讯账号,这个时候就需要我们退出当前的账号,那么腾讯视频如何退出登陆呢?接下来我告诉大家~ 1、首先找到腾讯视频并打开…

linux通过yum安装nginx,Linux系统使用yum安装nginx教程

首先执行以下命令安装2个软件包:yum install epel-releaseyum install yum-utils然后新增yum源:vim /etc/yum.repos.d/nginx.repo写入以下内容:[nginx-stable]namenginx stable repobaseurlhttp://nginx.org/packages/centos/$releasever/$ba…

Chrome谷歌浏览器私密浏览自动开启功能获批专利

Chrome谷歌浏览器私密浏览自动开启功能获批专利 谷歌近日被授予一项新的专利:在桌面和移动浏览器中自动启用匿名浏览功能。谷歌这项美国专利号是8935798 B1,专利描述为用户使用浏览器上网,自动阻止浏览器存储浏览历史记录/用户输入文字&#…

linux怎么休眠快捷键,在Deepin系统中创建右键休眠选项的方法

本文介绍在深度Deepin操作系统中创建右键休眠选项,以方便你更快的进入到系统休眠当中,实现方法非常简单,按照下面的步骤进行就可以了。休眠的好处系统休眠,可以让平时的工作环境保存到硬盘中,以便开机后便可立即进入工…

谷歌Chrome 81浏览器更新:新增微软Chromium版Edge现代Web控件

谷歌浏览器是一款非常好用的服务软件,有很多用户都会选择这款软件进行搜索,这里有非常多的搜索功能,用户可以使用这款软件解决自己的一些难题,这款软件的功能也在不断的更新,用户可以使用手机在这里享受非常便捷的服务…

linux spoon.sh闪退,解决Linux Kettle出现闪退问题

linux环境, 运行sh spoon.sh打开图形化界面时经常出现闪退情况。报错信息如下:cfgbuilder - Warning: The configuration parameter [org] is not supported by the default configuration builder for scheme: sftpjava: cairo-misc.c:380: _cairo_oper…

Chrome浏览器占用太多内存,内存不够用怎么办

用户在使用浏览器打开每一个页面的时候都会有很多进程车程序,来保护用户的信息安全,每一个标签都有各自的运行方式,这样在使用的时候就可以达到互不干扰的效果,但是这样做就会将所有的数据都堆叠在一起,使用起来会有弊…

单片机外部中断实验C语言程序,STC89C52单片机外部中断0实验

原标题:STC89C52单片机外部中断0实验/实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来显示系统进入了外部中断0实验板型号:BS-XYD-C52实验名称: 外部中断0测试编写人: 谢应东编写日期: …

简单参数让谷歌Chrome浏览器单进程运行

核心提示:Google Chrome是由Google开发的一款设计简单、高效的Web浏览工具。 大多数人都会在怨恨Google Chrome的多线程吃内存吧?而且即使标签独立进程,它的稳定性也不见得高到哪里去,经常遇到要崩溃就一起崩溃的情况,不如让他老…

c语言 %15s,c语言求助

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼fprintf(fp,"%23s%15s\n",p->num,p->name);fclose(fp);}void del_name() /*定义按姓名注销旧档案函数*/{char tempname[10]"";int n0;struct student record[N]{0},*pNULL,*kNULL;FILE*fpNU…

Chrome浏览器依然是最受欢迎的浏览器 排名轻微下滑

chrome谷歌浏览器依然是最受欢迎的浏览器 排名轻微下滑 NetMarketShare 公布了最新的浏览器市场份额数据,排名前三的分别是:Chrome、Internet Explorer 和Firefox 。 Chrome 浏览器依然是全球最受欢迎的桌面浏览器,但从 4 月起已出现轻微下滑…

android 自定义推流器,Android直播实现 Android端推流、播放

最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码就可实现编码、推…