OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [media/] [video/] [zr36050.c] - Blame information for rev 78

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.