| 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,42 – 1999/0610/sys/src/9/pc/devlml.c:23,71 (short | long | prev | next) | ||
| 1999/0422 | enum{ | |
| 1999/0513 | Qdir, | |
| 1999/0526 |
| |
| 1999/0610 | Qjpg, // Qraw, | |
| 1999/0422 | }; | |
| 1999/0513 | static Dirtab lmldir[]={ | |
| 1999/0526 |
| |
| 1999/0610 | // name, qid, size, mode "lmljpg", {Qjpg}, 0, 0444, // "lmlraw", {Qraw}, 0, 0444, | |
| 1999/0422 | }; | |
| 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 |
| |
| 1999/0610 | Rendez sleepjpg; //Rendez sleepraw; | |
| 1999/0513 | int singleFrame; | |
| 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,74 – 1999/0610/sys/src/9/pc/devlml.c:80,136 | ||
| 1999/0526 | if (codeData->statCom[last] & STAT_BIT) return last; if (last == l) | |
| 1999/0610 | sleep(&sleepjpg, return0, 0); | |
| 1999/0423 | } | |
| 1999/0526 | return 0; | |
| 1999/0423 | } | |
| 1999/0526 | static long | |
| 1999/0610 | jpgread(Chan *, void *va, long nbytes, vlong) { int bufno; | |
| 1999/0423 | ||
| 1999/0526 |
| |
| 1999/0424 |
| |
| 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,84 – 1999/0610/sys/src/9/pc/devlml.c:140,145 | ||
| 1999/0525 | ulong cdsize; | |
| 1999/0529 | void *grabbuf; | |
| 1999/0527 | ulong grablen; | |
| 1999/0422 |
| |
| 1999/0423 | pcidev = pcimatch(nil, PCI_VENDOR_ZORAN, PCI_DEVICE_ZORAN_36067); if (pcidev == nil) { | |
| 1999/0601/sys/src/9/pc/devlml.c:105,117 – 1999/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 |
| |
| 1999/0517 |
| |
| 1999/0422 |
| |
| 1999/0518 |
| |
| 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,197 – 1999/0610/sys/src/9/pc/devlml.c:243,264 | ||
| 1999/0517 | ||
| 1999/0422 | c->aux = 0; switch(c->qid.path){ | |
| 1999/0526 |
| |
| 1999/0610 | case Qjpg: | |
| 1999/0601 | // allow one open | |
| 1999/0424 |
| |
| 1999/0610 | if (jpgopens) | |
| 1999/0424 | error(Einuse); | |
| 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,209 – 1999/0610/sys/src/9/pc/devlml.c:267,281 | ||
| 1999/0518 | lmlclose(Chan *c) { | |
| 1999/0422 | switch(c->qid.path){ | |
| 1999/0526 |
| |
| 1999/0515 |
| |
| 1999/0422 |
| |
| 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,222 – 1999/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 |
| |
| 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,256 – 1999/0610/sys/src/9/pc/devlml.c:325,331 | ||
| 1999/0422 | static void | |
| 1999/0424 | lmlintr(Ureg *, void *) { | |
| 1999/0520 |
| |
| 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,268 – 1999/0610/sys/src/9/pc/devlml.c:335,362 | ||
| 1999/0520 | writel(0xff000000, pciBaseAddr + INTR_STAT); | |
| 1999/0423 | ||
| 1999/0520 | if(flags & INTR_JPEGREP) { | |
| 1999/0515 |
| |
| 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 | } | |