plan 9 kernel history: overview | file list | diff list

1999/0513/pc/devlml.c (diff list | history)

1999/0430/sys/src/9/pc/devlml.c:11,431999/0513/sys/src/9/pc/devlml.c:11,44 (short | long | prev | next)
1999/0422    
// Lml 22 driver 
 
enum{ 
1999/0513    
	Qdir, 
1999/0422    
	Q819, 
	Q856, 
1999/0428    
	Qreg, 
1999/0422    
	Qvideo, 
1999/0513    
	Qjvideo, 
1999/0422    
	Qjframe, 
}; 
 
static Dirtab viddir[]={ 
//	 name,		 qid,	  size,		mode 
	"vid819",	{Q819},		0,		0644, 
	"vid856",	{Q856},		0,		0644, 
1999/0428    
	"vidreg",	{Qreg},		0,		0644, 
1999/0422    
	"video",	{Qvideo},	0,		0666, 
1999/0513    
static Dirtab lmldir[]={ 
//	 name,		 qid,		size,		mode 
	"lml819",	{Q819},		0,		0644, 
	"lml856",	{Q856},		0,		0644, 
	"lmlreg",	{Qreg},		0,		0644, 
	"jvideo",	{Qjvideo},	0,		0666, 
1999/0422    
	"jframe",	{Qjframe},	0,		0666, 
}; 
 
CodeData *	codeData; 
 
1999/0424    
int			currentBuffer; 
int			currentBufferLength; 
1999/0513    
int		currentBuffer; 
int		currentBufferLength; 
1999/0424    
void *		currentBufferPtr; 
int			frameNo; 
1999/0513    
int		frameNo; 
1999/0424    
Rendez		sleeper; 
int			singleFrame; 
int			bufferPrepared; 
int			hdrPos; 
int			nopens; 
1999/0513    
int		singleFrame; 
int		bufferPrepared; 
int		hdrPos; 
int		nopens; 
1999/0429    
uchar		q856[3]; 
1999/0424    
 
static FrameHeader frameHeader = { 
1999/0430/sys/src/9/pc/devlml.c:455,4611999/0513/sys/src/9/pc/devlml.c:456,462
1999/0423    
static void lmlintr(Ureg *, void *); 
 
static void 
1999/0422    
vidreset(void) 
1999/0513    
lmlreset(void) 
1999/0422    
{ 
	ulong regpa; 
	int i; 
1999/0430/sys/src/9/pc/devlml.c:462,4681999/0513/sys/src/9/pc/devlml.c:463,468
1999/0422    
 
1999/0423    
	pcidev = pcimatch(nil, PCI_VENDOR_ZORAN, PCI_DEVICE_ZORAN_36067); 
	if (pcidev == nil) { 
		print("No zr36067 found.\n"); 
		return; 
	} 
1999/0422    
	codeData = (CodeData*)xspanalloc(sizeof(CodeData), BY2PG, 0); 
1999/0430/sys/src/9/pc/devlml.c:472,4781999/0513/sys/src/9/pc/devlml.c:472,478
1999/0422    
	} 
 
	print("Installing Motion JPEG driver %s\n", MJPG_VERSION);  
	print("Buffer size %ux\n", sizeof(CodeData));  
1999/0513    
	print("Buffer at 0x%.8lux, size 0x%.8ux\n", codeData, sizeof(CodeData));  
1999/0422    
 
	// Get access to DMA memory buffer 
	memset(codeData, 0xAA, sizeof(CodeData)); 
1999/0430/sys/src/9/pc/devlml.c:491,4971999/0513/sys/src/9/pc/devlml.c:491,497
1999/0422    
 
1999/0423    
	pciPhysBaseAddr = (void *)(pcidev->mem[0].bar & ~0x0F); 
1999/0422    
 
1999/0423    
	print("zr36067 found at %lux\n", pciPhysBaseAddr); 
1999/0513    
	print("zr36067 found at 0x%.8lux", pciPhysBaseAddr); 
1999/0422    
 
1999/0423    
	regpa = upamalloc(pcidev->mem[0].bar & ~0x0F, pcidev->mem[0].size, 0); 
1999/0422    
	if (regpa == 0) { 
1999/0430/sys/src/9/pc/devlml.c:499,5041999/0513/sys/src/9/pc/devlml.c:499,505
1999/0422    
		return; 
	} 
1999/0423    
	pciBaseAddr = (ulong)KADDR(regpa); 
1999/0513    
	print(", mapped at 0x%.8lux\n", pciBaseAddr); 
1999/0422    
 
	// make sure the device will respond to mem accesses 
	// (pcicmd_master | pcicmd_memory) -- probably superfluous 
1999/0430/sys/src/9/pc/devlml.c:510,5391999/0513/sys/src/9/pc/devlml.c:511,539
1999/0422    
	// Interrupt handler 
1999/0423    
	intrenable(pcidev->intl, lmlintr, nil, pcidev->tbdf); 
1999/0422    
 
	print("LML33 Installed\n");  
	return;  
} 
 
static Chan* 
vidattach(char *spec) 
1999/0513    
lmlattach(char *spec) 
1999/0422    
{ 
	return devattach('V', spec); 
} 
 
static int 
vidwalk(Chan *c, char *name) 
1999/0513    
lmlwalk(Chan *c, char *name) 
1999/0422    
{ 
	return devwalk(c, name, viddir, nelem(viddir), devgen); 
1999/0513    
	return devwalk(c, name, lmldir, nelem(lmldir), devgen); 
1999/0422    
} 
 
static void 
vidstat(Chan *c, char *dp) 
1999/0513    
lmlstat(Chan *c, char *dp) 
1999/0422    
{ 
	devstat(c, dp, viddir, nelem(viddir), devgen); 
1999/0513    
	devstat(c, dp, lmldir, nelem(lmldir), devgen); 
1999/0422    
} 
 
static Chan* 
vidopen(Chan *c, int omode) 
1999/0513    
lmlopen(Chan *c, int omode) 
1999/0422    
{ 
	c->aux = 0; 
	switch(c->qid.path){ 
1999/0430/sys/src/9/pc/devlml.c:541,5471999/0513/sys/src/9/pc/devlml.c:541,547
1999/0422    
	case Q856: 
1999/0428    
	case Qreg: 
1999/0422    
		break; 
	case Qvideo: 
1999/0513    
	case Qjvideo: 
1999/0422    
	case Qjframe: 
1999/0424    
		if (nopens) 
			error(Einuse); 
1999/0430/sys/src/9/pc/devlml.c:556,5721999/0513/sys/src/9/pc/devlml.c:556,572
1999/0422    
		// allow one open total for these two 
		break; 
	} 
	return devopen(c, omode, viddir, nelem(viddir), devgen); 
1999/0513    
	return devopen(c, omode, lmldir, nelem(lmldir), devgen); 
1999/0422    
} 
 
static void 
vidclose(Chan *c) 
1999/0513    
lmlclose(Chan *c) 
1999/0422    
{ 
	switch(c->qid.path){ 
	case Q819: 
	case Q856: 
1999/0428    
	case Qreg: 
1999/0422    
	case Qvideo: 
1999/0513    
	case Qjvideo: 
1999/0422    
	case Qjframe: 
		authclose(c); 
	} 
1999/0430/sys/src/9/pc/devlml.c:573,5831999/0513/sys/src/9/pc/devlml.c:573,589
1999/0422    
} 
 
static long 
1999/0424    
vidread(Chan *c, void *va, long n, vlong off) { 
1999/0513    
lmlread(Chan *c, void *va, long n, vlong voff) { 
1999/0424    
	int i, d; 
	uchar *buf = va; 
1999/0513    
	long off = voff; 
	long v; 
1999/0423    
 
1999/0422    
	switch(c->qid.path){ 
1999/0513    
	switch(c->qid.path & ~CHDIR){ 
 
	case Qdir: 
		return devdirread(c, (char *)buf, n, lmldir, nelem(lmldir), devgen); 
 
1999/0422    
	case Q819: 
1999/0424    
		if (off < 0 || off + n > 0x20) 
1999/0423    
			return 0; 
1999/0430/sys/src/9/pc/devlml.c:621,6331999/0513/sys/src/9/pc/devlml.c:627,641
1999/0428    
			break; 
		case 4: 
1999/0430    
			if (off & (n-1)) return 0; 
1999/0424    
			*(long *)buf = readl(pciBaseAddr + off); 
1999/0513    
			v = readl(pciBaseAddr + off); 
			*(long *)buf = v; 
print("reading %lux at %lux (%lux)\n", v, pciBaseAddr + off, off); 
1999/0428    
			break; 
		default: 
			return 0; 
1999/0424    
		} 
1999/0428    
		return n; 
1999/0422    
	case Qvideo: 
1999/0513    
	case Qjvideo: 
1999/0422    
	case Qjframe: 
1999/0424    
		return vread(c, buf, n, off); 
1999/0422    
	} 
1999/0430/sys/src/9/pc/devlml.c:634,6441999/0513/sys/src/9/pc/devlml.c:642,656
1999/0422    
} 
 
static long 
1999/0424    
vidwrite(Chan *c, void *va, long n, vlong off) { 
1999/0513    
lmlwrite(Chan *c, void *va, long n, vlong off) { 
1999/0424    
	int i; 
	uchar *buf = va; 
1999/0423    
 
	switch(c->qid.path){ 
1999/0513    
	switch(c->qid.path & ~CHDIR){ 
 
	case Qdir: 
		error(Eperm); 
 
1999/0423    
	case Q819: 
1999/0424    
		if (off < 0 || off + n > 0x20) 
1999/0423    
			return 0; 
1999/0430/sys/src/9/pc/devlml.c:680,7071999/0513/sys/src/9/pc/devlml.c:692,719
1999/0428    
			return 0; 
1999/0424    
		} 
1999/0428    
		return n; 
1999/0423    
	case Qvideo: 
1999/0513    
	case Qjvideo: 
1999/0423    
	case Qjframe: 
1999/0424    
		return vwrite(c, buf, n, off); 
1999/0423    
	} 
1999/0422    
} 
 
Dev viddevtab = { 
1999/0513    
Dev lmldevtab = { 
1999/0422    
	'V', 
	"video", 
 
	vidreset, 
1999/0513    
	lmlreset, 
1999/0422    
	devinit, 
	vidattach, 
1999/0513    
	lmlattach, 
1999/0422    
	devclone, 
	vidwalk, 
	vidstat, 
	vidopen, 
1999/0513    
	lmlwalk, 
	lmlstat, 
	lmlopen, 
1999/0422    
	devcreate, 
	vidclose, 
	vidread, 
1999/0513    
	lmlclose, 
	lmlread, 
1999/0422    
	devbread, 
	vidwrite, 
1999/0513    
	lmlwrite, 
1999/0422    
	devbwrite, 
	devremove, 
	devwstat, 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)