bsal_srv_hid.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <rthw.h>
  4. #include <stdio.h>
  5. #include <stdint.h>
  6. #include "bsal.h"
  7. #include "bsal_osif.h"
  8. #include "bsal_srv_hid.h"
  9. static P_SRV_GENERAL_CB pfn_bas_cb = NULL;
  10. static uint8_t rep_map_data[] =
  11. {
  12. 0x05, 0x01, // Usage Page (Generic Desktop)
  13. 0x09, 0x02, // Usage (Mouse)
  14. 0xA1, 0x01, // Collection (Application)
  15. // Report ID 1: Mouse buttons + scroll/pan
  16. 0x85, 0x01, // Report Id 1
  17. 0x09, 0x01, // Usage (Pointer)
  18. 0xA1, 0x00, // Collection (Physical)
  19. 0x95, 0x05, // Report Count (3)
  20. 0x75, 0x01, // Report Size (1)
  21. 0x05, 0x09, // Usage Page (Buttons)
  22. 0x19, 0x01, // Usage Minimum (01)
  23. 0x29, 0x05, // Usage Maximum (05)
  24. 0x15, 0x00, // Logical Minimum (0)
  25. 0x25, 0x01, // Logical Maximum (1)
  26. 0x81, 0x02, // Input (Data, Variable, Absolute)
  27. 0x95, 0x01, // Report Count (1)
  28. 0x75, 0x03, // Report Size (3)
  29. 0x81, 0x01, // Input (Constant) for padding
  30. 0x75, 0x08, // Report Size (8)
  31. 0x95, 0x01, // Report Count (1)
  32. 0x05, 0x01, // Usage Page (Generic Desktop)
  33. 0x09, 0x38, // Usage (Wheel)
  34. 0x15, 0x81, // Logical Minimum (-127)
  35. 0x25, 0x7F, // Logical Maximum (127)
  36. 0x81, 0x06, // Input (Data, Variable, Relative)
  37. 0x05, 0x0C, // Usage Page (Consumer)
  38. 0x0A, 0x38, 0x02, // Usage (AC Pan)
  39. 0x95, 0x01, // Report Count (1)
  40. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  41. 0xC0, // End Collection (Physical)
  42. // Report ID 2: Mouse motion
  43. 0x85, 0x02, // Report Id 2
  44. 0x09, 0x01, // Usage (Pointer)
  45. 0xA1, 0x00, // Collection (Physical)
  46. 0x75, 0x0C, // Report Size (12)
  47. 0x95, 0x02, // Report Count (2)
  48. 0x05, 0x01, // Usage Page (Generic Desktop)
  49. 0x09, 0x30, // Usage (X)
  50. 0x09, 0x31, // Usage (Y)
  51. 0x16, 0x01, 0xF8, // Logical maximum (2047)
  52. 0x26, 0xFF, 0x07, // Logical minimum (-2047)
  53. 0x81, 0x06, // Input (Data, Variable, Relative)
  54. 0xC0, // End Collection (Physical)
  55. 0xC0, // End Collection (Application)
  56. // Report ID 3: Advanced buttons
  57. 0x05, 0x0C, // Usage Page (Consumer)
  58. 0x09, 0x01, // Usage (Consumer Control)
  59. 0xA1, 0x01, // Collection (Application)
  60. 0x85, 0x03, // Report Id (3)
  61. 0x15, 0x00, // Logical minimum (0)
  62. 0x25, 0x01, // Logical maximum (1)
  63. 0x75, 0x01, // Report Size (1)
  64. 0x95, 0x01, // Report Count (1)
  65. 0x09, 0xCD, // Usage (Play/Pause)
  66. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  67. 0x0A, 0x83, 0x01, // Usage (AL Consumer Control Configuration)
  68. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  69. 0x09, 0xB5, // Usage (Scan Next Track)
  70. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  71. 0x09, 0xB6, // Usage (Scan Previous Track)
  72. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  73. 0x09, 0xEA, // Usage (Volume Down)
  74. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  75. 0x09, 0xE9, // Usage (Volume Up)
  76. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  77. 0x0A, 0x25, 0x02, // Usage (AC Forward)
  78. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  79. 0x0A, 0x24, 0x02, // Usage (AC Back)
  80. 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
  81. 0xC0 // End Collection
  82. };
  83. static void hid_profile_callback(void *p)
  84. {
  85. bsal_callbak_data_t *p_param = (bsal_callbak_data_t *)p;
  86. bool is_app_cb = false;
  87. rt_kprintf("msg_type = %d\n", p_param->msg_type);
  88. if (p_param->msg_type == BSAL_CALLBACK_TYPE_READ_CHAR_VALUE)
  89. {
  90. rt_kprintf("off_handle = %d\n", p_param->off_handle);
  91. if (GATT_SVC_HID_REPORT_MAP_INDEX == p_param->off_handle)
  92. {
  93. is_app_cb = true;
  94. rt_kprintf("report map\n");
  95. // bsal_srv_write_data(p_param->stack_ptr, p_param->start_handle, p_param->off_handle, sizeof(rep_map_data), rep_map_data);
  96. }
  97. }
  98. if (is_app_cb && (pfn_bas_cb != NULL))
  99. {
  100. pfn_bas_cb(p_param);
  101. }
  102. }
  103. void bsal_le_hid_svr_init(void *stack_ptr, void *app_callback)
  104. {
  105. struct bsal_gatt_app_srv_def ble_svc_hid_defs[] =
  106. {
  107. {
  108. /*** Hid Service. */
  109. .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  110. .uuid = BSAL_UUID16_DECLARE(GATT_UUID_HID),
  111. .characteristics = (bsal_gatt_chr_def_t[])
  112. {
  113. // {
  114. // /*** Protocol Mode characteristic */
  115. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_PROTOCOL_MODE),
  116. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE_WITHOUT_RESPONSE,
  117. // .permission = BSAL_GATT_PERM_READ_NONE,
  118. // .value_length = 1,
  119. // },
  120. {
  121. /*** Input Report characteristics */
  122. .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_INPUT_REPORT),
  123. .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE | BSAL_ATT_P_NOTIFY,
  124. .permission = BSAL_GATT_PERM_READ_NONE,
  125. .value_length = 1,
  126. },
  127. // {
  128. // /*** Output Report characteristics */
  129. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_INPUT_REPORT),
  130. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE | BSAL_ATT_P_NOTIFY,
  131. // .permission = BSAL_GATT_PERM_READ_NONE,
  132. // .value_length = 1,
  133. // },
  134. // {
  135. // /*** Feature Report characteristics */
  136. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_INPUT_REPORT),
  137. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE | BSAL_ATT_P_NOTIFY,
  138. // .permission = BSAL_GATT_PERM_READ_NONE,
  139. // .value_length = 1,
  140. // },
  141. // {
  142. // /*** Report Map characteristics */
  143. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_REPORT_MAP),
  144. // .properties = BSAL_ATT_P_READ,
  145. // .permission = BSAL_GATT_PERM_READ_NONE,
  146. // .value_length = 1,
  147. //// .value_length = sizeof(rep_map_data),
  148. //// .val_handle = rep_map_data,
  149. // },
  150. // {
  151. // /*** Boot Mouse Input Report characteristics */
  152. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_BOOT_MOUSE_INPUT_REPORT),
  153. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE | BSAL_ATT_P_NOTIFY,
  154. // .permission = BSAL_GATT_PERM_READ_NONE,
  155. // .value_length = 1,
  156. // },
  157. // {
  158. // /*** HID Information characteristics */
  159. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_HID_INFORMATION),
  160. // .properties = BSAL_ATT_P_READ,
  161. // .permission = BSAL_GATT_PERM_READ_NONE,
  162. // .value_length = 1,
  163. // },
  164. // {
  165. // /*** HID Control Point characteristics */
  166. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_HID_CONTROL_POINT),
  167. // .properties = BSAL_ATT_P_WRITE_WITHOUT_RESPONSE,
  168. // .permission = BSAL_GATT_PERM_READ_NONE,
  169. // .value_length = 1,
  170. // },
  171. {
  172. 0, /* No more characteristics in this service. */
  173. }
  174. },
  175. },
  176. // {
  177. // /*** Battery Service. */
  178. // .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  179. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_BATTERY),
  180. // .characteristics = (bsal_gatt_chr_def_t[])
  181. // {
  182. // {
  183. // /*** Battery Level characteristic */
  184. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_BAS_LEVEL),
  185. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_NOTIFY,
  186. // .permission = BSAL_GATT_PERM_READ_NONE,
  187. // .value_length = 1,
  188. // },
  189. // {
  190. // 0, /* No more characteristics in this service. */
  191. // }
  192. // },
  193. // },
  194. // {
  195. // /*** Device Information Service. */
  196. // .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  197. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_DEVICE_INFORMATION),
  198. // .characteristics = (bsal_gatt_chr_def_t[])
  199. // {
  200. // {
  201. // /*** Manufacturer Name String characteristic */
  202. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_MANUFACTURER_NAME_STRING),
  203. // .properties = BSAL_ATT_P_READ,
  204. // .permission = BSAL_GATT_PERM_READ_NONE,
  205. // .value_length = 1,
  206. // },
  207. // {
  208. // /*** PnP ID characteristic */
  209. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_PNP_ID),
  210. // .properties = BSAL_ATT_P_READ,
  211. // .permission = BSAL_GATT_PERM_READ_NONE,
  212. // .value_length = 1,
  213. // },
  214. // {
  215. // 0, /* No more characteristics in this service. */
  216. // }
  217. // },
  218. // },
  219. // {
  220. // /*** Generic Attribute Service. */
  221. // .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  222. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_GENERIC_ATTRIBUTE),
  223. // /* This service is empty */
  224. // },
  225. // {
  226. // /*** Generic Access Service. */
  227. // .type = BSAL_GATT_UUID_PRIMARY_SERVICE,
  228. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_GENERIC_ACCESS),
  229. // .characteristics = (bsal_gatt_chr_def_t[])
  230. // {
  231. // {
  232. // /*** Device Name characteristic */
  233. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_DEVICE_NAME),
  234. // .properties = BSAL_ATT_P_READ | BSAL_ATT_P_WRITE,
  235. // .permission = BSAL_GATT_PERM_READ_NONE,
  236. // .value_length = 1,
  237. // },
  238. // {
  239. // /*** Appearance characteristic */
  240. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_GAP_APPEARANCE),
  241. // .properties = BSAL_ATT_P_READ,
  242. // .permission = BSAL_GATT_PERM_READ_NONE,
  243. // .value_length = 1,
  244. // },
  245. // {
  246. // /*** Peripheral Preferred Connection Parameters characteristic */
  247. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_PPCP),
  248. // .properties = BSAL_ATT_P_READ,
  249. // .permission = BSAL_GATT_PERM_READ_NONE,
  250. // .value_length = 1,
  251. // },
  252. // {
  253. // /*** Central Address Resolution characteristic */
  254. // .uuid = BSAL_UUID16_DECLARE(GATT_UUID_CHAR_CENTRAL_ADDRESS_RESOLUTION),
  255. // .properties = BSAL_ATT_P_READ,
  256. // .permission = BSAL_GATT_PERM_READ_NONE,
  257. // .value_length = 1,
  258. // },
  259. // {
  260. // 0, /* No more characteristics in this service. */
  261. // }
  262. // },
  263. // },
  264. {
  265. 0, /* No more services. */
  266. },
  267. };
  268. bsal_stack_le_srv_reg_func(stack_ptr, &ble_svc_hid_defs, (P_SRV_GENERAL_CB *)hid_profile_callback);
  269. pfn_bas_cb = (P_SRV_GENERAL_CB)app_callback;
  270. }