btp.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. /* bttester.c - Bluetooth Tester */
  2. /*
  3. * Copyright (c) 2015-2016 Intel Corporation
  4. * Copyright (c) 2022 Codecoup
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. */
  8. #include <base/common.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <stddef.h>
  13. #include <string.h>
  14. #include <base/types.h>
  15. #include <base/common.h>
  16. #include <bluetooth/bluetooth.h>
  17. #include <base/byteorder.h>
  18. #include <common/timer.h>
  19. #include <rthw.h>
  20. #include <rtthread.h>
  21. #include <rtdevice.h>
  22. #include "rtthread_driver_serial.h"
  23. #define LOG_MODULE_NAME bttester
  24. #include <logging/bt_log.h>
  25. #include "btp/btp.h"
  26. #define CMD_QUEUED 2
  27. struct btp_buf {
  28. intptr_t _reserved;
  29. union {
  30. uint8_t data[BTP_MTU];
  31. struct btp_hdr hdr;
  32. };
  33. };
  34. static struct btp_buf cmd_buf[CMD_QUEUED];
  35. static K_FIFO_DEFINE(cmds_queue);
  36. static K_FIFO_DEFINE(avail_queue);
  37. static void supported_commands(uint8_t *data, uint16_t len)
  38. {
  39. uint8_t buf[1];
  40. struct core_read_supported_commands_rp *rp = (void *) buf;
  41. (void)memset(buf, 0, sizeof(buf));
  42. tester_set_bit(buf, CORE_READ_SUPPORTED_COMMANDS);
  43. tester_set_bit(buf, CORE_READ_SUPPORTED_SERVICES);
  44. tester_set_bit(buf, CORE_REGISTER_SERVICE);
  45. tester_set_bit(buf, CORE_UNREGISTER_SERVICE);
  46. tester_send(BTP_SERVICE_ID_CORE, CORE_READ_SUPPORTED_COMMANDS,
  47. BTP_INDEX_NONE, (uint8_t *) rp, sizeof(buf));
  48. }
  49. static void supported_services(uint8_t *data, uint16_t len)
  50. {
  51. uint8_t buf[2];
  52. struct core_read_supported_services_rp *rp = (void *) buf;
  53. (void)memset(buf, 0, sizeof(buf));
  54. tester_set_bit(buf, BTP_SERVICE_ID_CORE);
  55. tester_set_bit(buf, BTP_SERVICE_ID_GAP);
  56. tester_set_bit(buf, BTP_SERVICE_ID_GATT);
  57. #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL)
  58. tester_set_bit(buf, BTP_SERVICE_ID_L2CAP);
  59. #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
  60. #if defined(CONFIG_BT_MESH)
  61. tester_set_bit(buf, BTP_SERVICE_ID_MESH);
  62. #endif /* CONFIG_BT_MESH */
  63. #if defined(CONFIG_BT_VCP_VOL_REND)
  64. tester_set_bit(buf, BTP_SERVICE_ID_VCS);
  65. #endif /* CONFIG_BT_VCP_VOL_REND */
  66. #if defined(CONFIG_BT_IAS) || defined(CONFIG_BT_IAS_CLIENT)
  67. tester_set_bit(buf, BTP_SERVICE_ID_IAS);
  68. #endif /* CONFIG_BT_IAS */
  69. #if defined(CONFIG_BT_AICS) || defined(CONFIG_BT_AICS_CLIENT)
  70. tester_set_bit(buf, BTP_SERVICE_ID_AICS);
  71. #endif /*CONFIG_BT_AICS */
  72. #if defined(CONFIG_BT_VOCS) || defined(CONFIG_BT_VOCS_CLIENT)
  73. tester_set_bit(buf, BTP_SERVICE_ID_VOCS);
  74. #endif /* CONFIG_BT_VOCS */
  75. tester_send(BTP_SERVICE_ID_CORE, CORE_READ_SUPPORTED_SERVICES,
  76. BTP_INDEX_NONE, (uint8_t *) rp, sizeof(buf));
  77. }
  78. static void register_service(uint8_t *data, uint16_t len)
  79. {
  80. struct core_register_service_cmd *cmd = (void *) data;
  81. uint8_t status;
  82. switch (cmd->id) {
  83. case BTP_SERVICE_ID_GAP:
  84. status = tester_init_gap();
  85. /* Rsp with success status will be handled by bt enable cb */
  86. if (status == BTP_STATUS_FAILED) {
  87. goto rsp;
  88. }
  89. return;
  90. case BTP_SERVICE_ID_GATT:
  91. status = tester_init_gatt();
  92. break;
  93. #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL)
  94. case BTP_SERVICE_ID_L2CAP:
  95. status = tester_init_l2cap();
  96. #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
  97. break;
  98. #if defined(CONFIG_BT_MESH)
  99. case BTP_SERVICE_ID_MESH:
  100. status = tester_init_mesh();
  101. break;
  102. #endif /* CONFIG_BT_MESH */
  103. #if defined(CONFIG_BT_VCP_VOL_REND)
  104. case BTP_SERVICE_ID_VCS:
  105. status = tester_init_vcp();
  106. break;
  107. #endif /* CONFIG_BT_VCP_VOL_REND */
  108. #if defined(CONFIG_BT_VOCS) || defined(CONFIG_BT_VOCS_CLIENT)
  109. case BTP_SERVICE_ID_VOCS:
  110. status = tester_init_vcp();
  111. break;
  112. #endif /* CONFIG_BT_VOCS */
  113. #if defined(CONFIG_BT_AICS) || defined(CONFIG_BT_AICS_CLIENT)
  114. case BTP_SERVICE_ID_AICS:
  115. status = tester_init_vcp();
  116. break;
  117. #endif /* CONFIG_BT_AICS */
  118. #if defined(CONFIG_BT_IAS) || defined(CONFIG_BT_IAS_CLIENT)
  119. case BTP_SERVICE_ID_IAS:
  120. status = BTP_STATUS_SUCCESS;
  121. break;
  122. #endif /* CONFIG_BT_IAS */
  123. default:
  124. BT_WARN("unknown id: 0x%02x", cmd->id);
  125. status = BTP_STATUS_FAILED;
  126. break;
  127. }
  128. rsp:
  129. tester_rsp(BTP_SERVICE_ID_CORE, CORE_REGISTER_SERVICE, BTP_INDEX_NONE,
  130. status);
  131. }
  132. static void unregister_service(uint8_t *data, uint16_t len)
  133. {
  134. struct core_unregister_service_cmd *cmd = (void *) data;
  135. uint8_t status;
  136. switch (cmd->id) {
  137. case BTP_SERVICE_ID_GAP:
  138. status = tester_unregister_gap();
  139. break;
  140. case BTP_SERVICE_ID_GATT:
  141. status = tester_unregister_gatt();
  142. break;
  143. #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL)
  144. case BTP_SERVICE_ID_L2CAP:
  145. status = tester_unregister_l2cap();
  146. break;
  147. #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
  148. #if defined(CONFIG_BT_MESH)
  149. case BTP_SERVICE_ID_MESH:
  150. status = tester_unregister_mesh();
  151. break;
  152. #endif /* CONFIG_BT_MESH */
  153. #if defined(CONFIG_BT_VCP_VOL_REND)
  154. case BTP_SERVICE_ID_VCS:
  155. status = tester_unregister_vcp();
  156. break;
  157. #endif /* CONFIG_BT_VCP_VOL_REND */
  158. #if defined(CONFIG_BT_AICS) || defined(CONFIG_BT_AICS_CLIENT)
  159. case BTP_SERVICE_ID_AICS:
  160. status = tester_unregister_vcp();
  161. break;
  162. #endif /* CONFIG_BT_AICS */
  163. #if defined(CONFIG_BT_VOCS) || defined(CONFIG_BT_VOCS_CLIENT)
  164. case BTP_SERVICE_ID_VOCS:
  165. status = tester_unregister_vcp();
  166. break;
  167. #endif /* CONFIG_BT_VOCS */
  168. default:
  169. BT_WARN("unknown id: 0x%x", cmd->id);
  170. status = BTP_STATUS_FAILED;
  171. break;
  172. }
  173. tester_rsp(BTP_SERVICE_ID_CORE, CORE_UNREGISTER_SERVICE, BTP_INDEX_NONE,
  174. status);
  175. }
  176. static void handle_core(uint8_t opcode, uint8_t index, uint8_t *data,
  177. uint16_t len)
  178. {
  179. if (index != BTP_INDEX_NONE) {
  180. BT_WARN("index != BTP_INDEX_NONE: 0x%x", index);
  181. tester_rsp(BTP_SERVICE_ID_CORE, opcode, index, BTP_STATUS_FAILED);
  182. return;
  183. }
  184. switch (opcode) {
  185. case CORE_READ_SUPPORTED_COMMANDS:
  186. supported_commands(data, len);
  187. return;
  188. case CORE_READ_SUPPORTED_SERVICES:
  189. supported_services(data, len);
  190. return;
  191. case CORE_REGISTER_SERVICE:
  192. register_service(data, len);
  193. return;
  194. case CORE_UNREGISTER_SERVICE:
  195. unregister_service(data, len);
  196. return;
  197. default:
  198. BT_WARN("unknown opcode: 0x%x", opcode);
  199. tester_rsp(BTP_SERVICE_ID_CORE, opcode, BTP_INDEX_NONE,
  200. BTP_STATUS_UNKNOWN_CMD);
  201. return;
  202. }
  203. }
  204. // static void cmd_handler(void *p1, void *p2, void *p3)
  205. static void cmd_handler(void)
  206. {
  207. // while (1)
  208. {
  209. struct btp_buf *cmd;
  210. uint16_t len;
  211. // if(k_fifo_size(&cmds_queue))
  212. // {
  213. // BT_INFO("cmd_handler1, size:%d", k_fifo_size(&cmds_queue));
  214. // }
  215. cmd = k_fifo_get(&cmds_queue, K_FOREVER);
  216. if(cmd == NULL)
  217. {
  218. return;
  219. }
  220. len = sys_le16_to_cpu(cmd->hdr.len);
  221. BT_INFO("service:%d, len:%d", cmd->hdr.service, len);
  222. /* TODO
  223. * verify if service is registered before calling handler
  224. */
  225. switch (cmd->hdr.service) {
  226. case BTP_SERVICE_ID_CORE:
  227. handle_core(cmd->hdr.opcode, cmd->hdr.index,
  228. cmd->hdr.data, len);
  229. break;
  230. case BTP_SERVICE_ID_GAP:
  231. tester_handle_gap(cmd->hdr.opcode, cmd->hdr.index,
  232. cmd->hdr.data, len);
  233. BT_ERR("BTP_SERVICE_ID_GAP");
  234. break;
  235. case BTP_SERVICE_ID_GATT:
  236. tester_handle_gatt(cmd->hdr.opcode, cmd->hdr.index,
  237. cmd->hdr.data, len);
  238. break;
  239. #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL)
  240. case BTP_SERVICE_ID_L2CAP:
  241. tester_handle_l2cap(cmd->hdr.opcode, cmd->hdr.index,
  242. cmd->hdr.data, len);
  243. #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
  244. break;
  245. #if defined(CONFIG_BT_MESH)
  246. case BTP_SERVICE_ID_MESH:
  247. tester_handle_mesh(cmd->hdr.opcode, cmd->hdr.index,
  248. cmd->hdr.data, len);
  249. break;
  250. #endif /* CONFIG_BT_MESH */
  251. #if defined(CONFIG_BT_VCP_VOL_REND)
  252. case BTP_SERVICE_ID_VCS:
  253. tester_handle_vcs(cmd->hdr.opcode, cmd->hdr.index,
  254. cmd->hdr.data, len);
  255. break;
  256. #endif /* CONFIG_BT_VCP_VOL_REND */
  257. #if defined(CONFIG_BT_AICS)
  258. case BTP_SERVICE_ID_AICS:
  259. tester_handle_aics(cmd->hdr.opcode, cmd->hdr.index,
  260. cmd->hdr.data, len);
  261. break;
  262. #endif /* CONFIG_BT_AICS */
  263. #if defined(CONFIG_BT_VOCS)
  264. case BTP_SERVICE_ID_VOCS:
  265. tester_handle_vocs(cmd->hdr.opcode, cmd->hdr.index,
  266. cmd->hdr.data, len);
  267. break;
  268. #endif /* CONFIG_BT_VOCS */
  269. default:
  270. BT_WARN("unknown service: 0x%x", cmd->hdr.service);
  271. tester_rsp(cmd->hdr.service, cmd->hdr.opcode,
  272. cmd->hdr.index, BTP_STATUS_FAILED);
  273. break;
  274. }
  275. k_fifo_put(&avail_queue, cmd);
  276. }
  277. }
  278. static uint8_t *recv_cb(uint8_t *buf, size_t *off)
  279. {
  280. struct btp_hdr *cmd = (void *) buf;
  281. struct btp_buf *new_buf;
  282. uint16_t len;
  283. // BT_INFO("off: %x", *off);
  284. if (*off < sizeof(*cmd)) {
  285. return buf;
  286. }
  287. len = sys_le16_to_cpu(cmd->len);
  288. // BT_INFO("off: %x, len:%x", *off, len);
  289. if (len > BTP_MTU - sizeof(*cmd)) {
  290. BT_ERR("BT tester: invalid packet length");
  291. *off = 0;
  292. return buf;
  293. }
  294. if (*off < sizeof(*cmd) + len) {
  295. return buf;
  296. }
  297. new_buf = k_fifo_get(&avail_queue, K_NO_WAIT);
  298. if (!new_buf) {
  299. BT_ERR("BT tester: RX overflow");
  300. *off = 0;
  301. return buf;
  302. }
  303. // BT_INFO("cmd_handler, size:%d", k_fifo_size(&cmds_queue));
  304. k_fifo_put(&cmds_queue, CONTAINER_OF(buf, struct btp_buf, data));
  305. // BT_INFO("cmd_handler, size:%d", k_fifo_size(&cmds_queue));
  306. *off = 0;
  307. return new_buf->data;
  308. }
  309. #if 0
  310. #if defined(CONFIG_UART_PIPE)
  311. /* Uart Pipe */
  312. static void uart_init(uint8_t *data)
  313. {
  314. uart_pipe_register(data, BTP_MTU, recv_cb);
  315. }
  316. static void uart_send(uint8_t *data, size_t len)
  317. {
  318. uart_pipe_send(data, len);
  319. }
  320. #else /* !CONFIG_UART_PIPE */
  321. static uint8_t *recv_buf;
  322. static size_t recv_off;
  323. //static const struct device *const dev =
  324. // DEVICE_DT_GET(DT_CHOSEN(zephyr_console));
  325. static void timer_expiry_cb(struct k_timer *timer)
  326. {
  327. uint8_t c;
  328. // while (uart_poll_in(dev, &c) == 0) {
  329. // recv_buf[recv_off++] = c;
  330. // recv_buf = recv_cb(recv_buf, &recv_off);
  331. // }
  332. }
  333. K_TIMER_DEFINE(timer, timer_expiry_cb, NULL);
  334. /* Uart Poll */
  335. static void uart_init(uint8_t *data)
  336. {
  337. // __ASSERT_NO_MSG(device_is_ready(dev));
  338. recv_buf = data;
  339. k_timer_start(&timer, K_MSEC(10), K_MSEC(10));
  340. }
  341. static void uart_send(uint8_t *data, size_t len)
  342. {
  343. int i;
  344. // for (i = 0; i < len; i++) {
  345. // uart_poll_out(dev, data[i]);
  346. // }
  347. }
  348. #endif /* CONFIG_UART_PIPE */
  349. #endif
  350. struct h4_uart_config{
  351. const char *name;
  352. int flowcontrol; // RT-Thread not support CTS/RTS flowcontrol now, default is true.
  353. struct serial_configure rt_config;
  354. };
  355. static struct h4_uart_config uart_config = {
  356. .rt_config = RT_SERIAL_CONFIG_DEFAULT,
  357. };
  358. static char device_name[10];
  359. int uart_init_params(int idx, int rate, int databits, int stopbits, int parity, bool flowcontrol)
  360. {
  361. printk("uart_init_params idx: %d, rate: %d, databits: %d, stopbits: %d, parity: %d, flowcontrol: %d\n",
  362. idx, rate, databits, stopbits, parity, flowcontrol);
  363. rt_sprintf(device_name, "uart%d", idx);
  364. uart_config.name = device_name;
  365. uart_config.flowcontrol = flowcontrol;
  366. uart_config.rt_config.baud_rate = rate;
  367. uart_config.rt_config.data_bits = databits;
  368. uart_config.rt_config.stop_bits = stopbits;
  369. uart_config.rt_config.parity = parity;
  370. #if defined(RTTHREAD_VERSION) && RTTHREAD_VERSION > 40003 //< rtthread version larger than v4.0.3
  371. uart_config.rt_config.flowcontrol = flowcontrol;
  372. #endif
  373. return 0;
  374. }
  375. static rt_device_t h4_uart;
  376. static uint8_t *recv_buf;
  377. static size_t recv_off;
  378. /* Uart Poll */
  379. static void uart_init(uint8_t *data)
  380. {
  381. // __ASSERT_NO_MSG(device_is_ready(dev));
  382. uart_init_params(1, 115200, 8, 1, 0, 0);
  383. recv_buf = data;
  384. printk("uart_init, uart_config.name: %s\n", uart_config.name);
  385. h4_uart = rt_device_find(uart_config.name);
  386. // printk("uart_init, h4_uart: 0x%x\n", h4_uart);
  387. RT_ASSERT(h4_uart);
  388. rt_err_t err;
  389. if ((err = rt_device_open(h4_uart, RT_DEVICE_FLAG_INT_RX))) {
  390. printk("Open uart_init error\n");
  391. return;
  392. }
  393. if ((err = rt_device_control(h4_uart, RT_DEVICE_CTRL_CONFIG, &uart_config.rt_config))) {
  394. printk("Control uart_init error\n");
  395. return;
  396. }
  397. }
  398. static void uart_send(uint8_t *data, size_t len)
  399. {
  400. // int i;
  401. // for (i = 0; i < len; i++) {
  402. // uart_poll_out(dev, data[i]);
  403. // }
  404. rt_device_write(h4_uart, 0, data, len);
  405. }
  406. static int hci_driver_h4_recv(uint8_t *buf, uint16_t len)
  407. {
  408. if(!h4_uart)
  409. {
  410. return 0;
  411. }
  412. return rt_device_read(h4_uart, 0, buf, len);
  413. }
  414. void tester_rx_polling(void)
  415. {
  416. uint8_t c;
  417. while (hci_driver_h4_recv(&c, 1) != 0) {
  418. // BT_INFO("c:%x", c);
  419. recv_buf[recv_off++] = c;
  420. recv_buf = recv_cb(recv_buf, &recv_off);
  421. }
  422. }
  423. void tester_polling_work(void)
  424. {
  425. tester_rx_polling();
  426. cmd_handler();
  427. }
  428. void tester_init(void)
  429. {
  430. int i;
  431. struct btp_buf *buf;
  432. BT_DBG("Initializing tester");
  433. for (i = 0; i < CMD_QUEUED; i++) {
  434. k_fifo_put(&avail_queue, &cmd_buf[i]);
  435. }
  436. // k_thread_create(&cmd_thread, stack, STACKSIZE, cmd_handler,
  437. // NULL, NULL, NULL, K_PRIO_COOP(7), 0, K_NO_WAIT);
  438. buf = k_fifo_get(&avail_queue, K_NO_WAIT);
  439. uart_init(buf->data);
  440. tester_send(BTP_SERVICE_ID_CORE, CORE_EV_IUT_READY, BTP_INDEX_NONE,
  441. NULL, 0);
  442. }
  443. void tester_send(uint8_t service, uint8_t opcode, uint8_t index, uint8_t *data,
  444. size_t len)
  445. {
  446. struct btp_hdr msg;
  447. msg.service = service;
  448. msg.opcode = opcode;
  449. msg.index = index;
  450. msg.len = len;
  451. uart_send((uint8_t *)&msg, sizeof(msg));
  452. if (data && len) {
  453. uart_send(data, len);
  454. }
  455. }
  456. void tester_rsp(uint8_t service, uint8_t opcode, uint8_t index, uint8_t status)
  457. {
  458. struct btp_status s;
  459. if (status == BTP_STATUS_SUCCESS) {
  460. tester_send(service, opcode, index, NULL, 0);
  461. return;
  462. }
  463. s.code = status;
  464. tester_send(service, BTP_STATUS, index, (uint8_t *) &s, sizeof(s));
  465. }