int hidc_reset_device_class() { int ec; /* error code */ int dd; uint32_t cur_cls; /* current Device Class */ if (org_device_class == 0) return 0; if ((dd = open_hci_dev()) < 0) return dd; if ((ec = get_device_class(dd, &cur_cls)) < 0) { close_hci_dev(dd); return ec; } if (cur_cls != org_device_class) { if ((ec = set_device_class(dd, org_device_class)) < 0) { close_hci_dev(dd); return ec; } } if ((ec = close_hci_dev(dd)) < 0) return ec; org_device_class = 0; return 0; }
int hidc_set_discoverable(int is_discoverable) { int ec; /* error code */ int dd; uint32_t mode; if (is_discoverable) mode = SCAN_PAGE | SCAN_INQUIRY; else mode = SCAN_PAGE; if ((dd = open_hci_dev()) < 0) return dd; if ((ec = set_scan_mode(dd, mode)) < 0) { close_hci_dev(dd); return ec; } was_discoverable_set = is_discoverable; if ((ec = close_hci_dev(dd)) < 0) return ec; return 0; }
int hidc_set_hid_device_class() { int ec; /* error code */ int dd; uint32_t cur_cls; /* current Device Class */ uint32_t new_cls; /* new Device Class */ if ((dd = open_hci_dev()) < 0) return dd; if ((ec = get_device_class(dd, &cur_cls)) < 0) { close_hci_dev(dd); return ec; } if (org_device_class == 0) org_device_class = cur_cls; /* change only the last 12 bits */ new_cls = cur_cls & 0xfffff000; new_cls |= DC_PERI_KEYBOARD; if (new_cls != cur_cls) { if ((ec = set_device_class(dd, new_cls)) < 0) { close_hci_dev(dd); return ec; } } if ((ec = close_hci_dev(dd)) < 0) return ec; return 0; }
static void open_device(uint16_t index) { struct hcidump_data *data; data = malloc(sizeof(*data)); if (!data) return; memset(data, 0, sizeof(*data)); data->index = index; data->fd = open_hci_dev(index); if (data->fd < 0) { free(data); return; } mainloop_add_fd(data->fd, EPOLLIN, device_callback, data, free_data); }
void hidc_wait_for_empty_service_class(int timeout) { int dd; uint32_t cur_cls = 0; /* current Device Class */ time_t timeout_end = time(NULL) + timeout; log_d("start waiting for empty service class"); if ((dd = open_hci_dev()) < 0) return; get_device_class(dd, &cur_cls); while (((cur_cls & 0x00fff000) != 0) && (time(NULL) <= timeout_end)) { usleep(10 * 1000); get_device_class(dd, &cur_cls); } close_hci_dev(dd); log_d("stop waiting for empty service class"); }