android USB gadget框架分析

转眼间,看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的框架结构。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答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、付费专栏及课程。

余额充值