linux usb gadget设备驱动

上传人:xh****66 文档编号:56672102 上传时间:2018-10-14 格式:DOC 页数:55 大小:402.50KB
返回 下载 相关 举报
linux usb gadget设备驱动_第1页
第1页 / 共55页
linux usb gadget设备驱动_第2页
第2页 / 共55页
linux usb gadget设备驱动_第3页
第3页 / 共55页
linux usb gadget设备驱动_第4页
第4页 / 共55页
linux usb gadget设备驱动_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《linux usb gadget设备驱动》由会员分享,可在线阅读,更多相关《linux usb gadget设备驱动(55页珍藏版)》请在金锄头文库上搜索。

1、LinuxLinux usbusb gadgetgadget 驱动驱动利用 Linux USB gadget 设备驱动可以实现一些比较有意思的功能,举两个例子: 1、一个嵌入式产品中的某个存储设备,或是一个存储设备的某个分区,可以作为一个 U 盘被 PC;设别,从而非常方便的完成文件交互,这个功能被广泛的应用于手机、数码相机等产品中。2、一个嵌入式设备通过 USB 连接到你的 PC 后,在你的 PC 端会出现一个新的网络连接,在嵌入式设备上也会有一个网卡设备,你可以配置它们的 IP 地址,并进行网络通讯,俗称USBNET。所有 USB 通讯的设备端都有 usb device 程序,通常称它们为

2、 usb 固件。在一些功能简单的设备里,用一些专用的可编程 USB 控制器就可以了。而在一些运行了类似 linux 操作系统的复杂的嵌入式系统中,要完成 usb device 程序,就会要求你不仅熟悉 usb device 控制器的操作,还要熟悉操作系统的驱动架构。我想通过 “功能体验”、“驱动调试”、“gadget 驱动结构分析”、“编写一个自己的 gadget 驱动”这 4 个方面解析 linux usb gadget 设备驱动的编写方法。一、linux 模拟 U 盘功能的实现 在硬件环境为华清远见的 fs2410 平台,软件环境为 linux-2.6.26 的 linux 系统上,实现模

3、拟 U 盘的功能。向内核添加代码#include #include #include 修改修改 arch/arm/mach-s3c2410/mach-smdk2410.carch/arm/mach-s3c2410/mach-smdk2410.c/*USB device 上拉电阻处理 */static void smdk2410_udc_pullupsmdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)u8 *s3c2410_pullup_info = “ “,“Pull-up enable“,“Pull-up disable“,“UDC reset, i

4、n case of“;printk(“smdk2410_udc: %sn“,s3c2410_pullup_infocmd);s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPG9_OUTP);switch (cmd)case S3C2410_UDC_P_ENABLE :s3c2410_gpio_setpin(S3C2410_GPG9, 1); /set gpg9 output HIGHbreak;case S3C2410_UDC_P_DISABLE :s3c2410_gpio_setpin(S3C2410_GPG9, 0); /set gpg9 outpu

5、t LOWbreak;case S3C2410_UDC_P_RESET :/FIXME!break;default:break;static struct s3c2410_udc_mach_info smdk2410_udc_cfgsmdk2410_udc_cfg _initdata = .udc_command = smdk2410_udc_pullup,;static struct platform_device *smdk2410_devices _initdata = ,static void _init sdmk2410_init(void) u32 upll_value;set_s

6、3c2410fb_info(s3c24xx_udc_set_platdata( /* 初始化*/s3c_device_sdi.dev.platform_data = /* Turn off suspend on both USB ports, and switch the* selectable USB port to USB device mode. */s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |S3C2410_MISCCR_USBSUSPND0 |S3C2410_MISCCR_USBSUSPND1, 0x0);/* 设置 USB 时钟 */

7、upll_valueupll_value = = ( (0x780x78 USB Gadget Support -USB Peripheral Controller (S3C2410 USB Device Controller) -S3C2410 USB Device Controller* S3C2410 udc debug messagesUSB Gadget Drivers File-backed Storage Gadget3、编译内核#make zImage#make modules在目录 drivers/usb/gadget 下生成 g_file_storage.ko加载驱动,测试

8、功能利用前面的生成的内核,启动系统后,加载 g_file_storage.ko#insmod g_file_storage.ko# insmod g_file_storage.ko file=/dev/mtdblock2 stall=0 removable=10.03 USB: usb_gadget_register_driver() g_file_storage0.04 USB: binding gadget driver g_file_storage0.05 USB: s3c2410_set_selfpowered()g_file_storage gadget: File-backed S

9、torage Gadget, version: 20 October 2004g_file_storage gadget: Number of LUNs=1g_file_storage gadget-lun0: ro=0, file: /dev/mtdblock30.06 USB: udc_enable calledsmdk2410_udc: Pull-up enable连接设备到 windows,windows 系统会自动设备到一个新的 U 盘加入。格式化 U 盘,存入文件。卸载 U 盘后,在目标板上执行如下操作:# mkdir /mnt/gadget# mount -t vfat /dev

10、/mtdblock2 /mnt/gadget/ #ls可以看到 windows 存入 U 盘的文件。 二、usbnet 功能的实现 配置内核支持 usbnet USB Gadget Support -USB Peripheral Controller (S3C2410 USB Device Controller) -S3C2410 USB Device Controller* S3C2410 udc debug messagesUSB Gadget DriversEthernet Gadget (with CDC Ethernet support)* RNDIS support2、编译内核#m

11、ake zImage#make modules在目录 drivers/usb/gadget 下生成 g_ether.ko3、加载驱动,测试功能利用前面的生成的内核,启动系统后,加载 g_ether.ko#insmod g_ether.ko#ifconfig usb0 192.168.1.120usb0 Link encap:Ethernet HWaddr 5E:C5:F6:D4:2B:91inet addr:192.168.1.120 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Me

12、tric:1RX packets:253 errors:0 dropped:0 overruns:0 frame:0TX packets:43 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:35277 (34.4 KiB) TX bytes:10152 (9.9 KiB) 连接设备到 windows,windows 系统会提示安装驱动,根据提示安装上 RNDIS 驱动。这个驱动可以在网络上找到。此时 windows 会新生成一个网络连接,配置它的 ip 地址等信息。然后就可以和目标系统通过

13、 USB 实现网络通讯了这一节主要把在实现“linux 模拟 U 盘功能”过程中的一些调试过程记录下来,并加以解析。一、背景知识 1、USB Mass Storage 类规范概述类规范概述 USB 组织在 universal Serial Bus Mass Storage Class Spaceification 1.1 版本中定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个 独立的子类规范,即: 1. USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport2.USB Mass Stora

14、ge Class Bulk-Only Transport3.USB Mass Storage Class ATA Command Block 4.USB Mass Storage Class UFI Command Specification 前两个子规范定义了数据/命令/状态在 USB 上的传输方法。Bulk- Only 传输规范仅仅使用 Bulk 端点传送数据/命令/状态,CBI 传输规范则使用 Control/Bulk/Interrupt 三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA 命令规范用于硬盘,UFI 命令规范是针对 USB 移动存储。

15、Microsoft Windows 中提供对 Mass Storage 协议的支持,因此 USB 移动设备只需要遵循 Mass Storage 协议来组织数据和处理命令,即可实现与 PC 机交换数据。而 Flash 的存储单元组织形式采用 FAT16 文件系统,这样,就可以直接在 Windows 的浏览器中通过可移动磁盘来交换数据了,Windows 负责对 FAT16 文件系统的管理,USB 设备不需要干预FAT16 文件系统操作的具体细节。 USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这 些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述

16、符,是USB 设备正常工作的先决条件。 Linux-2.6.26 内核中在利用 USB gadget 驱动实现模拟 U 盘时主要涉及到 file_storage.c、s3c2410_udc.c 等驱动文件(这些文件的具体结构,将在下一篇文章中描述)。此时我们想先从这些代码中找到 USB 描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。 存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:其中,bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol 可以判断出设备是否是存储类,以及属于哪种存储子类和存储介质的操作命令。在 file_storage.c 文件中,/* USB protocol value = the transport method */#define USB_PR_CBI 0x00 / Control/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号