zr36060.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:14k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * for the Matrox Marvel G200 and Rainbow Runner-G series
  3.  *
  4.  * This module is an interface to the ZR3606 jpeg codec chip.
  5.  *
  6.  * Copyright (C) 1999  Mike Bernson <mike@mlb.org>
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version 2
  11.  * of the License, or (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  *
  22.  *
  23.  *****************************************************************************
  24.  */
  25. #ifndef __KERNEL__
  26. #define __KERNEL__
  27. #endif
  28. #ifndef MODULE
  29. #define MODULE
  30. #endif
  31. #include <linux/module.h>
  32. #include <linux/delay.h>
  33. #include <linux/errno.h>
  34. #include <linux/kernel.h>
  35. #include <asm/io.h>
  36. #include <linux/i2c.h>
  37. #include "mgavideo.h"
  38. #include "zr36060.h"
  39. #define dprintk     if (debug) printk
  40. #define XGENIOCTRL      0x2a
  41. #define XGENIODATA      0x2b
  42. static int debug = 1; /* insmod parameter */
  43. /****************************************************************************
  44. * linux kernel module api
  45. ****************************************************************************/
  46. #ifdef MODULE
  47. int init_module(void)
  48. #else
  49. int zr36060_init(void)
  50. #endif
  51. {
  52. return 0;
  53. }
  54. #ifdef MODULE
  55. void cleanup_module(void)
  56. {
  57. }
  58. #endif
  59. #ifdef NEVER
  60. static void
  61. zr36060_codechostptr(struct codec *codec, int size)
  62. {
  63. writew(zr->codechostptr, size/8);
  64. }
  65. #endif
  66. static int
  67. zr36060_load_memory(struct codec *codec) 
  68. {
  69. int i;
  70. char status;
  71. char data[1];
  72. data[0] = 0x80;
  73. codec->codec_write_memory(codec, data, 0, 1);
  74. for(i=0; i < 1000; i++) {
  75. codec->codec_read_memory(codec, &status, 1, 1);
  76. if ((status & 0x80) == 0) {
  77. return 0;
  78. }
  79. udelay(10);
  80. }
  81. printk("zr36060: load from memory did not complete status=0x%xn",
  82. status);
  83. return -1;
  84.  }
  85. static u8 SOF[19] = {
  86. 0xff, 0xc0, /* Start of frame marker */
  87. 0x00, 0x11, /* Length of this segment */
  88. 0x08, /* Precision */
  89. 240/8, 240&0xff, /* number of lines */
  90. 704/8, 704&0xff, /* line length */
  91. 3, /* number of components */
  92. 0, 0x21, 0, /* Y component */
  93. 1, 0x11, 1, /* U component */
  94. 2, 0x11, 1 /* V component */
  95. };
  96. static u8 SOS[] = {
  97. 0xff, 0xda, /* start of Scan marker */
  98. 0x00, 0x0c, /* lenght of this segment */
  99. 0x03, /* number of components */
  100. 0x00, 0x00, /* Y component */
  101. 0x01, 0x11, /* U component */
  102. 0x02, 0x11, /* V component */
  103. 0x00, 0x3f, 0x00 /* constant */
  104. };
  105. static u8 DRI[] = {
  106. 0xff, 0xdd, /* define Restart Interval */
  107. 0x00, 0x04, /* length of this segment */
  108. 0x00, 0x08, /* lenght of restart interval in mcu units */
  109. };
  110. static u8 DQT[] = {
  111. 0xff, 0xdb, /* DQT marker */
  112. 0x00, 0x84, /* DQT length */
  113. 0x00, /* table ID 0 */
  114. 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
  115. 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
  116. 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
  117. 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
  118. 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
  119. 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
  120. 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
  121. 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
  122. 0x01, /* table ID 1 */
  123. 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
  124. 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
  125. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  126. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  127. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  128. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  129. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
  130. 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
  131. };
  132. static u8 DHT[] = {
  133.       0xff, 0xc4,   /* DHT marker */
  134.       0x01, 0xa2,   /* DHT length */
  135.       0x00,      /* table class 0, ID 0 */
  136.       0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, /* # codes of length 1..8 */
  137.       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* # codes of length 8..16 */
  138.       0x00,                  /* values for codes of length 2 */
  139.       0x01, 0x02, 0x03, 0x04, 0x05,         /* values for codes of length 3 */
  140.       0x06,                  /* values for codes of length 4 */
  141.       0x07,                  /* values for codes of length 5 */
  142.       0x08,                  /* values for codes of length 6 */
  143.       0x09,                  /* values for codes of length 7 */
  144.       0x0a,                  /* values for codes of length 8 */
  145.       0x0b,                  /* values for codes of length 9 */
  146.       0x01,      /* table class 0, ID 1 */
  147.       0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,   /* # codes of length 1..8 */
  148.       0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,   /* # codes of length 9..16 */
  149.       0x00, 0x01, 0x02,            /* values for codes of length 2 */
  150.       0x03,                  /* values for codes of length 3 */
  151.       0x04,                  /* values for codes of length 4 */
  152.       0x05,                  /* values for codes of length 5 */
  153.       0x06,                  /* values for codes of length 6 */
  154.       0x07,                  /* values for codes of length 7 */
  155.       0x08,                  /* values for codes of length 8 */
  156.       0x09,                  /* values for codes of length 9 */
  157.       0x0a,                  /* values for codes of length 10 */
  158.       0x0b,                  /* values for codes of length 11 */
  159.       0x10,
  160.       0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
  161.       0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d,
  162.       0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
  163.       0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
  164.       0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
  165.       0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
  166.       0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
  167.       0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
  168.       0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
  169.       0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  170.       0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
  171.       0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
  172.       0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  173.       0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
  174.       0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
  175.       0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  176.       0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
  177.       0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
  178.       0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
  179.       0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
  180.       0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
  181.       0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  182.       0xf9, 0xfa, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04,
  183.       0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00,
  184.       0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
  185.       0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,
  186.       0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08,
  187.       0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23,
  188.       0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a,
  189.       0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18,
  190.       0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35,
  191.       0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45,
  192.       0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55,
  193.       0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65,
  194.       0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75,
  195.       0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84,
  196.       0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93,
  197.       0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2,
  198.       0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
  199.       0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
  200.       0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
  201.       0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
  202.       0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
  203.       0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5,
  204.       0xf6, 0xf7, 0xf8, 0xf9, 0xfa
  205. };
  206. static u8 APP[] = {
  207.       0xff, 0xe0, /* APP marker */
  208.       0x00, 0x02, /* APP length */
  209.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  210.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  211.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  212.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  213.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  214.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  215. };
  216. static u8 COM[] = {
  217.       0xff, 0xfe, /* COM marker */
  218.       0x00, 0x02, /* COM length */
  219.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  220.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  221.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  222.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  223.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  224.       0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  225. };
  226. static int
  227. zr36060_memory(struct codec *codec, int width, int height, 
  228. int compress_mode, int quality)
  229. {
  230. u8 sof[19];
  231. u8 data[96];
  232. u32 size;
  233. data[0] = 0x01;
  234. codec->codec_write_memory(codec, data, 0, 1);
  235. data[0x02] = 0x01; /* slave mode, 8 bit buss */
  236. if (compress_mode) {
  237. data[0x03] = 0xa4; /* compress pass, variable scaling */
  238. } else {
  239. data[0x03] = 0x00; /* decompress pass */
  240. }
  241. data[0x04] = 0x00; /* reserved */
  242. data[0x05] = 0xff; /* max block code volume in bits (510) */
  243. data[0x06] = 0x38; /* Marks DRI, DQT, DHT */
  244. data[0x07] = 0x00; /* interrupts none */
  245. size = (width * height) * 16;
  246. size = (size * quality) / 400;
  247. if (size < 8192)
  248. size = 8192;
  249. if ((size * 2)> ((256 * 1024) * 7))
  250. size = (256 * 1024 * 7);
  251. data[0x09] = (size >> 24) & 0xff;
  252. data[0x0a] = (size >> 16) & 0xff;
  253. data[0x0b] = (size >> 8) & 0xff;
  254. data[0x0c] = size & 0xff;
  255. data[0x11] = 0x01; /* Scale Factor 1:1 */
  256. data[0x12] = 0x00;
  257. data[0x13] = 0xff; /* Allocation factor Must be 0xffffff */
  258. data[0x14] = 0xff;
  259. data[0x15] = 0xff;
  260. data[0x24] = 0x00; /* Test Control Must be 0x0000 */
  261. data[0x25] = 0x00;
  262. data[0x30] = 0x40;
  263. data[0x31] = 0x21;
  264. data[0x32] = 0x00; /* No scaling  */
  265. data[0x33] = 0x80; /* Background color y */
  266. data[0x34] = 0xe0; /* Background color u */
  267. data[0x35] = 0xe0; /* Background color v */
  268. data[0x36] = 524 >> 8; /* Vtotal for sync master */
  269. data[0x37] = 524 & 0xff;
  270. data[0x38] = 857 >> 8;  /* Htotal for sync master */
  271. data[0x39] = 857 & 0xff;
  272. data[0x3a] = 5;         /* Vsync for sync master */
  273. data[0x3b] = 31; /* Hsync for sync master */
  274. data[0x3c] = 11; /* BVstart for sync master */
  275. data[0x3d] = 99; /* BHstart for sync master */
  276. data[0x3e] = 241 >> 8; /* BVend for sync master */
  277. data[0x3f] = 241;
  278. data[0x40] = 720 >> 8; /* BHend for sync master */
  279. data[0x41] = 720 & 0xff;
  280. data[0x42] = 11 >> 8; /* VSTART for active area  */
  281. data[0x43] = 11;
  282. data[0x44] = 262 >> 8; /* VEND for active area */
  283. data[0x45] = 262 & 0xff;
  284. data[0x46] = 12 >> 8; /* HSTART for active area */
  285. data[0x47] = 12;
  286. data[0x48] = 720 >> 8; /* HEND for active area */
  287. data[0x49] = 720 & 0xff;
  288. data[0x4a] = 12 >> 8;
  289. data[0x4b] = 12;
  290. data[0x4c] = height >> 8;
  291. data[0x4d] = height;
  292. data[0x4e] = 11 >> 8;
  293. data[0x4f] = 11;
  294. data[0x50] = width >> 8;
  295. data[0x51] = width;
  296. /* set video mode */
  297. memcpy(sof, SOF, sizeof(sof));
  298. sof[5] = width >> 8;
  299. sof[6] = width;
  300. sof[7] = height >> 8;
  301. sof[8] = height;
  302. if (codec->codec_write_memory(codec, &data[2], 0x02, 6))
  303. return -1;
  304. if (codec->codec_write_memory(codec, &data[9], 0x09, 4))
  305. return -1;
  306. if (codec->codec_write_memory(codec, &data[0x11], 0x11, 5))
  307. return -1;
  308. if (codec->codec_write_memory(codec, &data[0x24], 0x24, 2))
  309. return -1;
  310. if (codec->codec_write_memory(codec, &data[0x30], 0x30, 34))
  311. return -1;
  312. if (codec->codec_write_memory(codec, sof, 0x60, sizeof(sof)))
  313. return -1;
  314. if (codec->codec_write_memory(codec, SOS, 0x7a, sizeof(SOS)))
  315. return -1;
  316. if (codec->codec_write_memory(codec, DRI, 0xc0, sizeof(DRI)))
  317. return -1;
  318. if (codec->codec_write_memory(codec, DQT, 0xcc, sizeof(DQT)))
  319. return -1;
  320. if (codec->codec_write_memory(codec, DHT, 0x1d4, sizeof(DHT)))
  321. return -1;
  322. if (codec->codec_write_memory(codec, APP, 0x380, sizeof(APP)))
  323. return -1;
  324. if (codec->codec_write_memory(codec, COM, 0x3c0, sizeof(COM)))
  325. return -1;
  326. return zr36060_load_memory(codec);
  327. }
  328. int
  329. zr36060_interrupt(struct codec *codec)
  330. {
  331. printk("zr36060: command compelete interruptn");
  332. #ifdef NEVER
  333. zr->state = ZR_IDLE_STATE;
  334. /* remove pending command complete */
  335. writeb(VI_CMDCMPL, zr->viclear);
  336. #endif
  337. return 0;
  338. }
  339. int
  340. zr36060_compress_image(struct codec *codec)
  341. {
  342. printk("zr36060: compress imagen");
  343. if (codec->state != ZR_IDLE_STATE) {
  344. printk("zr36060: compression image but zr36060 not idlen");
  345. return -1;
  346. }
  347. /* for now compress the whole frame */
  348. if (zr36060_memory(codec, 704, 240, 1, 100))
  349. return -1;
  350. /* Start image compressing */
  351. (*codec->codec_start)(codec);
  352. printk("zr36060: compression startedn");
  353. mdelay(1000);
  354. {
  355. struct mga_dev *mga;
  356. char data;
  357. int i;
  358. int *ptr;
  359. codec->codec_read_memory(codec, &data, 0x08, 1);
  360. printk("zr36060: interrupt status: %xn", data);
  361. printk("zr36060: image_data: ");
  362. mga = codec->private;
  363. ptr = (int *)mga->interface_base;
  364. for(i=0; i < 16; i++) {
  365. printk("%4x ", *ptr++);
  366. }
  367. printk("n");
  368. }
  369. return 0;
  370. }
  371. int
  372. zr36060_decompress_image(struct codec *codec)
  373. {
  374. return 0;
  375. }
  376. int
  377. zr36060_attach(struct codec *codec)
  378. {
  379. char chip_id[2];
  380. if (debug)
  381. printk("zr36060: reseting zr36060n");
  382. codec->codec_reset(codec);
  383. /* read id from zr36060 */
  384. if (debug)
  385. printk("zr36060: reading chip idn");
  386. if (codec->codec_read_memory(codec, chip_id, 0x22, 2)) {
  387. printk("zr36060: Read errorn");
  388. return -1;
  389. }
  390. if (chip_id[0] == 0x33) {
  391. printk("zr36060: zr36060 found revision %xn", chip_id[1]);
  392. } else {
  393. printk("zr36060: zr36060 not found (%x %x)n",
  394.        chip_id[0], chip_id[1]);
  395. return -1;
  396. }
  397. if (debug) 
  398. printk("zr36060: Loading default parmetersn");
  399. zr36060_memory(codec, 704, 240, 1, 100);
  400. #ifdef NEVER
  401. MOD_INC_USE_COUNT;
  402. #endif
  403. return 0;
  404. }
  405. int
  406. zr36060_deattach(struct codec *codec)
  407. {
  408. #ifdef NEVER
  409. /* reset the codec interface */
  410. writeb(0x00, zr->codecctl);
  411. writeb(0x01, zr->codecctl);
  412. writeb(0x00, zr->codecctl);
  413. MOD_DEC_USE_COUNT;
  414. #endif
  415. return 0;
  416. }