usb gadget multi-function驱动

通常情况下, usb设备是一些简单的,  单一功能的装置。

如鼠标, 键盘, U盘等。 这些设备相对简单, 故主控制器一般使用单片机即可。

如U盘的组成结构一般如下:

1. usb设备控制器 + usb phy

2. 单片机主控

3. nand存储接口芯片

4. ROM, RAM

5. 供电模块

 

当然, 有些芯片厂家把这些功能都集合在了一个芯片当中, 如台湾的群联电子(phison), 主要就提供闪存(Nand Flash)控制器, 及存储整体解决方案。

之前的PS2251-33 芯片, 即为USB2.0 闪存控制器芯片。

内部集成了 usb2.0/1.1设备控制器, 微控制器, Nand Flash接口芯片及PRAM(可编程存储介质, 用户可更新固件/描述信息等)

该芯片向外引出48pin, 64pin等版本,  用于连接Nand Flash存储器, 供电, USB接口引脚, 晶振时钟输入输出引脚, 复位及测试用引脚等等。可完成U盘等设备的开发与设计。


废话很多... 概括讲, 大部分usb设备比较简单, 只提供usb function, 故不需要复杂系统。

但有些usb设备,  如安卓手机, IPC摄像头, 各种带otg接口的开发板, 这些想作为usb设备存在, 需要

1. 硬件集成usb设备控制器

2. 操作系统需支持usb 从设备驱动, 如Linux Gadget 驱动框架就可以方便用户编写从设备驱动程序

 

这里就引出了multi-function gadget驱动, 类似安卓手机, 可提供adb, mtp, ptp等功能, 故该设备就是一个usb composite(复合)设备。但通常安卓手机这些功能无法同时启用, 界面中会提供一个选择界面, 用户同一时间只能使用一种功能。

 

而Linux内核中提供的gadget multi-function驱动, 是一个多功能复合设备的实现参考, 它可以使usb设备同时使能三种功能:

1. usb虚拟网卡(rndis或cdc ecm)  -- ifconfig 产生usb0网卡, 可通过该网卡进行网络通信

2. usb虚拟串口(cdc acm) -- usb设备端产生/dev/ttyGS0, 主机端产生/dev/ttyACM0, 两者可通过tty设备进行串口通信

3. 大容量存储介质(mass storage) -- 主机端会产生/dev/sdx 设备节点, 挂载后可进行文件系统操作

以上三种功能可同时进行


ok, 讲了这么多,  我们直接进行相关的配置来试验一下... (对的, linux主线已经实现了这些驱动...我们要做的仅仅是配置||)

1. make menuconfig 配置使能gadget multi function, 在usb gadget目录下面, 不贴图了

2. 更换内核镜像(如果是build-in), 或者更换内核模块(/lib/modules/xxxx/kernel/drivers/usb/***)

3. 启动系统后, 加载g_multi.ko即可

    modprobe g_multi.ko  xxxxxx

    关于内核参数, 必须的仅有一个, 即f_mass_storage.ko需要的file=xxx, 描述使用的文件系统镜像

    故以下是制作文件系统镜像(和制作rootfs类似)

    * dd if=/dev/zero of=/mnt/mass_stor.img bs=1M count=20   // 生成20M的空文件

    * losetup -f /mnt/mass_stor.img  // 使用第一个空闲的loop设备,  关联该镜像

    * losetp -a 即可看见回环设备  (所谓回环设备, 类似回环地址127.0.0.1, 是软件虚拟的, 没有对应硬件块设备或网卡)

    * mkfs.vfat /dev/loop0  (格式化成vfat)

    * mount /dev/loop0 /mnt/media   (挂载该块设备)

 

    之后, 可以使用以下命令正确加载g_multi.ko模块了

    modprobe g_multi.ko file=/dev/loop0

 

4. ok, 如果usb控制器配置正确(peripheral 或 drd/otg模式), 该usb复合设备会上拉相应的引脚, 此处ecm, rndis, acm, mass storage等驱动使用的都是480M速度, 即usb 高速设备, 驱动会利用usb设备控制器相关寄存器控制 上拉D+引脚,  后续就能被usb主机探测到并做相应速度识别, 枚举等规范操作了。

 


ok, 该多功能usb复合设备就能被主机使用了。下面描述下3种功能如何使用...

如果主机是Linux系统的话,  默认的内核配置应该就支持以上三种功能主机端设备驱动(class driver)

主机端lsusb看一下:

river@river-VirtualBox:~/mount/rootfs$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 480M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=, 12M
    |__ Port 2: Dev 5, If 4, Class=Mass Storage, Driver=usb-storage, 480M
    |__ Port 2: Dev 5, If 2, Class=Communications, Driver=cdc_acm, 480M
    |__ Port 2: Dev 5, If 0, Class=Communications, Driver=rndis_host, 480M
    |__ Port 2: Dev 5, If 3, Class=CDC Data, Driver=cdc_acm, 480M
    |__ Port 2: Dev 5, If 1, Class=CDC Data, Driver=rndis_host, 480M

usb-storage, cdc_acm, rndis_host 这三种驱动都加载了 (即rndis和cdc ecm是互斥的, 需要配置选择使用)

1. 虚拟串口, 

    这个简单, 设备端echo 12345 > /dev/ttyGS0, 主机端 cat /dev/ttyACM0  就实现了串口通信... 反之亦然

    如果要和控制台(console)相关联, 输出相关log, 需要内核参数配置 如console=/ttyGS0,115200, 如此主机端就能使用一些串口终端程序, 如securecrt, putty, xshell, minicom, picocom等, 和usb设备进行串口通信

2. 大容量存储介质,

    这个更简单, 直接挂载/dev/sdx块设备, 然后进行文件系统操作即可

3. 虚拟网卡

    ifconfig -a 一下,  应该新增了usb0这一类的网卡, 主要配置下ip,  掩码, 网关等即可

PC端:
[ 6557.497339] rndis_host 1-2:1.0 enp0s12u2: renamed from usb0


HOST_USB_IP=192.168.1.2
sudo ifconfig enp0s12u2 $HOST_USB_IP netmask 255.255.255.0
route


设备端:
HOST_USB_IP=192.168.1.2
TARGET_USB_IP=192.168.1.111
ifconfig usb0 $TARGET_USB_IP netmask 255.255.255.0
route

如此即可,  互相ping一下.


ok, 熟悉一下,  后续可参考g_multi.ko 实现一个其他功能集合的usb设备驱动。

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux USB gadget驱动编写有如下几个步骤: 1. 确定USB gadget功能:首先需要确定所需实现的USB gadget功能,例如以USB设备的形式提供存储、网络、音频等服务。这样可以决定需要实现的USB gadget驱动类型和功能。 2. 编写USB驱动框架:基于Linux内核框架,编写USB gadget驱动的基本框架。这包括注册USB gadget驱动和常用的函数接口等。 3. 实现USB gadget子系统:根据所需的功能,实现USB gadget子系统的模块,如存储、网络或音频子系统等。这些子系统需要封装底层的USB通信协议和数据传输,供应用程序调用。 4. 配置USB gadget驱动:根据具体需求,在系统配置文件中进行必要的配置,以启用和配置USB gadget驱动。这包括配置端点、描述符和功能等。 5. 移植和编译:将驱动程序编译成内核模块,然后将其移植到目标设备上。对于嵌入式设备,可能需要修改硬件相关的代码,以适应硬件平台。 6. 测试和调试:编写测试用例,对USB gadget驱动进行测试和调试,确保其正常工作。这包括对设备和主机之间的数据传输进行验证,以及处理异常情况和错误处理。 总之,编写Linux USB gadget驱动需要明确所需实现的功能、基于内核框架编写驱动框架、实现USB gadget子系统、配置以及移植和编译。最后进行测试和调试,确保驱动程序的正常运行。通过以上步骤,可以实现各种USB设备功能的驱动。 ### 回答2: Linux USB gadget驱动是用于实现USB设备的功能的驱动程序。它使得Linux设备可以作为一个USB设备与其他主机进行通信。在编写Linux USB gadget驱动时,需要完成以下几个步骤。 首先,需要确定设备的功能和属性。USB设备可以有多种功能,如储存设备、键盘、鼠标等。根据设备的类型和规格,确定设备的操作和数据传输方式。 其次,在驱动程序中定义设备的USB描述符。USB描述符包括设备描述符、接口描述符和端点描述符等,它们是USB协议的一部分,用于描述设备的属性和功能。 然后,在驱动程序中实现设备的相关功能。根据设备的类型和规格,编写相应的功能代码。例如,如果设备是一个键盘,就需要实现按键事件的处理逻辑;如果设备是一个储存设备,就需要实现读写数据的逻辑。 最后,编译和加载驱动程序。使用Linux内核提供的工具链,将驱动程序编译为可执行文件,并将其加载到Linux内核中运行。加载驱动程序后,系统即可识别设备,并根据驱动程序中定义的功能和属性来处理设备的操作和数据传输。 总之,编写Linux USB gadget驱动需要确定设备的功能和属性、定义USB描述符、实现设备的相关功能,最后编译和加载驱动程序。通过这些步骤,我们可以在Linux系统中实现USB设备的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值