Merge remote-tracking branch 'pm/linux-next'
[linux-2.6/next.git] / drivers / staging / go7007 / go7007-fw.c
blobc9a6409edfe36f0153b976e9c63af42cbc37ad9c
1 /*
2 * Copyright (C) 2005-2006 Micronas USA Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License (Version 2) as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software Foundation,
15 * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
19 * This file contains code to generate a firmware image for the GO7007SB
20 * encoder. Much of the firmware is read verbatim from a file, but some of
21 * it concerning bitrate control and other things that can be configured at
22 * run-time are generated dynamically. Note that the format headers
23 * generated here do not affect the functioning of the encoder; they are
24 * merely parroted back to the host at the start of each frame.
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/time.h>
30 #include <linux/mm.h>
31 #include <linux/device.h>
32 #include <linux/i2c.h>
33 #include <linux/firmware.h>
34 #include <linux/slab.h>
35 #include <asm/byteorder.h>
37 #include "go7007-priv.h"
39 /* Constants used in the source firmware image to describe code segments */
41 #define FLAG_MODE_MJPEG (1)
42 #define FLAG_MODE_MPEG1 (1<<1)
43 #define FLAG_MODE_MPEG2 (1<<2)
44 #define FLAG_MODE_MPEG4 (1<<3)
45 #define FLAG_MODE_H263 (1<<4)
46 #define FLAG_MODE_ALL (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
47 FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
48 FLAG_MODE_H263)
49 #define FLAG_SPECIAL (1<<8)
51 #define SPECIAL_FRM_HEAD 0
52 #define SPECIAL_BRC_CTRL 1
53 #define SPECIAL_CONFIG 2
54 #define SPECIAL_SEQHEAD 3
55 #define SPECIAL_AV_SYNC 4
56 #define SPECIAL_FINAL 5
57 #define SPECIAL_AUDIO 6
58 #define SPECIAL_MODET 7
60 /* Little data class for creating MPEG headers bit-by-bit */
62 struct code_gen {
63 unsigned char *p; /* destination */
64 u32 a; /* collects bits at the top of the variable */
65 int b; /* bit position of most recently-written bit */
66 int len; /* written out so far */
69 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
71 #define CODE_ADD(name, val, length) do { \
72 name.b -= (length); \
73 name.a |= (val) << name.b; \
74 while (name.b <= 24) { \
75 *name.p = name.a >> 24; \
76 ++name.p; \
77 name.a <<= 8; \
78 name.b += 8; \
79 name.len += 8; \
80 } \
81 } while (0)
83 #define CODE_LENGTH(name) (name.len + (32 - name.b))
85 /* Tables for creating the bitrate control data */
87 static const s16 converge_speed_ip[101] = {
88 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
89 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
91 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
93 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
94 5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
95 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
96 19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
97 41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
98 100
101 static const s16 converge_speed_ipb[101] = {
102 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
105 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
106 6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
107 9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
108 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
109 28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
110 57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
111 125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
115 static const s16 LAMBDA_table[4][101] = {
116 { 16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
117 19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
118 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
119 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
120 32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
121 39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
122 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
123 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
124 67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
125 80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
129 20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
130 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
131 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
132 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
133 40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
134 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
135 58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
136 70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
137 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
138 100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
142 24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
143 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
144 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
145 41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
146 49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
147 58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
148 70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
149 84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
150 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
151 120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
155 32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
156 38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
157 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
158 54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
159 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
160 78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
161 93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
162 112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
163 134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
164 160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
169 /* MPEG blank frame generation tables */
171 enum mpeg_frame_type {
172 PFRAME,
173 BFRAME_PRE,
174 BFRAME_POST,
175 BFRAME_BIDIR,
176 BFRAME_EMPTY
179 static const u32 addrinctab[33][2] = {
180 { 0x01, 1 }, { 0x03, 3 }, { 0x02, 3 }, { 0x03, 4 },
181 { 0x02, 4 }, { 0x03, 5 }, { 0x02, 5 }, { 0x07, 7 },
182 { 0x06, 7 }, { 0x0b, 8 }, { 0x0a, 8 }, { 0x09, 8 },
183 { 0x08, 8 }, { 0x07, 8 }, { 0x06, 8 }, { 0x17, 10 },
184 { 0x16, 10 }, { 0x15, 10 }, { 0x14, 10 }, { 0x13, 10 },
185 { 0x12, 10 }, { 0x23, 11 }, { 0x22, 11 }, { 0x21, 11 },
186 { 0x20, 11 }, { 0x1f, 11 }, { 0x1e, 11 }, { 0x1d, 11 },
187 { 0x1c, 11 }, { 0x1b, 11 }, { 0x1a, 11 }, { 0x19, 11 },
188 { 0x18, 11 }
191 /* Standard JPEG tables */
193 static const u8 default_intra_quant_table[] = {
194 8, 16, 19, 22, 26, 27, 29, 34,
195 16, 16, 22, 24, 27, 29, 34, 37,
196 19, 22, 26, 27, 29, 34, 34, 38,
197 22, 22, 26, 27, 29, 34, 37, 40,
198 22, 26, 27, 29, 32, 35, 40, 48,
199 26, 27, 29, 32, 35, 40, 48, 58,
200 26, 27, 29, 34, 38, 46, 56, 69,
201 27, 29, 35, 38, 46, 56, 69, 83
204 static const u8 bits_dc_luminance[] = {
205 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
208 static const u8 val_dc_luminance[] = {
209 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
212 static const u8 bits_dc_chrominance[] = {
213 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
216 static const u8 val_dc_chrominance[] = {
217 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
220 static const u8 bits_ac_luminance[] = {
221 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
224 static const u8 val_ac_luminance[] = {
225 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
226 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
227 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
228 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
229 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
230 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
231 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
232 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
233 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
234 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
235 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
236 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
237 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
238 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
239 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
240 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
241 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
242 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
243 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
244 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
245 0xf9, 0xfa
248 static const u8 bits_ac_chrominance[] = {
249 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
252 static const u8 val_ac_chrominance[] = {
253 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
254 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
255 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
256 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
257 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
258 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
259 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
260 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
261 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
262 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
263 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
264 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
265 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
266 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
267 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
268 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
269 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
270 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
271 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
272 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
273 0xf9, 0xfa
276 /* Zig-zag mapping for quant table
278 * OK, let's do this mapping on the actual table above so it doesn't have
279 * to be done on the fly.
281 static const int zz[64] = {
282 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
283 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
284 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
285 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
288 static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
290 int i, cnt = pkg_cnt * 32;
292 if (space < cnt)
293 return -1;
295 for (i = 0; i < cnt; ++i)
296 dest[i] = cpu_to_le16p(src + i);
298 return cnt;
301 static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
303 int i, p = 0;
305 buf[p++] = 0xff;
306 buf[p++] = 0xd8;
307 buf[p++] = 0xff;
308 buf[p++] = 0xdb;
309 buf[p++] = 0;
310 buf[p++] = 2 + 65;
311 buf[p++] = 0;
312 buf[p++] = default_intra_quant_table[0];
313 for (i = 1; i < 64; ++i)
314 /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
315 buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
316 buf[p++] = 0xff;
317 buf[p++] = 0xc0;
318 buf[p++] = 0;
319 buf[p++] = 17;
320 buf[p++] = 8;
321 buf[p++] = go->height >> 8;
322 buf[p++] = go->height & 0xff;
323 buf[p++] = go->width >> 8;
324 buf[p++] = go->width & 0xff;
325 buf[p++] = 3;
326 buf[p++] = 1;
327 buf[p++] = 0x22;
328 buf[p++] = 0;
329 buf[p++] = 2;
330 buf[p++] = 0x11;
331 buf[p++] = 0;
332 buf[p++] = 3;
333 buf[p++] = 0x11;
334 buf[p++] = 0;
335 buf[p++] = 0xff;
336 buf[p++] = 0xc4;
337 buf[p++] = 418 >> 8;
338 buf[p++] = 418 & 0xff;
339 buf[p++] = 0x00;
340 memcpy(buf + p, bits_dc_luminance + 1, 16);
341 p += 16;
342 memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
343 p += sizeof(val_dc_luminance);
344 buf[p++] = 0x01;
345 memcpy(buf + p, bits_dc_chrominance + 1, 16);
346 p += 16;
347 memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
348 p += sizeof(val_dc_chrominance);
349 buf[p++] = 0x10;
350 memcpy(buf + p, bits_ac_luminance + 1, 16);
351 p += 16;
352 memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
353 p += sizeof(val_ac_luminance);
354 buf[p++] = 0x11;
355 memcpy(buf + p, bits_ac_chrominance + 1, 16);
356 p += 16;
357 memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
358 p += sizeof(val_ac_chrominance);
359 buf[p++] = 0xff;
360 buf[p++] = 0xda;
361 buf[p++] = 0;
362 buf[p++] = 12;
363 buf[p++] = 3;
364 buf[p++] = 1;
365 buf[p++] = 0x00;
366 buf[p++] = 2;
367 buf[p++] = 0x11;
368 buf[p++] = 3;
369 buf[p++] = 0x11;
370 buf[p++] = 0;
371 buf[p++] = 63;
372 buf[p++] = 0;
373 return p;
376 static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
378 u8 *buf;
379 u16 mem = 0x3e00;
380 unsigned int addr = 0x19;
381 int size = 0, i, off = 0, chunk;
383 buf = kzalloc(4096, GFP_KERNEL);
384 if (buf == NULL) {
385 printk(KERN_ERR "go7007: unable to allocate 4096 bytes for "
386 "firmware construction\n");
387 return -1;
390 for (i = 1; i < 32; ++i) {
391 mjpeg_frame_header(go, buf + size, i);
392 size += 80;
394 chunk = mjpeg_frame_header(go, buf + size, 1);
395 memmove(buf + size, buf + size + 80, chunk - 80);
396 size += chunk - 80;
398 for (i = 0; i < size; i += chunk * 2) {
399 if (space - off < 32) {
400 off = -1;
401 goto done;
404 code[off + 1] = __cpu_to_le16(0x8000 | mem);
406 chunk = 28;
407 if (mem + chunk > 0x4000)
408 chunk = 0x4000 - mem;
409 if (i + 2 * chunk > size)
410 chunk = (size - i) / 2;
412 if (chunk < 28) {
413 code[off] = __cpu_to_le16(0x4000 | chunk);
414 code[off + 31] = __cpu_to_le16(addr++);
415 mem = 0x3e00;
416 } else {
417 code[off] = __cpu_to_le16(0x1000 | 28);
418 code[off + 31] = 0;
419 mem += 28;
422 memcpy(&code[off + 2], buf + i, chunk * 2);
423 off += 32;
425 done:
426 kfree(buf);
427 return off;
430 static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
431 int modulo, int pict_struct, enum mpeg_frame_type frame)
433 int i, j, mb_code, mb_len;
434 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
435 CODE_GEN(c, buf + 6);
437 switch (frame) {
438 case PFRAME:
439 mb_code = 0x1;
440 mb_len = 3;
441 break;
442 case BFRAME_PRE:
443 mb_code = 0x2;
444 mb_len = 4;
445 break;
446 case BFRAME_POST:
447 mb_code = 0x2;
448 mb_len = 3;
449 break;
450 case BFRAME_BIDIR:
451 mb_code = 0x2;
452 mb_len = 2;
453 break;
454 default: /* keep the compiler happy */
455 mb_code = mb_len = 0;
456 break;
459 CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
460 CODE_ADD(c, 0xffff, 16);
461 CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 0x7 : 0x4, 4);
462 if (frame != PFRAME)
463 CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 0x7 : 0x4, 4);
464 else
465 CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
466 CODE_ADD(c, 0, 3); /* What is this?? */
467 /* Byte-align with zeros */
468 j = 8 - (CODE_LENGTH(c) % 8);
469 if (j != 8)
470 CODE_ADD(c, 0, j);
472 if (go->format == GO7007_FORMAT_MPEG2) {
473 CODE_ADD(c, 0x1, 24);
474 CODE_ADD(c, 0xb5, 8);
475 CODE_ADD(c, 0x844, 12);
476 CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
477 if (go->interlace_coding) {
478 CODE_ADD(c, pict_struct, 4);
479 if (go->dvd_mode)
480 CODE_ADD(c, 0x000, 11);
481 else
482 CODE_ADD(c, 0x200, 11);
483 } else {
484 CODE_ADD(c, 0x3, 4);
485 CODE_ADD(c, 0x20c, 11);
487 /* Byte-align with zeros */
488 j = 8 - (CODE_LENGTH(c) % 8);
489 if (j != 8)
490 CODE_ADD(c, 0, j);
493 for (i = 0; i < rows; ++i) {
494 CODE_ADD(c, 1, 24);
495 CODE_ADD(c, i + 1, 8);
496 CODE_ADD(c, 0x2, 6);
497 CODE_ADD(c, 0x1, 1);
498 CODE_ADD(c, mb_code, mb_len);
499 if (go->interlace_coding) {
500 CODE_ADD(c, 0x1, 2);
501 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
503 if (frame == BFRAME_BIDIR) {
504 CODE_ADD(c, 0x3, 2);
505 if (go->interlace_coding)
506 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
508 CODE_ADD(c, 0x3, 2);
509 for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
510 CODE_ADD(c, 0x8, 11);
511 CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
512 CODE_ADD(c, mb_code, mb_len);
513 if (go->interlace_coding) {
514 CODE_ADD(c, 0x1, 2);
515 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
517 if (frame == BFRAME_BIDIR) {
518 CODE_ADD(c, 0x3, 2);
519 if (go->interlace_coding)
520 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
522 CODE_ADD(c, 0x3, 2);
524 /* Byte-align with zeros */
525 j = 8 - (CODE_LENGTH(c) % 8);
526 if (j != 8)
527 CODE_ADD(c, 0, j);
530 i = CODE_LENGTH(c) + 4 * 8;
531 buf[2] = 0x00;
532 buf[3] = 0x00;
533 buf[4] = 0x01;
534 buf[5] = 0x00;
535 return i;
538 static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
540 int i, aspect_ratio, picture_rate;
541 CODE_GEN(c, buf + 6);
543 if (go->format == GO7007_FORMAT_MPEG1) {
544 switch (go->aspect_ratio) {
545 case GO7007_RATIO_4_3:
546 aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
547 break;
548 case GO7007_RATIO_16_9:
549 aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
550 break;
551 default:
552 aspect_ratio = 1;
553 break;
555 } else {
556 switch (go->aspect_ratio) {
557 case GO7007_RATIO_4_3:
558 aspect_ratio = 2;
559 break;
560 case GO7007_RATIO_16_9:
561 aspect_ratio = 3;
562 break;
563 default:
564 aspect_ratio = 1;
565 break;
568 switch (go->sensor_framerate) {
569 case 24000:
570 picture_rate = 1;
571 break;
572 case 24024:
573 picture_rate = 2;
574 break;
575 case 25025:
576 picture_rate = go->interlace_coding ? 6 : 3;
577 break;
578 case 30000:
579 picture_rate = go->interlace_coding ? 7 : 4;
580 break;
581 case 30030:
582 picture_rate = go->interlace_coding ? 8 : 5;
583 break;
584 default:
585 picture_rate = 5; /* 30 fps seems like a reasonable default */
586 break;
589 CODE_ADD(c, go->width, 12);
590 CODE_ADD(c, go->height, 12);
591 CODE_ADD(c, aspect_ratio, 4);
592 CODE_ADD(c, picture_rate, 4);
593 CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 20000 : 0x3ffff, 18);
594 CODE_ADD(c, 1, 1);
595 CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 112 : 20, 10);
596 CODE_ADD(c, 0, 3);
598 /* Byte-align with zeros */
599 i = 8 - (CODE_LENGTH(c) % 8);
600 if (i != 8)
601 CODE_ADD(c, 0, i);
603 if (go->format == GO7007_FORMAT_MPEG2) {
604 CODE_ADD(c, 0x1, 24);
605 CODE_ADD(c, 0xb5, 8);
606 CODE_ADD(c, 0x148, 12);
607 if (go->interlace_coding)
608 CODE_ADD(c, 0x20001, 20);
609 else
610 CODE_ADD(c, 0xa0001, 20);
611 CODE_ADD(c, 0, 16);
613 /* Byte-align with zeros */
614 i = 8 - (CODE_LENGTH(c) % 8);
615 if (i != 8)
616 CODE_ADD(c, 0, i);
618 if (ext) {
619 CODE_ADD(c, 0x1, 24);
620 CODE_ADD(c, 0xb52, 12);
621 CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
622 CODE_ADD(c, 0x105, 9);
623 CODE_ADD(c, 0x505, 16);
624 CODE_ADD(c, go->width, 14);
625 CODE_ADD(c, 1, 1);
626 CODE_ADD(c, go->height, 14);
628 /* Byte-align with zeros */
629 i = 8 - (CODE_LENGTH(c) % 8);
630 if (i != 8)
631 CODE_ADD(c, 0, i);
635 i = CODE_LENGTH(c) + 4 * 8;
636 buf[0] = i & 0xff;
637 buf[1] = i >> 8;
638 buf[2] = 0x00;
639 buf[3] = 0x00;
640 buf[4] = 0x01;
641 buf[5] = 0xb3;
642 return i;
645 static int gen_mpeg1hdr_to_package(struct go7007 *go,
646 __le16 *code, int space, int *framelen)
648 u8 *buf;
649 u16 mem = 0x3e00;
650 unsigned int addr = 0x19;
651 int i, off = 0, chunk;
653 buf = kzalloc(5120, GFP_KERNEL);
654 if (buf == NULL) {
655 printk(KERN_ERR "go7007: unable to allocate 5120 bytes for "
656 "firmware construction\n");
657 return -1;
659 framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
660 if (go->interlace_coding)
661 framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
662 0, 2, PFRAME);
663 buf[0] = framelen[0] & 0xff;
664 buf[1] = framelen[0] >> 8;
665 i = 368;
666 framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
667 if (go->interlace_coding)
668 framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
669 0, 2, BFRAME_PRE);
670 buf[i] = framelen[1] & 0xff;
671 buf[i + 1] = framelen[1] >> 8;
672 i += 1632;
673 framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
674 if (go->interlace_coding)
675 framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
676 0, 2, BFRAME_POST);
677 buf[i] = framelen[2] & 0xff;
678 buf[i + 1] = framelen[2] >> 8;
679 i += 1432;
680 framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
681 if (go->interlace_coding)
682 framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
683 0, 2, BFRAME_BIDIR);
684 buf[i] = framelen[3] & 0xff;
685 buf[i + 1] = framelen[3] >> 8;
686 i += 1632 + 16;
687 mpeg1_sequence_header(go, buf + i, 0);
688 i += 40;
689 for (i = 0; i < 5120; i += chunk * 2) {
690 if (space - off < 32) {
691 off = -1;
692 goto done;
695 code[off + 1] = __cpu_to_le16(0x8000 | mem);
697 chunk = 28;
698 if (mem + chunk > 0x4000)
699 chunk = 0x4000 - mem;
700 if (i + 2 * chunk > 5120)
701 chunk = (5120 - i) / 2;
703 if (chunk < 28) {
704 code[off] = __cpu_to_le16(0x4000 | chunk);
705 code[off + 31] = __cpu_to_le16(addr);
706 if (mem + chunk == 0x4000) {
707 mem = 0x3e00;
708 ++addr;
710 } else {
711 code[off] = __cpu_to_le16(0x1000 | 28);
712 code[off + 31] = 0;
713 mem += 28;
716 memcpy(&code[off + 2], buf + i, chunk * 2);
717 off += 32;
719 done:
720 kfree(buf);
721 return off;
724 static int vti_bitlen(struct go7007 *go)
726 unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
728 for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i);
729 return i + 1;
732 static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
733 int modulo, enum mpeg_frame_type frame)
735 int i;
736 CODE_GEN(c, buf + 6);
737 int mb_count = (go->width >> 4) * (go->height >> 4);
739 CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
740 if (modulo)
741 CODE_ADD(c, 0x1, 1);
742 CODE_ADD(c, 0x1, 2);
743 CODE_ADD(c, 0, vti_bitlen(go));
744 CODE_ADD(c, 0x3, 2);
745 if (frame == PFRAME)
746 CODE_ADD(c, 0, 1);
747 CODE_ADD(c, 0xc, 11);
748 if (frame != PFRAME)
749 CODE_ADD(c, 0x4, 3);
750 if (frame != BFRAME_EMPTY) {
751 for (i = 0; i < mb_count; ++i) {
752 switch (frame) {
753 case PFRAME:
754 CODE_ADD(c, 0x1, 1);
755 break;
756 case BFRAME_PRE:
757 CODE_ADD(c, 0x47, 8);
758 break;
759 case BFRAME_POST:
760 CODE_ADD(c, 0x27, 7);
761 break;
762 case BFRAME_BIDIR:
763 CODE_ADD(c, 0x5f, 8);
764 break;
765 case BFRAME_EMPTY: /* keep compiler quiet */
766 break;
771 /* Byte-align with a zero followed by ones */
772 i = 8 - (CODE_LENGTH(c) % 8);
773 CODE_ADD(c, 0, 1);
774 CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
776 i = CODE_LENGTH(c) + 4 * 8;
777 buf[0] = i & 0xff;
778 buf[1] = i >> 8;
779 buf[2] = 0x00;
780 buf[3] = 0x00;
781 buf[4] = 0x01;
782 buf[5] = 0xb6;
783 return i;
786 static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
788 const unsigned char head[] = { 0x00, 0x00, 0x01, 0xb0, go->pali,
789 0x00, 0x00, 0x01, 0xb5, 0x09,
790 0x00, 0x00, 0x01, 0x00,
791 0x00, 0x00, 0x01, 0x20, };
792 int i, aspect_ratio;
793 int fps = go->sensor_framerate / go->fps_scale;
794 CODE_GEN(c, buf + 2 + sizeof(head));
796 switch (go->aspect_ratio) {
797 case GO7007_RATIO_4_3:
798 aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
799 break;
800 case GO7007_RATIO_16_9:
801 aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
802 break;
803 default:
804 aspect_ratio = 1;
805 break;
808 memcpy(buf + 2, head, sizeof(head));
809 CODE_ADD(c, 0x191, 17);
810 CODE_ADD(c, aspect_ratio, 4);
811 CODE_ADD(c, 0x1, 4);
812 CODE_ADD(c, fps, 16);
813 CODE_ADD(c, 0x3, 2);
814 CODE_ADD(c, 1001, vti_bitlen(go));
815 CODE_ADD(c, 1, 1);
816 CODE_ADD(c, go->width, 13);
817 CODE_ADD(c, 1, 1);
818 CODE_ADD(c, go->height, 13);
819 CODE_ADD(c, 0x2830, 14);
821 /* Byte-align */
822 i = 8 - (CODE_LENGTH(c) % 8);
823 CODE_ADD(c, 0, 1);
824 CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
826 i = CODE_LENGTH(c) + sizeof(head) * 8;
827 buf[0] = i & 0xff;
828 buf[1] = i >> 8;
829 return i;
832 static int gen_mpeg4hdr_to_package(struct go7007 *go,
833 __le16 *code, int space, int *framelen)
835 u8 *buf;
836 u16 mem = 0x3e00;
837 unsigned int addr = 0x19;
838 int i, off = 0, chunk;
840 buf = kzalloc(5120, GFP_KERNEL);
841 if (buf == NULL) {
842 printk(KERN_ERR "go7007: unable to allocate 5120 bytes for "
843 "firmware construction\n");
844 return -1;
846 framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
847 i = 368;
848 framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
849 i += 1632;
850 framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
851 i += 1432;
852 framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
853 i += 1632;
854 mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
855 i += 16;
856 mpeg4_sequence_header(go, buf + i, 0);
857 i += 40;
858 for (i = 0; i < 5120; i += chunk * 2) {
859 if (space - off < 32) {
860 off = -1;
861 goto done;
864 code[off + 1] = __cpu_to_le16(0x8000 | mem);
866 chunk = 28;
867 if (mem + chunk > 0x4000)
868 chunk = 0x4000 - mem;
869 if (i + 2 * chunk > 5120)
870 chunk = (5120 - i) / 2;
872 if (chunk < 28) {
873 code[off] = __cpu_to_le16(0x4000 | chunk);
874 code[off + 31] = __cpu_to_le16(addr);
875 if (mem + chunk == 0x4000) {
876 mem = 0x3e00;
877 ++addr;
879 } else {
880 code[off] = __cpu_to_le16(0x1000 | 28);
881 code[off + 31] = 0;
882 mem += 28;
885 memcpy(&code[off + 2], buf + i, chunk * 2);
886 off += 32;
888 mem = 0x3e00;
889 addr = go->ipb ? 0x14f9 : 0x0af9;
890 memset(buf, 0, 5120);
891 framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
892 i = 368;
893 framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
894 i += 1632;
895 framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
896 i += 1432;
897 framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
898 i += 1632;
899 mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
900 i += 16;
901 for (i = 0; i < 5120; i += chunk * 2) {
902 if (space - off < 32) {
903 off = -1;
904 goto done;
907 code[off + 1] = __cpu_to_le16(0x8000 | mem);
909 chunk = 28;
910 if (mem + chunk > 0x4000)
911 chunk = 0x4000 - mem;
912 if (i + 2 * chunk > 5120)
913 chunk = (5120 - i) / 2;
915 if (chunk < 28) {
916 code[off] = __cpu_to_le16(0x4000 | chunk);
917 code[off + 31] = __cpu_to_le16(addr);
918 if (mem + chunk == 0x4000) {
919 mem = 0x3e00;
920 ++addr;
922 } else {
923 code[off] = __cpu_to_le16(0x1000 | 28);
924 code[off + 31] = 0;
925 mem += 28;
928 memcpy(&code[off + 2], buf + i, chunk * 2);
929 off += 32;
931 done:
932 kfree(buf);
933 return off;
936 static int brctrl_to_package(struct go7007 *go,
937 __le16 *code, int space, int *framelen)
939 int converge_speed = 0;
940 int lambda = (go->format == GO7007_FORMAT_MJPEG || go->dvd_mode) ?
941 100 : 0;
942 int peak_rate = 6 * go->bitrate / 5;
943 int vbv_buffer = go->format == GO7007_FORMAT_MJPEG ?
944 go->bitrate :
945 (go->dvd_mode ? 900000 : peak_rate);
946 int fps = go->sensor_framerate / go->fps_scale;
947 int q = 0;
948 /* Bizarre math below depends on rounding errors in division */
949 u32 sgop_expt_addr = go->bitrate / 32 * (go->ipb ? 3 : 1) * 1001 / fps;
950 u32 sgop_peak_addr = peak_rate / 32 * 1001 / fps;
951 u32 total_expt_addr = go->bitrate / 32 * 1000 / fps * (fps / 1000);
952 u32 vbv_alert_addr = vbv_buffer * 3 / (4 * 32);
953 u32 cplx[] = {
954 q > 0 ? sgop_expt_addr * q :
955 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
956 q > 0 ? sgop_expt_addr * q :
957 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
958 q > 0 ? sgop_expt_addr * q :
959 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
960 q > 0 ? sgop_expt_addr * q :
961 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
963 u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
964 u16 pack[] = {
965 0x200e, 0x0000,
966 0xBF20, go->ipb ? converge_speed_ipb[converge_speed]
967 : converge_speed_ip[converge_speed],
968 0xBF21, go->ipb ? 2 : 0,
969 0xBF22, go->ipb ? LAMBDA_table[0][lambda / 2 + 50]
970 : 32767,
971 0xBF23, go->ipb ? LAMBDA_table[1][lambda] : 32767,
972 0xBF24, 32767,
973 0xBF25, lambda > 99 ? 32767 : LAMBDA_table[3][lambda],
974 0xBF26, sgop_expt_addr & 0x0000FFFF,
975 0xBF27, sgop_expt_addr >> 16,
976 0xBF28, sgop_peak_addr & 0x0000FFFF,
977 0xBF29, sgop_peak_addr >> 16,
978 0xBF2A, vbv_alert_addr & 0x0000FFFF,
979 0xBF2B, vbv_alert_addr >> 16,
980 0xBF2C, 0,
981 0xBF2D, 0,
982 0, 0,
984 0x200e, 0x0000,
985 0xBF2E, vbv_alert_addr & 0x0000FFFF,
986 0xBF2F, vbv_alert_addr >> 16,
987 0xBF30, cplx[0] & 0x0000FFFF,
988 0xBF31, cplx[0] >> 16,
989 0xBF32, cplx[1] & 0x0000FFFF,
990 0xBF33, cplx[1] >> 16,
991 0xBF34, cplx[2] & 0x0000FFFF,
992 0xBF35, cplx[2] >> 16,
993 0xBF36, cplx[3] & 0x0000FFFF,
994 0xBF37, cplx[3] >> 16,
995 0xBF38, 0,
996 0xBF39, 0,
997 0xBF3A, total_expt_addr & 0x0000FFFF,
998 0xBF3B, total_expt_addr >> 16,
999 0, 0,
1001 0x200e, 0x0000,
1002 0xBF3C, total_expt_addr & 0x0000FFFF,
1003 0xBF3D, total_expt_addr >> 16,
1004 0xBF3E, 0,
1005 0xBF3F, 0,
1006 0xBF48, 0,
1007 0xBF49, 0,
1008 0xBF4A, calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
1009 0xBF4B, 4,
1010 0xBF4C, 0,
1011 0xBF4D, 0,
1012 0xBF4E, 0,
1013 0xBF4F, 0,
1014 0xBF50, 0,
1015 0xBF51, 0,
1016 0, 0,
1018 0x200e, 0x0000,
1019 0xBF40, sgop_expt_addr & 0x0000FFFF,
1020 0xBF41, sgop_expt_addr >> 16,
1021 0xBF42, 0,
1022 0xBF43, 0,
1023 0xBF44, 0,
1024 0xBF45, 0,
1025 0xBF46, (go->width >> 4) * (go->height >> 4),
1026 0xBF47, 0,
1027 0xBF64, 0,
1028 0xBF65, 0,
1029 0xBF18, framelen[4],
1030 0xBF19, framelen[5],
1031 0xBF1A, framelen[6],
1032 0xBF1B, framelen[7],
1033 0, 0,
1035 #if 0
1036 /* Remove once we don't care about matching */
1037 0x200e, 0x0000,
1038 0xBF56, 4,
1039 0xBF57, 0,
1040 0xBF58, 5,
1041 0xBF59, 0,
1042 0xBF5A, 6,
1043 0xBF5B, 0,
1044 0xBF5C, 8,
1045 0xBF5D, 0,
1046 0xBF5E, 1,
1047 0xBF5F, 0,
1048 0xBF60, 1,
1049 0xBF61, 0,
1050 0xBF62, 0,
1051 0xBF63, 0,
1052 0, 0,
1053 #else
1054 0x2008, 0x0000,
1055 0xBF56, 4,
1056 0xBF57, 0,
1057 0xBF58, 5,
1058 0xBF59, 0,
1059 0xBF5A, 6,
1060 0xBF5B, 0,
1061 0xBF5C, 8,
1062 0xBF5D, 0,
1063 0, 0,
1064 0, 0,
1065 0, 0,
1066 0, 0,
1067 0, 0,
1068 0, 0,
1069 0, 0,
1070 #endif
1072 0x200e, 0x0000,
1073 0xBF10, 0,
1074 0xBF11, 0,
1075 0xBF12, 0,
1076 0xBF13, 0,
1077 0xBF14, 0,
1078 0xBF15, 0,
1079 0xBF16, 0,
1080 0xBF17, 0,
1081 0xBF7E, 0,
1082 0xBF7F, 1,
1083 0xBF52, framelen[0],
1084 0xBF53, framelen[1],
1085 0xBF54, framelen[2],
1086 0xBF55, framelen[3],
1087 0, 0,
1090 return copy_packages(code, pack, 6, space);
1093 static int config_package(struct go7007 *go, __le16 *code, int space)
1095 int fps = go->sensor_framerate / go->fps_scale / 1000;
1096 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1097 int brc_window_size = fps;
1098 int q_min = 2, q_max = 31;
1099 int THACCoeffSet0 = 0;
1100 u16 pack[] = {
1101 0x200e, 0x0000,
1102 0xc002, 0x14b4,
1103 0xc003, 0x28b4,
1104 0xc004, 0x3c5a,
1105 0xdc05, 0x2a77,
1106 0xc6c3, go->format == GO7007_FORMAT_MPEG4 ? 0 :
1107 (go->format == GO7007_FORMAT_H263 ? 0 : 1),
1108 0xc680, go->format == GO7007_FORMAT_MPEG4 ? 0xf1 :
1109 (go->format == GO7007_FORMAT_H263 ? 0x61 :
1110 0xd3),
1111 0xc780, 0x0140,
1112 0xe009, 0x0001,
1113 0xc60f, 0x0008,
1114 0xd4ff, 0x0002,
1115 0xe403, 2340,
1116 0xe406, 75,
1117 0xd411, 0x0001,
1118 0xd410, 0xa1d6,
1119 0x0001, 0x2801,
1121 0x200d, 0x0000,
1122 0xe402, 0x018b,
1123 0xe401, 0x8b01,
1124 0xd472, (go->board_info->sensor_flags &
1125 GO7007_SENSOR_TV) &&
1126 (!go->interlace_coding) ?
1127 0x01b0 : 0x0170,
1128 0xd475, (go->board_info->sensor_flags &
1129 GO7007_SENSOR_TV) &&
1130 (!go->interlace_coding) ?
1131 0x0008 : 0x0009,
1132 0xc404, go->interlace_coding ? 0x44 :
1133 (go->format == GO7007_FORMAT_MPEG4 ? 0x11 :
1134 (go->format == GO7007_FORMAT_MPEG1 ? 0x02 :
1135 (go->format == GO7007_FORMAT_MPEG2 ? 0x04 :
1136 (go->format == GO7007_FORMAT_H263 ? 0x08 :
1137 0x20)))),
1138 0xbf0a, (go->format == GO7007_FORMAT_MPEG4 ? 8 :
1139 (go->format == GO7007_FORMAT_MPEG1 ? 1 :
1140 (go->format == GO7007_FORMAT_MPEG2 ? 2 :
1141 (go->format == GO7007_FORMAT_H263 ? 4 : 16)))) |
1142 ((go->repeat_seqhead ? 1 : 0) << 6) |
1143 ((go->dvd_mode ? 1 : 0) << 9) |
1144 ((go->gop_header_enable ? 1 : 0) << 10),
1145 0xbf0b, 0,
1146 0xdd5a, go->ipb ? 0x14 : 0x0a,
1147 0xbf0c, 0,
1148 0xbf0d, 0,
1149 0xc683, THACCoeffSet0,
1150 0xc40a, (go->width << 4) | rows,
1151 0xe01a, go->board_info->hpi_buffer_cap,
1152 0, 0,
1153 0, 0,
1155 0x2008, 0,
1156 0xe402, 0x88,
1157 0xe401, 0x8f01,
1158 0xbf6a, 0,
1159 0xbf6b, 0,
1160 0xbf6c, 0,
1161 0xbf6d, 0,
1162 0xbf6e, 0,
1163 0xbf6f, 0,
1164 0, 0,
1165 0, 0,
1166 0, 0,
1167 0, 0,
1168 0, 0,
1169 0, 0,
1170 0, 0,
1172 0x200e, 0,
1173 0xbf66, brc_window_size,
1174 0xbf67, 0,
1175 0xbf68, q_min,
1176 0xbf69, q_max,
1177 0xbfe0, 0,
1178 0xbfe1, 0,
1179 0xbfe2, 0,
1180 0xbfe3, go->ipb ? 3 : 1,
1181 0xc031, go->board_info->sensor_flags &
1182 GO7007_SENSOR_VBI ? 1 : 0,
1183 0xc01c, 0x1f,
1184 0xdd8c, 0x15,
1185 0xdd94, 0x15,
1186 0xdd88, go->ipb ? 0x1401 : 0x0a01,
1187 0xdd90, go->ipb ? 0x1401 : 0x0a01,
1188 0, 0,
1190 0x200e, 0,
1191 0xbfe4, 0,
1192 0xbfe5, 0,
1193 0xbfe6, 0,
1194 0xbfe7, fps << 8,
1195 0xbfe8, 0x3a00,
1196 0xbfe9, 0,
1197 0xbfea, 0,
1198 0xbfeb, 0,
1199 0xbfec, (go->interlace_coding ? 1 << 15 : 0) |
1200 (go->modet_enable ? 0xa : 0) |
1201 (go->board_info->sensor_flags &
1202 GO7007_SENSOR_VBI ? 1 : 0),
1203 0xbfed, 0,
1204 0xbfee, 0,
1205 0xbfef, 0,
1206 0xbff0, go->board_info->sensor_flags &
1207 GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1208 0xbff1, 0,
1209 0, 0,
1212 return copy_packages(code, pack, 5, space);
1215 static int seqhead_to_package(struct go7007 *go, __le16 *code, int space,
1216 int (*sequence_header_func)(struct go7007 *go,
1217 unsigned char *buf, int ext))
1219 int vop_time_increment_bitlength = vti_bitlen(go);
1220 int fps = go->sensor_framerate / go->fps_scale *
1221 (go->interlace_coding ? 2 : 1);
1222 unsigned char buf[40] = { };
1223 int len = sequence_header_func(go, buf, 1);
1224 u16 pack[] = {
1225 0x2006, 0,
1226 0xbf08, fps,
1227 0xbf09, 0,
1228 0xbff2, vop_time_increment_bitlength,
1229 0xbff3, (1 << vop_time_increment_bitlength) - 1,
1230 0xbfe6, 0,
1231 0xbfe7, (fps / 1000) << 8,
1232 0, 0,
1233 0, 0,
1234 0, 0,
1235 0, 0,
1236 0, 0,
1237 0, 0,
1238 0, 0,
1239 0, 0,
1240 0, 0,
1242 0x2007, 0,
1243 0xc800, buf[2] << 8 | buf[3],
1244 0xc801, buf[4] << 8 | buf[5],
1245 0xc802, buf[6] << 8 | buf[7],
1246 0xc803, buf[8] << 8 | buf[9],
1247 0xc406, 64,
1248 0xc407, len - 64,
1249 0xc61b, 1,
1250 0, 0,
1251 0, 0,
1252 0, 0,
1253 0, 0,
1254 0, 0,
1255 0, 0,
1256 0, 0,
1257 0, 0,
1259 0x200e, 0,
1260 0xc808, buf[10] << 8 | buf[11],
1261 0xc809, buf[12] << 8 | buf[13],
1262 0xc80a, buf[14] << 8 | buf[15],
1263 0xc80b, buf[16] << 8 | buf[17],
1264 0xc80c, buf[18] << 8 | buf[19],
1265 0xc80d, buf[20] << 8 | buf[21],
1266 0xc80e, buf[22] << 8 | buf[23],
1267 0xc80f, buf[24] << 8 | buf[25],
1268 0xc810, buf[26] << 8 | buf[27],
1269 0xc811, buf[28] << 8 | buf[29],
1270 0xc812, buf[30] << 8 | buf[31],
1271 0xc813, buf[32] << 8 | buf[33],
1272 0xc814, buf[34] << 8 | buf[35],
1273 0xc815, buf[36] << 8 | buf[37],
1274 0, 0,
1275 0, 0,
1276 0, 0,
1279 return copy_packages(code, pack, 3, space);
1282 static int relative_prime(int big, int little)
1284 int remainder;
1286 while (little != 0) {
1287 remainder = big % little;
1288 big = little;
1289 little = remainder;
1291 return big;
1294 static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1296 int arate = go->board_info->audio_rate * 1001 * go->fps_scale;
1297 int ratio = arate / go->sensor_framerate;
1298 int adjratio = ratio * 215 / 100;
1299 int rprime = relative_prime(go->sensor_framerate,
1300 arate % go->sensor_framerate);
1301 int f1 = (arate % go->sensor_framerate) / rprime;
1302 int f2 = (go->sensor_framerate - arate % go->sensor_framerate) / rprime;
1303 u16 pack[] = {
1304 0x200e, 0,
1305 0xbf98, (u16)((-adjratio) & 0xffff),
1306 0xbf99, (u16)((-adjratio) >> 16),
1307 0xbf92, 0,
1308 0xbf93, 0,
1309 0xbff4, f1 > f2 ? f1 : f2,
1310 0xbff5, f1 < f2 ? f1 : f2,
1311 0xbff6, f1 < f2 ? ratio : ratio + 1,
1312 0xbff7, f1 > f2 ? ratio : ratio + 1,
1313 0xbff8, 0,
1314 0xbff9, 0,
1315 0xbffa, adjratio & 0xffff,
1316 0xbffb, adjratio >> 16,
1317 0xbf94, 0,
1318 0xbf95, 0,
1319 0, 0,
1322 return copy_packages(code, pack, 1, space);
1325 static int final_package(struct go7007 *go, __le16 *code, int space)
1327 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1328 u16 pack[] = {
1329 0x8000,
1337 ((go->board_info->sensor_flags & GO7007_SENSOR_TV) &&
1338 (!go->interlace_coding) ?
1339 (1 << 14) | (1 << 9) : 0) |
1340 ((go->encoder_subsample ? 1 : 0) << 8) |
1341 (go->board_info->sensor_flags &
1342 GO7007_SENSOR_CONFIG_MASK),
1343 ((go->encoder_v_halve ? 1 : 0) << 14) |
1344 (go->encoder_v_halve ? rows << 9 : rows << 8) |
1345 (go->encoder_h_halve ? 1 << 6 : 0) |
1346 (go->encoder_h_halve ? go->width >> 3 : go->width >> 4),
1347 (1 << 15) | (go->encoder_v_offset << 6) |
1348 (1 << 7) | (go->encoder_h_offset >> 2),
1349 (1 << 6),
1352 ((go->fps_scale - 1) << 8) |
1353 (go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1354 (1 << 7) : 0) |
1355 0x41,
1356 go->ipb ? 0xd4c : 0x36b,
1357 (rows << 8) | (go->width >> 4),
1358 go->format == GO7007_FORMAT_MPEG4 ? 0x0404 : 0,
1359 (1 << 15) | ((go->interlace_coding ? 1 : 0) << 13) |
1360 ((go->closed_gop ? 1 : 0) << 12) |
1361 ((go->format == GO7007_FORMAT_MPEG4 ? 1 : 0) << 11) |
1362 /* (1 << 9) | */
1363 ((go->ipb ? 3 : 0) << 7) |
1364 ((go->modet_enable ? 1 : 0) << 2) |
1365 ((go->dvd_mode ? 1 : 0) << 1) | 1,
1366 (go->format == GO7007_FORMAT_MPEG1 ? 0x89a0 :
1367 (go->format == GO7007_FORMAT_MPEG2 ? 0x89a0 :
1368 (go->format == GO7007_FORMAT_MJPEG ? 0x89a0 :
1369 (go->format == GO7007_FORMAT_MPEG4 ? 0x8920 :
1370 (go->format == GO7007_FORMAT_H263 ? 0x8920 : 0))))),
1371 go->ipb ? 0x1f15 : 0x1f0b,
1372 go->ipb ? 0x0015 : 0x000b,
1373 go->ipb ? 0xa800 : 0x5800,
1374 0xffff,
1375 0x0020 + 0x034b * 0,
1376 0x0020 + 0x034b * 1,
1377 0x0020 + 0x034b * 2,
1378 0x0020 + 0x034b * 3,
1379 0x0020 + 0x034b * 4,
1380 0x0020 + 0x034b * 5,
1381 go->ipb ? (go->gop_size / 3) : go->gop_size,
1382 (go->height >> 4) * (go->width >> 4) * 110 / 100,
1385 return copy_packages(code, pack, 1, space);
1388 static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1390 int clock_config = ((go->board_info->audio_flags &
1391 GO7007_AUDIO_I2S_MASTER ? 1 : 0) << 11) |
1392 ((go->board_info->audio_flags &
1393 GO7007_AUDIO_OKI_MODE ? 1 : 0) << 8) |
1394 (((go->board_info->audio_bclk_div / 4) - 1) << 4) |
1395 (go->board_info->audio_main_div - 1);
1396 u16 pack[] = {
1397 0x200d, 0,
1398 0x9002, 0,
1399 0x9002, 0,
1400 0x9031, 0,
1401 0x9032, 0,
1402 0x9033, 0,
1403 0x9034, 0,
1404 0x9035, 0,
1405 0x9036, 0,
1406 0x9037, 0,
1407 0x9040, 0,
1408 0x9000, clock_config,
1409 0x9001, (go->board_info->audio_flags & 0xffff) |
1410 (1 << 9),
1411 0x9000, ((go->board_info->audio_flags &
1412 GO7007_AUDIO_I2S_MASTER ?
1413 1 : 0) << 10) |
1414 clock_config,
1415 0, 0,
1416 0, 0,
1417 0x2005, 0,
1418 0x9041, 0,
1419 0x9042, 256,
1420 0x9043, 0,
1421 0x9044, 16,
1422 0x9045, 16,
1423 0, 0,
1424 0, 0,
1425 0, 0,
1426 0, 0,
1427 0, 0,
1428 0, 0,
1429 0, 0,
1430 0, 0,
1431 0, 0,
1432 0, 0,
1435 return copy_packages(code, pack, 2, space);
1438 static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1440 int ret, mb, i, addr, cnt = 0;
1441 u16 pack[32];
1442 u16 thresholds[] = {
1443 0x200e, 0,
1444 0xbf82, go->modet[0].pixel_threshold,
1445 0xbf83, go->modet[1].pixel_threshold,
1446 0xbf84, go->modet[2].pixel_threshold,
1447 0xbf85, go->modet[3].pixel_threshold,
1448 0xbf86, go->modet[0].motion_threshold,
1449 0xbf87, go->modet[1].motion_threshold,
1450 0xbf88, go->modet[2].motion_threshold,
1451 0xbf89, go->modet[3].motion_threshold,
1452 0xbf8a, go->modet[0].mb_threshold,
1453 0xbf8b, go->modet[1].mb_threshold,
1454 0xbf8c, go->modet[2].mb_threshold,
1455 0xbf8d, go->modet[3].mb_threshold,
1456 0xbf8e, 0,
1457 0xbf8f, 0,
1458 0, 0,
1461 ret = copy_packages(code, thresholds, 1, space);
1462 if (ret < 0)
1463 return -1;
1464 cnt += ret;
1466 addr = 0xbac0;
1467 memset(pack, 0, 64);
1468 i = 0;
1469 for (mb = 0; mb < 1624; ++mb) {
1470 pack[i * 2 + 3] <<= 2;
1471 pack[i * 2 + 3] |= go->modet_map[mb];
1472 if (mb % 8 != 7)
1473 continue;
1474 pack[i * 2 + 2] = addr++;
1475 ++i;
1476 if (i == 10 || mb == 1623) {
1477 pack[0] = 0x2000 | i;
1478 ret = copy_packages(code + cnt, pack, 1, space - cnt);
1479 if (ret < 0)
1480 return -1;
1481 cnt += ret;
1482 i = 0;
1483 memset(pack, 0, 64);
1485 pack[i * 2 + 3] = 0;
1488 memset(pack, 0, 64);
1489 i = 0;
1490 for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1491 pack[i * 2 + 2] = addr;
1492 pack[i * 2 + 3] = 0;
1493 ++i;
1494 if (i == 10 || addr == 0xbbf9) {
1495 pack[0] = 0x2000 | i;
1496 ret = copy_packages(code + cnt, pack, 1, space - cnt);
1497 if (ret < 0)
1498 return -1;
1499 cnt += ret;
1500 i = 0;
1501 memset(pack, 0, 64);
1504 return cnt;
1507 static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
1508 int *framelen)
1510 switch (type) {
1511 case SPECIAL_FRM_HEAD:
1512 switch (go->format) {
1513 case GO7007_FORMAT_MJPEG:
1514 return gen_mjpeghdr_to_package(go, code, space);
1515 case GO7007_FORMAT_MPEG1:
1516 case GO7007_FORMAT_MPEG2:
1517 return gen_mpeg1hdr_to_package(go, code, space,
1518 framelen);
1519 case GO7007_FORMAT_MPEG4:
1520 return gen_mpeg4hdr_to_package(go, code, space,
1521 framelen);
1523 case SPECIAL_BRC_CTRL:
1524 return brctrl_to_package(go, code, space, framelen);
1525 case SPECIAL_CONFIG:
1526 return config_package(go, code, space);
1527 case SPECIAL_SEQHEAD:
1528 switch (go->format) {
1529 case GO7007_FORMAT_MPEG1:
1530 case GO7007_FORMAT_MPEG2:
1531 return seqhead_to_package(go, code, space,
1532 mpeg1_sequence_header);
1533 case GO7007_FORMAT_MPEG4:
1534 return seqhead_to_package(go, code, space,
1535 mpeg4_sequence_header);
1536 default:
1537 return 0;
1539 case SPECIAL_AV_SYNC:
1540 return avsync_to_package(go, code, space);
1541 case SPECIAL_FINAL:
1542 return final_package(go, code, space);
1543 case SPECIAL_AUDIO:
1544 return audio_to_package(go, code, space);
1545 case SPECIAL_MODET:
1546 return modet_to_package(go, code, space);
1548 printk(KERN_ERR
1549 "go7007: firmware file contains unsupported feature %04x\n",
1550 type);
1551 return -1;
1554 int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1556 const struct firmware *fw_entry;
1557 __le16 *code, *src;
1558 int framelen[8] = { }; /* holds the lengths of empty frame templates */
1559 int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1560 int mode_flag;
1561 int ret;
1563 switch (go->format) {
1564 case GO7007_FORMAT_MJPEG:
1565 mode_flag = FLAG_MODE_MJPEG;
1566 break;
1567 case GO7007_FORMAT_MPEG1:
1568 mode_flag = FLAG_MODE_MPEG1;
1569 break;
1570 case GO7007_FORMAT_MPEG2:
1571 mode_flag = FLAG_MODE_MPEG2;
1572 break;
1573 case GO7007_FORMAT_MPEG4:
1574 mode_flag = FLAG_MODE_MPEG4;
1575 break;
1576 default:
1577 return -1;
1579 if (request_firmware(&fw_entry, go->board_info->firmware, go->dev)) {
1580 printk(KERN_ERR
1581 "go7007: unable to load firmware from file \"%s\"\n",
1582 go->board_info->firmware);
1583 return -1;
1585 code = kzalloc(codespace * 2, GFP_KERNEL);
1586 if (code == NULL) {
1587 printk(KERN_ERR "go7007: unable to allocate %d bytes for "
1588 "firmware construction\n", codespace * 2);
1589 goto fw_failed;
1591 src = (__le16 *)fw_entry->data;
1592 srclen = fw_entry->size / 2;
1593 while (srclen >= 2) {
1594 chunk_flags = __le16_to_cpu(src[0]);
1595 chunk_len = __le16_to_cpu(src[1]);
1596 if (chunk_len + 2 > srclen) {
1597 printk(KERN_ERR "go7007: firmware file \"%s\" "
1598 "appears to be corrupted\n",
1599 go->board_info->firmware);
1600 goto fw_failed;
1602 if (chunk_flags & mode_flag) {
1603 if (chunk_flags & FLAG_SPECIAL) {
1604 ret = do_special(go, __le16_to_cpu(src[2]),
1605 &code[i], codespace - i, framelen);
1606 if (ret < 0) {
1607 printk(KERN_ERR "go7007: insufficient "
1608 "memory for firmware "
1609 "construction\n");
1610 goto fw_failed;
1612 i += ret;
1613 } else {
1614 if (codespace - i < chunk_len) {
1615 printk(KERN_ERR "go7007: insufficient "
1616 "memory for firmware "
1617 "construction\n");
1618 goto fw_failed;
1620 memcpy(&code[i], &src[2], chunk_len * 2);
1621 i += chunk_len;
1624 srclen -= chunk_len + 2;
1625 src += chunk_len + 2;
1627 release_firmware(fw_entry);
1628 *fw = (u8 *)code;
1629 *fwlen = i * 2;
1630 return 0;
1632 fw_failed:
1633 kfree(code);
1634 release_firmware(fw_entry);
1635 return -1;