打印

STM32 USB键盘修改的问题

[复制链接]
5649|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用的是IAR5.4库里面自带的鼠标例程,可以成功运行,但是按照圈圈的那个说明修改成usb键盘却无法运行,我修改的步骤如下:

第一步:修改const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
  {
   0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
    0x34,                       /*idVendor (0x1234)*/
    0x12,
    0x21,                       /*idProduct = 0x4321*/
    0x43,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*Index of string descriptor describing
                                              manufacturer */
    2,                          /*Index of string descriptor describing
                                             product*/
    3,                          /*Index of string descriptor describing the
                                             device serial number */
    0x01                        /*bNumConfigurations*/
  }


第二步我修改:
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
  {
   //以下为配置描述符
0x09, /* bLength: Configuation Descriptor size */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
JOYSTICK_SIZ_CONFIG_DESC,
/* wTotalLength: Bytes returned */
0x00,
0x01,         /*bNumInterfaces: 1 interface*/
0x01,         /*bConfigurationValue: Configuration value*/
0x00,         /*iConfiguration: Index of string descriptor describing
               the configuration*/
0xC0,         /*bmAttributes: self powered */
0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

//以下为接口描述符
/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09,         /*bLength: Interface Descriptor size*/
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
0x00,         /*bInterfaceNumber: Number of Interface*/
0x00,         /*bAlternateSetting: Alternate setting*/
0x02,         /*bNumEndpoints*/
0x03,         /*bInterfaceClass: HID*/
0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x01,         /*bInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0,            /*iInterface: Index of string descriptor*/

//以下为HID描述符
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09,         /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x00,         /*bcdHID: HID Class Spec release number*/
0x01,
0x00,         /*bCountryCode: Hardware target country*/
0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22,         /*bDescriptorType*/
JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/
0x00,

//以下为输入端点1描述符
/******************** Descriptor of Joystick Mouse endpoint ********************/
/* 27 */
0x07,          /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
0x81,          /*bEndpointAddress: Endpoint Address (IN)*/
0x03,          /*bmAttributes: Interrupt endpoint*/
0x08,          /*wMaxPacketSize: 8 Byte max */
0x00,
0x20,          /*bInterval: Polling Interval (32 ms)*/

//以下为输出端点1描述符
/* 34 */
0x07,          /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/
0x03,          /*bmAttributes: Interrupt endpoint*/
0x08,          /*wMaxPacketSize: 8 Byte max */
0x00,
0x20,          /*bInterval: Polling Interval (32 ms)*/
/* 41 */
  }
  ; /* MOUSE_ConfigDescriptor */
const u8 Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
  {
   0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)
0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, //     LOGICAL_MINIMUM (0)
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
0x95, 0x08, //     REPORT_COUNT (8)
0x75, 0x01, //     REPORT_SIZE (1)
0x81, 0x02, //     INPUT (Data,Var,Abs)
0x95, 0x01, //     REPORT_COUNT (1)
0x75, 0x08, //     REPORT_SIZE (8)
0x81, 0x03, //     INPUT (Cnst,Var,Abs)
0x95, 0x06, //   REPORT_COUNT (6)
0x75, 0x08, //   REPORT_SIZE (8)
0x25, 0xFF, //   LOGICAL_MAXIMUM (255)
0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, //     INPUT (Data,Ary,Abs)
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
0x95, 0x02, //   REPORT_COUNT (2)
0x75, 0x01, //   REPORT_SIZE (1)
0x05, 0x08, //   USAGE_PAGE (LEDs)
0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
0x29, 0x02, //   USAGE_MAXIMUM (Caps Lock)
0x91, 0x02, //   OUTPUT (Data,Var,Abs)
0x95, 0x01, //   REPORT_COUNT (1)
0x75, 0x06, //   REPORT_SIZE (6)
0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)
0xc0        // END_COLLECTION
  }

第三步:修改

  /* Update the serial number string descriptor with the data from the unique
  ID*/
  Get_SerialNum();

  pInformation->Current_Configuration = 0;
  /* Connect the device */
  PowerOn();
  /* USB interrupts initialization */
  _SetISTR(0);               /* clear pending interrupts */
  wInterrupt_Mask = IMR_MSK;
  _SetCNTR(wInterrupt_Mask); /* set interrupts mask */

  bDeviceState = UNCONNECTED;
}

/*******************************************************************************
* Function Name  : Joystick_Reset.
* Description    : Joystick Mouse reset routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Reset(void)
{
  /* Set Joystick_DEVICE as not configured */
  pInformation->Current_Configuration = 0;
  pInformation->Current_Interface = 0;/*the default Interface*/

  /* Current Feature initialization */
  pInformation->Current_Feature = Joystick_ConfigDescriptor[7];

  SetBTABLE(BTABLE_ADDRESS);

  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_STALL);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPRxValid(ENDP0);

  /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxCount(ENDP1, 8);
  SetEPRxStatus(ENDP1, EP_RX_DIS);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

  bDeviceState = ATTACHED;

  /* Set this device to response on default address */
  SetDeviceAddress(0);




地址定义: #define ENDP1_TXADDR        (0x98)
#define ENDP1_RXADDR        (0xD8)

运行:目前是电脑无**常识别usb设备,

2.jpg (6.04 KB )

2.jpg
沙发
skyfight|  楼主 | 2012-6-1 15:12 | 只看该作者
希望各位大侠指点啊,不胜感激

使用特权

评论回复
板凳
vigia| | 2012-6-1 15:25 | 只看该作者
1, 你把你改了什么单独写出来

2, 键盘的report descriptor网上到处都是,你抄一个靠谱的。

3, 你键盘数据怎么发送的?

4, 把我的STM32F103 USB科普贴看一遍先
https://bbs.21ic.com/viewthread.p ... ;highlight=%2Bvigia

使用特权

评论回复
地板
skyfight|  楼主 | 2012-6-1 15:34 | 只看该作者
这个就是在网上抄的圈圈修改usb键盘的例子,修改后就出现了这个情况,却是对usb协议不熟悉,先谢谢你了

使用特权

评论回复
5
vigia| | 2012-6-1 15:41 | 只看该作者
usb是个复杂的协议,和串口之类不好比的

如果你连基本的东西都不想去看一看,就想抄出一个程序来,基本是不可能的。

另外,你贴这么密密麻麻的代码,叫我一行一行去看,我也是不高兴地:lol

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
李晓倩 + 1 www.91mh.cc/comic/12835/ 斗罗大陆漫画.
6
jiayou0054| | 2012-6-1 22:57 | 只看该作者
从出现问题看,应该是发生再设备枚举过程。你可以使用BusHound看看到哪一步。

使用特权

评论回复
7
jiayou0054| | 2012-6-1 22:59 | 只看该作者
从出现问题看,应该是发生再设备枚举过程。你可以使用BusHound看看到哪一步。

使用特权

评论回复
8
qinjian8609| | 2012-6-2 14:19 | 只看该作者
先爱上大叔大叔撒旦

使用特权

评论回复
9
qinjian8609| | 2012-6-2 14:19 | 只看该作者
啊实打实的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

658

帖子

3

粉丝