首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM做为USB从设备的实现

ARM做为USB从设备的实现

ARM做为USB从设备的实现,在linux内核中有例程,很遗憾,不能直接拿过来用.

主要有两方面原因:
1,内核缺少一个头文件.
#include/linux/usb/g_hid.h
时间太久了,记得不太清楚.好像是这个文件.从网上down下来之后,扔到内核头文件里面即可.
里面的内容为:
[cpp] view plaincopy

  • /*
  • * g_hid.h -- Header file for USB HID gadget driver
  • *
  • * Copyright (C) 2010 Fabien Chouteau <fabien.chouteau@barco.com>
  • *
  • * This program is free software; you can redistribute it and/or modify
  • * it under the terms of the GNU General Public License as published by
  • * the Free Software Foundation; either version 2 of the License, or
  • * (at your option) any later version.
  • *
  • * This program is distributed in the hope that it will be useful,
  • * but WITHOUT ANY WARRANTY; without even the implied warranty of
  • * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  • * GNU General Public License for more details.
  • *
  • * You should have received a copy of the GNU General Public License
  • * along with this program; if not, write to the Free Software
  • * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  • */

  • #ifndef __LINUX_USB_G_HID_H
  • #define __LINUX_USB_G_HID_H

  • struct hidg_func_descriptor {  
  •         unsigned char           subclass;  
  •         unsigned char           protocol;  
  •         unsigned short          report_length;  
  •         unsigned short          report_desc_length;  
  •         unsigned char           report_desc[];  
  • };  
  • #endif /* __LINUX_USB_G_HID_H */

2, 在linux-2.6.31.1-cavm1/drivers/usb/gadget中,hid.c文件写法有误.
正确写法为:
[cpp] view plaincopy

  • /*
  • * hid.c -- HID Composite driver
  • *
  • * Based on multi.c
  • *
  • * Copyright (C) 2010 Fabien Chouteau <fabien.chouteau@barco.com>
  • *
  • * This program is free software; you can redistribute it and/or modify
  • * it under the terms of the GNU General Public License as published by
  • * the Free Software Foundation; either version 2 of the License, or
  • * (at your option) any later version.
  • *
  • * This program is distributed in the hope that it will be useful,
  • * but WITHOUT ANY WARRANTY; without even the implied warranty of
  • * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  • * GNU General Public License for more details.
  • *
  • * You should have received a copy of the GNU General Public License
  • * along with this program; if not, write to the Free Software
  • * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  • */


  • #include <linux/kernel.h>
  • #include <linux/platform_device.h>
  • #include <linux/list.h>
  • #include <linux/usb/musb.h>


  • #define DRIVER_DESC     "HID ps3 controller"
  • #define DRIVER_VERSION      "2011/07/21"

  • /*-------------------------------------------------------------------------*/

  • #define HIDG_VENDOR_NUM     0x0525  /* XXX NetChip */
  • #define HIDG_PRODUCT_NUM    0xa4ac  /* Linux-USB HID gadget */

  • /*-------------------------------------------------------------------------*/

  • /*
  • * kbuild is not very cooperative with respect to linking separately
  • * compiled library objects into one module.  So for now we won't use
  • * separate compilation ... ensuring init/exit sections work to shrink
  • * the runtime footprint, and giving us at least some parts of what
  • * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  • */

  • #include "composite.c"
  • #include "usbstring.c"
  • #include "config.c"
  • #include "epautoconf.c"

  • #include "f_hid.c"


  • struct hidg_func_node {  
  •     struct list_head node;  
  •     struct hidg_func_descriptor *func;  
  • };  

  • static LIST_HEAD(hidg_func_list);  

  • /*-------------------------------------------------------------------------*/

  • static
    struct usb_device_descriptor device_desc = {  
  •     .bLength =      sizeof device_desc,  
  •     .bDescriptorType =  USB_DT_DEVICE,  

  •     .bcdUSB =       cpu_to_le16(0x0200),  

  •     /* .bDeviceClass =      USB_CLASS_COMM, */
  •     /* .bDeviceSubClass =   0, */
  •     /* .bDeviceProtocol =   0, */
  •     .bDeviceClass =     0xEF,  
  •     .bDeviceSubClass =  2,  
  •     .bDeviceProtocol =  1,  
  •     /* .bMaxPacketSize0 = f(hardware) */

  •     /* Vendor and product id can be overridden by module parameters.  */
  •     .idVendor =     cpu_to_le16(HIDG_VENDOR_NUM),  
  •     .idProduct =        cpu_to_le16(HIDG_PRODUCT_NUM),  
  •     /* .bcdDevice = f(hardware) */
  •     /* .iManufacturer = DYNAMIC */
  •     /* .iProduct = DYNAMIC */
  •     /* NO SERIAL NUMBER */
  •     .bNumConfigurations =   1,  
  • };  

  • static
    struct usb_otg_descriptor otg_descriptor = {  
  •     .bLength =      sizeof otg_descriptor,  
  •     .bDescriptorType =  USB_DT_OTG,  

  •     /* REVISIT SRP-only hardware is possible, although
  •      * it would not be called "OTG" ...
  •      */
  •     .bmAttributes =     USB_OTG_SRP | USB_OTG_HNP,  
  • };  

  • static
    const
    struct usb_descriptor_header *otg_desc[] = {  
  •     (struct usb_descriptor_header *) &otg_descriptor,  
  •     NULL,  
  • };  


  • /* string IDs are assigned dynamically */

  • #define STRING_MANUFACTURER_IDX     0
  • #define STRING_PRODUCT_IDX      1

  • static
    char manufacturer[50];  

  • static
    struct usb_string strings_dev[] = {  
  •     [STRING_MANUFACTURER_IDX].s = manufacturer,  
  •     [STRING_PRODUCT_IDX].s = DRIVER_DESC,  
  •     {  } /* end of list */
  • };  

  • static
    struct usb_gadget_strings stringtab_dev = {  
  •     .language   = 0x0409,   /* en-us */
  •     .strings    = strings_dev,  
  • };  

  • static
    struct usb_gadget_strings *dev_strings[] = {  
  •     &stringtab_dev,  
  •     NULL,  
  • };  
继承事业,薪火相传
返回列表