PB03F学习之配置为蓝牙键盘

[复制链接]
查看658 | 回复4 | 2024-11-2 19:28:17 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-11-2 19:30 编辑

SDK example中有一个HID设备的例程:phy6222_v313_0512\example\ble_peripheral\HIDKeyboard

缺省被配置为调节音量的设备。也预留了改为键盘和鼠标的代码,只不过是被注释了。

1、修改HID描述符(hidkbservice.c)
放开Keyboard部分的描述,注释掉其他部分
  1. static CONST uint8 hidReportMap[] =
  2. {
  3.         #if 1
  4.     0x05, 0x01,  // Usage Pg (Generic Desktop)
  5.     0x09, 0x06,  // Usage (Keyboard)
  6.     0xA1, 0x01,  // Collection: (Application)
  7.     0x85, HID_RPT_ID_KEY_IN,  // Report Id (2)
  8.     //
  9.     0x05, 0x07,  //   Usage Pg (Key Codes)
  10.     0x19, 0xE0,  //   Usage Min (224)
  11.     0x29, 0xE7,  //   Usage Max (231)
  12.     0x15, 0x00,  //   Log Min (0)
  13.     0x25, 0x01,  //   Log Max (1)
  14.     //
  15.     //   Modifier byte
  16.     0x75, 0x01,  //   Report Size (1)
  17.     0x95, 0x08,  //   Report Count (8)
  18.     0x81, 0x02,  //   Input: (Data, Variable, Absolute)
  19.     //
  20.     //   Reserved byte
  21.     0x95, 0x01,  //   Report Count (1)
  22.     0x75, 0x08,  //   Report Size (8)
  23.     0x81, 0x01,  //   Input: (Constant)
  24.     //
  25.     //   LED report
  26.     0x95, 0x05,  //   Report Count (5)
  27.     0x75, 0x01,  //   Report Size (1)
  28.     0x05, 0x08,  //   Usage Pg (LEDs)
  29.     0x19, 0x01,  //   Usage Min (1)
  30.     0x29, 0x05,  //   Usage Max (5)
  31.     0x91, 0x02,  //   Output: (Data, Variable, Absolute)
  32.     //
  33.     //   LED report padding
  34.     0x95, 0x01,  //   Report Count (1)
  35.     0x75, 0x03,  //   Report Size (3)
  36.     0x91, 0x01,  //   Output: (Constant)
  37.     //
  38.     //   Key arrays (6 bytes)
  39.     0x95, 0x06,  //   Report Count (6)
  40.     0x75, 0x08,  //   Report Size (8)
  41.     0x15, 0x00,  //   Log Min (0)
  42.     0x25, 0x65,  //   Log Max (101)
  43.     0x05, 0x07,  //   Usage Pg (Key Codes)
  44.     0x19, 0x00,  //   Usage Min (0)
  45.     0x29, 0x65,  //   Usage Max (101)
  46.     0x81, 0x00,  //   Input: (Data, Array)
  47.     //
  48.     0xC0,        // End Collection
  49.     #endif
复制代码


2、hiddev.c

放开touch_init,touch_init负责按键部分处理函数
  1. void HidDev_Init( uint8 task_id )
  2. {
  3. ......
  4. touch_init(on_key);
  5. ......
  6. }
复制代码
需要增加一个on_key函数,用于向hidKbdTaskId发送按键事件。
  1. void on_key(touch_evt_t key_evt)
  2. {
  3.         if(key_evt==TOUCH_EVT_PRESS)
  4.         {
  5.                 //osal_set_event( hidKbdTaskId, START_DEVICE_EVT );
  6.                 LOG("on_key Press A\n");
  7.                 osal_start_timerEx(hidKbdTaskId, HID_KEYA_EVT, 20);
  8.         }
  9. }
复制代码
hidkbd.h中定义:

#define HID_KEYA_EVT                                  0x0200


3、touch_key.c
  1. static void pin_event_handler(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
  2. {
  3.     if(type == NEGEDGE)
  4.     {
  5.         s_touch_hdl(TOUCH_EVT_PRESS);
  6.         LOG("key release\n");
  7.     }
  8. }

  9. int touch_init(touch_evt_hdl_t hdl)
  10. {
  11.     //uint32_t ret;
  12.     if(hdl == NULL)
  13.         return PPlus_ERR_INVALID_PARAM;

  14.     s_touch_hdl = hdl;
  15.                 hal_gpioretention_register(P15);
  16.     hal_gpio_pin_init(P15,IE);
  17.     //hal_gpio_pull_set(P15, STRONG_PULL_UP);                //PULL_DOWN
  18.     hal_gpioin_register(P15, NULL, pin_event_handler);//pin_event_handler);
  19.     //LOG("touch pin input enable %d\n", ret);
  20.     return PPlus_SUCCESS;
  21. }
复制代码

touch_init将s_touch_hdl 注册为输入参数hdl(on_key),配置P15做为输入按键。当按下P15后,调用pin_event_handler函数,pin_event_handler会调用on_key函数。

4、hidkbd.c
  1. uint16 HidKbd_ProcessEvent( uint8 task_id, uint16 events )
  2. {
  3. ......
  4. if ( events & HID_TEST_EVT )
  5.     {
  6.          hidKbdSendReport(HID_KEYBOARD_2);
  7.          hidKbdSendReport(0);
  8. //        hidCCSendReport(0,1,0);
  9. //        hidCCSendReport(0,0,0);

  10.         if(hidDevGapState==GAPROLE_CONNECTED)
  11.         {
  12.             osal_start_timerEx(hidKbdTaskId, HID_TEST_EVT, 5000);
  13.         }

  14.         return ( events ^ HID_TEST_EVT );
  15.     }
  16.                 if ( events & HID_KEYA_EVT )
  17.     {
  18.          hidKbdSendReport(HID_KEYBOARD_A);
  19.          hidKbdSendReport(0);
  20.      return(events ^ HID_KEYA_EVT );
  21. }
  22. ......
  23. }
复制代码
放开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"

3.png
42.png
5.png


回复

使用道具 举报

大猫的鱼 | 2024-11-2 22:52:21 | 显示全部楼层
回复

使用道具 举报

ALiaodddddd | 2024-11-3 13:43:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

ALiaodddddd | 2024-11-3 13:45:02 | 显示全部楼层
可以用
回复

使用道具 举报

小小鸟 | 2024-11-4 08:22:50 | 显示全部楼层
666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则