ylscat 发表于 2013-6-5 11:48:01

PC不识别Gadget HID

本帖最后由 ylscat 于 2013-6-9 16:37 编辑

我想把TQ2416做成一个模拟的USB键盘,但是PC总是识别为未知设备。我没什么驱动经验,请技服给予指点!
代码修改的步骤如下:
我参考了linux kernel的一个例子写的,https://www.kernel.org/doc/Documentation/usb/gadget_hid.txt
1 linux-3.1_TQ2416/arch/arm/mach-s3c2416/mach-tq2416.c
添加hid设备注册:
#include <linux/usb/g_hid.h>
/* hid descriptor for a keyboard */
static struct hidg_func_descriptor my_hid_data = {
      .subclass               = 0, /* No subclass */
      .protocol               = 1, /* Keyboard */
      .report_length          = 8,
      .report_desc_length   = 63,
      .report_desc            = {
                0x05, 0x01,   /* USAGE_PAGE (Generic Desktop)         */
                0x09, 0x06,   /* USAGE (Keyboard)                     */
                0xa1, 0x01,   /* COLLECTION (Application)               */
                0x05, 0x07,   /*   USAGE_PAGE (Keyboard)                */
                0x19, 0xe0,   /*   USAGE_MINIMUM (Keyboard LeftControl) */
                0x29, 0xe7,   /*   USAGE_MAXIMUM (Keyboard Right GUI)   */
                0x15, 0x00,   /*   LOGICAL_MINIMUM (0)                  */
                0x25, 0x01,   /*   LOGICAL_MAXIMUM (1)                  */
                0x75, 0x01,   /*   REPORT_SIZE (1)                      */
                0x95, 0x08,   /*   REPORT_COUNT (8)                     */
                0x81, 0x02,   /*   INPUT (Data,Var,Abs)               */
                0x95, 0x01,   /*   REPORT_COUNT (1)                     */
                0x75, 0x08,   /*   REPORT_SIZE (8)                      */
                0x81, 0x03,   /*   INPUT (Cnst,Var,Abs)               */
                0x95, 0x05,   /*   REPORT_COUNT (5)                     */
                0x75, 0x01,   /*   REPORT_SIZE (1)                      */
                0x05, 0x08,   /*   USAGE_PAGE (LEDs)                  */
                0x19, 0x01,   /*   USAGE_MINIMUM (Num Lock)             */
                0x29, 0x05,   /*   USAGE_MAXIMUM (Kana)               */
                0x91, 0x02,   /*   OUTPUT (Data,Var,Abs)                */
                0x95, 0x01,   /*   REPORT_COUNT (1)                     */
                0x75, 0x03,   /*   REPORT_SIZE (3)                      */
                0x91, 0x03,   /*   OUTPUT (Cnst,Var,Abs)                */
                0x95, 0x06,   /*   REPORT_COUNT (6)                     */
                0x75, 0x08,   /*   REPORT_SIZE (8)                      */
                0x15, 0x00,   /*   LOGICAL_MINIMUM (0)                  */
                0x25, 0x65,   /*   LOGICAL_MAXIMUM (101)                */
                0x05, 0x07,   /*   USAGE_PAGE (Keyboard)                */
                0x19, 0x00,   /*   USAGE_MINIMUM (Reserved)             */
                0x29, 0x65,   /*   USAGE_MAXIMUM (Keyboard Application) */
                0x81, 0x00,   /*   INPUT (Data,Ary,Abs)               */
                0xc0            /* END_COLLECTION                         */
      }
};

static struct platform_device my_hid = {
      .name                   = "hidg",
      .id                     = 0,
      .num_resources          = 0,
      .resource               = 0,
      .dev.platform_data      = &my_hid_data,
};


static struct platform_device *tq2416_devices[] __initdata = {
...
&s3c_device_usbgadget,
&my_hid,
}

2 修改menuconfig
Device Drivers -> HID devices -> USB human interface (full support)
Device Drivers -> USB support -> USB gadget support -> HID Gadget

3 加载模块
把编译的zImage烧写,进入命令行,insmod g_hid.ko。

这个时候windows发现了未知的设备,无法识别。
出现了文件/dev/hidg0
然后串口出现了如下信息:
hub 1-0:1.0: Cannot enable port 2.Maybe the USB cable is bad?
hub 1-0:1.0: Cannot enable port 2.Maybe the USB cable is bad?
hub 1-0:1.0: Cannot enable port 2.Maybe the USB cable is bad?
hub 1-0:1.0: Cannot enable port 2.Maybe the USB cable is bad?
hub 1-0:1.0: unable to enumerate USB device on port 2

我猜测可能是USB时钟没有配置,因为论坛贴问过这事,《S3C2416 USB HOST 裸机问题》
还有就是没有把CPU的USB port1配置为Device function。

请教各位大牛,给予指点。最好给点配置的例子,比如2410/2440怎么配的(kernel是3.1的)

亚瑟王 发表于 2013-6-5 18:20:56

TQ2416要使用device功能是需要修改TQ2416的usb device驱动源码,完善时钟之类的初始化,完成这个操作就可以使用usb了。

ylscat 发表于 2013-6-9 16:36:44

把PHYCTRL寄存器的值改为0就可以了。见drivers/usb/gadget/s3c-hsudc.c
static void s3c_hsudc_init_phy(void)
{
...
    writel(0, S3C2443_PHYCTRL);
...
}

亚瑟王 发表于 2013-6-9 17:57:36

ylscat 发表于 2013-6-9 16:36 static/image/common/back.gif
把PHYCTRL寄存器的值改为0就可以了。见drivers/usb/gadget/s3c-hsudc.c
static void s3c_hsudc_init_phy(v ...

是的,是修改这个地方。
页: [1]
查看完整版本: PC不识别Gadget HID