本帖最后由 sujingliang 于 2024-11-2 19:30 编辑
SDK example中有一个HID设备的例程:phy6222_v313_0512\example\ble_peripheral\HIDKeyboard
缺省被配置为调节音量的设备。也预留了改为键盘和鼠标的代码,只不过是被注释了。
1、修改HID描述符(hidkbservice.c)
放开Keyboard部分的描述,注释掉其他部分
- static CONST uint8 hidReportMap[] =
- {
- #if 1
- 0x05, 0x01, // Usage Pg (Generic Desktop)
- 0x09, 0x06, // Usage (Keyboard)
- 0xA1, 0x01, // Collection: (Application)
- 0x85, HID_RPT_ID_KEY_IN, // Report Id (2)
- //
- 0x05, 0x07, // Usage Pg (Key Codes)
- 0x19, 0xE0, // Usage Min (224)
- 0x29, 0xE7, // Usage Max (231)
- 0x15, 0x00, // Log Min (0)
- 0x25, 0x01, // Log Max (1)
- //
- // Modifier byte
- 0x75, 0x01, // Report Size (1)
- 0x95, 0x08, // Report Count (8)
- 0x81, 0x02, // Input: (Data, Variable, Absolute)
- //
- // Reserved byte
- 0x95, 0x01, // Report Count (1)
- 0x75, 0x08, // Report Size (8)
- 0x81, 0x01, // Input: (Constant)
- //
- // LED report
- 0x95, 0x05, // Report Count (5)
- 0x75, 0x01, // Report Size (1)
- 0x05, 0x08, // Usage Pg (LEDs)
- 0x19, 0x01, // Usage Min (1)
- 0x29, 0x05, // Usage Max (5)
- 0x91, 0x02, // Output: (Data, Variable, Absolute)
- //
- // LED report padding
- 0x95, 0x01, // Report Count (1)
- 0x75, 0x03, // Report Size (3)
- 0x91, 0x01, // Output: (Constant)
- //
- // Key arrays (6 bytes)
- 0x95, 0x06, // Report Count (6)
- 0x75, 0x08, // Report Size (8)
- 0x15, 0x00, // Log Min (0)
- 0x25, 0x65, // Log Max (101)
- 0x05, 0x07, // Usage Pg (Key Codes)
- 0x19, 0x00, // Usage Min (0)
- 0x29, 0x65, // Usage Max (101)
- 0x81, 0x00, // Input: (Data, Array)
- //
- 0xC0, // End Collection
- #endif
复制代码
2、hiddev.c
放开touch_init,touch_init负责按键部分处理函数
- void HidDev_Init( uint8 task_id )
- {
- ......
- touch_init(on_key);
- ......
- }
复制代码 需要增加一个on_key函数,用于向hidKbdTaskId发送按键事件。
- void on_key(touch_evt_t key_evt)
- {
- if(key_evt==TOUCH_EVT_PRESS)
- {
- //osal_set_event( hidKbdTaskId, START_DEVICE_EVT );
- LOG("on_key Press A\n");
- osal_start_timerEx(hidKbdTaskId, HID_KEYA_EVT, 20);
- }
- }
复制代码 hidkbd.h中定义:
#define HID_KEYA_EVT 0x0200
3、touch_key.c
- static void pin_event_handler(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
- {
- if(type == NEGEDGE)
- {
- s_touch_hdl(TOUCH_EVT_PRESS);
- LOG("key release\n");
- }
- }
- int touch_init(touch_evt_hdl_t hdl)
- {
- //uint32_t ret;
- if(hdl == NULL)
- return PPlus_ERR_INVALID_PARAM;
- s_touch_hdl = hdl;
- hal_gpioretention_register(P15);
- hal_gpio_pin_init(P15,IE);
- //hal_gpio_pull_set(P15, STRONG_PULL_UP); //PULL_DOWN
- hal_gpioin_register(P15, NULL, pin_event_handler);//pin_event_handler);
- //LOG("touch pin input enable %d\n", ret);
- return PPlus_SUCCESS;
- }
复制代码
touch_init将s_touch_hdl 注册为输入参数hdl(on_key),配置P15做为输入按键。当按下P15后,调用pin_event_handler函数,pin_event_handler会调用on_key函数。
4、hidkbd.c
- uint16 HidKbd_ProcessEvent( uint8 task_id, uint16 events )
- {
- ......
- if ( events & HID_TEST_EVT )
- {
- hidKbdSendReport(HID_KEYBOARD_2);
- hidKbdSendReport(0);
- // hidCCSendReport(0,1,0);
- // hidCCSendReport(0,0,0);
- if(hidDevGapState==GAPROLE_CONNECTED)
- {
- osal_start_timerEx(hidKbdTaskId, HID_TEST_EVT, 5000);
- }
- return ( events ^ HID_TEST_EVT );
- }
- if ( events & HID_KEYA_EVT )
- {
- hidKbdSendReport(HID_KEYBOARD_A);
- hidKbdSendReport(0);
- return(events ^ HID_KEYA_EVT );
- }
- ......
- }
复制代码 放开hidKbdSendReport(HID_KEYBOARD_2); hidKbdSendReport(0);的注释:
在收到HID_TEST_EVT事件后,发送HID_KEYBOARD_2(2)按键的报告描述。
osal_start_timerEx(hidKbdTaskId, HID_TEST_EVT, 5000);设置5秒后,再触发HID_TEST_EVT事件。
增加对HID_KEYA_EVT 事件
hidKbdSendReport(HID_KEYBOARD_A);发送HID_KEYBOARD_A(A)按键的报告描述。
5、效果
通过以上修改,PB03F已经可以被电脑识别为一个HID keybord设备
连接后,每5秒钟向电脑发送一个“2”,每按下P15向电脑发送一个"A"
|