Example #1
0
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;
}
Example #2
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;
}
Example #3
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;
}
Example #4
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);
}
Example #5
0
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");
}