天嵌 ARM开发社区

 找回密码
 注册
查看: 4806|回复: 3

PC不识别Gadget HID

[复制链接]
ylscat 发表于 2013-6-5 11:48:01 | 显示全部楼层 |阅读模式
本帖最后由 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
把PHYCTRL寄存器的值改为0就可以了。见drivers/usb/gadget/s3c-hsudc.c
static void s3c_hsudc_init_phy(v ...

是的,是修改这个地方。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-6 02:00 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表