henesyinit from p9fd787fda5 years agoHistory
73 lines · 1.2 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h>#include "usb.h"#include "usbproto.h" static intsetupcmd(int fd, uchar *data, int count){	int n; 	n = write(fd, data, count);	if(n < 0) {		werrstr("setupcmd: write err: %r");		return -1;	}	if(n != count) {		werrstr("setupcmd: short write: %d of %d", n, count);		return -1;	}	return n;} static intsetupout(int fd, uchar *req, uchar *data, int count){	int n;	uchar *wp; 	if(count == 0)		return setupcmd(fd, req, 8); 	wp = emalloc(8+count);	memmove(wp, req, 8);	memmove(wp+8, data, count);	n = setupcmd(fd, wp, 8+count);	free(wp);	return n;} static intsetupin(int fd, uchar *req, uchar *data, int count){	int n; 	n = setupcmd(fd, req, 8);	if(n < 0)		return n;	n = read(fd, data, count);	if(n < 0)		werrstr("setupin: read err: %r");	else if(n != count)		werrstr("setupin: short read (%d < %d)", n, count);	return n;} intsetupreq(Device *d, int type, int request, int value, int index, uchar *data, int count){	int fd;	uchar req[8]; 	fd = d->setup;	req[0] = type;	req[1] = request;	PUT2(req+2, value);	PUT2(req+4, index);	PUT2(req+6, count);	if((type&RD2H) != 0)		return setupin(fd, req, data, count);	else		return setupout(fd, req, data, count);}