📄 buz.c
字号:
return btread(ZR36057_POR) & 0xFF;}static int zr36060_write_8(struct zoran *zr, unsigned reg, unsigned val){ if (post_office_wait(zr) || post_office_write(zr, 0, 1, reg >> 8) || post_office_write(zr, 0, 2, reg)) { return -1; } return post_office_write(zr, 0, 3, val);}static int zr36060_write_16(struct zoran *zr, unsigned reg, unsigned val){ if (zr36060_write_8(zr, reg + 0, val >> 8)) { return -1; } return zr36060_write_8(zr, reg + 1, val >> 0);}static int zr36060_write_24(struct zoran *zr, unsigned reg, unsigned val){ if (zr36060_write_8(zr, reg + 0, val >> 16)) { return -1; } return zr36060_write_16(zr, reg + 1, val >> 0);}static int zr36060_write_32(struct zoran *zr, unsigned reg, unsigned val){ if (zr36060_write_16(zr, reg + 0, val >> 16)) { return -1; } return zr36060_write_16(zr, reg + 2, val >> 0);}static u32 zr36060_read_8(struct zoran *zr, unsigned reg){ if (post_office_wait(zr) || post_office_write(zr, 0, 1, reg >> 8) || post_office_write(zr, 0, 2, reg)) { return -1; } return post_office_read(zr, 0, 3) & 0xFF;}static int zr36060_reset(struct zoran *zr){ return post_office_write(zr, 3, 0, 0);}static void zr36060_sleep(struct zoran *zr, int sleep){ GPIO(zr, 1, !sleep);}static void zr36060_set_jpg(struct zoran *zr, enum zoran_codec_mode mode){ struct tvnorm *tvn; u32 reg; int size; reg = (1 << 0) /* CodeMstr */ |(0 << 2) /* CFIS=0 */ |(0 << 6) /* Endian=0 */ |(0 << 7); /* Code16=0 */ zr36060_write_8(zr, 0x002, reg); switch (mode) { case BUZ_MODE_MOTION_DECOMPRESS: case BUZ_MODE_STILL_DECOMPRESS: reg = 0x00; /* Codec mode = decompression */ break; case BUZ_MODE_MOTION_COMPRESS: case BUZ_MODE_STILL_COMPRESS: default: reg = 0xa4; /* Codec mode = compression with variable scale factor */ break; } zr36060_write_8(zr, 0x003, reg); reg = 0x00; /* reserved, mbz */ zr36060_write_8(zr, 0x004, reg); reg = 0xff; /* 510 bits/block */ zr36060_write_8(zr, 0x005, reg); /* JPEG markers */ reg = (zr->params.jpeg_markers) & 0x38; /* DRI, DQT, DHT */ if (zr->params.COM_len) reg |= JPEG_MARKER_COM; if (zr->params.APP_len) reg |= JPEG_MARKER_APP; zr36060_write_8(zr, 0x006, reg); reg = (0 << 3) /* DATERR=0 */ |(0 << 2) /* END=0 */ |(0 << 1) /* EOI=0 */ |(0 << 0); /* EOAV=0 */ zr36060_write_8(zr, 0x007, reg); /* code volume */ /* Target field size in pixels: */ tvn = &tvnorms[zr->params.norm]; size = (tvn->Ha / 2) * (tvn->Wa) / (zr->params.HorDcm) / (zr->params.VerDcm); /* Target compressed field size in bits: */ size = size * 16; /* uncompressed size in bits */ size = size * zr->params.quality / 400; /* quality = 100 is a compression ratio 1:4 */ /* Lower limit (arbitrary, 1 KB) */ if (size < 8192) size = 8192; /* Upper limit: 7/8 of the code buffers */ if (size * zr->params.field_per_buff > zr->jpg_bufsize * 7) size = zr->jpg_bufsize * 7 / zr->params.field_per_buff; reg = size; zr36060_write_32(zr, 0x009, reg); /* how do we set initial SF as a function of quality parameter? */ reg = 0x0100; /* SF=1.0 */ zr36060_write_16(zr, 0x011, reg); reg = 0x00ffffff; /* AF=max */ zr36060_write_24(zr, 0x013, reg); reg = 0x0000; /* test */ zr36060_write_16(zr, 0x024, reg);}static void zr36060_set_video(struct zoran *zr, enum zoran_codec_mode mode){ struct tvnorm *tvn; u32 reg; reg = (0 << 7) /* Video8=0 */ |(0 << 6) /* Range=0 */ |(0 << 3) /* FlDet=0 */ |(1 << 2) /* FlVedge=1 */ |(0 << 1) /* FlExt=0 */ |(0 << 0); /* SyncMstr=0 */ /* According to ZR36067 documentation, FlDet should correspond to the odd_even flag of the ZR36067 */ if (zr->params.odd_even) reg |= (1 << 3); if (mode != BUZ_MODE_STILL_DECOMPRESS) { /* limit pixels to range 16..235 as per CCIR-601 */ reg |= (1 << 6); /* Range=1 */ } zr36060_write_8(zr, 0x030, reg); reg = (0 << 7) /* VCLKPol=0 */ |(0 << 6) /* PValPol=0 */ |(1 << 5) /* PoePol=1 */ |(0 << 4) /* SImgPol=0 */ |(0 << 3) /* BLPol=0 */ |(0 << 2) /* FlPol=0 */ |(0 << 1) /* HSPol=0, sync on falling edge */ |(1 << 0); /* VSPol=1 */ zr36060_write_8(zr, 0x031, reg); switch (zr->params.HorDcm) { default: case 1: reg = (0 << 0); break; /* HScale = 0 */ case 2: reg = (1 << 0); break; /* HScale = 1 */ case 4: reg = (2 << 0); break; /* HScale = 2 */ } if (zr->params.VerDcm == 2) reg |= (1 << 2); zr36060_write_8(zr, 0x032, reg); reg = 0x80; /* BackY */ zr36060_write_8(zr, 0x033, reg); reg = 0xe0; /* BackU */ zr36060_write_8(zr, 0x034, reg); reg = 0xe0; /* BackV */ zr36060_write_8(zr, 0x035, reg); /* sync generator */ tvn = &tvnorms[zr->params.norm]; reg = tvn->Ht - 1; /* Vtotal */ zr36060_write_16(zr, 0x036, reg); reg = tvn->Wt - 1; /* Htotal */ zr36060_write_16(zr, 0x038, reg); reg = 6 - 1; /* VsyncSize */ zr36060_write_8(zr, 0x03a, reg); reg = 100 - 1; /* HsyncSize */ zr36060_write_8(zr, 0x03b, reg); reg = tvn->VStart - 1; /* BVstart */ zr36060_write_8(zr, 0x03c, reg); reg += tvn->Ha / 2; /* BVend */ zr36060_write_16(zr, 0x03e, reg); reg = tvn->HStart - 1; /* BHstart */ zr36060_write_8(zr, 0x03d, reg); reg += tvn->Wa; /* BHend */ zr36060_write_16(zr, 0x040, reg); /* active area */ reg = zr->params.img_y + tvn->VStart; /* Vstart */ zr36060_write_16(zr, 0x042, reg); reg += zr->params.img_height; /* Vend */ zr36060_write_16(zr, 0x044, reg); reg = zr->params.img_x + tvn->HStart; /* Hstart */ zr36060_write_16(zr, 0x046, reg); reg += zr->params.img_width; /* Hend */ zr36060_write_16(zr, 0x048, reg); /* subimage area */ reg = zr->params.img_y + tvn->VStart; /* SVstart */ zr36060_write_16(zr, 0x04a, reg); reg += zr->params.img_height; /* SVend */ zr36060_write_16(zr, 0x04c, reg); reg = zr->params.img_x + tvn->HStart; /* SHstart */ zr36060_write_16(zr, 0x04e, reg); reg += zr->params.img_width; /* SHend */ zr36060_write_16(zr, 0x050, reg);}static void zr36060_set_jpg_SOF(struct zoran *zr){ u32 reg; reg = 0xffc0; /* SOF marker */ zr36060_write_16(zr, 0x060, reg); reg = 17; /* SOF length */ zr36060_write_16(zr, 0x062, reg); reg = 8; /* precision 8 bits */ zr36060_write_8(zr, 0x064, reg); reg = zr->params.img_height / zr->params.VerDcm; /* image height */ zr36060_write_16(zr, 0x065, reg); reg = zr->params.img_width / zr->params.HorDcm; /* image width */ zr36060_write_16(zr, 0x067, reg); reg = 3; /* 3 color components */ zr36060_write_8(zr, 0x069, reg); reg = 0x002100; /* Y component */ zr36060_write_24(zr, 0x06a, reg); reg = 0x011101; /* U component */ zr36060_write_24(zr, 0x06d, reg); reg = 0x021101; /* V component */ zr36060_write_24(zr, 0x070, reg);}static void zr36060_set_jpg_SOS(struct zoran *zr){ u32 reg; reg = 0xffda; /* SOS marker */ zr36060_write_16(zr, 0x07a, reg); reg = 12; /* SOS length */ zr36060_write_16(zr, 0x07c, reg); reg = 3; /* 3 color components */ zr36060_write_8(zr, 0x07e, reg); reg = 0x0000; /* Y component */ zr36060_write_16(zr, 0x07f, reg); reg = 0x0111; /* U component */ zr36060_write_16(zr, 0x081, reg); reg = 0x0211; /* V component */ zr36060_write_16(zr, 0x083, reg); reg = 0x003f00; /* Start, end spectral scans */ zr36060_write_24(zr, 0x085, reg);}static void zr36060_set_jpg_DRI(struct zoran *zr){ u32 reg; reg = 0xffdd; /* DRI marker */ zr36060_write_16(zr, 0x0c0, reg); reg = 4; /* DRI length */ zr36060_write_16(zr, 0x0c2, reg); reg = 8; /* length in MCUs */ zr36060_write_16(zr, 0x0c4, reg);}static void zr36060_set_jpg_DQT(struct zoran *zr){ unsigned i; unsigned adr; static const u8 dqt[] = { 0xff, 0xdb, /* DHT marker */ 0x00, 0x84, /* DHT length */ 0x00, /* table ID 0 */ 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e, 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33, 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44, 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57, 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71, 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63, 0x01, /* table ID 1 */ 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a, 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63 }; /* write fixed quantitization tables */ adr = 0x0cc; for (i = 0; i < sizeof(dqt); ++i) { zr36060_write_8(zr, adr++, dqt[i]); }}static void zr36060_set_jpg_DHT(struct zoran *zr){ unsigned i; unsigned adr; static const u8 dht[] = { 0xff, 0xc4, /* DHT marker */ 0x01, 0xa2, /* DHT length */ 0x00, /* table class 0, ID 0 */ 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, /* # codes of length 1..8 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* # codes of length 8..16 */ 0x00, /* values for codes of length 2 */ 0x01, 0x02, 0x03, 0x04, 0x05, /* values for codes of length 3 */ 0x06, /* values for codes of length 4 */ 0x07, /* values for codes of length 5 */ 0x08, /* values for codes of length 6 */ 0x09, /* values for codes of length 7 */ 0x0a, /* values for codes of length 8 */ 0x0b, /* values for codes of length 9 */ 0x01, /* table class 0, ID 1 */ 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* # codes of length 1..8 */ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* # codes of length 9..16 */ 0x00, 0x01, 0x02, /* values for codes of length 2 */ 0x03, /* values for codes of length 3 */ 0x04, /* values for codes of length 4 */ 0x05, /* values for codes of length 5 */ 0x06, /* values for codes of length 6 */ 0x07, /* values for codes of length 7 */ 0x08, /* values for codes of length 8 */ 0x09, /* values for codes of length 9 */ 0x0a, /* values for codes of length 10 */ 0x0b, /* values for codes of length 11 */ 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; /* write fixed Huffman tables */ adr = 0x1d4; for (i = 0; i < sizeof(dht); ++i) { zr36060_write_8(zr, adr++, dht[i]); }}static void zr36060_set_jpg_APP(struct zoran *zr){ unsigned adr; int len, i; u32 reg; len = zr->params.APP_len; if (len < 0) len = 0; if (len > 60) len = 60; i = zr->params.APPn; if (i < 0) i = 0; if (i > 15) i = 15; reg = 0xffe0 + i; /* APPn marker */ zr36060_write_16(zr, 0x380, reg); reg = len + 2; /* APPn len */ zr36060_write_16(zr, 0x382, reg); /* write APPn data */ adr = 0x384; for (i = 0; i < 60; i++) { zr36060_write_8(zr, adr++, (i < len ? zr->params.APP_data[i] : 0)); }}static void zr36060_set_jpg_COM(struct zoran *zr){ unsigned adr; int len, i; u32 reg; len = zr->params.COM_len; if (len < 0) len = 0; if (len > 60) len = 60; reg = 0xfffe; /* COM marker */ zr36060_write_16(zr, 0x3c0, reg); reg = len + 2; /* COM len */ zr36060_write_16(zr, 0x3c2, reg); /* write COM data */ adr = 0x3c4; for (i = 0; i < 60; i++) { zr36060_write_8(zr, adr++, (i < len ? zr->params.COM_data[i] : 0)); }}static void zr36060_set_cap(struct zoran *zr, enum zoran_codec_mode mode){ unsigned i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -