1 /* 2 * Zoran ZR36050 basic configuration functions 3 * 4 * Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at> 5 * 6 * $Id: zr36050.c,v 1.1.2.11 2003/08/03 14:54:53 rbultje Exp $ 7 * 8 * ------------------------------------------------------------------------ 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 * 24 * ------------------------------------------------------------------------ 25 */ 26 27 #define ZR050_VERSION "v0.7.1" 28 29 #include <linux/module.h> 30 #include <linux/init.h> 31 #include <linux/slab.h> 32 #include <linux/delay.h> 33 34 #include <linux/types.h> 35 #include <linux/wait.h> 36 37 /* I/O commands, error codes */ 38 #include <asm/io.h> 39 40 /* headerfile of this module */ 41 #include "zr36050.h" 42 43 /* codec io API */ 44 #include "videocodec.h" 45 46 /* it doesn't make sense to have more than 20 or so, 47 just to prevent some unwanted loops */ 48 #define MAX_CODECS 20 49 50 /* amount of chips attached via this driver */ 51 static int zr36050_codecs; 52 53 /* debugging is available via module parameter */ 54 static int debug; 55 module_param(debug, int, 0); 56 MODULE_PARM_DESC(debug, "Debug level (0-4)"); 57 58 #define dprintk(num, format, args...) \ 59 do { \ 60 if (debug >= num) \ 61 printk(format, ##args); \ 62 } while (0) 63 64 /* ========================================================================= 65 Local hardware I/O functions: 66 67 read/write via codec layer (registers are located in the master device) 68 ========================================================================= */ 69 70 /* read and write functions */ 71 static u8 72 zr36050_read (struct zr36050 *ptr, 73 u16 reg) 74 { 75 u8 value = 0; 76 77 // just in case something is wrong... 78 if (ptr->codec->master_data->readreg) 79 value = (ptr->codec->master_data->readreg(ptr->codec, 80 reg)) & 0xFF; 81 else 82 dprintk(1, 83 KERN_ERR "%s: invalid I/O setup, nothing read!\n", 84 ptr->name); 85 86 dprintk(4, "%s: reading from 0x%04x: %02x\n", ptr->name, reg, 87 value); 88 89 return value; 90 } 91 92 static void 93 zr36050_write (struct zr36050 *ptr, 94 u16 reg, 95 u8 value) 96 { 97 dprintk(4, "%s: writing 0x%02x to 0x%04x\n", ptr->name, value, 98 reg); 99 100 // just in case something is wrong... 101 if (ptr->codec->master_data->writereg) 102 ptr->codec->master_data->writereg(ptr->codec, reg, value); 103 else 104 dprintk(1, 105 KERN_ERR 106 "%s: invalid I/O setup, nothing written!\n", 107 ptr->name); 108 } 109 110 /* ========================================================================= 111 Local helper function: 112 113 status read 114 ========================================================================= */ 115 116 /* status is kept in datastructure */ 117 static u8 118 zr36050_read_status1 (struct zr36050 *ptr) 119 { 120 ptr->status1 = zr36050_read(ptr, ZR050_STATUS_1); 121 122 zr36050_read(ptr, 0); 123 return ptr->status1; 124 } 125 126 /* ========================================================================= 127 Local helper function: 128 129 scale factor read 130 ========================================================================= */ 131 132 /* scale factor is kept in datastructure */ 133 static u16 134 zr36050_read_scalefactor (struct zr36050 *ptr) 135 { 136 ptr->scalefact = (zr36050_read(ptr, ZR050_SF_HI) << 8) | 137 (zr36050_read(ptr, ZR050_SF_LO) & 0xFF); 138 139 /* leave 0 selected for an eventually GO from master */ 140 zr36050_read(ptr, 0); 141 return ptr->scalefact; 142 } 143 144 /* ========================================================================= 145 Local helper function: 146 147 wait if codec is ready to proceed (end of processing) or time is over 148 ========================================================================= */ 149 150 static void 151 zr36050_wait_end (struct zr36050 *ptr) 152 { 153 int i = 0; 154 155 while (!(zr36050_read_status1(ptr) & 0x4)) { 156 udelay(1); 157 if (i++ > 200000) { // 200ms, there is for sure something wrong!!! 158 dprintk(1, 159 "%s: timeout at wait_end (last status: 0x%02x)\n", 160 ptr->name, ptr->status1); 161 break; 162 } 163 } 164 } 165 166 /* ========================================================================= 167 Local helper function: 168 169 basic test of "connectivity", writes/reads to/from memory the SOF marker 170 ========================================================================= */ 171 172 static int 173 zr36050_basic_test (struct zr36050 *ptr) 174 { 175 zr36050_write(ptr, ZR050_SOF_IDX, 0x00); 176 zr36050_write(ptr, ZR050_SOF_IDX + 1, 0x00); 177 if ((zr36050_read(ptr, ZR050_SOF_IDX) | 178 zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0x0000) { 179 dprintk(1, 180 KERN_ERR 181 "%s: attach failed, can't connect to jpeg processor!\n", 182 ptr->name); 183 return -ENXIO; 184 } 185 zr36050_write(ptr, ZR050_SOF_IDX, 0xff); 186 zr36050_write(ptr, ZR050_SOF_IDX + 1, 0xc0); 187 if (((zr36050_read(ptr, ZR050_SOF_IDX) << 8) | 188 zr36050_read(ptr, ZR050_SOF_IDX + 1)) != 0xffc0) { 189 dprintk(1, 190 KERN_ERR 191 "%s: attach failed, can't connect to jpeg processor!\n", 192 ptr->name); 193 return -ENXIO; 194 } 195 196 zr36050_wait_end(ptr); 197 if ((ptr->status1 & 0x4) == 0) { 198 dprintk(1, 199 KERN_ERR 200 "%s: attach failed, jpeg processor failed (end flag)!\n", 201 ptr->name); 202 return -EBUSY; 203 } 204 205 return 0; /* looks good! */ 206 } 207 208 /* ========================================================================= 209 Local helper function: 210 211 simple loop for pushing the init datasets 212 ========================================================================= */ 213 214 static int 215 zr36050_pushit (struct zr36050 *ptr, 216 u16 startreg, 217 u16 len, 218 const char *data) 219 { 220 int i = 0; 221 222 dprintk(4, "%s: write data block to 0x%04x (len=%d)\n", ptr->name, 223 startreg, len); 224 while (i < len) { 225 zr36050_write(ptr, startreg++, data[i++]); 226 } 227 228 return i; 229 } 230 231 /* ========================================================================= 232 Basic datasets: 233 234 jpeg baseline setup data (you find it on lots places in internet, or just 235 extract it from any regular .jpg image...) 236 237 Could be variable, but until it's not needed it they are just fixed to save 238 memory. Otherwise expand zr36050 structure with arrays, push the values to 239 it and initialize from there, as e.g. the linux zr36057/60 driver does it. 240 ========================================================================= */ 241 242 static const char zr36050_dqt[0x86] = { 243 0xff, 0xdb, //Marker: DQT 244 0x00, 0x84, //Length: 2*65+2 245 0x00, //Pq,Tq first table 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, 254 0x01, //Pq,Tq second table 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 263 }; 264 265 static const char zr36050_dht[0x1a4] = { 266 0xff, 0xc4, //Marker: DHT 267 0x01, 0xa2, //Length: 2*AC, 2*DC 268 0x00, //DC first table 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, 272 0x01, //DC second table 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, 276 0x10, //AC first table 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, 297 0xF8, 0xF9, 0xFA, 298 0x11, //AC second table 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, 319 0xF9, 0xFA 320 }; 321 322 /* jpeg baseline setup, this is just fixed in this driver (YUV pictures) */ 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 }; //table idx's QT 326 static const char zr36050_td[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; //table idx's DC 327 static const char zr36050_ta[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; //table idx's AC 328 329 /* horizontal 422 decimation setup (maybe we support 411 or so later, too) */ 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 }; 332 333 /* ========================================================================= 334 Local helper functions: 335 336 calculation and setup of parameter-dependent JPEG baseline segments 337 (needed for compression only) 338 ========================================================================= */ 339 340 /* ------------------------------------------------------------------------- */ 341 342 /* SOF (start of frame) segment depends on width, height and sampling ratio 343 of each color component */ 344 345 static int 346 zr36050_set_sof (struct zr36050 *ptr) 347 { 348 char sof_data[34]; // max. size of register set 349 int i; 350 351 dprintk(3, "%s: write SOF (%dx%d, %d components)\n", ptr->name, 352 ptr->width, ptr->height, NO_OF_COMPONENTS); 353 sof_data[0] = 0xff; 354 sof_data[1] = 0xc0; 355 sof_data[2] = 0x00; 356 sof_data[3] = (3 * NO_OF_COMPONENTS) + 8; 357 sof_data[4] = BASELINE_PRECISION; // only '8' possible with zr36050 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; 362 sof_data[9] = NO_OF_COMPONENTS; 363 for (i = 0; i < NO_OF_COMPONENTS; i++) { 364 sof_data[10 + (i * 3)] = i; // index identifier 365 sof_data[11 + (i * 3)] = (ptr->h_samp_ratio[i] << 4) | (ptr->v_samp_ratio[i]); // sampling ratios 366 sof_data[12 + (i * 3)] = zr36050_tq[i]; // Q table selection 367 } 368 return zr36050_pushit(ptr, ZR050_SOF_IDX, 369 (3 * NO_OF_COMPONENTS) + 10, sof_data); 370 } 371 372 /* ------------------------------------------------------------------------- */ 373 374 /* SOS (start of scan) segment depends on the used scan components 375 of each color component */ 376 377 static int 378 zr36050_set_sos (struct zr36050 *ptr) 379 { 380 char sos_data[16]; // max. size of register set 381 int i; 382 383 dprintk(3, "%s: write SOS\n", ptr->name); 384 sos_data[0] = 0xff; 385 sos_data[1] = 0xda; 386 sos_data[2] = 0x00; 387 sos_data[3] = 2 + 1 + (2 * NO_OF_COMPONENTS) + 3; 388 sos_data[4] = NO_OF_COMPONENTS; 389 for (i = 0; i < NO_OF_COMPONENTS; i++) { 390 sos_data[5 + (i * 2)] = i; // index 391 sos_data[6 + (i * 2)] = (zr36050_td[i] << 4) | zr36050_ta[i]; // AC/DC tbl.sel. 392 } 393 sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 2] = 00; // scan start 394 sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 3] = 0x3F; 395 sos_data[2 + 1 + (2 * NO_OF_COMPONENTS) + 4] = 00; 396 return zr36050_pushit(ptr, ZR050_SOS1_IDX, 397 4 + 1 + (2 * NO_OF_COMPONENTS) + 3, 398 sos_data); 399 } 400 401 /* ------------------------------------------------------------------------- */ 402 403 /* DRI (define restart interval) */ 404 405 static int 406 zr36050_set_dri (struct zr36050 *ptr) 407 { 408 char dri_data[6]; // max. size of register set 409 410 dprintk(3, "%s: write DRI\n", ptr->name); 411 dri_data[0] = 0xff; 412 dri_data[1] = 0xdd; 413 dri_data[2] = 0x00; 414 dri_data[3] = 0x04; 415 dri_data[4] = ptr->dri >> 8; 416 dri_data[5] = ptr->dri & 0xff; 417 return zr36050_pushit(ptr, ZR050_DRI_IDX, 6, dri_data); 418 } 419 420 /* ========================================================================= 421 Setup function: 422 423 Setup compression/decompression of Zoran's JPEG processor 424 ( see also zoran 36050 manual ) 425 426 ... sorry for the spaghetti code ... 427 ========================================================================= */ 428 static void 429 zr36050_init (struct zr36050 *ptr) 430 { 431 int sum = 0; 432 long bitcnt, tmp; 433 434 if (ptr->mode == CODEC_DO_COMPRESSION) { 435 dprintk(2, "%s: COMPRESSION SETUP\n", ptr->name); 436 437 /* 050 communicates with 057 in master mode */ 438 zr36050_write(ptr, ZR050_HARDWARE, ZR050_HW_MSTR); 439 440 /* encoding table preload for compression */ 441 zr36050_write(ptr, ZR050_MODE, 442 ZR050_MO_COMP | ZR050_MO_TLM); 443 zr36050_write(ptr, ZR050_OPTIONS, 0); 444 445 /* disable all IRQs */ 446 zr36050_write(ptr, ZR050_INT_REQ_0, 0); 447 zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1 448 449 /* volume control settings */ 450 /*zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol);*/ 451 zr36050_write(ptr, ZR050_SF_HI, ptr->scalefact >> 8); 452 zr36050_write(ptr, ZR050_SF_LO, ptr->scalefact & 0xff); 453 454 zr36050_write(ptr, ZR050_AF_HI, 0xff); 455 zr36050_write(ptr, ZR050_AF_M, 0xff); 456 zr36050_write(ptr, ZR050_AF_LO, 0xff); 457 458 /* setup the variable jpeg tables */ 459 sum += zr36050_set_sof(ptr); 460 sum += zr36050_set_sos(ptr); 461 sum += zr36050_set_dri(ptr); 462 463 /* setup the fixed jpeg tables - maybe variable, though - 464 * (see table init section above) */ 465 dprintk(3, "%s: write DQT, DHT, APP\n", ptr->name); 466 sum += zr36050_pushit(ptr, ZR050_DQT_IDX, 467 sizeof(zr36050_dqt), zr36050_dqt); 468 sum += zr36050_pushit(ptr, ZR050_DHT_IDX, 469 sizeof(zr36050_dht), zr36050_dht); 470 zr36050_write(ptr, ZR050_APP_IDX, 0xff); 471 zr36050_write(ptr, ZR050_APP_IDX + 1, 0xe0 + ptr->app.appn); 472 zr36050_write(ptr, ZR050_APP_IDX + 2, 0x00); 473 zr36050_write(ptr, ZR050_APP_IDX + 3, ptr->app.len + 2); 474 sum += zr36050_pushit(ptr, ZR050_APP_IDX + 4, 60, 475 ptr->app.data) + 4; 476 zr36050_write(ptr, ZR050_COM_IDX, 0xff); 477 zr36050_write(ptr, ZR050_COM_IDX + 1, 0xfe); 478 zr36050_write(ptr, ZR050_COM_IDX + 2, 0x00); 479 zr36050_write(ptr, ZR050_COM_IDX + 3, ptr->com.len + 2); 480 sum += zr36050_pushit(ptr, ZR050_COM_IDX + 4, 60, 481 ptr->com.data) + 4; 482 483 /* do the internal huffman table preload */ 484 zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI); 485 486 zr36050_write(ptr, ZR050_GO, 1); // launch codec 487 zr36050_wait_end(ptr); 488 dprintk(2, "%s: Status after table preload: 0x%02x\n", 489 ptr->name, ptr->status1); 490 491 if ((ptr->status1 & 0x4) == 0) { 492 dprintk(1, KERN_ERR "%s: init aborted!\n", 493 ptr->name); 494 return; // something is wrong, its timed out!!!! 495 } 496 497 /* setup misc. data for compression (target code sizes) */ 498 499 /* size of compressed code to reach without header data */ 500 sum = ptr->real_code_vol - sum; 501 bitcnt = sum << 3; /* need the size in bits */ 502 503 tmp = bitcnt >> 16; 504 dprintk(3, 505 "%s: code: csize=%d, tot=%d, bit=%ld, highbits=%ld\n", 506 ptr->name, sum, ptr->real_code_vol, bitcnt, tmp); 507 zr36050_write(ptr, ZR050_TCV_NET_HI, tmp >> 8); 508 zr36050_write(ptr, ZR050_TCV_NET_MH, tmp & 0xff); 509 tmp = bitcnt & 0xffff; 510 zr36050_write(ptr, ZR050_TCV_NET_ML, tmp >> 8); 511 zr36050_write(ptr, ZR050_TCV_NET_LO, tmp & 0xff); 512 513 bitcnt -= bitcnt >> 7; // bits without stuffing 514 bitcnt -= ((bitcnt * 5) >> 6); // bits without eob 515 516 tmp = bitcnt >> 16; 517 dprintk(3, "%s: code: nettobit=%ld, highnettobits=%ld\n", 518 ptr->name, bitcnt, tmp); 519 zr36050_write(ptr, ZR050_TCV_DATA_HI, tmp >> 8); 520 zr36050_write(ptr, ZR050_TCV_DATA_MH, tmp & 0xff); 521 tmp = bitcnt & 0xffff; 522 zr36050_write(ptr, ZR050_TCV_DATA_ML, tmp >> 8); 523 zr36050_write(ptr, ZR050_TCV_DATA_LO, tmp & 0xff); 524 525 /* compression setup with or without bitrate control */ 526 zr36050_write(ptr, ZR050_MODE, 527 ZR050_MO_COMP | ZR050_MO_PASS2 | 528 (ptr->bitrate_ctrl ? ZR050_MO_BRC : 0)); 529 530 /* this headers seem to deliver "valid AVI" jpeg frames */ 531 zr36050_write(ptr, ZR050_MARKERS_EN, 532 ZR050_ME_DQT | ZR050_ME_DHT | 533 ((ptr->app.len > 0) ? ZR050_ME_APP : 0) | 534 ((ptr->com.len > 0) ? ZR050_ME_COM : 0)); 535 } else { 536 dprintk(2, "%s: EXPANSION SETUP\n", ptr->name); 537 538 /* 050 communicates with 055 in master mode */ 539 zr36050_write(ptr, ZR050_HARDWARE, 540 ZR050_HW_MSTR | ZR050_HW_CFIS_2_CLK); 541 542 /* encoding table preload */ 543 zr36050_write(ptr, ZR050_MODE, ZR050_MO_TLM); 544 545 /* disable all IRQs */ 546 zr36050_write(ptr, ZR050_INT_REQ_0, 0); 547 zr36050_write(ptr, ZR050_INT_REQ_1, 3); // low 2 bits always 1 548 549 dprintk(3, "%s: write DHT\n", ptr->name); 550 zr36050_pushit(ptr, ZR050_DHT_IDX, sizeof(zr36050_dht), 551 zr36050_dht); 552 553 /* do the internal huffman table preload */ 554 zr36050_write(ptr, ZR050_MARKERS_EN, ZR050_ME_DHTI); 555 556 zr36050_write(ptr, ZR050_GO, 1); // launch codec 557 zr36050_wait_end(ptr); 558 dprintk(2, "%s: Status after table preload: 0x%02x\n", 559 ptr->name, ptr->status1); 560 561 if ((ptr->status1 & 0x4) == 0) { 562 dprintk(1, KERN_ERR "%s: init aborted!\n", 563 ptr->name); 564 return; // something is wrong, its timed out!!!! 565 } 566 567 /* setup misc. data for expansion */ 568 zr36050_write(ptr, ZR050_MODE, 0); 569 zr36050_write(ptr, ZR050_MARKERS_EN, 0); 570 } 571 572 /* adr on selected, to allow GO from master */ 573 zr36050_read(ptr, 0); 574 } 575 576 /* ========================================================================= 577 CODEC API FUNCTIONS 578 579 this functions are accessed by the master via the API structure 580 ========================================================================= */ 581 582 /* set compression/expansion mode and launches codec - 583 this should be the last call from the master before starting processing */ 584 static int 585 zr36050_set_mode (struct videocodec *codec, 586 int mode) 587 { 588 struct zr36050 *ptr = (struct zr36050 *) codec->data; 589 590 dprintk(2, "%s: set_mode %d call\n", ptr->name, mode); 591 592 if ((mode != CODEC_DO_EXPANSION) && (mode != CODEC_DO_COMPRESSION)) 593 return -EINVAL; 594 595 ptr->mode = mode; 596 zr36050_init(ptr); 597 598 return 0; 599 } 600 601 /* set picture size (norm is ignored as the codec doesn't know about it) */ 602 static int 603 zr36050_set_video (struct videocodec *codec, 604 struct tvnorm *norm, 605 struct vfe_settings *cap, 606 struct vfe_polarity *pol) 607 { 608 struct zr36050 *ptr = (struct zr36050 *) codec->data; 609 int size; 610 611 dprintk(2, "%s: set_video %d.%d, %d/%d-%dx%d (0x%x) q%d call\n", 612 ptr->name, norm->HStart, norm->VStart, 613 cap->x, cap->y, cap->width, cap->height, 614 cap->decimation, cap->quality); 615 /* if () return -EINVAL; 616 * trust the master driver that it knows what it does - so 617 * we allow invalid startx/y and norm for now ... */ 618 ptr->width = cap->width / (cap->decimation & 0xff); 619 ptr->height = cap->height / ((cap->decimation >> 8) & 0xff); 620 621 /* (KM) JPEG quality */ 622 size = ptr->width * ptr->height; 623 size *= 16; /* size in bits */ 624 /* apply quality setting */ 625 size = size * cap->quality / 200; 626 627 /* Minimum: 1kb */ 628 if (size < 8192) 629 size = 8192; 630 /* Maximum: 7/8 of code buffer */ 631 if (size > ptr->total_code_vol * 7) 632 size = ptr->total_code_vol * 7; 633 634 ptr->real_code_vol = size >> 3; /* in bytes */ 635 636 /* Set max_block_vol here (previously in zr36050_init, moved 637 * here for consistency with zr36060 code */ 638 zr36050_write(ptr, ZR050_MBCV, ptr->max_block_vol); 639 640 return 0; 641 } 642 643 /* additional control functions */ 644 static int 645 zr36050_control (struct videocodec *codec, 646 int type, 647 int size, 648 void *data) 649 { 650 struct zr36050 *ptr = (struct zr36050 *) codec->data; 651 int *ival = (int *) data; 652 653 dprintk(2, "%s: control %d call with %d byte\n", ptr->name, type, 654 size); 655 656 switch (type) { 657 case CODEC_G_STATUS: /* get last status */ 658 if (size != sizeof(int)) 659 return -EFAULT; 660 zr36050_read_status1(ptr); 661 *ival = ptr->status1; 662 break; 663 664 case CODEC_G_CODEC_MODE: 665 if (size != sizeof(int)) 666 return -EFAULT; 667 *ival = CODEC_MODE_BJPG; 668 break; 669 670 case CODEC_S_CODEC_MODE: 671 if (size != sizeof(int)) 672 return -EFAULT; 673 if (*ival != CODEC_MODE_BJPG) 674 return -EINVAL; 675 /* not needed, do nothing */ 676 return 0; 677 678 case CODEC_G_VFE: 679 case CODEC_S_VFE: 680 /* not needed, do nothing */ 681 return 0; 682 683 case CODEC_S_MMAP: 684 /* not available, give an error */ 685 return -ENXIO; 686 687 case CODEC_G_JPEG_TDS_BYTE: /* get target volume in byte */ 688 if (size != sizeof(int)) 689 return -EFAULT; 690 *ival = ptr->total_code_vol; 691 break; 692 693 case CODEC_S_JPEG_TDS_BYTE: /* get target volume in byte */ 694 if (size != sizeof(int)) 695 return -EFAULT; 696 ptr->total_code_vol = *ival; 697 /* (Kieran Morrissey) 698 * code copied from zr36060.c to ensure proper bitrate */ 699 ptr->real_code_vol = (ptr->total_code_vol * 6) >> 3; 700 break; 701 702 case CODEC_G_JPEG_SCALE: /* get scaling factor */ 703 if (size != sizeof(int)) 704 return -EFAULT; 705 *ival = zr36050_read_scalefactor(ptr); 706 break; 707 708 case CODEC_S_JPEG_SCALE: /* set scaling factor */ 709 if (size != sizeof(int)) 710 return -EFAULT; 711 ptr->scalefact = *ival; 712 break; 713 714 case CODEC_G_JPEG_APP_DATA: { /* get appn marker data */ 715 struct jpeg_app_marker *app = data; 716 717 if (size != sizeof(struct jpeg_app_marker)) 718 return -EFAULT; 719 720 *app = ptr->app; 721 break; 722 } 723 724 case CODEC_S_JPEG_APP_DATA: { /* set appn marker data */ 725 struct jpeg_app_marker *app = data; 726 727 if (size != sizeof(struct jpeg_app_marker)) 728 return -EFAULT; 729 730 ptr->app = *app; 731 break; 732 } 733 734 case CODEC_G_JPEG_COM_DATA: { /* get comment marker data */ 735 struct jpeg_com_marker *com = data; 736 737 if (size != sizeof(struct jpeg_com_marker)) 738 return -EFAULT; 739 740 *com = ptr->com; 741 break; 742 } 743 744 case CODEC_S_JPEG_COM_DATA: { /* set comment marker data */ 745 struct jpeg_com_marker *com = data; 746 747 if (size != sizeof(struct jpeg_com_marker)) 748 return -EFAULT; 749 750 ptr->com = *com; 751 break; 752 } 753 754 default: 755 return -EINVAL; 756 } 757 758 return size; 759 } 760 761 /* ========================================================================= 762 Exit and unregister function: 763 764 Deinitializes Zoran's JPEG processor 765 ========================================================================= */ 766 767 static int 768 zr36050_unset (struct videocodec *codec) 769 { 770 struct zr36050 *ptr = codec->data; 771 772 if (ptr) { 773 /* do wee need some codec deinit here, too ???? */ 774 775 dprintk(1, "%s: finished codec #%d\n", ptr->name, 776 ptr->num); 777 kfree(ptr); 778 codec->data = NULL; 779 780 zr36050_codecs--; 781 return 0; 782 } 783 784 return -EFAULT; 785 } 786 787 /* ========================================================================= 788 Setup and registry function: 789 790 Initializes Zoran's JPEG processor 791 792 Also sets pixel size, average code size, mode (compr./decompr.) 793 (the given size is determined by the processor with the video interface) 794 ========================================================================= */ 795 796 static int 797 zr36050_setup (struct videocodec *codec) 798 { 799 struct zr36050 *ptr; 800 int res; 801 802 dprintk(2, "zr36050: initializing MJPEG subsystem #%d.\n", 803 zr36050_codecs); 804 805 if (zr36050_codecs == MAX_CODECS) { 806 dprintk(1, 807 KERN_ERR "zr36050: Can't attach more codecs!\n"); 808 return -ENOSPC; 809 } 810 //mem structure init 811 codec->data = ptr = kzalloc(sizeof(struct zr36050), GFP_KERNEL); 812 if (NULL == ptr) { 813 dprintk(1, KERN_ERR "zr36050: Can't get enough memory!\n"); 814 return -ENOMEM; 815 } 816 817 snprintf(ptr->name, sizeof(ptr->name), "zr36050[%d]", 818 zr36050_codecs); 819 ptr->num = zr36050_codecs++; 820 ptr->codec = codec; 821 822 //testing 823 res = zr36050_basic_test(ptr); 824 if (res < 0) { 825 zr36050_unset(codec); 826 return res; 827 } 828 //final setup 829 memcpy(ptr->h_samp_ratio, zr36050_decimation_h, 8); 830 memcpy(ptr->v_samp_ratio, zr36050_decimation_v, 8); 831 832 ptr->bitrate_ctrl = 0; /* 0 or 1 - fixed file size flag 833 * (what is the difference?) */ 834 ptr->mode = CODEC_DO_COMPRESSION; 835 ptr->width = 384; 836 ptr->height = 288; 837 ptr->total_code_vol = 16000; 838 ptr->max_block_vol = 240; 839 ptr->scalefact = 0x100; 840 ptr->dri = 1; 841 842 /* no app/com marker by default */ 843 ptr->app.appn = 0; 844 ptr->app.len = 0; 845 ptr->com.len = 0; 846 847 zr36050_init(ptr); 848 849 dprintk(1, KERN_INFO "%s: codec attached and running\n", 850 ptr->name); 851 852 return 0; 853 } 854 855 static const struct videocodec zr36050_codec = { 856 .owner = THIS_MODULE, 857 .name = "zr36050", 858 .magic = 0L, // magic not used 859 .flags = 860 CODEC_FLAG_JPEG | CODEC_FLAG_HARDWARE | CODEC_FLAG_ENCODER | 861 CODEC_FLAG_DECODER, 862 .type = CODEC_TYPE_ZR36050, 863 .setup = zr36050_setup, // functionality 864 .unset = zr36050_unset, 865 .set_mode = zr36050_set_mode, 866 .set_video = zr36050_set_video, 867 .control = zr36050_control, 868 // others are not used 869 }; 870 871 /* ========================================================================= 872 HOOK IN DRIVER AS KERNEL MODULE 873 ========================================================================= */ 874 875 static int __init 876 zr36050_init_module (void) 877 { 878 //dprintk(1, "ZR36050 driver %s\n",ZR050_VERSION); 879 zr36050_codecs = 0; 880 return videocodec_register(&zr36050_codec); 881 } 882 883 static void __exit 884 zr36050_cleanup_module (void) 885 { 886 if (zr36050_codecs) { 887 dprintk(1, 888 "zr36050: something's wrong - %d codecs left somehow.\n", 889 zr36050_codecs); 890 } 891 videocodec_unregister(&zr36050_codec); 892 } 893 894 module_init(zr36050_init_module); 895 module_exit(zr36050_cleanup_module); 896 897 MODULE_AUTHOR("Wolfgang Scherr <scherr@net4you.at>"); 898 MODULE_DESCRIPTION("Driver module for ZR36050 jpeg processors " 899 ZR050_VERSION); 900 MODULE_LICENSE("GPL"); 901