27 #define ZR060_VERSION "v0.7"
29 #include <linux/module.h>
31 #include <linux/slab.h>
34 #include <linux/types.h>
35 #include <linux/wait.h>
51 static int zr36060_codecs;
53 static bool low_bitrate;
62 #define dprintk(num, format, args...) \
65 printk(format, ##args); \
82 if (ptr->
codec->master_data->readreg)
83 value = (ptr->
codec->master_data->readreg(ptr->
codec,
87 KERN_ERR "%s: invalid I/O setup, nothing read!\n",
101 dprintk(4,
"0x%02x @0x%04x\n", value, reg);
104 if (ptr->
codec->master_data->writereg)
105 ptr->
codec->master_data->writereg(ptr->
codec, reg, value);
109 "%s: invalid I/O setup, nothing written!\n",
121 zr36060_read_status (
struct zr36060 *ptr)
125 zr36060_read(ptr, 0);
137 zr36060_read_scalefactor (
struct zr36060 *ptr)
143 zr36060_read(ptr, 0);
154 zr36060_wait_end (
struct zr36060 *ptr)
162 "%s: timeout at wait_end (last status: 0x%02x)\n",
176 zr36060_basic_test (
struct zr36060 *ptr)
182 "%s: attach failed, can't connect to jpeg processor!\n",
187 zr36060_wait_end(ptr);
188 if (ptr->
status & ZR060_CFSR_Busy) {
191 "%s: attach failed, jpeg processor failed (end flag)!\n",
206 zr36060_pushit (
struct zr36060 *ptr,
213 dprintk(4,
"%s: write data block to 0x%04x (len=%d)\n", ptr->
name,
216 zr36060_write(ptr, startreg++, data[i++]);
233 static const char zr36060_dqt[0x86] = {
237 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
238 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
239 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
240 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
241 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
242 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
243 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
244 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
246 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
247 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
248 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
249 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
250 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
251 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
252 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
253 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
256 static const char zr36060_dht[0x1a4] = {
260 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
261 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
262 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
264 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
265 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
266 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
268 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
269 0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
270 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11,
271 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
272 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
273 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24,
274 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
275 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34,
276 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
277 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
278 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
279 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
280 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
281 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
282 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
283 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9,
284 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
285 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
286 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
287 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
290 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
291 0x07, 0x05, 0x04, 0x04, 0x00, 0x01,
292 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
293 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
294 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
295 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62,
296 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
297 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
298 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
299 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56,
300 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
301 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
302 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
303 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
304 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
305 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
306 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
307 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
308 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
309 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
314 #define NO_OF_COMPONENTS 0x3 //Y,U,V
315 #define BASELINE_PRECISION 0x8 //MCU size (?)
316 static const char zr36060_tq[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
317 static const char zr36060_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
318 static const char zr36060_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
321 static const char zr36060_decimation_h[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
322 static const char zr36060_decimation_v[8] = { 1, 1, 1, 0, 0, 0, 0, 0 };
337 zr36060_set_sof (
struct zr36060 *ptr)
342 dprintk(3,
"%s: write SOF (%dx%d, %d components)\n", ptr->
name,
349 sof_data[5] = (ptr->
height) >> 8;
350 sof_data[6] = (ptr->
height) & 0xff;
351 sof_data[7] = (ptr->
width) >> 8;
352 sof_data[8] = (ptr->
width) & 0xff;
355 sof_data[10 + (i * 3)] = i;
358 sof_data[12 + (i * 3)] = zr36060_tq[i];
361 (3 * NO_OF_COMPONENTS) + 10, sof_data);
370 zr36060_set_sos (
struct zr36060 *ptr)
382 sos_data[5 + (i * 2)] = i;
383 sos_data[6 + (i * 2)] = (zr36060_td[i] << 4) |
390 4 + 1 + (2 * NO_OF_COMPONENTS) + 3,
399 zr36060_set_dri (
struct zr36060 *ptr)
408 dri_data[4] = (ptr->
dri) >> 8;
409 dri_data[5] = (ptr->
dri) & 0xff;
422 zr36060_init (
struct zr36060 *ptr)
458 sum += zr36060_set_sof(ptr);
459 sum += zr36060_set_sos(ptr);
460 sum += zr36060_set_dri(ptr);
491 "%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n",
495 tmp = bitcnt & 0xffff;
499 bitcnt -= bitcnt >> 7;
500 bitcnt -= ((bitcnt * 5) >> 6);
503 dprintk(3,
"%s: code: nettobit=%ld, highnettobits=%ld\n",
504 ptr->
name, bitcnt, tmp);
507 tmp = bitcnt & 0xffff;
557 zr36060_wait_end(ptr);
558 dprintk(2,
"%s: Status after table preload: 0x%02x\n", ptr->
name,
561 if (ptr->
status & ZR060_CFSR_Busy) {
581 dprintk(2,
"%s: set_mode %d call\n", ptr->
name, mode);
603 dprintk(2,
"%s: set_video %d/%d-%dx%d (%%%d) call\n", ptr->
name,
713 reg += norm->
Ha / 2 + 8;
760 int *ival = (
int *)
data;
762 dprintk(2,
"%s: control %d call with %d byte\n", ptr->
name, type,
767 if (size !=
sizeof(
int))
769 zr36060_read_status(ptr);
774 if (size !=
sizeof(
int))
780 if (size !=
sizeof(
int))
797 if (size !=
sizeof(
int))
803 if (size !=
sizeof(
int))
810 if (size !=
sizeof(
int))
812 *ival = zr36060_read_scalefactor(ptr);
816 if (size !=
sizeof(
int))
909 dprintk(2,
"zr36060: initializing MJPEG subsystem #%d.\n",
914 KERN_ERR "zr36060: Can't attach more codecs!\n");
926 ptr->
num = zr36060_codecs++;
930 res = zr36060_basic_test(ptr);
932 zr36060_unset(codec);
963 static const struct videocodec zr36060_codec = {
971 .setup = zr36060_setup,
972 .unset = zr36060_unset,
973 .set_mode = zr36060_set_mode,
974 .set_video = zr36060_set_video,
975 .control = zr36060_control,
984 zr36060_init_module (
void)
992 zr36060_cleanup_module (
void)
994 if (zr36060_codecs) {
996 "zr36060: something's wrong - %d codecs left somehow.\n",