## diffname pc/devlml.h 1999/0422 ## diff -e /dev/null /n/emeliedump/1999/0422/sys/src/brazil/pc/devlml.h 0a // Lml 22 driver #define MJPG_VERSION "LML33 v0.2" // Various minor numbers (functions) of the device #define MJPG_MINOR_STATUS 0 #define MJPG_MINOR_VIDEO 1 #define MJPG_MINOR_FRAME 2 #define MJPG_MINOR_STILL 3 // The following values can be modified to tune/set default behaviour of the // driver. // The number of uS delay in I2C state transitions #define H33_I2C_DELAY 10 // The amount of spinning to do before the I2C bus is timed out #define H33_I2C_TIMEOUT 10000000 // The amount of spinning to do before the guest bus is timed out #define H33_GUEST_TIMEOUT 10000000 // The amount of spinning to do before the polling of the still // transfer port is aborted. #define H33_STILL_TIMEOUT 1000000 // The following number is the maximum number of cards permited. Each // card found is mapped to a device minor number starting from 0. #define H33_MAX_CARDS 1 // The following is the number of device types supported. #define H33_DEVICE_COUNT 2 // The number of 8K pages per buffer, we will allocate four buffers, // locked into memory whenever the device is open so modify with care. #define H33_PAGES 32 // The following are the datastructures needed by the device. // A H33_Device records the properties of the various card types supported. typedef struct { int number; // The H33_CARDTYPE_ assigned char *card_name; // A string name int zr060addr; // Which guest bus address for the ZR36060 } H33_Device; // An entry in the fragment table typedef struct { ulong address; // bus address of page int length; // length of page } H33_RingPage; // The structure that we will use to tell the '57 about the buffers // The sizeof(H33_RingData) should not exceed page size typedef struct { void *buffer[4]; ulong i_stat_com[4]; H33_RingPage ring_pages[4][H33_PAGES]; } H33_RingData; typedef struct { int expect; // the buffer the int routine expects next int which; // which ring buffer the read or write uses int filled; // the current number of filled buffers int pages; // the number of complete pages int remainder; // the number of bytes in incomplete page } H33_RingPtr; // The remainder of the #defs are constants which should not need changing. // The PCI vendor and device ids of the zoran chipset on the dc30 // these really belong in pci.h #define PCI_VENDOR_ZORAN 0x11de #define PCI_DEVICE_ZORAN_36057 0x6057 // The ZR36057 is mapped into a 4Kbyte block of the address space // starting at PCI_BASE_ADDRESS_0. Its application specific registers // are layed out within that space as follows. #define ZR36057_VFEND_HORCON 0x000 #define ZR36057_VFEND_VERCON 0x004 #define ZR36057_VFEND_SCLPIX 0x008 #define ZR36057_VDISP_TOP 0x00c #define ZR36057_VDISP_BOT 0x010 #define ZR36057_VSTRD_GRB 0x014 #define ZR36057_VDISP_CONF 0x018 #define ZR36057_MASK_TOP 0x01c #define ZR36057_MASK_BOT 0x020 #define ZR36057_OVRLY_CTL 0x024 #define ZR36057_SYS_PCI 0x028 #define ZR36057_GPIO_CTL 0x02c #define ZR36057_MPEG_SRCW 0x030 #define ZR36057_MPEG_CTFR_CTL 0x034 #define ZR36057_MPEG_MEM_PTR 0x038 #define ZR36057_INTR_STAT 0x03c #define ZR36057_INTR_CTL 0x040 #define ZR36057_I2C_BUS 0x044 #define ZR36057_JPEG_MODE_CTL 0x100 #define ZR36057_JPEG_PROC_CTL 0x104 #define ZR36057_VSYNC_PARM 0x108 #define ZR36057_HSYNC_PARM 0x10c #define ZR36057_HOR_ACTIVE 0x110 #define ZR36057_VER_ACTIVE 0x114 #define ZR36057_FIELD_PROC 0x118 #define ZR36057_JPEG_CODE_BASE 0x11C #define ZR36057_JPEG_FIFO_THRHLD 0x120 #define ZR36057_JPEG_GUESTID 0x124 #define ZR36057_GUEST_CTL 0x12c #define ZR36057_POST_OFFICE 0x200 #define ZR36057_STILL_TRANS 0x300 // The datasheet says that STILL_TRANS is 0x140, but the errata says it's 0x300 // which bits of the ZR36057_INTR... mean something special #define ZR36057_INTR_GIRQ1 0x40000000 #define ZR36057_INTR_GIRQ0 0x20000000 #define ZR36057_INTR_CODREP 0x10000000 #define ZR36057_INTR_JPEGREP 0x08000000 #define ZR36057_INTR_ENABLE 0x01000000 // which bits of ZR36057_I2C_BUS mean something special #define ZR36057_POST_PEND 0x02000000 #define ZR36057_POST_TIME 0x01000000 #define ZR36057_POST_DIR 0x00800000 // function of the Guest CS outputs #define ZR36060_GUEST_DATA 0 #define ZR36060_GUEST_START 1 #define ZR36060_GUEST_RESET 3 // the still busy bit in ZR36057_STILL_TRANS // this assumes we are working in little endian mode #define ZR36057_STILL_BUSY 0x80000000 // which bit of ZR36057_I2C_BUS is which #define ZR36057_I2C_SCL 1 #define ZR36057_I2C_SDA 2 // The ZR36060 registers #define ZR36060_LOAD 0x000 #define ZR36060_FIFO_STAT 0x001 #define ZR36060_INTERFACE 0x002 #define ZR36060_MODE 0x003 #define ZR36060_ZERO 0x004 #define ZR36060_MBCV 0x005 #define ZR36060_MARKERS_EN 0x006 #define ZR36060_INT_MASK 0x007 #define ZR36060_INT_STAT 0x008 #define ZR36060_TCV_NEThi 0x009 #define ZR36060_TCV_NETmh 0x00a #define ZR36060_TCV_NETml 0x00b #define ZR36060_TCV_NETlo 0x00c #define ZR36060_TCV_DATAhi 0x00d #define ZR36060_TCV_DATAmh 0x00e #define ZR36060_TCV_DATAml 0x00f #define ZR36060_TCV_DATAlo 0x010 #define ZR36060_SFhi 0x011 #define ZR36060_SFlo 0x012 #define ZR36060_AFhi 0x013 #define ZR36060_AFme 0x014 #define ZR36060_AFlo 0x015 #define ZR36060_ACVhi 0x016 #define ZR36060_ACVmh 0x017 #define ZR36060_ACVml 0x018 #define ZR36060_ACVlo 0x019 #define ZR36060_ATAhi 0x01a #define ZR36060_ATAmh 0x01b #define ZR36060_ATAml 0x01c #define ZR36060_ATAlo 0x01d #define ZR36060_ACV_TRUNhi 0x01e #define ZR36060_ACV_TRUNmh 0x01f #define ZR36060_ACV_TRUNml 0x020 #define ZR36060_ACV_TRUNlo 0x021 #define ZR36060_DEV_ID 0x022 #define ZR36060_DEV_REV 0x023 #define ZR36060_TEST_1 0x024 #define ZR36060_TEST_2 0x025 #define ZR36060_VCR 0x030 #define ZR36060_VPR 0x031 #define ZR36060_SCALE 0x032 #define ZR36060_BKG_CLR_Y 0x033 #define ZR36060_BKG_CLR_U 0x034 #define ZR36060_BKG_CLR_V 0x035 #define ZR36060_SYNC_VTOTALhi 0x036 #define ZR36060_SYNC_VTOTALlo 0x037 #define ZR36060_SYNC_HTOTALhi 0x038 #define ZR36060_SYNC_HTOTALlo 0x039 #define ZR36060_SYNC_VSIZE 0x03a #define ZR36060_SYNC_HSIZE 0x03b #define ZR36060_SYNC_BVSTART 0x03c #define ZR36060_SYNC_BHSTART 0x03d #define ZR36060_SYNC_BVENDhi 0x03e #define ZR36060_SYNC_BVENDlo 0x03f #define ZR36060_SYNC_BHENDhi 0x040 #define ZR36060_SYNC_BHENDlo 0x041 #define ZR36060_AA_VSTARThi 0x042 #define ZR36060_AA_VSTARTlo 0x043 #define ZR36060_AA_VENDhi 0x044 #define ZR36060_AA_VENDlo 0x045 #define ZR36060_AA_HSTARThi 0x046 #define ZR36060_AA_HSTARTlo 0x047 #define ZR36060_AA_HENDhi 0x048 #define ZR36060_AA_HENDlo 0x049 #define ZR36060_SW_VSTARThi 0x04a #define ZR36060_SW_VSTARTlo 0x04b #define ZR36060_SW_VENDhi 0x04c #define ZR36060_SW_VENDlo 0x04d #define ZR36060_SW_HSTARThi 0x04e #define ZR36060_SW_HSTARTlo 0x04f #define ZR36060_SW_HENDhi 0x050 #define ZR36060_SW_HENDlo 0x051 #define MB 0x100000 #define NBUF 4 #define FRAGM_FINAL_B 1 #define STAT_BIT 1 typedef struct MjpgDrv MjpgDrv; typedef struct H33_Fragment H33_Fragment; typedef struct H33_FragmentTable H33_FragmentTable; typedef struct CodeData CodeData; typedef struct ML33Board LML33Board; #define FRAGSIZE (MB/NBUF) struct H33_Fragment { uchar fragbytes[FRAGSIZE]; }; struct H33_FragmentTable { H33_Fragment * fragmAddress; // Physical address ulong fragmLength; }; struct CodeData { char idString[16]; ulong statCom[4]; // Physical address ulong statComInitial[4]; // Physical address H33_FragmentTable fragmDescr[4]; H33_Fragment frag[4]; }; extern char static_MjpgDrv_GPL_Notice[]; extern struct file_operations static_MjpgDrv_fOps; struct MjpgDrv { int openCount; int sleepFlag; struct wait_queue * intrWaitQ; }; #define PCI_DEVICE_ZORAN_36067 PCI_DEVICE_ZORAN_36057 struct ML33Board { void * pciPhysBaseAddr; void * pciBaseAddr; Pcidev * pcidev; }; extern void * H33Addr; extern LML33Board * lml33Board; void LML33Board_ctor(LML33Board*); void LML33Board_dtor(LML33Board*); int LML33Board_installInterruptHandler(LML33Board*); void LML33Board_initHardware(LML33Board*); void LML33Board_mjpegGo(LML33Board*); // ZR36067 (PCI controller) register memory access ulong LML33Board_readL(LML33Board*,int addr); void LML33Board_writeL(LML33Board*,int addr,ulong); ushort LML33Board_readW(LML33Board*,int addr); void LML33Board_writeW(LML33Board*,int addr,ushort); uchar LML33Board_readB(LML33Board*,int addr); void LML33Board_writeB(LML33Board*,int addr,uchar); int LML33Board_getBit(LML33Board*,int addr,int); void LML33Board_setBit(LML33Board*,int addr,int,int); // I2C (video encoder/decoder) manipulation functions void h33_i2c_pause(LML33Board*); int h33_i2c_waitscl(LML33Board*); void h33_i2c_start(LML33Board*); void h33_i2c_stop(LML33Board*); void h33_i2c_wrbit(LML33Board*,int bit); int h33_i2c_rdbit(LML33Board*); int h33_i2c_wrbyte(LML33Board*,int value); int h33_i2c_rdbyte(LML33Board*,int* value); int h33_i2c_probe(LML33Board*,int addr); int h33_i2c_wr8(LML33Board*,int addr, int sub, int value); int h33_i2c_rd8(LML33Board*,int addr, int sub, int *value); int h33_i2c_bt856rd8 (LML33Board*,int addr, int *msb); // GPIO access void gpioSetDirection(int gpIO,int dir); void gpioSet(int gpIO,int value); int gpioGet(int gpIO); // PostOffice access functions int h33_post_idle(void); int h33_post_write(int guest, int reg, int value); int h33_post_read(int guest, int reg); // ZR36060 void h33_zr060_write(int reg, int value); int h33_zr060_read(int reg); void MjpgDrv_ctor(MjpgDrv*); void MjpgDrv_dtor(MjpgDrv*); int MjpgDrv_open(struct inode *iNode, struct file *filePtr); void MjpgDrv_release(struct inode *iNode, struct file *filePtr); void MjpgDrv_intrHandler(int irqNo, void *devId, struct pt_regs *ptRegs); void * static_CodeData_map(ulong h33PHighMemory,ulong h33BufferSize); int CodeData_getReadyBuffer(CodeData*); int CodeData_getProcessedBuffer(CodeData*this); int CodeData_getBuffer(CodeData *,int bufferNo,void** bufferPtr,ushort* frameNo); int CodeData_prepareBuffer(CodeData *, int bufferNo); . ## diffname pc/devlml.h 1999/0423 ## diff -e /n/emeliedump/1999/0422/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0423/sys/src/brazil/pc/devlml.h 314,319d 270,308d 254,267d 252c static void * pciPhysBaseAddr; static ulong pciBaseAddr; static Pcidev * pcidev; . 236,240c char idString[16]; ulong statCom[4]; // Physical address ulong statComInitial[4]; // Physical address FragmentTable fragmDescr[4]; Fragment frag[4]; . 230,231c struct FragmentTable { Fragment * fragmAddress; // Physical address . 226c struct Fragment { . 219,220c typedef struct Fragment Fragment; typedef struct FragmentTable FragmentTable; . 217a #define writel(v, a) *(ulong *)(a) = v #define writew(v, a) *(ushort *)(a) = v #define writeb(v, a) *(uchar *)(a) = v #define readl(a) (*(ulong *)(a)) #define readw(a) (*(ushort *)(a)) #define readb(a) (*(uchar *)(a)) . 120,211d 118a #define ZR36057_POST_OFFICE 0x200 #define ZR36057_POST_PEND 0x02000000 #define ZR36057_POST_TIME 0x01000000 #define ZR36057_POST_DIR 0x00800000 . 112,117c #define GID060 0 . 76,110c #define BT819Addr 0x8a #define BT856Addr 0x88 . 74a #define PCI_DEVICE_ZORAN_36067 PCI_DEVICE_ZORAN_36057 . 67c } RingPtr; . 58,59c RingPage ring_pages[4][PAGES]; } RingData; . 54c // The sizeof(RingData) should not exceed page size . 51c } RingPage; . 45c } Device; . 40c // A Device records the properties of the various card types supported. . 38a #define ZR36057_I2C_BUS 0x044 // which bit of ZR36057_I2C_BUS is which #define ZR36057_I2C_SCL 1 #define ZR36057_I2C_SDA 2 . 36c #define PAGES 32 . 32c #define DEVICE_COUNT 2 . 29c #define MAX_CARDS 1 . 25c #define STILL_TIMEOUT 1000000 . 21c #define GUEST_TIMEOUT 10000000 . 18c #define I2C_TIMEOUT 10000000 . 14,15c // The number of uS delay in I2C state transitions (probably >= 10) #define I2C_DELAY 15 . ## diffname pc/devlml.h 1999/0424 ## diff -e /n/emeliedump/1999/0423/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0424/sys/src/brazil/pc/devlml.h 144,148c struct FrameHeader // Don't modify this struct, used by h/w { short mrkSOI; short mrkAPP3; short lenAPP3; char nm[4]; short frameNo; ulong sec; ulong usec; ulong frameSize; ulong frameSeqNo; }; . 142c //If we're on the little endian architecture, then 0xFF, 0xD8 byte sequence is #define MRK_SOI 0xD8FF #define MRK_APP3 0xE3FF #define APP_NAME "LML" . 129,137d 121c struct CodeData { // Don't modify this struct, used by h/w . 116c struct FragmentTable { // Don't modify this struct, used by h/w . 103a typedef struct FrameHeader FrameHeader; . 89a #define ZR36057_INTR_JPEGREP 0x08000000 #define ZR36057_INTR_STAT 0x03c . ## diffname pc/devlml.h 1999/0428 ## diff -e /n/emeliedump/1999/0424/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0428/sys/src/brazil/pc/devlml.h 84,92d ## diffname pc/devlml.h 1999/0429 ## diff -e /n/emeliedump/1999/0428/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0429/sys/src/brazil/pc/devlml.h 42a #define ZR36057_INTR_JPEGREP 0x08000000 #define ZR36057_INTR_STAT 0x03c . ## diffname pc/devlml.h 1999/0513 ## diff -e /n/emeliedump/1999/0429/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0513/sys/src/brazil/pc/devlml.h 92,94c #define writel(v, a) (*(ulong *)(a) = (v)) #define writew(v, a) (*(ushort *)(a) = (v)) #define writeb(v, a) (*(uchar *)(a) = (v)) . 15c #define I2C_DELAY 50 . ## diffname pc/devlml.h 1999/0514 ## diff -e /n/emeliedump/1999/0513/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0514/sys/src/brazil/pc/devlml.h 103,104c typedef struct CodeData CodeData; typedef struct ML33Board LML33Board; . 99,101c typedef struct FrameHeader FrameHeader; typedef struct MjpgDrv MjpgDrv; typedef struct Fragment Fragment; . 94,97c #define writeb(v, a) (*(uchar *)(a) = (v)) #define readl(a) (*(ulong *)(a)) #define readw(a) (*(ushort *)(a)) #define readb(a) (*(uchar *)(a)) . 92c #define writel(v, a) (*(ulong *)(a) = (v)) . 79,81c #define PCI_VENDOR_ZORAN 0x11de #define PCI_DEVICE_ZORAN_36057 0x6057 #define PCI_DEVICE_ZORAN_36067 PCI_DEVICE_ZORAN_36057 . 68,72c int expect; // the buffer the int routine expects next int which; // which ring buffer the read or write uses int filled; // the current number of filled buffers int pages; // the number of complete pages int remainder; // the number of bytes in incomplete page . 62,64c void *buffer[4]; ulong i_stat_com[4]; RingPage ring_pages[4][PAGES]; . 55,56c ulong address; // bus address of page int length; // length of page . 48,50c int number; // The H33_CARDTYPE_ assigned char *card_name; // A string name int zr060addr; // Which guest bus address for the ZR36060 . 41,44c #define ZR36057_I2C_SCL 1 #define ZR36057_I2C_SDA 2 #define ZR36057_INTR_JPEGREP 0x08000000 #define ZR36057_INTR_STAT 0x03c . ## diffname pc/devlml.h 1999/0515 ## diff -e /n/emeliedump/1999/0514/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0515/sys/src/brazil/pc/devlml.h 92,98d ## diffname pc/devlml.h 1999/0517 ## diff -e /n/emeliedump/1999/0515/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0517/sys/src/brazil/pc/devlml.h 111,115c char idString[16]; ulong statCom[4]; // Physical address ulong statComInitial[4]; // Physical address FragmentTable fragdesc[4]; Fragment frag[4]; . 106,107c ulong addr; // Physical address ulong leng; . 53,74d ## diffname pc/devlml.h 1999/0518 ## diff -e /n/emeliedump/1999/0517/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0518/sys/src/brazil/pc/devlml.h 91d 89d ## diffname pc/devlml.h 1999/0520 ## diff -e /n/emeliedump/1999/0518/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0520/sys/src/brazil/pc/devlml.h 98,114c #define GID060 0 . 94,96c #define POST_OFFICE 0x200 #define POST_PEND 0x02000000 #define POST_TIME 0x01000000 #define POST_DIR 0x00800000 . 79,80c union Fragment { FrameHeader fh; char fb[FRAGSIZE]; . 76a //If we're on the little endian architecture, then 0xFF, 0xD8 byte sequence is #define MRK_SOI 0xD8FF #define MRK_APP3 0xE3FF #define APP_NAME "LML" struct FrameHeader { // Don't modify this struct, used by h/w ushort mrkSOI; ushort mrkAPP3; ushort lenAPP3; char nm[4]; ushort frameNo; ulong sec; ulong usec; ulong frameSize; ulong frameSeqNo; }; . 70,75c typedef struct FrameHeader FrameHeader; typedef struct MjpgDrv MjpgDrv; typedef union Fragment Fragment; typedef struct FragmentTable FragmentTable; typedef struct CodeData CodeData; typedef struct ML33Board LML33Board; . 39,44c #define I2C_BUS 0x044 // which bit of I2C_BUS is which #define I2C_SCL 1 #define I2C_SDA 2 #define INTR_JPEGREP 0x08000000 #define INTR_STAT 0x03c . ## diffname pc/devlml.h 1999/0525 ## diff -e /n/emeliedump/1999/0520/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0525/sys/src/brazil/pc/devlml.h 106a ulong physaddr; // Physical addr of statCom[0] . 94c #define FRAGSIZE ((MB-0x100)/NBUF) . ## diffname pc/devlml.h 1999/0529 ## diff -e /n/emeliedump/1999/0525/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0529/sys/src/brazil/pc/devlml.h 111a #define CODEDATASIZE ((sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1)) #define GRABDATASIZE ((720 * 480 * 2 * 2 + BY2PG - 1) & ~(BY2PG - 1)) . 107,108c ulong pamjpg; // Physical addr of statCom[0] ulong pagrab; // Physical addr of grab buffer ulong statCom[4]; // Physical addresses of fragdescs . 94c #define FRAGSIZE (128*1024) . ## diffname pc/devlml.h 1999/0610 ## diff -e /n/emeliedump/1999/0529/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0610/sys/src/brazil/pc/devlml.h 75d 71d 64d 43a #define INTR_GIRQ0 0x20000000 . 31,37d 5,10d ## diffname pc/devlml.h 1999/0909 ## diff -e /n/emeliedump/1999/0610/sys/src/brazil/pc/devlml.h /n/emeliedump/1999/0909/sys/src/brazil/pc/devlml.h 74c ulong nsec; . ## diffname pc/devlml.h 2001/1027 ## diff -e /n/emeliedump/1999/0909/sys/src/brazil/pc/devlml.h /n/emeliedump/2001/1027/sys/src/9/pc/devlml.h 100c #define GRABDATASIZE ((730 * 568 * 2 * 2 + BY2PG - 1) & ~(BY2PG - 1)) . ## diffname pc/devlml.h 2001/1101 ## diff -e /n/emeliedump/2001/1027/sys/src/9/pc/devlml.h /n/emeliedump/2001/1101/sys/src/9/pc/devlml.h 73,74c vlong ftime; . ## diffname pc/devlml.h 2001/1106 ## diff -e /n/emeliedump/2001/1101/sys/src/9/pc/devlml.h /n/emeliedump/2001/1106/sys/src/9/pc/devlml.h 95c HdrFragment frag[4]; . 84a struct HdrFragment { uchar hdr[sizeof(FrameHeader)-2]; Fragment; }; . 56a typedef struct HdrFragment HdrFragment; . ## diffname pc/devlml.h 2001/1107 ## diff -e /n/emeliedump/2001/1106/sys/src/9/pc/devlml.h /n/emeliedump/2001/1107/sys/src/9/pc/devlml.h 87c uchar hdr[sizeof(FrameHeader)]; . 64c #define MRK_SOI 0xD8FF . ## diffname pc/devlml.h 2001/1108 ## diff -e /n/emeliedump/2001/1107/sys/src/9/pc/devlml.h /n/emeliedump/2001/1108/sys/src/9/pc/devlml.h 104,105c enum{ Codedatasize = (sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1), Grabdatasize = (730 * 568 * 2 * 2 + BY2PG - 1) & ~(BY2PG - 1), }; . 76c ushort frameSeqNo; ushort SOIfiller; . 45,47c #define VENDOR_ZORAN 0x11de #define ZORAN_36057 0x6057 #define ZORAN_36067 ZORAN_36057 . 3a #define NLML 2 .