linux USB从设备使用gadget实现大容量存储设备
硬件平台:fresscale iMX6Q
linux内核版本4.1.15
Gadget 框架提出了一套标准API, 在底层, USB 设备控制器 (USB Device Controller, UDC) 驱动则实现这一套 API, 不同的 UDC (通常是 SOC 的一部分) 需要不同的驱动, 甚至基于同样的 UDC 的不同板子也需要进行代码修改。这一层我们可以称之为平台相关层。
Linux-USB Gadget 驱动框架(以下简称 Gadget )实现了 USB 协议定义的设备端的软件功能。相对于 Linux USB 主机端( Host ) 驱动而言, Gadget 驱动出现较晚,它出现在 2.4.23 以后
Linux USB 设备端驱动有两部分组成。一部分是USB 设备控制器(USB Device Controller, UDC)驱动、另一部分是硬件无关的功能驱动(如:鼠标、u盘、usb串口、usb网络等);也可以分为3层的,
分别是:UDC Controller Drivers(usb 从设备相关的硬件驱动)
Gadget Drivers(提供了usb从设备的具体功能,如HID鼠标,键盘,串口,u盘等功能)
Upper Layers(提供了usb从设备的core,提供了相应的驱动框架以及API)
使用usb gadget 实现大容量存储主要使用两种方式。
方式1:在linux3.0内核以前,使用insmod方式实现。
优点:资料多,支持老版本内核。
缺点:需要在模块插入阶段配置。只能[M]的方式编译出ko模块然后插入阶段配置,或者需要修改内核代码给一套默认参数,调用方式比较奇怪。
1,menuconfig配置相关的内核模块 [M] g_file_storage.ko
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
USB Gadget Drivers 配置[M] g_file_storage.ko
2 配置完成后,make uImage编译内核,然后 make modules编译模块,在 /driver/usb/gadget/下面形成驱动模块 g_mass_storage.ko文件,把这个文件拷贝到文件系统的 “/lib/modules/内核版本/kernel/drivers/usb/gadget/” 目录下面, modprobe 命令会在lib/modules路径下面搜索要加载的驱动模块库文件。
3 机器里执行:
modprobe g_mass_storage file=/dev/mmcblk0 removable=1
或者
module_path=/lib/modules/内核版本/g_file_storage.ko
insmod ${module_path} file=/dev/mmcblk1p1 stall=0 removable=1
以上命令加载gadget msc驱动,传递SD卡为模块参数,使用micro usb 线连接板卡与PC,这时PC端识SD卡FAT32分区,可以拷贝文件到SD卡中,拷贝完成后可以在开发板中查看到SD卡中的新文件。 使用超级终端在SD卡创建文件,需要重新连接板卡与PC,PC才能识别SD卡新创建的文件.
另外需要注意的是:从SD卡拷贝文件到PC,速度是比较快的,能达到18M/S,而从PC拷贝文件到SD卡速度很慢,大概是1.4M/s,最后拷贝的文件经过MD5验证,数据是安全的,未丢失数据。
Read:
b9cdf2cbec8014750fde35d9e32674f4-----origin sdcard file---OK--MAX SPEED=18M/S-
b9cdf2cbec8014750fde35d9e32674f4-----read to pc files
Write:
b9cdf2cbec8014750fde35d9e32674f4------pc file-OK-MAX SPEED=1.4M/S
b9cdf2cbec8014750fde35d9e32674f4------sdcard file
方式2:在linux3.0内核之后的版本,使用insmod方式实现。
优点:使用configfs进行配置,配置方便,可在任何阶段使用,将会成为未来主流方式
缺点:不支持3.0以下的内核
1,menuconfig配置相关的内核模块
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
<*> USB Gadget Drivers (USB functions configurable through configfs) --->
[*] Mass storage
2,挂载configfs文件系统:
$ mount none $CONFIGFS_HOME -t configfs
where CONFIGFS_HOME is the mount point for configfs
例:
# mount -t configfs none /sys/kernel/config
3,新建garget是实例:
For each gadget to be created its corresponding directory must be created:
$ mkdir $CONFIGFS_HOME/usb_gadget/<gadget name>
例:
$ mkdir $CONFIGFS_HOME/usb_gadget/g1
$ cd $CONFIGFS_HOME/usb_gadget/g1
4,配置idVendor与idProduct
定义产品的VendorID和ProductID
Each gadget needs to have its vendor id <VID> and product id <PID> specified:
$ echo <VID> > idVendor
$ echo <PID> > idProduct
例:
# echo "0xabcd" > idVendor
# echo "0x1234" > idProduct
5,初始化描述符字符串:
将开发商、产品和序列号字符串写入内核:
$ mkdir strings/0x409
Then the strings can be specified:
$ echo <serial number> > strings/0x409/serialnumber
$ echo <manufacturer> > strings/0x409/manufacturer
$ echo <product> > strings/0x409/product
例:
# echo "0123456789ABCDEF" > strings/0x409/serialnumber
# echo "Master" > strings/0x409/manufacturer
# echo "Demo" > strings/0x409/product
4,创建功能实例:
The gadget will provide some functions, for each function its corresponding
directory must be created:
$ mkdir functions/<name>.<instance name>
这里的名称是模块名称,类比于g_mass_storage.ko去掉前缀,去掉结尾,即得到名称,
查看名称可以查看 drivers/usb/gadget/function/Makefile 得到相应的名称,去掉usb_f_前缀,去掉.o后缀
where <name> corresponds to one of allowed function names and instance name
is an arbitrary string allowed in a filesystem, e.g.:
例子:
$ mkdir functions/ncm.usb0 # usb_f_ncm.ko gets loaded with request_module()
usb存储的话:
$ mkdir mass_storage.usb0
如果成功:打印正确信息如下:
如果失败打印错误信息,没有找到相应的功能实现:
4,创建配置实例:
Each gadget will consist of a number of configurations, their corresponding
directories must be created:
$ mkdir configs/<name>.<number>
where <name> can be any string which is legal in a filesystem and the
<number> is the configuration's number, e.g.:
例:
# mkdir configs/c.1/ #创建实例c.1
# mkdir configs/c.1/strings/0x409 #创建描述字符串
# echo "DRAGON" > configfs/c.1/strings/0x409/configuration #描述符字符串写入DRAGON
# echo 120 > configs/c.1/MaxPower 写入最大电流需求
# ln -s functions/mass_storage.usb0/ configs/c.1/ #捆绑功能实例mass_storage到配置c.1
5,绑定gedget实例到UDC物理硬件
首先查看板子上的UDC设备
[root@dragonExt g1]# ls /sys/class/udc/
ci_hdrc.0
Such a gadget must be finally enabled so that the USB host can enumerate it.
In order to enable the gadget it must be bound to a UDC (USB Device Controller).
$ echo <udc name> > UDC
例:
# echo ci_hdrc.0 >UDC #绑定gedget实例到UDC物理硬件
此时此刻,接入usb线到pc,U盘出来了。恭喜
注:卸载gadget设备:
echo "" > UDC
下面附上我的完整配置实例enable_usb_gadget_mass_storage_configfs.sh
#!/bin/sh#set -xv
set -e
mount -t configfs none /sys/kernel/config/
cd /sys/kernel/config/usb_gadget/
mkdir g1
cd g1/echo "0xABCD" >idVendor
echo "0x1017" >idProduct
cat idVendor
cat idProductmkdir strings/0x409/
echo "012345678ABCDEF" >strings/0x409/serialnumber
echo "Dragon" >strings/0x409/manufacturer
echo "DragonMSC" >strings/0x409/product mkdir functions/mass_storage.usb0
echo /dev/mmcblk1p1 >functions/mass_storage.usb0/lun.0/file mkdir configs/c.1
mkdir configs/c.1/strings/0x409/echo "abc" > configs/c.1/strings/0x409/configuration
cat configs/c.1/strings/0x409/configuration
ln -s functions/mass_storage.usb0/ configs/c.1/ls /sys/class/udc/
echo ci_hdrc.0 >UDCecho !!!!!!!!!!!!!!!!!!
echo !!!!!OK!!!!!!!!!!!
echo !!!!!!!!!!!!!!!!!!
linux USB从设备使用gadget实现大容量存储设备相关推荐
- 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- Linux usb 6. HC/UDC 测试
文章目录 1. 背景介绍 2. Device (gadget zero) 2.1 `gadget zero` 创建 2.2 SourceSink Function 2.3 Loopback Funct ...
- linux 看usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备
我有几个USB大容量存储闪存驱动器连接到Ubuntu Linux计算机(Ubuntu 10.04.1,内核2.6.32-25-386),我需要以编程方式区分它们(如果可能的话,从bash,但我不害怕编 ...
- linux内核不能识别u盘分区,一种在Linux内核中识别特定USB大容量存储设备的方法及系统与流程...
本发明涉配usb设备识别技术领域,特别是涉及一种在linux内核中识别特定usb大容量存储设备的方法及系统. 背景技术: 在linux系统下对usb设备进行管控,一般而言有两种方法,一种是阻断新插入设 ...
- linux usb gadget 日志
1,USB 协议入门 几种USB控制器类型:OHCI,UHCI,EHCI,XHCI 遇到过一些关于USB的东西(如下),一直没搞明白什么USB1.0/1.1/2.0/3.0之类的,当然我知道它们的各自 ...
- linux usb gadget驱动详解(一)
由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...
- 71 linux usb设备驱动
usb接口有大,小口之分 usb有主机(host,大口)/设备(otg, 小口)工作模式 usb主机可以主动去操作设备, 主机接口由4根线(vcc, gnd, d+, d-) usb设备被主机操作, ...
- Linux usb设备驱动
原文地址:http://blog.csdn.net/chenjin_zhong/article/details/6329316 1.Linux usb设备驱动框架 USB是通用串行总线的总称,Linu ...
- linux usb gadget驱动详解(三)
本文将对linux4.4.19版本usb gadget源码进行简单分析.鉴于前文反复测试U盘设备驱动,现从linux-4.4.19/drivers/usb/gadget/legacy/mass_sto ...
- 第16章 USB主机、设备与Gadget驱动之USB UDC与Gadget驱动(一)
16.4.1 UDC(USB设备控制器)和Gadget(小配件)驱动的关键数据结构与API USB设备控制器(UDC)驱动指的是作为其他USB主机控制器外设的USB硬件设备上底层硬件控制器的驱动,该硬 ...
最新文章
- Leangoo新功能-卡片ID
- C# ChartControl 控制X轴的间距个数
- 初读CLR Via C# 之 IL、CTS、CLS
- yarn:info There appears to be trouble with your network connection. Retrying...
- 实战-Android开机时间优化
- ORACLE安装之环境搭建
- 图解机器学习:人人都能懂的算法原理
- EditText属性输入框Kotlin.Android
- 【Css/Html】网页Css默认设计样式载入模板代码body.css
- [DCDC](DC-DC) 电感计算有难题 ? 你我一起来学习
- Colorbox 参数设置-中文版
- Mac Mini搭载苹果自研M1芯片 Mac Mini详细评测
- 计算机专业迎新晚会主题海报,如何制作迎新晚会宣传海报?推荐使用迎新海报素材!...
- Oracle的profile
- 使用 pip 快速安装 OpenCV
- 普元 AppServer 6.5 哑安装后执行启动命令./startup.sh后启动失败
- java计算机毕业设计公交线路查询系统MyBatis+系统+LW文档+源码+调试部署
- 汇总!【AI会议倒计时列表】“AI Conference Deadlines”
- python练习题:u4.1统计字符串中数字的个数
- 第1章:为什么要并行计算