Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1571278
  • 博文数量: 204
  • 博客积分: 2215
  • 博客等级: 大尉
  • 技术积分: 4426
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-06 08:03
个人简介

气质,源于心灵的自信!

文章存档

2018年(1)

2017年(1)

2016年(1)

2015年(18)

2014年(20)

2013年(30)

2012年(119)

2011年(14)

分类: LINUX

2012-04-13 11:57:48

    转眼间,看usb gadget代码看的有一段时间了,把其中的层次关系大致的理了一遍,就写出来和大家分享下,不对之处敬请指出,了解层次结构嘛,当然是代码越简单越好,俗话说“柿子专拣软的捏”,就拿最简单的zero.c开涮啦!
首先说下整体流程:
一个UDC(usb设备控制器)上面要挂一个usb_gadget_driver,usb_composite_dev挂到UDC的gadget上,usb_composite_driver挂到usb_composite_dev上,然后在usb_composite_dev上挂上一个usb_configuration配置,然后在usb_configuration的function链表中挂一个function,并且把function写入对应的config 的interface数组中。这就是整个流程。可能这么说有点晕,下面就看实际的代码分析吧!
首先把结构体老大贴出来,因为别人都依靠他呢!
  1. struct s3c2410_udc {
  2.     .........................
  3.     struct usb_gadget        gadget;
  4.     struct usb_gadget_driver    *driver;
  5.     .....................
  6. };

首先你应该准备一个usb_gadget_driver,并把它挂到上述结构体的driver成员中。在zero.c中该结构为

  1. static struct usb_gadget_driver composite_driver = {
  2.     .speed        = USB_SPEED_HIGH,

  3.     .unbind        = composite_unbind,

  4.     .setup        = composite_setup,
  5.     .disconnect    = composite_disconnect,

  6.     .suspend    = composite_suspend,
  7.     .resume        = composite_resume,

  8.     .driver    = {
  9.         .owner        = THIS_MODULE,
  10.     },
  11. };
这个结构是通用的结构。其中的composite_driver.function成员和composite_driver.driver.name被
usb_composite_driver中得成员给重新赋值了。

  1. static struct usb_composite_driver zero_driver = {
  2.     .name        = "zero",
  3.     .dev        = &device_desc,
  4.     .strings    = dev_strings,
  5.     .unbind        = zero_unbind,
  6.     .suspend    = zero_suspend,
  7.     .resume        = zero_resume,
  8. };

然后分配一个usb_composite_dev,把该结构体挂到gadget上,现在结构体老大如下
  1. struct s3c2410_udc {
  2.     .........................
  3.     struct usb_gadget        gadget;----------》cdev
  4.     struct usb_gadget_driver    *driver;-------->composite_driver
         .....................
  5. };
  6. 然后在cdev上挂上usb_composite_driver,其定义如下:

    1. static struct usb_composite_driver zero_driver = {
    2.     .name        = "zero",
    3.     .dev        = &device_desc,
    4.     .strings    = dev_strings,
    5.     .unbind        = zero_unbind,
    6.     .suspend    = zero_suspend,
    7.     .resume        = zero_resume,
    8. };

    然后在cdev上绑定usb_configuration,usb_config的定义如下:

    1. static struct usb_configuration loopback_driver = {
    2.     .label        = "loopback",
    3.     .strings    = loopback_strings,
    4.     .bConfigurationValue = 2,
    5.     .bmAttributes    = USB_CONFIG_ATT_SELFPOWER,
    6.     /* .iConfiguration = DYNAMIC */
    7. };
    把该config挂到cdev上。然后初始化一个function,并把它挂到config上,初始化的function如下

    1. loop = kzalloc(sizeof *loop, GFP_KERNEL);
    2.     loop->function.name = "loopback";
    3.     loop->function.descriptors = fs_loopback_descs;
    4.     loop->function.bind = loopback_bind;
    5.     loop->function.unbind = loopback_unbind;
    6.     loop->function.set_alt = loopback_set_alt;
    7.     loop->function.disable = loopback_disable;
    然后调用该function的bind函数,把function加入到config的interface数组中。至此层次结构已经理清,这也是usb gadget的框架结构。
阅读(6402) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~