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

所有USB通讯的设备端都有usb device程序,通常称它们为usb固件。在一些功能简单的设备里,用一些专用的可编程USB控制器就可以了。而在一些运行了类似linux操作系统的复杂的嵌入式系统中,要完成usb device程序,就会要求你不仅熟悉usb device控制器的操作,还要熟悉操作系统的驱动架构。

我想通过 “功能体验”、“驱动调试”、“gadget驱动结构分析”、“编写一个自己的gadget驱动”这4个方面解析linux usb gadget设备驱动的编写方法。

一、linux模拟U盘功能的实现

在硬件环境为华清远见的fs2410平台,软件环境为linux-2.6.26的linux系统上,实现模拟U盘的功能。

向内核添加代码

#include #include #include

修改arch/arm/mach-s3c2410/mach-smdk2410.c

/*USB device上拉电阻处理 */

static void smdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)

{

u8 *s3c2410_pullup_info[] = {

" ",

"Pull-up enable",

"Pull-up disable",

"UDC reset, in case of"

};

printk("smdk2410_udc: %s\n",s3c2410_pullup_info[cmd]);

s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPG9_OUTP);

switch (cmd)

{

case S3C2410_UDC_P_ENABLE :

s3c2410_gpio_setpin(S3C2410_GPG9, 1);   //set gpg9 output HIGH

break;

case S3C2410_UDC_P_DISABLE :

s3c2410_gpio_setpin(S3C2410_GPG9, 0);   //set gpg9 output LOW

break;

case S3C2410_UDC_P_RESET :

//FIXME!!!

break;

default:

break;

}

}

static struct s3c2410_udc_mach_info smdk2410_udc_cfg __initdata = {

.udc_command    = smdk2410_udc_pullup,

};

static struct platform_device *smdk2410_devices[] __initdata = {

…,

&s3c_device_usbgadget,  /*USB gadget device设备登记*/

};

static void __init sdmk2410_init(void)

{

u32 upll_value;

set_s3c2410fb_info(&smdk2410_lcdcfg);

s3c24xx_udc_set_platdata(&smdk2410_udc_cfg); /* 初始化*/

s3c_device_sdi.dev.platform_data = &smdk2410_mmc_cfg;

/* 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时钟 */

upll_value = (

0x78 << S3C2410_PLLCON_MDIVSHIFT)

| (0x02 << S3C2410_PLLCON_PDIVSHIFT)

| (0x03 << S3C2410_PLLCON_SDIVSHIFT);

while (upll_value != readl(S3C2410_UPLLCON)) {

writel(upll_value, S3C2410_UPLLCON);

udelay(20);

}

}

修改drivers/usb/gadget/file_storage.c

static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,

struct usb_request *req, int *pbusy,

enum fsg_buffer_state *state)

{

int     rc;

udelay(800);

……

}

配置内核支持U盘模拟

USB Gadget Support  --->

USB Peripheral Controller (S3C2410 USB Device Controller)  --->

S3C2410 USB Device Controller

[*]       S3C2410 udc debug messages

USB Gadget Drivers

File-backed Storage Gadget

3、编译内核

#make zImage

#make modules

在目录drivers/usb/gadget下生成g_file_storage.ko

加载驱动,测试功能

利用前面的生成的内核,启动系统后,加载g_file_storage.ko

#insmod g_file_storage.ko

# insmod g_file_storage.ko file=/dev/mtdblock2 stall=0 removable=1

0.03 USB: usb_gadget_register_driver() 'g_file_storage'

0.04 USB: binding gadget driver 'g_file_storage'

0.05 USB: s3c2410_set_selfpowered()

g_file_storage gadget: File-backed Storage Gadget, version: 20 October 2004

g_file_storage gadget: Number of LUNs=1

g_file_storage gadget-lun0: ro=0, file: /dev/mtdblock3

0.06 USB: udc_enable called

smdk2410_udc: Pull-up enable

连接设备到windows,windows系统会自动设备到一个新的U盘加入。格式化U盘,存入文件。卸载U盘后,在目标板上执行如下操作:

# mkdir /mnt/gadget

# mount -t vfat /dev/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 messages

USB Gadget Drivers

Ethernet Gadget (with CDC Ethernet support)

[*]       RNDIS support

2、编译内核

#make zImage

#make modules

在目录drivers/usb/gadget下生成g_ether.ko

3、加载驱动,测试功能

利用前面的生成的内核,启动系统后,加载g_ether.ko

#insmod g_ether.ko

#ifconfig usb0 192.168.1.120

……

usb0 Link encap:Ethernet HWaddr 5E:C5:F6:D4:2B:91

inet addr:192.168.1.120 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:253 errors:0 dropped:0 overruns:0 frame:0

TX packets:43 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:35277 (34.4 KiB) TX bytes:10152 (9.9 KiB)

连接设备到windows,windows系统会提示安装驱动,根据提示安装上RNDIS驱动。这个驱动可以在网络上找到。此时windows会新生成一个网络连接,配置它的ip地址等信息。然后就可以和目标系统通过USB实现网络通讯了

linux选择usb功能,USB gadget设备驱动解析(1)——功能体验相关推荐

  1. USB gadget设备驱动解析

    利用Linux USB gadget设备驱动可以实现一些比较有意思的功能,举两个例子: 1.一个嵌入式产品中的某个存储设备,或是一个存储设备的某个分区,可以作为一个U盘被PC:设别,从而非常方便的完成 ...

  2. Linux设备驱动开发---USB主机(控制器)与设备驱动(一)

    USB主机控制器与设备驱动---主机侧 一.Linux USB驱动层次 1.USB驱动(主机侧) 2.USB的逻辑组合(4个层次) 二.USB主机(控制器)驱动 1.主机控制器规格 2.主机控制器的相 ...

  3. Linux I2C核心、总线与设备驱动

    Linux I2C核心.总线与设备驱动 I2C总线仅仅使用SCL. SDA这两根信号线就实现了设备之间的数据交互,极大地简化了对硬件资源和PCB板布线空间的占用.因此, I2C总线非常广泛地应用在EE ...

  4. Linux I2C核心、总线与设备驱动(一)

    本章导读 I2C总线仅仅使用SCL.SDA两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和PCB板布线空间的占用.因此,I2C总线被非常广泛地应用在EEPROM.实时钟.小型LCD等设备与 ...

  5. Linux I2C核心、总线与设备驱动(二)

    从上面的分析可知,虽然I2C硬件体系结构比较简单,但是I2C体系结构在Linux中的实现却相当复杂.当工程师拿到实际的电路板,面对复杂的 Linux I2C子系统,应该如何下手写驱动呢?究竟有哪些是需 ...

  6. Linux内核移植 part2:uboot 设备驱动模型

    最近在移植uboot-2015.04的时候发现,uboot的设备驱动也带驱动模型了,第一次见到的时候还真是愣了一下,特别是调试的时候没有以前那么方便直接了.而且设备模型和设备树捆绑在一起,又得花费一番 ...

  7. linux内核源码分析之设备驱动

    目录 一.I/O 体系结构 二.与外设的交互 1.I/O端口: 2.I/O内存映射 3.轮询和中断 三.驱动分类 四.注册 五.与文件系统关联 六.资源管理 七.结构体总结 一.I/O 体系结构 与外 ...

  8. Linux嵌入式学习(简单 platform 设备驱动的实现)

    文章目录 编辑device.c 编辑driver.c 编辑Makefile 编辑app.c 编译.加载和测试 话不多说,直接开始吧- 工作环境:VMware14+Ubuntu18.04 内核版本:5. ...

  9. linux烟雾传感器程序,Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动...

    #include #include#include#include#include#include#include#include#include#include#include#include #d ...

最新文章

  1. HBase文件索引分析
  2. python 操作 表格
  3. 牛客 - 牛半仙的妹子图(并查集+bitset/克鲁斯卡尔重构树+主席树)
  4. A browser for WinCE/Windows base WebKit. (zz)
  5. 光流.flo文件生成.png图片(可批量)
  6. linux NFS 配置步骤
  7. 医咖会免费SPSS教程学习笔记—组内相关系数ICC
  8. How to read PCA biplots and scree plots
  9. spy++获取supermemo菜单ID
  10. uniapp 获取到当前位置信息显示在地图上
  11. 为什么苹果6没有录屏_谁说苹果手机没有录屏功能的!教你这样开启,还能录制声音呢...
  12. liunx下设置自动完成任务(每周六晚一点整,系统自动把/home目录文件下到所有文件做一个备份,备份到/var/backups/home.tar.gz))
  13. 习题 9.10 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
  14. Android中使用dimen定义尺寸
  15. 2022-2028全球激光全息膜行业调研及趋势分析报告
  16. 详解10G以太网结构、PMD接口及应用的相关知识
  17. B站视频下载软件分享
  18. Mybatis生成逆向工程文件
  19. Linux分区页框分配器之水位
  20. 论文阅读:Deep-Learning Super-Resolution Microscopy

热门文章

  1. 网络编程基础【林老师版】:简单的 套接字通信(一)
  2. electron 前端开发桌面应用
  3. 并发-阻塞队列源码分析
  4. synchronized 详解,偏向锁,轻量锁,重量锁
  5. Java笔记(11):Eclipse使用
  6. QT C1041错误
  7. hdu 5584 gcd/lcm/数学公式
  8. Android官方api的下载
  9. js 正则练习之语法高亮
  10. php去掉 x5E,清除wordpress里PHP文件恶意代码