hal-bluetooth.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. // SPDX-License-Identifier: Apache-2.0
  2. /*
  3. * Copyright (C) 2013 Intel Corporation
  4. *
  5. */
  6. #define _GNU_SOURCE
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <stdbool.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <cutils/properties.h>
  13. #include "hal-log.h"
  14. #include "hal.h"
  15. #include "hal-msg.h"
  16. #include "ipc-common.h"
  17. #include "hal-ipc.h"
  18. #include "hal-utils.h"
  19. static const bt_callbacks_t *bt_hal_cbacks = NULL;
  20. #define enum_prop_to_hal(prop, hal_prop, type) do { \
  21. static type e; \
  22. prop.val = &e; \
  23. prop.len = sizeof(e); \
  24. e = *((uint8_t *) (hal_prop->val)); \
  25. } while (0)
  26. #define enum_prop_from_hal(prop, hal_len, hal_val, enum_type) do { \
  27. enum_type e; \
  28. if (prop->len != sizeof(e)) { \
  29. error("invalid HAL property %u (%u vs %zu), aborting ", \
  30. prop->type, prop->len, sizeof(e)); \
  31. exit(EXIT_FAILURE); \
  32. } \
  33. memcpy(&e, prop->val, sizeof(e)); \
  34. *((uint8_t *) hal_val) = e; /* enums are mapped to 1 byte */ \
  35. *hal_len = 1; \
  36. } while (0)
  37. static void handle_adapter_state_changed(void *buf, uint16_t len, int fd)
  38. {
  39. struct hal_ev_adapter_state_changed *ev = buf;
  40. DBG("state: %s", bt_state_t2str(ev->state));
  41. if (bt_hal_cbacks->adapter_state_changed_cb)
  42. bt_hal_cbacks->adapter_state_changed_cb(ev->state);
  43. }
  44. static void adapter_props_to_hal(bt_property_t *send_props,
  45. struct hal_property *prop,
  46. uint8_t num_props, uint16_t len)
  47. {
  48. void *buf = prop;
  49. uint8_t i;
  50. for (i = 0; i < num_props; i++) {
  51. if (sizeof(*prop) + prop->len > len) {
  52. error("invalid adapter properties(%zu > %u), aborting",
  53. sizeof(*prop) + prop->len, len);
  54. exit(EXIT_FAILURE);
  55. }
  56. send_props[i].type = prop->type;
  57. switch (prop->type) {
  58. case HAL_PROP_ADAPTER_TYPE:
  59. enum_prop_to_hal(send_props[i], prop,
  60. bt_device_type_t);
  61. break;
  62. case HAL_PROP_ADAPTER_SCAN_MODE:
  63. enum_prop_to_hal(send_props[i], prop,
  64. bt_scan_mode_t);
  65. break;
  66. case HAL_PROP_ADAPTER_SERVICE_REC:
  67. default:
  68. send_props[i].len = prop->len;
  69. send_props[i].val = prop->val;
  70. break;
  71. }
  72. DBG("prop[%d]: %s", i, btproperty2str(&send_props[i]));
  73. len -= sizeof(*prop) + prop->len;
  74. buf += sizeof(*prop) + prop->len;
  75. prop = buf;
  76. }
  77. if (!len)
  78. return;
  79. error("invalid adapter properties (%u bytes left), aborting", len);
  80. exit(EXIT_FAILURE);
  81. }
  82. static void adapter_prop_from_hal(const bt_property_t *property, uint8_t *type,
  83. uint16_t *len, void *val)
  84. {
  85. /* type match IPC type */
  86. *type = property->type;
  87. switch (property->type) {
  88. case HAL_PROP_ADAPTER_SCAN_MODE:
  89. enum_prop_from_hal(property, len, val, bt_scan_mode_t);
  90. break;
  91. case BT_PROPERTY_BDNAME:
  92. case BT_PROPERTY_BDADDR:
  93. case BT_PROPERTY_UUIDS:
  94. case BT_PROPERTY_CLASS_OF_DEVICE:
  95. case BT_PROPERTY_TYPE_OF_DEVICE:
  96. case BT_PROPERTY_SERVICE_RECORD:
  97. case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
  98. case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
  99. case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
  100. case BT_PROPERTY_REMOTE_RSSI:
  101. case BT_PROPERTY_REMOTE_VERSION_INFO:
  102. case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP:
  103. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  104. case BT_PROPERTY_LOCAL_LE_FEATURES:
  105. #endif
  106. default:
  107. *len = property->len;
  108. memcpy(val, property->val, property->len);
  109. break;
  110. }
  111. }
  112. static void device_props_to_hal(bt_property_t *send_props,
  113. struct hal_property *prop, uint8_t num_props,
  114. uint16_t len)
  115. {
  116. void *buf = prop;
  117. uint8_t i;
  118. for (i = 0; i < num_props; i++) {
  119. if (sizeof(*prop) + prop->len > len) {
  120. error("invalid device properties (%zu > %u), aborting",
  121. sizeof(*prop) + prop->len, len);
  122. exit(EXIT_FAILURE);
  123. }
  124. send_props[i].type = prop->type;
  125. switch (prop->type) {
  126. case HAL_PROP_DEVICE_TYPE:
  127. enum_prop_to_hal(send_props[i], prop,
  128. bt_device_type_t);
  129. break;
  130. case HAL_PROP_DEVICE_VERSION_INFO:
  131. {
  132. static bt_remote_version_t e;
  133. const struct hal_prop_device_info *p;
  134. send_props[i].val = &e;
  135. send_props[i].len = sizeof(e);
  136. p = (struct hal_prop_device_info *) prop->val;
  137. e.manufacturer = p->manufacturer;
  138. e.sub_ver = p->sub_version;
  139. e.version = p->version;
  140. }
  141. break;
  142. case HAL_PROP_DEVICE_SERVICE_REC:
  143. {
  144. static bt_service_record_t e;
  145. const struct hal_prop_device_service_rec *p;
  146. send_props[i].val = &e;
  147. send_props[i].len = sizeof(e);
  148. p = (struct hal_prop_device_service_rec *) prop->val;
  149. memset(&e, 0, sizeof(e));
  150. memcpy(&e.channel, &p->channel, sizeof(e.channel));
  151. memcpy(e.uuid.uu, p->uuid, sizeof(e.uuid.uu));
  152. memcpy(e.name, p->name, p->name_len);
  153. }
  154. break;
  155. default:
  156. send_props[i].len = prop->len;
  157. send_props[i].val = prop->val;
  158. break;
  159. }
  160. len -= sizeof(*prop) + prop->len;
  161. buf += sizeof(*prop) + prop->len;
  162. prop = buf;
  163. DBG("prop[%d]: %s", i, btproperty2str(&send_props[i]));
  164. }
  165. if (!len)
  166. return;
  167. error("invalid device properties (%u bytes left), aborting", len);
  168. exit(EXIT_FAILURE);
  169. }
  170. static void handle_adapter_props_changed(void *buf, uint16_t len, int fd)
  171. {
  172. struct hal_ev_adapter_props_changed *ev = buf;
  173. bt_property_t props[ev->num_props];
  174. DBG("");
  175. if (!bt_hal_cbacks->adapter_properties_cb)
  176. return;
  177. len -= sizeof(*ev);
  178. adapter_props_to_hal(props, ev->props, ev->num_props, len);
  179. bt_hal_cbacks->adapter_properties_cb(ev->status, ev->num_props, props);
  180. }
  181. static void handle_bond_state_change(void *buf, uint16_t len, int fd)
  182. {
  183. struct hal_ev_bond_state_changed *ev = buf;
  184. bt_bdaddr_t *addr = (bt_bdaddr_t *) ev->bdaddr;
  185. DBG("state %u", ev->state);
  186. if (bt_hal_cbacks->bond_state_changed_cb)
  187. bt_hal_cbacks->bond_state_changed_cb(ev->status, addr,
  188. ev->state);
  189. }
  190. static void handle_pin_request(void *buf, uint16_t len, int fd)
  191. {
  192. struct hal_ev_pin_request *ev = buf;
  193. /* Those are declared as packed, so it's safe to assign pointers */
  194. bt_bdaddr_t *addr = (bt_bdaddr_t *) ev->bdaddr;
  195. bt_bdname_t *name = (bt_bdname_t *) ev->name;
  196. DBG("");
  197. if (bt_hal_cbacks->pin_request_cb)
  198. bt_hal_cbacks->pin_request_cb(addr, name, ev->class_of_dev);
  199. }
  200. static void handle_ssp_request(void *buf, uint16_t len, int fd)
  201. {
  202. struct hal_ev_ssp_request *ev = buf;
  203. /* Those are declared as packed, so it's safe to assign pointers */
  204. bt_bdaddr_t *addr = (bt_bdaddr_t *) ev->bdaddr;
  205. bt_bdname_t *name = (bt_bdname_t *) ev->name;
  206. DBG("");
  207. if (bt_hal_cbacks->ssp_request_cb)
  208. bt_hal_cbacks->ssp_request_cb(addr, name, ev->class_of_dev,
  209. ev->pairing_variant,
  210. ev->passkey);
  211. }
  212. void bt_thread_associate(void)
  213. {
  214. if (bt_hal_cbacks->thread_evt_cb)
  215. bt_hal_cbacks->thread_evt_cb(ASSOCIATE_JVM);
  216. }
  217. void bt_thread_disassociate(void)
  218. {
  219. if (bt_hal_cbacks->thread_evt_cb)
  220. bt_hal_cbacks->thread_evt_cb(DISASSOCIATE_JVM);
  221. }
  222. static bool interface_ready(void)
  223. {
  224. return bt_hal_cbacks != NULL;
  225. }
  226. static void handle_discovery_state_changed(void *buf, uint16_t len, int fd)
  227. {
  228. struct hal_ev_discovery_state_changed *ev = buf;
  229. DBG("");
  230. if (bt_hal_cbacks->discovery_state_changed_cb)
  231. bt_hal_cbacks->discovery_state_changed_cb(ev->state);
  232. }
  233. static void handle_device_found(void *buf, uint16_t len, int fd)
  234. {
  235. struct hal_ev_device_found *ev = buf;
  236. bt_property_t props[ev->num_props];
  237. DBG("");
  238. if (!bt_hal_cbacks->device_found_cb)
  239. return;
  240. len -= sizeof(*ev);
  241. device_props_to_hal(props, ev->props, ev->num_props, len);
  242. bt_hal_cbacks->device_found_cb(ev->num_props, props);
  243. }
  244. static void handle_device_state_changed(void *buf, uint16_t len, int fd)
  245. {
  246. struct hal_ev_remote_device_props *ev = buf;
  247. bt_property_t props[ev->num_props];
  248. DBG("");
  249. if (!bt_hal_cbacks->remote_device_properties_cb)
  250. return;
  251. len -= sizeof(*ev);
  252. device_props_to_hal(props, ev->props, ev->num_props, len);
  253. bt_hal_cbacks->remote_device_properties_cb(ev->status,
  254. (bt_bdaddr_t *)ev->bdaddr,
  255. ev->num_props, props);
  256. }
  257. static void handle_acl_state_changed(void *buf, uint16_t len, int fd)
  258. {
  259. struct hal_ev_acl_state_changed *ev = buf;
  260. bt_bdaddr_t *addr = (bt_bdaddr_t *) ev->bdaddr;
  261. DBG("state %u", ev->state);
  262. if (bt_hal_cbacks->acl_state_changed_cb)
  263. bt_hal_cbacks->acl_state_changed_cb(ev->status, addr,
  264. ev->state);
  265. }
  266. static void handle_dut_mode_receive(void *buf, uint16_t len, int fd)
  267. {
  268. struct hal_ev_dut_mode_receive *ev = buf;
  269. DBG("");
  270. if (len != sizeof(*ev) + ev->len) {
  271. error("invalid dut mode receive event (%u), aborting", len);
  272. exit(EXIT_FAILURE);
  273. }
  274. if (bt_hal_cbacks->dut_mode_recv_cb)
  275. bt_hal_cbacks->dut_mode_recv_cb(ev->opcode, ev->data, ev->len);
  276. }
  277. static void handle_le_test_mode(void *buf, uint16_t len, int fd)
  278. {
  279. struct hal_ev_le_test_mode *ev = buf;
  280. DBG("");
  281. if (bt_hal_cbacks->le_test_mode_cb)
  282. bt_hal_cbacks->le_test_mode_cb(ev->status, ev->num_packets);
  283. }
  284. static void handle_energy_info(void *buf, uint16_t len, int fd)
  285. {
  286. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  287. struct hal_ev_energy_info *ev = buf;
  288. bt_activity_energy_info info;
  289. DBG("");
  290. info.ctrl_state = ev->ctrl_state;
  291. info.energy_used = ev->energy_used;
  292. info.idle_time = ev->idle_time;
  293. info.rx_time = ev->rx_time;
  294. info.status = ev->status;
  295. info.tx_time = ev->status;
  296. if (bt_hal_cbacks->energy_info_cb)
  297. bt_hal_cbacks->energy_info_cb(&info);
  298. #endif
  299. }
  300. /*
  301. * handlers will be called from notification thread context,
  302. * index in table equals to 'opcode - HAL_MINIMUM_EVENT'
  303. */
  304. static const struct hal_ipc_handler ev_handlers[] = {
  305. /* HAL_EV_ADAPTER_STATE_CHANGED */
  306. { handle_adapter_state_changed, false,
  307. sizeof(struct hal_ev_adapter_state_changed) },
  308. /* HAL_EV_ADAPTER_PROPS_CHANGED */
  309. { handle_adapter_props_changed, true,
  310. sizeof(struct hal_ev_adapter_props_changed) +
  311. sizeof(struct hal_property) },
  312. /* HAL_EV_REMOTE_DEVICE_PROPS */
  313. { handle_device_state_changed, true,
  314. sizeof(struct hal_ev_remote_device_props) +
  315. sizeof(struct hal_property) },
  316. /* HAL_EV_DEVICE_FOUND */
  317. { handle_device_found, true, sizeof(struct hal_ev_device_found) +
  318. sizeof(struct hal_property) },
  319. /* HAL_EV_DISCOVERY_STATE_CHANGED */
  320. { handle_discovery_state_changed, false,
  321. sizeof(struct hal_ev_discovery_state_changed) },
  322. /* HAL_EV_PIN_REQUEST */
  323. { handle_pin_request, false, sizeof(struct hal_ev_pin_request) },
  324. /* HAL_EV_SSP_REQUEST */
  325. { handle_ssp_request, false, sizeof(struct hal_ev_ssp_request) },
  326. /* HAL_EV_BOND_STATE_CHANGED */
  327. { handle_bond_state_change, false,
  328. sizeof(struct hal_ev_bond_state_changed) },
  329. /* HAL_EV_ACL_STATE_CHANGED */
  330. { handle_acl_state_changed, false,
  331. sizeof(struct hal_ev_acl_state_changed) },
  332. /* HAL_EV_DUT_MODE_RECEIVE */
  333. { handle_dut_mode_receive, true,
  334. sizeof(struct hal_ev_dut_mode_receive) },
  335. /* HAL_EV_LE_TEST_MODE */
  336. { handle_le_test_mode, false, sizeof(struct hal_ev_le_test_mode) },
  337. /* HAL_EV_ENERGY_INFO */
  338. { handle_energy_info, false, sizeof(struct hal_ev_energy_info) },
  339. };
  340. static uint8_t get_mode(void)
  341. {
  342. char value[PROPERTY_VALUE_MAX];
  343. if (get_config("mode", value, NULL) > 0) {
  344. if (!strcasecmp(value, "bredr"))
  345. return HAL_MODE_BREDR;
  346. if (!strcasecmp(value, "le"))
  347. return HAL_MODE_LE;
  348. }
  349. return HAL_MODE_DEFAULT;
  350. }
  351. static uint16_t add_prop(const char *prop, uint8_t type, void *buf)
  352. {
  353. struct hal_config_prop *hal_prop = buf;
  354. hal_prop->type = type;
  355. hal_prop->len = strlen(prop) + 1;
  356. memcpy(hal_prop->val, prop, hal_prop->len);
  357. return sizeof(*hal_prop) + hal_prop->len;
  358. }
  359. static int send_configuration(void)
  360. {
  361. char buf[IPC_MTU];
  362. struct hal_cmd_configuration *cmd = (void *) buf;
  363. char prop[PROPERTY_VALUE_MAX];
  364. uint16_t len = sizeof(*cmd);
  365. cmd->num = 0;
  366. if (get_config("vendor", prop, "ro.product.manufacturer") > 0) {
  367. len += add_prop(prop, HAL_CONFIG_VENDOR, buf + len);
  368. cmd->num++;
  369. }
  370. if (get_config("name", prop, "ro.product.name") > 0) {
  371. len += add_prop(prop, HAL_CONFIG_NAME, buf + len);
  372. cmd->num++;
  373. }
  374. if (get_config("model", prop, "ro.product.model") > 0) {
  375. len += add_prop(prop, HAL_CONFIG_MODEL, buf + len);
  376. cmd->num++;
  377. }
  378. if (get_config("serialno", prop, "ro.serialno") > 0) {
  379. len += add_prop(prop, HAL_CONFIG_SERIAL_NUMBER, buf + len);
  380. cmd->num++;
  381. }
  382. if (get_config("systemid", prop, NULL) > 0) {
  383. len += add_prop(prop, HAL_CONFIG_SYSTEM_ID, buf + len);
  384. cmd->num++;
  385. }
  386. if (get_config("pnpid", prop, NULL) > 0) {
  387. len += add_prop(prop, HAL_CONFIG_PNP_ID, buf + len);
  388. cmd->num++;
  389. }
  390. if (get_config("fwrev", prop, "ro.build.version.release") > 0) {
  391. len += add_prop(prop, HAL_CONFIG_FW_REV, buf + len);
  392. cmd->num++;
  393. }
  394. if (get_config("hwrev", prop, "ro.board.platform") > 0) {
  395. len += add_prop(prop, HAL_CONFIG_HW_REV, buf + len);
  396. cmd->num++;
  397. }
  398. return hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_CONFIGURATION, len, cmd,
  399. NULL, NULL, NULL);
  400. }
  401. static int init(bt_callbacks_t *callbacks)
  402. {
  403. struct hal_cmd_register_module cmd;
  404. int status;
  405. DBG("");
  406. if (interface_ready())
  407. return BT_STATUS_DONE;
  408. hal_ipc_register(HAL_SERVICE_ID_BLUETOOTH, ev_handlers,
  409. sizeof(ev_handlers)/sizeof(ev_handlers[0]));
  410. if (!hal_ipc_init(BLUEZ_HAL_SK_PATH, sizeof(BLUEZ_HAL_SK_PATH)))
  411. return BT_STATUS_FAIL;
  412. bt_hal_cbacks = callbacks;
  413. /* Start Android Bluetooth daemon service */
  414. if (property_set("bluetooth.start", "daemon") < 0) {
  415. error("Failed to set bluetooth.start=daemon");
  416. hal_ipc_cleanup();
  417. bt_hal_cbacks = NULL;
  418. return BT_STATUS_FAIL;
  419. }
  420. if (!hal_ipc_accept()) {
  421. hal_ipc_cleanup();
  422. bt_hal_cbacks = NULL;
  423. return BT_STATUS_FAIL;
  424. }
  425. status = send_configuration();
  426. if (status != BT_STATUS_SUCCESS) {
  427. error("Failed to send configuration");
  428. goto fail;
  429. }
  430. cmd.service_id = HAL_SERVICE_ID_BLUETOOTH;
  431. cmd.mode = get_mode();
  432. cmd.max_clients = 1;
  433. status = hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
  434. sizeof(cmd), &cmd, NULL, NULL, NULL);
  435. if (status != BT_STATUS_SUCCESS) {
  436. error("Failed to register 'bluetooth' service");
  437. goto fail;
  438. }
  439. cmd.service_id = HAL_SERVICE_ID_SOCKET;
  440. cmd.max_clients = 1;
  441. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  442. cmd.mode = HAL_MODE_SOCKET_DYNAMIC_MAP;
  443. #else
  444. cmd.mode = HAL_MODE_DEFAULT;
  445. #endif
  446. status = hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
  447. sizeof(cmd), &cmd, NULL, NULL, NULL);
  448. if (status != BT_STATUS_SUCCESS) {
  449. error("Failed to register 'socket' service");
  450. goto fail;
  451. }
  452. return status;
  453. fail:
  454. hal_ipc_cleanup();
  455. bt_hal_cbacks = NULL;
  456. hal_ipc_unregister(HAL_SERVICE_ID_BLUETOOTH);
  457. return status;
  458. }
  459. static int enable(void)
  460. {
  461. DBG("");
  462. if (!interface_ready())
  463. return BT_STATUS_NOT_READY;
  464. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_ENABLE, 0, NULL,
  465. NULL, NULL, NULL);
  466. }
  467. static int disable(void)
  468. {
  469. DBG("");
  470. if (!interface_ready())
  471. return BT_STATUS_NOT_READY;
  472. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_DISABLE, 0, NULL,
  473. NULL, NULL, NULL);
  474. }
  475. static void cleanup(void)
  476. {
  477. DBG("");
  478. if (!interface_ready())
  479. return;
  480. hal_ipc_cleanup();
  481. hal_ipc_unregister(HAL_SERVICE_ID_BLUETOOTH);
  482. bt_hal_cbacks = NULL;
  483. }
  484. static int get_adapter_properties(void)
  485. {
  486. DBG("");
  487. if (!interface_ready())
  488. return BT_STATUS_NOT_READY;
  489. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_ADAPTER_PROPS,
  490. 0, NULL, NULL, NULL, NULL);
  491. }
  492. static int get_adapter_property(bt_property_type_t type)
  493. {
  494. struct hal_cmd_get_adapter_prop cmd;
  495. DBG("prop: %s (%d)", bt_property_type_t2str(type), type);
  496. if (!interface_ready())
  497. return BT_STATUS_NOT_READY;
  498. /* type match IPC type */
  499. cmd.type = type;
  500. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_ADAPTER_PROP,
  501. sizeof(cmd), &cmd, NULL, NULL, NULL);
  502. }
  503. static int set_adapter_property(const bt_property_t *property)
  504. {
  505. char buf[IPC_MTU];
  506. struct hal_cmd_set_adapter_prop *cmd = (void *) buf;
  507. uint16_t len_ret;
  508. size_t len;
  509. DBG("prop: %s", btproperty2str(property));
  510. if (!interface_ready())
  511. return BT_STATUS_NOT_READY;
  512. adapter_prop_from_hal(property, &cmd->type, &len_ret, cmd->val);
  513. cmd->len = len_ret;
  514. len = sizeof(*cmd) + cmd->len;
  515. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_SET_ADAPTER_PROP,
  516. len, cmd, NULL, NULL, NULL);
  517. }
  518. static int get_remote_device_properties(bt_bdaddr_t *remote_addr)
  519. {
  520. struct hal_cmd_get_remote_device_props cmd;
  521. DBG("bdaddr: %s", bdaddr2str(remote_addr));
  522. if (!interface_ready())
  523. return BT_STATUS_NOT_READY;
  524. memcpy(cmd.bdaddr, remote_addr, sizeof(cmd.bdaddr));
  525. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
  526. HAL_OP_GET_REMOTE_DEVICE_PROPS,
  527. sizeof(cmd), &cmd, NULL, NULL, NULL);
  528. }
  529. static int get_remote_device_property(bt_bdaddr_t *remote_addr,
  530. bt_property_type_t type)
  531. {
  532. struct hal_cmd_get_remote_device_prop cmd;
  533. DBG("bdaddr: %s prop: %s", bdaddr2str(remote_addr),
  534. bt_property_type_t2str(type));
  535. if (!interface_ready())
  536. return BT_STATUS_NOT_READY;
  537. memcpy(cmd.bdaddr, remote_addr, sizeof(cmd.bdaddr));
  538. /* type match IPC type */
  539. cmd.type = type;
  540. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
  541. HAL_OP_GET_REMOTE_DEVICE_PROP,
  542. sizeof(cmd), &cmd, NULL, NULL, NULL);
  543. }
  544. static int set_remote_device_property(bt_bdaddr_t *remote_addr,
  545. const bt_property_t *property)
  546. {
  547. char buf[IPC_MTU];
  548. struct hal_cmd_set_remote_device_prop *cmd = (void *) buf;
  549. size_t len;
  550. DBG("bdaddr: %s prop: %s", bdaddr2str(remote_addr),
  551. bt_property_type_t2str(property->type));
  552. if (!interface_ready())
  553. return BT_STATUS_NOT_READY;
  554. memcpy(cmd->bdaddr, remote_addr, sizeof(cmd->bdaddr));
  555. /* type match IPC type */
  556. cmd->type = property->type;
  557. cmd->len = property->len;
  558. memcpy(cmd->val, property->val, property->len);
  559. len = sizeof(*cmd) + cmd->len;
  560. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
  561. HAL_OP_SET_REMOTE_DEVICE_PROP,
  562. len, cmd, NULL, NULL, NULL);
  563. }
  564. static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
  565. {
  566. struct hal_cmd_get_remote_service_rec cmd;
  567. DBG("bdaddr: %s", bdaddr2str(remote_addr));
  568. if (!interface_ready())
  569. return BT_STATUS_NOT_READY;
  570. memcpy(cmd.bdaddr, remote_addr, sizeof(cmd.bdaddr));
  571. memcpy(cmd.uuid, uuid, sizeof(cmd.uuid));
  572. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
  573. HAL_OP_GET_REMOTE_SERVICE_REC,
  574. sizeof(cmd), &cmd, NULL, NULL, NULL);
  575. }
  576. static int get_remote_services(bt_bdaddr_t *remote_addr)
  577. {
  578. struct hal_cmd_get_remote_services cmd;
  579. DBG("bdaddr: %s", bdaddr2str(remote_addr));
  580. if (!interface_ready())
  581. return BT_STATUS_NOT_READY;
  582. memcpy(cmd.bdaddr, remote_addr, sizeof(cmd.bdaddr));
  583. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_REMOTE_SERVICES,
  584. sizeof(cmd), &cmd, NULL, NULL, NULL);
  585. }
  586. static int start_discovery(void)
  587. {
  588. DBG("");
  589. if (!interface_ready())
  590. return BT_STATUS_NOT_READY;
  591. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_START_DISCOVERY, 0,
  592. NULL, NULL, NULL, NULL);
  593. }
  594. static int cancel_discovery(void)
  595. {
  596. DBG("");
  597. if (!interface_ready())
  598. return BT_STATUS_NOT_READY;
  599. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_CANCEL_DISCOVERY, 0,
  600. NULL, NULL, NULL, NULL);
  601. }
  602. static int create_bond_real(const bt_bdaddr_t *bd_addr, int transport)
  603. {
  604. struct hal_cmd_create_bond cmd;
  605. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  606. if (!interface_ready())
  607. return BT_STATUS_NOT_READY;
  608. cmd.transport = transport;
  609. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  610. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_CREATE_BOND,
  611. sizeof(cmd), &cmd, NULL, NULL, NULL);
  612. }
  613. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  614. static int create_bond(const bt_bdaddr_t *bd_addr, int transport)
  615. {
  616. return create_bond_real(bd_addr, transport);
  617. }
  618. #else
  619. static int create_bond(const bt_bdaddr_t *bd_addr)
  620. {
  621. return create_bond_real(bd_addr, BT_TRANSPORT_UNKNOWN);
  622. }
  623. #endif
  624. static int cancel_bond(const bt_bdaddr_t *bd_addr)
  625. {
  626. struct hal_cmd_cancel_bond cmd;
  627. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  628. if (!interface_ready())
  629. return BT_STATUS_NOT_READY;
  630. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  631. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_CANCEL_BOND,
  632. sizeof(cmd), &cmd, NULL, NULL, NULL);
  633. }
  634. static int remove_bond(const bt_bdaddr_t *bd_addr)
  635. {
  636. struct hal_cmd_remove_bond cmd;
  637. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  638. if (!interface_ready())
  639. return BT_STATUS_NOT_READY;
  640. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  641. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_REMOVE_BOND,
  642. sizeof(cmd), &cmd, NULL, NULL, NULL);
  643. }
  644. static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
  645. uint8_t pin_len, bt_pin_code_t *pin_code)
  646. {
  647. struct hal_cmd_pin_reply cmd;
  648. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  649. if (!interface_ready())
  650. return BT_STATUS_NOT_READY;
  651. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  652. cmd.accept = accept;
  653. cmd.pin_len = pin_len;
  654. memcpy(cmd.pin_code, pin_code, sizeof(cmd.pin_code));
  655. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_PIN_REPLY,
  656. sizeof(cmd), &cmd, NULL, NULL, NULL);
  657. }
  658. static int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
  659. uint8_t accept, uint32_t passkey)
  660. {
  661. struct hal_cmd_ssp_reply cmd;
  662. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  663. if (!interface_ready())
  664. return BT_STATUS_NOT_READY;
  665. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  666. /* type match IPC type */
  667. cmd.ssp_variant = variant;
  668. cmd.accept = accept;
  669. cmd.passkey = passkey;
  670. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_SSP_REPLY,
  671. sizeof(cmd), &cmd, NULL, NULL, NULL);
  672. }
  673. static const void *get_profile_interface(const char *profile_id)
  674. {
  675. DBG("%s", profile_id);
  676. if (!interface_ready())
  677. return NULL;
  678. if (!strcmp(profile_id, BT_PROFILE_SOCKETS_ID))
  679. return bt_get_socket_interface();
  680. if (!strcmp(profile_id, BT_PROFILE_HIDHOST_ID))
  681. return bt_get_hidhost_interface();
  682. if (!strcmp(profile_id, BT_PROFILE_PAN_ID))
  683. return bt_get_pan_interface();
  684. if (!strcmp(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
  685. return bt_get_a2dp_interface();
  686. if (!strcmp(profile_id, BT_PROFILE_AV_RC_ID))
  687. return bt_get_avrcp_interface();
  688. if (!strcmp(profile_id, BT_PROFILE_HANDSFREE_ID))
  689. return bt_get_handsfree_interface();
  690. if (!strcmp(profile_id, BT_PROFILE_GATT_ID))
  691. return bt_get_gatt_interface();
  692. if (!strcmp(profile_id, BT_PROFILE_HEALTH_ID))
  693. return bt_get_health_interface();
  694. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  695. if (!strcmp(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
  696. return bt_get_avrcp_ctrl_interface();
  697. if (!strcmp(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
  698. return bt_get_hf_client_interface();
  699. if (!strcmp(profile_id, BT_PROFILE_MAP_CLIENT_ID))
  700. return bt_get_map_client_interface();
  701. if (!strcmp(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
  702. return bt_get_a2dp_sink_interface();
  703. #endif
  704. return NULL;
  705. }
  706. static int dut_mode_configure(uint8_t enable)
  707. {
  708. struct hal_cmd_dut_mode_conf cmd;
  709. DBG("enable %u", enable);
  710. if (!interface_ready())
  711. return BT_STATUS_NOT_READY;
  712. cmd.enable = enable;
  713. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_DUT_MODE_CONF,
  714. sizeof(cmd), &cmd, NULL, NULL, NULL);
  715. }
  716. static int dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t buf_len)
  717. {
  718. char cmd_buf[IPC_MTU];
  719. struct hal_cmd_dut_mode_send *cmd = (void *) cmd_buf;
  720. size_t len;
  721. DBG("opcode %u len %u", opcode, buf_len);
  722. if (!interface_ready())
  723. return BT_STATUS_NOT_READY;
  724. cmd->opcode = opcode;
  725. cmd->len = buf_len;
  726. memcpy(cmd->data, buf, cmd->len);
  727. len = sizeof(*cmd) + cmd->len;
  728. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_DUT_MODE_SEND,
  729. len, cmd, NULL, NULL, NULL);
  730. }
  731. static int le_test_mode(uint16_t opcode, uint8_t *buf, uint8_t buf_len)
  732. {
  733. char cmd_buf[IPC_MTU];
  734. struct hal_cmd_le_test_mode *cmd = (void *) cmd_buf;
  735. size_t len;
  736. DBG("opcode %u len %u", opcode, buf_len);
  737. if (!interface_ready())
  738. return BT_STATUS_NOT_READY;
  739. cmd->opcode = opcode;
  740. cmd->len = buf_len;
  741. memcpy(cmd->data, buf, cmd->len);
  742. len = sizeof(*cmd) + cmd->len;
  743. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_LE_TEST_MODE,
  744. len, cmd, NULL, NULL, NULL);
  745. }
  746. static int config_hci_snoop_log(uint8_t enable)
  747. {
  748. const char *property;
  749. DBG("enable %u", enable);
  750. property = enable ? "bluetooth.start" : "bluetooth.stop";
  751. if (property_set(property, "snoop") < 0) {
  752. error("Failed to set %s=snoop", property);
  753. return BT_STATUS_FAIL;
  754. }
  755. return BT_STATUS_SUCCESS;
  756. }
  757. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  758. static int get_connection_state(const bt_bdaddr_t *bd_addr)
  759. {
  760. struct hal_cmd_get_connection_state cmd;
  761. struct hal_rsp_get_connection_state rsp;
  762. size_t rsp_len = sizeof(rsp);
  763. bt_status_t status;
  764. DBG("bdaddr: %s", bdaddr2str(bd_addr));
  765. if (!interface_ready())
  766. return 0;
  767. memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
  768. status = hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
  769. HAL_OP_GET_CONNECTION_STATE, sizeof(cmd), &cmd,
  770. &rsp_len, &rsp, NULL);
  771. if (status != BT_STATUS_SUCCESS)
  772. return 0;
  773. return rsp.connection_state;
  774. }
  775. static int set_os_callouts(bt_os_callouts_t *callouts)
  776. {
  777. DBG("callouts: %p", callouts);
  778. /* TODO: implement */
  779. return BT_STATUS_SUCCESS;
  780. }
  781. static int read_energy_info(void)
  782. {
  783. DBG("");
  784. if (!interface_ready())
  785. return BT_STATUS_NOT_READY;
  786. return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_READ_ENERGY_INFO, 0,
  787. NULL, NULL, NULL, NULL);
  788. }
  789. #endif
  790. static const bt_interface_t bluetooth_if = {
  791. .size = sizeof(bt_interface_t),
  792. .init = init,
  793. .enable = enable,
  794. .disable = disable,
  795. .cleanup = cleanup,
  796. .get_adapter_properties = get_adapter_properties,
  797. .get_adapter_property = get_adapter_property,
  798. .set_adapter_property = set_adapter_property,
  799. .get_remote_device_properties = get_remote_device_properties,
  800. .get_remote_device_property = get_remote_device_property,
  801. .set_remote_device_property = set_remote_device_property,
  802. .get_remote_service_record = get_remote_service_record,
  803. .get_remote_services = get_remote_services,
  804. .start_discovery = start_discovery,
  805. .cancel_discovery = cancel_discovery,
  806. .create_bond = create_bond,
  807. .remove_bond = remove_bond,
  808. .cancel_bond = cancel_bond,
  809. .pin_reply = pin_reply,
  810. .ssp_reply = ssp_reply,
  811. .get_profile_interface = get_profile_interface,
  812. .dut_mode_configure = dut_mode_configure,
  813. .dut_mode_send = dut_mode_send,
  814. .le_test_mode = le_test_mode,
  815. .config_hci_snoop_log = config_hci_snoop_log,
  816. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  817. .get_connection_state = get_connection_state,
  818. .set_os_callouts = set_os_callouts,
  819. .read_energy_info = read_energy_info,
  820. #endif
  821. };
  822. static const bt_interface_t *get_bluetooth_interface(void)
  823. {
  824. DBG("");
  825. return &bluetooth_if;
  826. }
  827. static int close_bluetooth(struct hw_device_t *device)
  828. {
  829. DBG("");
  830. cleanup();
  831. free(device);
  832. return 0;
  833. }
  834. static int open_bluetooth(const struct hw_module_t *module, char const *name,
  835. struct hw_device_t **device)
  836. {
  837. bluetooth_device_t *dev = malloc(sizeof(bluetooth_device_t));
  838. DBG("");
  839. if (!dev) {
  840. error("Failed to allocate memory for device");
  841. return -ENOMEM;
  842. }
  843. memset(dev, 0, sizeof(bluetooth_device_t));
  844. dev->common.tag = HARDWARE_DEVICE_TAG;
  845. dev->common.version = 0;
  846. dev->common.module = (struct hw_module_t *) module;
  847. dev->common.close = close_bluetooth;
  848. dev->get_bluetooth_interface = get_bluetooth_interface;
  849. *device = (struct hw_device_t *) dev;
  850. return 0;
  851. }
  852. static struct hw_module_methods_t bluetooth_module_methods = {
  853. .open = open_bluetooth,
  854. };
  855. struct hw_module_t HAL_MODULE_INFO_SYM = {
  856. .tag = HARDWARE_MODULE_TAG,
  857. .version_major = 1,
  858. .version_minor = 0,
  859. .id = BT_HARDWARE_MODULE_ID,
  860. .name = "BlueZ Bluetooth stack",
  861. .author = "Intel Corporation",
  862. .methods = &bluetooth_module_methods
  863. };