⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.h

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 H
字号:
/* * USB implementation for Plan 9 *	(c) 1998, 1999 C H Forsyth */enum {	Dbginfo = 0x01,	Dbgfs = 0x02,	Dbgproc = 0x04,	Dbgcontrol = 0x08,};extern int debug, debugdebug, verbose;typedef uchar byte;#ifndef CHANNOPtypedef struct Ref Ref;#define threadprint fprint#endif/* * USB definitions */typedef struct DConfig DConfig;typedef struct DDevice DDevice;typedef struct DEndpoint DEndpoint;typedef struct DHid DHid;typedef struct DHub DHub;typedef struct DInterface DInterface;typedef struct Dconf Dconf;typedef struct Dalt Dalt;typedef struct Device Device;typedef struct Dinf Dinf;typedef struct Endpt Endpt;typedef struct Namelist Namelist;#ifndef nelem#define	nelem(x)	(sizeof((x))/sizeof((x)[0]))#endif#define	GET2(p)	((((p)[1]&0xFF)<<8)|((p)[0]&0xFF))#define	PUT2(p,v)	{((p)[0] = (v)); ((p)[1] = (v)>>8);}enum{	TokIN = 0x69,	TokOUT = 0xE1,	TokSETUP = 0x2D,	/* request type */	RH2D = 0<<7,	RD2H = 1<<7,	Rstandard = 0<<5,	Rclass = 1<<5,	Rvendor = 2<<5,	Rdevice = 0,	Rinterface = 1,	Rendpt = 2,	Rother = 3,	/* standard requests */	GET_STATUS = 0,	CLEAR_FEATURE = 1,	SET_FEATURE = 3,	SET_ADDRESS = 5,	GET_DESCRIPTOR = 6,	SET_DESCRIPTOR = 7,	GET_CONFIGURATION = 8,	SET_CONFIGURATION = 9,	GET_INTERFACE = 10,	SET_INTERFACE = 11,	SYNCH_FRAME = 12,	GET_CUR = 0x81,	GET_MIN = 0x82,	GET_MAX = 0x83,	GET_RES = 0x84,	SET_CUR = 0x01,	SET_MIN = 0x02,	SET_MAX = 0x03,	SET_RES = 0x04,	/* hub class feature selectors */	C_HUB_LOCAL_POWER = 0,	C_HUB_OVER_CURRENT,	PORT_CONNECTION = 0,	PORT_ENABLE = 1,	PORT_SUSPEND = 2,	PORT_OVER_CURRENT = 3,	PORT_RESET = 4,	PORT_POWER = 8,	PORT_LOW_SPEED = 9,	C_PORT_CONNECTION = 16,	C_PORT_ENABLE,	C_PORT_SUSPEND,	C_PORT_OVER_CURRENT,	C_PORT_RESET,	/* descriptor types */	DEVICE = 1,	CONFIGURATION = 2,	STRING = 3,	INTERFACE = 4,	ENDPOINT = 5,	HID = 0x21,	REPORT = 0x22,	PHYSICAL = 0x23,	HUB	= 0x29,	/* feature selectors */	DEVICE_REMOTE_WAKEUP = 1,	ENDPOINT_STALL = 0,	/* report types */	Tmtype = 3<<2,	Tmitem = 0xF0,	Tmain = 0<<2,		Tinput = 0x80,		Toutput = 0x90,		Tfeature = 0xB0,		Tcoll = 0xA0,		Tecoll = 0xC0,	 Tglobal = 1<<2,		Tusagepage = 0x00,		Tlmin = 0x10,		Tlmax = 0x20,		Tpmin = 0x30,		Tpmax = 0x40,		Tunitexp = 0x50,		Tunit = 0x60,		Trepsize = 0x70,		TrepID = 0x80,		Trepcount = 0x90,		Tpush = 0xA0,		Tpop = 0xB0,	 Tlocal = 2<<2,		Tusage = 0x00,		Tumin = 0x10,		Tumax = 0x20,		Tdindex = 0x30,		Tdmin = 0x40,		Tdmax = 0x50,		Tsindex = 0x70,		Tsmin = 0x80,		Tsmax = 0x90,		Tsetdelim = 0xA0,	 Treserved = 3<<2,	 Tlong = 0xFE,	/* parameters */	Nendpt =	16,	/* device state */	Detached = 0,	Attached,	Enabled,	Assigned,	Configured,	/* classes */	Noclass = 0,	Hubclass,	Otherclass,	/* endpoint direction */	Ein = 0,	Eout,	Eboth,	/* endpoint type */	Econtrol = 0,	Eiso = 1,	Ebulk = 2,	Eintr = 3,	/* endpoint isotype */	Eunknown = 0,	Easync = 1,	Eadapt = 2,	Esync = 3,};enum{	CL_AUDIO = 1,	CL_COMMS = 2,	CL_HID = 3,	CL_PRINTER = 7,	CL_STORAGE = 8,	CL_HUB = 9,	CL_DATA = 10,};struct Endpt{	uchar	addr;		/* endpoint address, 0-15 (|0x80 if direction==Ein) */	uchar	dir;		/* direction, Ein/Eout */	uchar	type;		/* Econtrol, Eiso, Ebulk, Eintr */	uchar	isotype;	/* Eunknown, Easync, Eadapt, Esync */	int	id;	int	class;	ulong	csp;	int	maxpkt;	Device*	dev;	Dconf*	conf;	Dinf*	iface;};struct Dalt{	int	attrib;	int	interval;	void*	devspec;	/* device specific settings */};struct Dinf{	int 	interface;	/* interface number */	ulong	csp;		/* USB class/subclass/proto */	Dalt*	dalt[16];	Endpt*	endpt[16];};struct Dconf{	ulong	csp;		/* USB class/subclass/proto */	int	nif;		/* number of interfaces */	int	cval;		/* value for set configuration */	int	attrib;	int	milliamps;	/* maximum power in this configuration */	Dinf*	iface[16];	/* up to 16 interfaces */};/* Dconf.attrib */enum{	Cbuspowered = 1<<7,	Cselfpowered = 1<<6,	Cremotewakeup = 1<<5,};struct Device{	Ref;	int	ctlrno;	int	ctl;	int	setup;	int	status;	int	state;	int	id;	int	class;	int	npt;	int	ls;		/* low speed */	ulong	csp;		/* USB class/subclass/proto */	int	nconf;	int	nif;		/* number of interfaces (sum of per-conf `nif's) */	int	vid;		/* vendor id */	int	did;		/* product (device) id */	Dconf*	config[16];	Endpt*	ep[Nendpt];//	Device*	setupfd;	/* for usbprobe *///	Device*	cfd;		/* for usbprobe */};/* * layout of standard descriptor types */struct DDevice{	byte	bLength;	byte	bDescriptorType;	byte	bcdUSB[2];	byte	bDeviceClass;	byte	bDeviceSubClass;	byte	bDeviceProtocol;	byte	bMaxPacketSize0;	byte	idVendor[2];	byte	idProduct[2];	byte	bcdDevice[2];	byte	iManufacturer;	byte	iProduct;	byte	iSerialNumber;	byte	bNumConfigurations;};#define	DDEVLEN	18struct DConfig{	byte	bLength;	byte	bDescriptorType;	byte	wTotalLength[2];	byte	bNumInterfaces;	byte	bConfigurationValue;	byte	iConfiguration;	byte	bmAttributes;	byte	MaxPower;};#define	DCONFLEN	9struct DInterface{	byte	bLength;	byte	bDescriptorType;	byte	bInterfaceNumber;	byte	bAlternateSetting;	byte	bNumEndpoints;	byte	bInterfaceClass;	byte	bInterfaceSubClass;	byte	bInterfaceProtocol;	byte	iInterface;};#define	DINTERLEN	9struct DEndpoint{	byte	bLength;	byte	bDescriptorType;	byte	bEndpointAddress;	byte	bmAttributes;	byte	wMaxPacketSize[2];	byte	bInterval;};#define	DENDPLEN	7struct DHid{	byte	bLength;	byte	bDescriptorType;	byte	bcdHID[2];	byte	bCountryCode;	byte	bNumDescriptors;	byte	bClassDescriptorType;	byte	wItemLength[2];};#define	DHIDLEN	9struct DHub{	byte	bLength;	byte	bDescriptorType;	byte	bNbrPorts;	byte	wHubCharacteristics[2];	byte	bPwrOn2PwrGood;	byte	bHubContrCurrent;	byte	DeviceRemovable[1];	/* variable length *//*	byte	PortPwrCtrlMask;		/* variable length, deprecated in USB v1.1 */};#define	DHUBLEN	9struct Namelist{	short	index;	char		*name;};typedef struct Drivetab{	ulong	csp;	void	(*driver)(Device *d);} Drivetab;#define Class(csp)	((csp)&0xff)#define Subclass(csp)	(((csp)>>8)&0xff)#define Proto(csp)	(((csp)>>16)&0xff)#define CSP(c, s, p)	((c) | ((s)<<8) | ((p)<<16))extern void (*dprinter[0x100])(Device *, int, ulong, void *b, int n);/* * format routines */void	pdesc	(Device *, int, ulong, byte *, int);void	preport	(Device *, int, ulong, byte *, int);void	pstring	(Device *, int, ulong, void *, int);void	phub	(Device *, int, ulong, void *, int);void	pdevice	(Device *, int, ulong, void *, int);void	phid	(Device *, int, ulong, void *, int);void	pcs_raw(char *tag, byte *b, int n);/* * interface */void	usbfmtinit(void);Device*	opendev(int, int);void	closedev(Device*);int	describedevice(Device*);int	loadconfig(Device *d, int n);Endpt *	newendpt(Device *d, int id, ulong csp);int	setupcmd(Endpt*, int, int, int, int, byte*, int);int	setupreq(Endpt*, int, int, int, int, int);int	setupreply(Endpt*, void*, int);void	setdevclass(Device *d, int n);void *	emalloc(ulong);void *	emallocz(ulong, int);char *	namefor(Namelist *, int);#pragma	varargck	type  "D"	Device*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -