27 #define ZR050_VERSION "v0.7.1"
29 #include <linux/module.h>
31 #include <linux/slab.h>
34 #include <linux/types.h>
35 #include <linux/wait.h>
51 static int zr36050_codecs;
58 #define dprintk(num, format, args...) \
61 printk(format, ##args); \
78 if (ptr->
codec->master_data->readreg)
79 value = (ptr->
codec->master_data->readreg(ptr->
codec,
83 KERN_ERR "%s: invalid I/O setup, nothing read!\n",
86 dprintk(4,
"%s: reading from 0x%04x: %02x\n", ptr->
name, reg,
97 dprintk(4,
"%s: writing 0x%02x to 0x%04x\n", ptr->
name, value,
101 if (ptr->
codec->master_data->writereg)
102 ptr->
codec->master_data->writereg(ptr->
codec, reg, value);
106 "%s: invalid I/O setup, nothing written!\n",
118 zr36050_read_status1 (
struct zr36050 *ptr)
122 zr36050_read(ptr, 0);
134 zr36050_read_scalefactor (
struct zr36050 *ptr)
140 zr36050_read(ptr, 0);
151 zr36050_wait_end (
struct zr36050 *ptr)
155 while (!(zr36050_read_status1(ptr) & 0x4)) {
159 "%s: timeout at wait_end (last status: 0x%02x)\n",
173 zr36050_basic_test (
struct zr36050 *ptr)
181 "%s: attach failed, can't connect to jpeg processor!\n",
191 "%s: attach failed, can't connect to jpeg processor!\n",
196 zr36050_wait_end(ptr);
197 if ((ptr->
status1 & 0x4) == 0) {
200 "%s: attach failed, jpeg processor failed (end flag)!\n",
215 zr36050_pushit (
struct zr36050 *ptr,
222 dprintk(4,
"%s: write data block to 0x%04x (len=%d)\n", ptr->
name,
225 zr36050_write(ptr, startreg++, data[i++]);
242 static const char zr36050_dqt[0x86] = {
246 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
247 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
248 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
249 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
250 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
251 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
252 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
253 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
255 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
256 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
257 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
258 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
259 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
260 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
261 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
262 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
265 static const char zr36050_dht[0x1a4] = {
269 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
270 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
273 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
274 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
275 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
277 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
278 0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
279 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11,
280 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
281 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
282 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24,
283 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
284 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34,
285 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
286 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
287 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
288 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
289 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
290 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
291 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
292 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
293 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
294 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
295 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
296 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
299 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
300 0x07, 0x05, 0x04, 0x04, 0x00, 0x01,
301 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
302 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
303 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
304 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62,
305 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
306 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
307 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
308 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
309 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
310 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
311 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
312 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
313 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
314 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
315 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
316 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
317 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
318 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
323 #define NO_OF_COMPONENTS 0x3 //Y,U,V
324 #define BASELINE_PRECISION 0x8 //MCU size (?)
325 static const char zr36050_tq[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
326 static const char zr36050_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
327 static const char zr36050_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
330 static const char zr36050_decimation_h[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
331 static const char zr36050_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 };
346 zr36050_set_sof (
struct zr36050 *ptr)
351 dprintk(3,
"%s: write SOF (%dx%d, %d components)\n", ptr->
name,
358 sof_data[5] = (ptr->
height) >> 8;
359 sof_data[6] = (ptr->
height) & 0xff;
360 sof_data[7] = (ptr->
width) >> 8;
361 sof_data[8] = (ptr->
width) & 0xff;
364 sof_data[10 + (i * 3)] = i;
366 sof_data[12 + (i * 3)] = zr36050_tq[i];
369 (3 * NO_OF_COMPONENTS) + 10, sof_data);
378 zr36050_set_sos (
struct zr36050 *ptr)
390 sos_data[5 + (i * 2)] = i;
391 sos_data[6 + (i * 2)] = (zr36050_td[i] << 4) | zr36050_ta[
i];
397 4 + 1 + (2 * NO_OF_COMPONENTS) + 3,
406 zr36050_set_dri (
struct zr36050 *ptr)
415 dri_data[4] = ptr->
dri >> 8;
416 dri_data[5] = ptr->
dri & 0xff;
429 zr36050_init (
struct zr36050 *ptr)
459 sum += zr36050_set_sof(ptr);
460 sum += zr36050_set_sos(ptr);
461 sum += zr36050_set_dri(ptr);
465 dprintk(3,
"%s: write DQT, DHT, APP\n", ptr->
name);
467 sizeof(zr36050_dqt), zr36050_dqt);
469 sizeof(zr36050_dht), zr36050_dht);
487 zr36050_wait_end(ptr);
488 dprintk(2,
"%s: Status after table preload: 0x%02x\n",
491 if ((ptr->
status1 & 0x4) == 0) {
505 "%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n",
509 tmp = bitcnt & 0xffff;
513 bitcnt -= bitcnt >> 7;
514 bitcnt -= ((bitcnt * 5) >> 6);
517 dprintk(3,
"%s: code: nettobit=%ld, highnettobits=%ld\n",
518 ptr->
name, bitcnt, tmp);
521 tmp = bitcnt & 0xffff;
557 zr36050_wait_end(ptr);
558 dprintk(2,
"%s: Status after table preload: 0x%02x\n",
561 if ((ptr->
status1 & 0x4) == 0) {
573 zr36050_read(ptr, 0);
590 dprintk(2,
"%s: set_mode %d call\n", ptr->
name, mode);
611 dprintk(2,
"%s: set_video %d.%d, %d/%d-%dx%d (0x%x) q%d call\n",
651 int *ival = (
int *)
data;
653 dprintk(2,
"%s: control %d call with %d byte\n", ptr->
name, type,
658 if (size !=
sizeof(
int))
660 zr36050_read_status1(ptr);
665 if (size !=
sizeof(
int))
671 if (size !=
sizeof(
int))
688 if (size !=
sizeof(
int))
694 if (size !=
sizeof(
int))
703 if (size !=
sizeof(
int))
705 *ival = zr36050_read_scalefactor(ptr);
709 if (size !=
sizeof(
int))
802 dprintk(2,
"zr36050: initializing MJPEG subsystem #%d.\n",
807 KERN_ERR "zr36050: Can't attach more codecs!\n");
819 ptr->
num = zr36050_codecs++;
823 res = zr36050_basic_test(ptr);
825 zr36050_unset(codec);
855 static const struct videocodec zr36050_codec = {
863 .setup = zr36050_setup,
864 .unset = zr36050_unset,
865 .set_mode = zr36050_set_mode,
866 .set_video = zr36050_set_video,
867 .control = zr36050_control,
876 zr36050_init_module (
void)
884 zr36050_cleanup_module (
void)
886 if (zr36050_codecs) {
888 "zr36050: something's wrong - %d codecs left somehow.\n",