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

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

1999/0601/sys/src/9/pc/devlml.c:23,421999/0610/sys/src/9/pc/devlml.c:23,71 (short | long | prev | next)
1999/0422    
 
enum{ 
1999/0513    
	Qdir, 
1999/0526    
	Qjcount, 
1999/0610    
	Qjpg, 
//	Qraw, 
1999/0422    
}; 
 
1999/0513    
static Dirtab lmldir[]={ 
//	 name,		 qid,		size,		mode 
1999/0526    
	"jcount",	{Qjcount},	0,		0444, 
1999/0610    
//	 name,		qid,	size,	mode 
	"lmljpg",	{Qjpg},	0,	0444, 
//	"lmlraw",	{Qraw},	0,	0444, 
1999/0422    
}; 
 
CodeData *	codeData; 
1999/0610    
static CodeData *	codeData; 
1999/0422    
 
1999/0610    
static ulong		jpgframeno; 
//static ulong		rawframeno; 
 
//static FrameHeader	rawheader; 
 
static FrameHeader	jpgheader[NBUF] = { 
	{ 
		MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, 
		{ 'L', 'M', 'L', '\0'}, 
		-1, 0, 0, 0, 0 
	}, { 
		MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, 
		{ 'L', 'M', 'L', '\0'}, 
		-1, 0, 0, 0, 0 
	}, { 
		MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, 
		{ 'L', 'M', 'L', '\0'}, 
		-1, 0, 0, 0, 0 
	}, { 
		MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, 
		{ 'L', 'M', 'L', '\0'}, 
		-1, 0, 0, 0, 0 
	} 
}; 
 
1999/0513    
int		frameNo; 
1999/0424    
Rendez		sleeper; 
1999/0610    
Rendez		sleepjpg; 
//Rendez		sleepraw; 
1999/0513    
int		singleFrame; 
int		nopens; 
1999/0610    
int		jpgopens; 
//int		rawopens; 
1999/0424    
 
1999/0525    
#define writel(v, a) *(ulong *)(a) = (v) 
#define readl(a) *(ulong*)(a) 
1999/0601/sys/src/9/pc/devlml.c:51,741999/0610/sys/src/9/pc/devlml.c:80,136
1999/0526    
		if (codeData->statCom[last] & STAT_BIT) 
			return last; 
		if (last == l) 
			sleep(&sleeper, return0, 0); 
1999/0610    
			sleep(&sleepjpg, return0, 0); 
1999/0423    
	} 
1999/0526    
	return 0; 
1999/0423    
} 
 
1999/0526    
static long 
vcount(Chan *, void *va, long nbytes, vlong) { 
	char *p = (char *)va; 
1999/0610    
jpgread(Chan *, void *va, long nbytes, vlong) { 
	int bufno; 
1999/0423    
 
1999/0526    
	// reads always return one byte: the next available buffer number 
	if (nbytes <= 0) return 0; 
	*p = getbuffer(); 
1999/0424    
	return 1; 
1999/0610    
	// reads should be of size 1 or sizeof(FrameHeader) 
	// Frameno is the number of the buffer containing the data 
	bufno = getbuffer(); 
	if (nbytes == sizeof(FrameHeader)) { 
		memmove(va, &jpgheader[bufno], sizeof jpgheader[bufno]); 
		return sizeof jpgheader[bufno]; 
	} 
	if (nbytes == 1) { 
		*(char *)va = bufno; 
		return 1; 
	} 
	return 0; 
1999/0424    
} 
 
1999/0610    
/* 
static long 
rawread(Chan *, void *va, long nbytes, vlong) { 
 
	// reads should be at least sizeof(FrameHeader) long 
	// Frameno is the number of the buffer containing the data 
	if (nbytes < sizeof(FrameHeader)) return 0; 
	sleep(&sleepraw, return0, 0); 
	memmove(va, &rawheader, sizeof rawheader); 
	return sizeof rawheader; 
} 
*/ 
 
1999/0423    
static void lmlintr(Ureg *, void *); 
 
static void 
1999/0610    
prepbuf(void) { 
	int i; 
 
	for (i = 0; i < NBUF; i++) { 
		codeData->statCom[i] = PADDR(&(codeData->fragdesc[i])); 
		codeData->fragdesc[i].addr = PADDR(&(codeData->frag[i])); 
		// Length is in double words, in position 1..20 
		codeData->fragdesc[i].leng = ((sizeof codeData->frag[i]) >> 1) | FRAGM_FINAL_B; 
	} 
} 
 
static void 
1999/0513    
lmlreset(void) 
1999/0422    
{ 
1999/0522    
	Physseg segbuf; 
1999/0601/sys/src/9/pc/devlml.c:78,841999/0610/sys/src/9/pc/devlml.c:140,145
1999/0525    
	ulong cdsize; 
1999/0529    
	void *grabbuf; 
1999/0527    
	ulong grablen; 
1999/0422    
	int i; 
 
1999/0423    
	pcidev = pcimatch(nil, PCI_VENDOR_ZORAN, PCI_DEVICE_ZORAN_36067); 
	if (pcidev == nil) { 
1999/0601/sys/src/9/pc/devlml.c:105,1171999/0610/sys/src/9/pc/devlml.c:166,174
1999/0422    
	// Get access to DMA memory buffer 
1999/0529    
	codeData->pamjpg = PADDR(codeData->statCom); 
	codeData->pagrab = PADDR(grabbuf); 
1999/0520    
	for (i = 0; i < NBUF; i++) { 
1999/0517    
		codeData->statCom[i] = PADDR(&(codeData->fragdesc[i])); 
		codeData->fragdesc[i].addr = PADDR(&(codeData->frag[i])); 
1999/0422    
		// Length is in double words, in position 1..20 
1999/0518    
		codeData->fragdesc[i].leng = ((sizeof codeData->frag[i]) >> 1) | FRAGM_FINAL_B; 
1999/0422    
	} 
 
1999/0610    
	prepbuf(); 
 
1999/0423    
	pciPhysBaseAddr = (void *)(pcidev->mem[0].bar & ~0x0F); 
1999/0422    
 
1999/0513    
	print("zr36067 found at 0x%.8lux", pciPhysBaseAddr); 
1999/0601/sys/src/9/pc/devlml.c:186,1971999/0610/sys/src/9/pc/devlml.c:243,264
1999/0517    
 
1999/0422    
	c->aux = 0; 
	switch(c->qid.path){ 
1999/0526    
	case Qjcount: 
1999/0610    
	case Qjpg: 
1999/0601    
		// allow one open 
1999/0424    
		if (nopens) 
1999/0610    
		if (jpgopens) 
1999/0424    
			error(Einuse); 
		nopens = 1; 
1999/0610    
		jpgopens = 1; 
		jpgframeno = 0; 
		prepbuf(); 
1999/0422    
		break; 
1999/0610    
/*	case Qraw: 
		// allow one open 
		if (rawopens) 
			error(Einuse); 
		rawopens = 1; 
		rawframeno = 0; 
		break; 
*/ 
1999/0422    
	} 
1999/0513    
	return devopen(c, omode, lmldir, nelem(lmldir), devgen); 
1999/0422    
} 
1999/0601/sys/src/9/pc/devlml.c:200,2091999/0610/sys/src/9/pc/devlml.c:267,281
1999/0518    
lmlclose(Chan *c) { 
 
1999/0422    
	switch(c->qid.path){ 
1999/0526    
	case Qjcount: 
1999/0515    
		nopens = 0; 
1999/0422    
		authclose(c); 
1999/0610    
	case Qjpg: 
		jpgopens = 0; 
		break; 
/*	case Qraw: 
		rawopens = 0; 
		break; 
*/ 
1999/0422    
	} 
1999/0610    
	authclose(c); 
1999/0422    
} 
 
static long 
1999/0601/sys/src/9/pc/devlml.c:215,2221999/0610/sys/src/9/pc/devlml.c:287,297
1999/0513    
 
	case Qdir: 
		return devdirread(c, (char *)buf, n, lmldir, nelem(lmldir), devgen); 
1999/0526    
	case Qjcount: 
		return vcount(c, buf, n, off); 
1999/0610    
	case Qjpg: 
		return jpgread(c, buf, n, off); 
/*	case Qraw: 
		return rawread(c, buf, n, off); 
*/ 
1999/0422    
	} 
} 
 
1999/0601/sys/src/9/pc/devlml.c:250,2561999/0610/sys/src/9/pc/devlml.c:325,331
1999/0422    
 
static void 
1999/0424    
lmlintr(Ureg *, void *) { 
1999/0520    
	static count; 
1999/0610    
	ulong fstart, fno; 
1999/0520    
	ulong flags = readl(pciBaseAddr+INTR_STAT); 
1999/0424    
	 
1999/0520    
	if(debug&(DBGINTR)) 
1999/0601/sys/src/9/pc/devlml.c:260,2681999/0610/sys/src/9/pc/devlml.c:335,362
1999/0520    
	writel(0xff000000, pciBaseAddr + INTR_STAT); 
1999/0423    
 
1999/0520    
	if(flags & INTR_JPEGREP) { 
		if ((debug&DBGINTR) || ((debug&DBGINTS) && (count++ % 128) == 0)) 
1999/0515    
			print("MjpgDrv_intrHandler wakeup\n"); 
		wakeup(&sleeper); 
1999/0610    
		vlong thetime; 
 
		fstart = jpgframeno & 0x00000003; 
		for (;;) { 
			jpgframeno++; 
			fno = jpgframeno & 0x00000003; 
			if (codeData->statCom[fno] & STAT_BIT) 
				break; 
			if (fno == fstart) { 
				if (debug & DBGINTR) 
					print("Spurious lml jpg intr?\n"); 
				return; 
			} 
		} 
		thetime = todget(nil); 
		jpgheader[fno].sec  = (ulong)(thetime / 1000000000LL); 
		jpgheader[fno].usec = (ulong)(thetime % 1000000000LL) / 1000; 
		jpgheader[fno].frameSize = 
			(codeData->statCom[fno] & 0x00ffffff) >> 1; 
		jpgheader[fno].frameSeqNo = codeData->statCom[fno] >> 24; 
		jpgheader[fno].frameNo = jpgframeno; 
		wakeup(&sleepjpg); 
1999/0515    
	} 
1999/0424    
	return; 
1999/0422    
} 


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