由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网、PCIE总线和RS232串口等。这里我们主要讨论USB。

USB是一个主从通信架构,但只能一主多从。其中usb主机控制器有ECHI(https://www.intel.com/content/www/us/en/products/docs/io/universal-serial-bus/ehci-specification.html)等规范支持,而usb设备则包含普通usb设备和hub两种。USB2.0规范、USB class等规范文档可以从https://www.usb.org/获得。另外,还有ULPI、UTMI接口(类比RGMII、MII)支持USB phy(类比以太网phy)与ip核(https://opencores.org/有开源的verilog USB ip核)对接。

linux usb驱动框架中包含很多有趣的玩意,其中drivers/usb/gadget就是其中一个。gadget是usb设备驱动,可以按照USB规范和设备类进行配置,使其成为各种各样的通用USB设备,如键鼠(HID class)、U盘(mass storage class)、网卡(CDC class)、摄像头(Video class)等。

在开始gadget源码分析前,我们先玩一下它!

先声明一下,我们分析的是linux4.4.19版本的gadget源码,其他版本的可能会有些出入,但原理上是相通的。测试平台为通用的硬件平台BeagleBone Black。

要使用linux内核为我们准备的gadget驱动demo,我们主要关注legacy这个文件夹,这个是遗留下来的驱动,已不建议使用了,以后的linux版本或许会消失。但我们这里先从传统入手!

编译内核前,make menuconfig修改一下配置。在usb菜单中选中gadget编译为模块(M),这样内核就可以编译出gadget驱动。编译好后,会在legacy下生成g_xxx.ko。譬如U盘设备驱动为g_mass_storage.ko。而function文件夹则是功能接口(interface)的具体实现,生成形如usb_f_xxx.ko,对应U盘驱动为usb_f_mass_storage.ko。

下面我们测试U盘设备驱动:

先ssh登录到BeagleBone Black板(简称BBB)上进行如下操作,生成一个FAT32格式的img,并挂载到sda文件夹上。

mkdir -p /var/sdcard;
cd  /var/sdcard;
mkdir sda;
dd  if=/dev/zero  of=/var/sdcard/disk.img  bs=1M  count=20;
mkdosfs -F 32  disk.img
mount -t vfat -o sync  /var/sdcard/disk.img   /var/sdcard/sda

此时/var/sdcard/sda为FAT32格式的文件系统,这样我们就能在linux系统里查看disk.img里包含的文件,便于测试验证!

然后在BBB上加载USB相关驱动:

modprobe musb_am335x
modprobe g_mass_storage file=/var/sdcard/disk.img

此时,U盘设备驱动启动,同时指定操作文件为/var/sdcard/disk.img,这样的目的是让PC识别成一个“可移动磁盘”,同时在PC上读写磁盘时,实质上是对BBB板内的/var/sdcard/disk.img进行操作。

在BBB板上lsmod查看当前已加载的驱动:

<lsmod
g_mass_storage          4414  0
usb_f_mass_storage     37916  2 g_mass_storage
libcomposite           44392  2 usb_f_mass_storage,g_mass_storage
musb_dsps               8235  0
musb_hdrc              71550  1 musb_dsps
udc_core               12063  2 musb_hdrc,libcomposite
usbcore               195125  2 musb_hdrc,usbhid
musb_am335x             1426  0

USB线缆接入PC后,我们就能看到PC识别出“可移动磁盘”。我们可以拖一个文件进去,或者在其上创建文件。在BBB板上,我们在已挂载的/var/sdcard/sda上看到刚从PC上拷贝过来的文件。

最后,上面说过,这种方式是legacy的,现已不推荐使用。欲知后事如何,且听下回分解!我们《linux usb gadget驱动详解(二)》见。

linux usb gadget驱动详解(一)相关推荐

  1. linux usb gadget驱动详解(二)

    在上篇<linux usb gadget驱动详解(一)>中,我们了解到gadget的测试方法,但在最后,我们留下一个问题,就是怎样使用新的方法进行usb gadget驱动测试. 我们发现l ...

  2. linux usb gadget驱动详解(三)

    本文将对linux4.4.19版本usb gadget源码进行简单分析.鉴于前文反复测试U盘设备驱动,现从linux-4.4.19/drivers/usb/gadget/legacy/mass_sto ...

  3. linux usb gadget驱动详解(四)

    现从msg_bind()函数(drivers/usb/gadget/legacy/mass_storage.c)开始讲起. U盘的gadget驱动比较复杂,因为它包含几部分,包括gadget驱动.U盘 ...

  4. linux usb gadget驱动详解(五)

    现从fsg_bind()讲起. //不失一般性,删掉错误处理和configfs相关代码 static int fsg_bind(struct usb_configuration *c, struct ...

  5. Linux usb设备驱动详解

    1.Linux usb设备驱动框架 USB是通用串行总线的总称,Linux内核几乎支持所有的usb设备,包括键盘,鼠标,打印机,modem,扫描仪.Linux的usb驱动分为主机驱动与gadget驱动 ...

  6. linux usb键盘驱动详解

    1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示: ...

  7. linux usb ga驱动详解,Linux设备驱动之内存映射

    1. 内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率.Linux提供了mmap()函数,用来映射物理内存. 在驱动程序 ...

  8. php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...

    Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...

  9. Linux字符设备驱动详解七(“插件“设备树实现RGB灯驱动)

    文章目录 系列文章目录 前言 正文 Device Tree Overlays:"插件"设备树 传统设备树 "插件"设备树 使用前提 案例说明 设备树:foo.d ...

最新文章

  1. IP通信基础 5月8日
  2. WebRTC之noise suppression算法
  3. 软件调试学习笔记(六)—— 硬件断点
  4. 深度学习笔记之lSTM网络
  5. git 入门教程之版本管理
  6. jvm默认垃圾收集器
  7. Visual Studio 2010 旗舰版安装图解
  8. nginx哪个版本性能好_骁龙750g和天玑1000+哪个好-参数性能对比
  9. ubuntu下的jdk环境变量配置(解决sun jdk和open jdk的问题)
  10. SQL Server生成含有数据的脚本文件
  11. [Swift]SwiftyJSON的使用:解析JSON
  12. 网站类项目商业计划书
  13. lighttpd 之十二 网络请求服务响应流程
  14. SDN与OPENFLOW 简介
  15. 来自学长师兄们的应届校招经验
  16. 免费Bootstrap后台管理模板
  17. 最长递增子序列O(NlogN)算法
  18. ibm服务器显示0 bf,IBM服务器常见服务器故障总结
  19. SQL数据库字段数据类型说明
  20. 评高级用计算机合格证吗,副教授评审什么情况下可以免计算机合格证

热门文章

  1. js实现图片虚化_Web前端之高斯模糊图片记
  2. 7、任务分配-任务分派其他人
  3. mysql8安装成功后忘记密码,密码重置
  4. Java中接口的作用,为什么要写接口?
  5. 大数据华而不实么?大数据的本质是什么?
  6. vue--子传父、父传子
  7. 点绕坐标系旋转旋转矩阵推导、理解
  8. 塑胶模具设计-双色注塑模具设计36条经典经验分享
  9. 用于食品标签的光学字符识别(OCR)视觉系统
  10. 嵌入式AI开发:Maixduino目标识别分类