| 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,43 – 1999/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 |
| |
| 1999/0513 | Qjvideo, | |
| 1999/0422 | Qjframe, }; | |
| 1999/0428 |
| |
| 1999/0422 |
| |
| 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 |
| |
| 1999/0513 | int currentBuffer; int currentBufferLength; | |
| 1999/0424 | void * currentBufferPtr; | |
| 1999/0513 | int frameNo; | |
| 1999/0424 | Rendez sleeper; | |
| 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,461 – 1999/0513/sys/src/9/pc/devlml.c:456,462 | ||
| 1999/0423 | static void lmlintr(Ureg *, void *); static void | |
| 1999/0422 |
| |
| 1999/0513 | lmlreset(void) | |
| 1999/0422 | { ulong regpa; int i; | |
| 1999/0430/sys/src/9/pc/devlml.c:462,468 – 1999/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) { | |
| 1999/0422 | codeData = (CodeData*)xspanalloc(sizeof(CodeData), BY2PG, 0); | |
| 1999/0430/sys/src/9/pc/devlml.c:472,478 – 1999/0513/sys/src/9/pc/devlml.c:472,478 | ||
| 1999/0422 | } print("Installing Motion JPEG driver %s\n", MJPG_VERSION); | |
| 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,497 – 1999/0513/sys/src/9/pc/devlml.c:491,497 | ||
| 1999/0422 | ||
| 1999/0423 | pciPhysBaseAddr = (void *)(pcidev->mem[0].bar & ~0x0F); | |
| 1999/0422 | ||
| 1999/0423 |
| |
| 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,504 – 1999/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,539 – 1999/0513/sys/src/9/pc/devlml.c:511,539 | ||
| 1999/0422 | // Interrupt handler | |
| 1999/0423 | intrenable(pcidev->intl, lmlintr, nil, pcidev->tbdf); | |
| 1999/0422 |
| |
| 1999/0513 | lmlattach(char *spec) | |
| 1999/0422 | { return devattach('V', spec); } static int | |
| 1999/0513 | lmlwalk(Chan *c, char *name) | |
| 1999/0422 | { | |
| 1999/0513 | return devwalk(c, name, lmldir, nelem(lmldir), devgen); | |
| 1999/0422 | } static void | |
| 1999/0513 | lmlstat(Chan *c, char *dp) | |
| 1999/0422 | { | |
| 1999/0513 | devstat(c, dp, lmldir, nelem(lmldir), devgen); | |
| 1999/0422 | } static Chan* | |
| 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,547 – 1999/0513/sys/src/9/pc/devlml.c:541,547 | ||
| 1999/0422 | case Q856: | |
| 1999/0428 | case Qreg: | |
| 1999/0422 | break; | |
| 1999/0513 | case Qjvideo: | |
| 1999/0422 | case Qjframe: | |
| 1999/0424 | if (nopens) error(Einuse); | |
| 1999/0430/sys/src/9/pc/devlml.c:556,572 – 1999/0513/sys/src/9/pc/devlml.c:556,572 | ||
| 1999/0422 | // allow one open total for these two break; } | |
| 1999/0513 | return devopen(c, omode, lmldir, nelem(lmldir), devgen); | |
| 1999/0422 | } static void | |
| 1999/0513 | lmlclose(Chan *c) | |
| 1999/0422 | { switch(c->qid.path){ case Q819: case Q856: | |
| 1999/0428 | case Qreg: | |
| 1999/0422 |
| |
| 1999/0513 | case Qjvideo: | |
| 1999/0422 | case Qjframe: authclose(c); } | |
| 1999/0430/sys/src/9/pc/devlml.c:573,583 – 1999/0513/sys/src/9/pc/devlml.c:573,589 | ||
| 1999/0422 | } static long | |
| 1999/0424 |
| |
| 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 |
| |
| 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,633 – 1999/0513/sys/src/9/pc/devlml.c:627,641 | ||
| 1999/0428 | break; case 4: | |
| 1999/0430 | if (off & (n-1)) return 0; | |
| 1999/0424 |
| |
| 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 |
| |
| 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,644 – 1999/0513/sys/src/9/pc/devlml.c:642,656 | ||
| 1999/0422 | } static long | |
| 1999/0424 |
| |
| 1999/0513 | lmlwrite(Chan *c, void *va, long n, vlong off) { | |
| 1999/0424 | int i; uchar *buf = va; | |
| 1999/0423 |
| |
| 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,707 – 1999/0513/sys/src/9/pc/devlml.c:692,719 | ||
| 1999/0428 | return 0; | |
| 1999/0424 | } | |
| 1999/0428 | return n; | |
| 1999/0423 |
| |
| 1999/0513 | case Qjvideo: | |
| 1999/0423 | case Qjframe: | |
| 1999/0424 | return vwrite(c, buf, n, off); | |
| 1999/0423 | } | |
| 1999/0422 | } | |
| 1999/0513 | Dev lmldevtab = { | |
| 1999/0422 | 'V', "video", | |
| 1999/0513 | lmlreset, | |
| 1999/0422 | devinit, | |
| 1999/0513 | lmlattach, | |
| 1999/0422 | devclone, | |
| 1999/0513 | lmlwalk, lmlstat, lmlopen, | |
| 1999/0422 | devcreate, | |
| 1999/0513 | lmlclose, lmlread, | |
| 1999/0422 | devbread, | |
| 1999/0513 | lmlwrite, | |
| 1999/0422 | devbwrite, devremove, devwstat, | |