Esempio n. 1
0
static void
writedata(int f, report_desc_t rd)
{
	struct variable *var;
	int dlen, i, r, rid;
	u_char *dbuf;
	enum hid_kind kind;

	kind = 0;
	rid = 0;
	for (kind = 0; kind < 3; kind ++) {
	    for (rid = 0; rid < 256; rid ++) {
		for (var = vars; var; var = var->next) {
			if (rid == var->h.report_ID && kind == var->h.kind)
				break;
		}
		if (var == NULL)
			continue;
		dlen = hid_report_size(rd, kind, rid);
		if (dlen <= 0)
			continue;
		dbuf = malloc(dlen);
		memset(dbuf, 0, dlen);
		dbuf[0] = rid;
		if (!zflag && hid_get_report(f, kind, dbuf, dlen) == 0) {
			if (verbose) {
				printf("Got %s report %d (%d bytes):",
				    kind == hid_input ? "input" :
				    kind == hid_output ? "output" : "feature",
				    rid, dlen);
				for (i = 0; i < dlen; i++)
					printf(" %02x", dbuf[i]);
				printf("\n");
			}
		} else if (!zflag) {
			warn("hid_get_report(rid %d)", rid);
			if (verbose) {
				printf("Can't get %s report %d (%d bytes). "
				    "Will be initialized with zeros.\n",
				    kind == hid_input ? "input" :
				    kind == hid_output ? "output" : "feature",
				    rid, dlen);
			}
		}
		for (var = vars; var; var = var->next) {
			if (rid != var->h.report_ID || kind != var->h.kind)
				continue;
			hid_set_data(dbuf, &var->h, var->val);
		}
		if (verbose) {
			printf("Setting %s report %d (%d bytes):",
			    kind == hid_output ? "output" :
			    kind == hid_feature ? "feature" : "input",
			    rid, dlen);
			for (i = 0; i < dlen; i++)
				printf(" %02x", dbuf[i]);
			printf("\n");
		}
		r = hid_set_report(f, kind, dbuf, dlen);
		if (r != 0)
			warn("hid_set_report(rid %d)", rid);
		free(dbuf);
	    }
	}
}
Esempio n. 2
0
QByteArray QUsbHid::getInputReport(int reportID, int maxLen,bool* r)
{
    return hid_get_report(handle, interface, HID_REPORT_TYPE_INPUT, reportID, maxLen, &lastErr, r);
}
Esempio n. 3
0
static void
dumpdata(int f, report_desc_t rd, int loop)
{
	struct variable *var;
	int dlen, havedata, i, match, r, rid, use_rid;
	u_char *dbuf;
	enum hid_kind kind;

	kind = 0;
	rid = -1;
	use_rid = !!hid_get_report_id(f);
	do {
		if (kind < 3) {
			if (++rid >= 256) {
				rid = 0;
				kind++;
			}
			if (kind >= 3)
				rid = -1;
			for (var = vars; var; var = var->next) {
				if (rid == var->h.report_ID &&
				    kind == var->h.kind)
					break;
			}
			if (var == NULL)
				continue;
		}
		dlen = hid_report_size(rd, kind < 3 ? kind : hid_input, rid);
		if (dlen <= 0)
			continue;
		dbuf = malloc(dlen);
		memset(dbuf, 0, dlen);
		if (kind < 3) {
			dbuf[0] = rid;
			r = hid_get_report(f, kind, dbuf, dlen);
			if (r < 0)
				warn("hid_get_report(rid %d)", rid);
			havedata = !r && (rid == 0 || dbuf[0] == rid);
			if (rid != 0)
				dbuf[0] = rid;
		} else {
			r = read(f, dbuf, dlen);
			if (r < 1)
				err(1, "read error");
			havedata = 1;
		}
		if (verbose) {
			printf("Got %s report %d (%d bytes):",
			    kind == hid_output ? "output" :
			    kind == hid_feature ? "feature" : "input",
			    use_rid ? dbuf[0] : 0, dlen);
			if (havedata) {
				for (i = 0; i < dlen; i++)
					printf(" %02x", dbuf[i]);
			}
			printf("\n");
		}
		match = 0;
		for (var = vars; var; var = var->next) {
			if ((kind < 3 ? kind : hid_input) != var->h.kind)
				continue;
			if (var->h.report_ID != 0 &&
			    dbuf[0] != var->h.report_ID)
				continue;
			match = 1;
			if (!noname)
				printf("%s=", var->name);
			if (havedata)
				prdata(dbuf, &var->h);
			printf("\n");
		}
		if (match)
			printf("\n");
		free(dbuf);
	} while (loop || kind < 3);
}
Esempio n. 4
0
QByteArray QUsbHid::getFeature(int reportID, int maxLen,bool* r)
{
    return hid_get_report(handle, interface, HID_REPORT_TYPE_FEATURE, reportID, maxLen, &lastErr, r);
}