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.
15 * This file contains code to generate a firmware image for the GO7007SB
16 * encoder. Much of the firmware is read verbatim from a file, but some of
17 * it concerning bitrate control and other things that can be configured at
18 * run-time are generated dynamically. Note that the format headers
19 * generated here do not affect the functioning of the encoder; they are
20 * merely parroted back to the host at the start of each frame.
23 #include <linux/module.h>
24 #include <linux/time.h>
26 #include <linux/device.h>
27 #include <linux/i2c.h>
28 #include <linux/firmware.h>
29 #include <linux/slab.h>
30 #include <asm/byteorder.h>
32 #include "go7007-priv.h"
34 #define GO7007_FW_NAME "go7007/go7007tv.bin"
36 /* Constants used in the source firmware image to describe code segments */
38 #define FLAG_MODE_MJPEG (1)
39 #define FLAG_MODE_MPEG1 (1<<1)
40 #define FLAG_MODE_MPEG2 (1<<2)
41 #define FLAG_MODE_MPEG4 (1<<3)
42 #define FLAG_MODE_H263 (1<<4)
43 #define FLAG_MODE_ALL (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
44 FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
46 #define FLAG_SPECIAL (1<<8)
48 #define SPECIAL_FRM_HEAD 0
49 #define SPECIAL_BRC_CTRL 1
50 #define SPECIAL_CONFIG 2
51 #define SPECIAL_SEQHEAD 3
52 #define SPECIAL_AV_SYNC 4
53 #define SPECIAL_FINAL 5
54 #define SPECIAL_AUDIO 6
55 #define SPECIAL_MODET 7
57 /* Little data class for creating MPEG headers bit-by-bit */
60 unsigned char *p
; /* destination */
61 u32 a
; /* collects bits at the top of the variable */
62 int b
; /* bit position of most recently-written bit */
63 int len
; /* written out so far */
66 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
68 #define CODE_ADD(name, val, length) do { \
70 name.a |= (val) << name.b; \
71 while (name.b <= 24) { \
72 *name.p = name.a >> 24; \
80 #define CODE_LENGTH(name) (name.len + (32 - name.b))
82 /* Tables for creating the bitrate control data */
84 static const s16 converge_speed_ip
[101] = {
85 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
86 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
87 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
88 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
89 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
90 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
91 5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
92 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
93 19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
94 41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
98 static const s16 converge_speed_ipb
[101] = {
99 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
100 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
101 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
102 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
103 6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
104 9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
105 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
106 28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
107 57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
108 125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
112 static const s16 LAMBDA_table
[4][101] = {
113 { 16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
114 19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
115 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
116 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
117 32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
118 39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
119 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
120 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
121 67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
122 80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
126 20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
127 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
128 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
129 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
130 40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
131 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
132 58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
133 70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
134 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
135 100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
139 24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
140 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
141 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
142 41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
143 49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
144 58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
145 70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
146 84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
147 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
148 120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
152 32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
153 38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
154 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
155 54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
156 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
157 78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
158 93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
159 112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
160 134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
161 160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
166 /* MPEG blank frame generation tables */
168 enum mpeg_frame_type
{
176 static const u32 addrinctab
[33][2] = {
177 { 0x01, 1 }, { 0x03, 3 }, { 0x02, 3 }, { 0x03, 4 },
178 { 0x02, 4 }, { 0x03, 5 }, { 0x02, 5 }, { 0x07, 7 },
179 { 0x06, 7 }, { 0x0b, 8 }, { 0x0a, 8 }, { 0x09, 8 },
180 { 0x08, 8 }, { 0x07, 8 }, { 0x06, 8 }, { 0x17, 10 },
181 { 0x16, 10 }, { 0x15, 10 }, { 0x14, 10 }, { 0x13, 10 },
182 { 0x12, 10 }, { 0x23, 11 }, { 0x22, 11 }, { 0x21, 11 },
183 { 0x20, 11 }, { 0x1f, 11 }, { 0x1e, 11 }, { 0x1d, 11 },
184 { 0x1c, 11 }, { 0x1b, 11 }, { 0x1a, 11 }, { 0x19, 11 },
188 /* Standard JPEG tables */
190 static const u8 default_intra_quant_table
[] = {
191 8, 16, 19, 22, 26, 27, 29, 34,
192 16, 16, 22, 24, 27, 29, 34, 37,
193 19, 22, 26, 27, 29, 34, 34, 38,
194 22, 22, 26, 27, 29, 34, 37, 40,
195 22, 26, 27, 29, 32, 35, 40, 48,
196 26, 27, 29, 32, 35, 40, 48, 58,
197 26, 27, 29, 34, 38, 46, 56, 69,
198 27, 29, 35, 38, 46, 56, 69, 83
201 static const u8 bits_dc_luminance
[] = {
202 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
205 static const u8 val_dc_luminance
[] = {
206 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
209 static const u8 bits_dc_chrominance
[] = {
210 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
213 static const u8 val_dc_chrominance
[] = {
214 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
217 static const u8 bits_ac_luminance
[] = {
218 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
221 static const u8 val_ac_luminance
[] = {
222 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
223 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
224 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
225 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
226 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
227 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
228 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
229 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
230 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
231 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
232 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
233 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
234 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
235 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
236 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
237 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
238 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
239 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
240 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
241 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
245 static const u8 bits_ac_chrominance
[] = {
246 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
249 static const u8 val_ac_chrominance
[] = {
250 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
251 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
252 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
253 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
254 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
255 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
256 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
257 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
258 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
259 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
260 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
261 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
262 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
263 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
264 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
265 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
266 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
267 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
268 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
269 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
273 /* Zig-zag mapping for quant table
275 * OK, let's do this mapping on the actual table above so it doesn't have
276 * to be done on the fly.
278 static const int zz
[64] = {
279 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
280 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
281 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
282 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
285 static int copy_packages(__le16
*dest
, u16
*src
, int pkg_cnt
, int space
)
287 int i
, cnt
= pkg_cnt
* 32;
292 for (i
= 0; i
< cnt
; ++i
)
293 dest
[i
] = cpu_to_le16p(src
+ i
);
298 static int mjpeg_frame_header(struct go7007
*go
, unsigned char *buf
, int q
)
309 buf
[p
++] = default_intra_quant_table
[0];
310 for (i
= 1; i
< 64; ++i
)
311 /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
312 buf
[p
++] = (default_intra_quant_table
[zz
[i
]] * q
) >> 3;
318 buf
[p
++] = go
->height
>> 8;
319 buf
[p
++] = go
->height
& 0xff;
320 buf
[p
++] = go
->width
>> 8;
321 buf
[p
++] = go
->width
& 0xff;
335 buf
[p
++] = 418 & 0xff;
337 memcpy(buf
+ p
, bits_dc_luminance
+ 1, 16);
339 memcpy(buf
+ p
, val_dc_luminance
, sizeof(val_dc_luminance
));
340 p
+= sizeof(val_dc_luminance
);
342 memcpy(buf
+ p
, bits_dc_chrominance
+ 1, 16);
344 memcpy(buf
+ p
, val_dc_chrominance
, sizeof(val_dc_chrominance
));
345 p
+= sizeof(val_dc_chrominance
);
347 memcpy(buf
+ p
, bits_ac_luminance
+ 1, 16);
349 memcpy(buf
+ p
, val_ac_luminance
, sizeof(val_ac_luminance
));
350 p
+= sizeof(val_ac_luminance
);
352 memcpy(buf
+ p
, bits_ac_chrominance
+ 1, 16);
354 memcpy(buf
+ p
, val_ac_chrominance
, sizeof(val_ac_chrominance
));
355 p
+= sizeof(val_ac_chrominance
);
373 static int gen_mjpeghdr_to_package(struct go7007
*go
, __le16
*code
, int space
)
377 unsigned int addr
= 0x19;
378 int size
= 0, i
, off
= 0, chunk
;
380 buf
= kzalloc(4096, GFP_KERNEL
);
384 for (i
= 1; i
< 32; ++i
) {
385 mjpeg_frame_header(go
, buf
+ size
, i
);
388 chunk
= mjpeg_frame_header(go
, buf
+ size
, 1);
389 memmove(buf
+ size
, buf
+ size
+ 80, chunk
- 80);
392 for (i
= 0; i
< size
; i
+= chunk
* 2) {
393 if (space
- off
< 32) {
398 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
401 if (mem
+ chunk
> 0x4000)
402 chunk
= 0x4000 - mem
;
403 if (i
+ 2 * chunk
> size
)
404 chunk
= (size
- i
) / 2;
407 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
408 code
[off
+ 31] = __cpu_to_le16(addr
++);
411 code
[off
] = __cpu_to_le16(0x1000 | 28);
416 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
424 static int mpeg1_frame_header(struct go7007
*go
, unsigned char *buf
,
425 int modulo
, int pict_struct
, enum mpeg_frame_type frame
)
427 int i
, j
, mb_code
, mb_len
;
428 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
429 CODE_GEN(c
, buf
+ 6);
448 default: /* keep the compiler happy */
449 mb_code
= mb_len
= 0;
453 CODE_ADD(c
, frame
== PFRAME
? 0x2 : 0x3, 13);
454 CODE_ADD(c
, 0xffff, 16);
455 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 0x7 : 0x4, 4);
457 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 0x7 : 0x4, 4);
459 CODE_ADD(c
, 0, 4); /* Is this supposed to be here?? */
460 CODE_ADD(c
, 0, 3); /* What is this?? */
461 /* Byte-align with zeros */
462 j
= 8 - (CODE_LENGTH(c
) % 8);
466 if (go
->format
== V4L2_PIX_FMT_MPEG2
) {
467 CODE_ADD(c
, 0x1, 24);
468 CODE_ADD(c
, 0xb5, 8);
469 CODE_ADD(c
, 0x844, 12);
470 CODE_ADD(c
, frame
== PFRAME
? 0xff : 0x44, 8);
471 if (go
->interlace_coding
) {
472 CODE_ADD(c
, pict_struct
, 4);
474 CODE_ADD(c
, 0x000, 11);
476 CODE_ADD(c
, 0x200, 11);
479 CODE_ADD(c
, 0x20c, 11);
481 /* Byte-align with zeros */
482 j
= 8 - (CODE_LENGTH(c
) % 8);
487 for (i
= 0; i
< rows
; ++i
) {
489 CODE_ADD(c
, i
+ 1, 8);
492 CODE_ADD(c
, mb_code
, mb_len
);
493 if (go
->interlace_coding
) {
495 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
497 if (frame
== BFRAME_BIDIR
) {
499 if (go
->interlace_coding
)
500 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
503 for (j
= (go
->width
>> 4) - 2; j
>= 33; j
-= 33)
504 CODE_ADD(c
, 0x8, 11);
505 CODE_ADD(c
, addrinctab
[j
][0], addrinctab
[j
][1]);
506 CODE_ADD(c
, mb_code
, mb_len
);
507 if (go
->interlace_coding
) {
509 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
511 if (frame
== BFRAME_BIDIR
) {
513 if (go
->interlace_coding
)
514 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
518 /* Byte-align with zeros */
519 j
= 8 - (CODE_LENGTH(c
) % 8);
524 i
= CODE_LENGTH(c
) + 4 * 8;
532 static int mpeg1_sequence_header(struct go7007
*go
, unsigned char *buf
, int ext
)
534 int i
, aspect_ratio
, picture_rate
;
535 CODE_GEN(c
, buf
+ 6);
537 if (go
->format
== V4L2_PIX_FMT_MPEG1
) {
538 switch (go
->aspect_ratio
) {
539 case GO7007_RATIO_4_3
:
540 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 3 : 2;
542 case GO7007_RATIO_16_9
:
543 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 5 : 4;
550 switch (go
->aspect_ratio
) {
551 case GO7007_RATIO_4_3
:
554 case GO7007_RATIO_16_9
:
562 switch (go
->sensor_framerate
) {
570 picture_rate
= go
->interlace_coding
? 6 : 3;
573 picture_rate
= go
->interlace_coding
? 7 : 4;
576 picture_rate
= go
->interlace_coding
? 8 : 5;
579 picture_rate
= 5; /* 30 fps seems like a reasonable default */
583 CODE_ADD(c
, go
->width
, 12);
584 CODE_ADD(c
, go
->height
, 12);
585 CODE_ADD(c
, aspect_ratio
, 4);
586 CODE_ADD(c
, picture_rate
, 4);
587 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 20000 : 0x3ffff, 18);
589 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 112 : 20, 10);
592 /* Byte-align with zeros */
593 i
= 8 - (CODE_LENGTH(c
) % 8);
597 if (go
->format
== V4L2_PIX_FMT_MPEG2
) {
598 CODE_ADD(c
, 0x1, 24);
599 CODE_ADD(c
, 0xb5, 8);
600 CODE_ADD(c
, 0x148, 12);
601 if (go
->interlace_coding
)
602 CODE_ADD(c
, 0x20001, 20);
604 CODE_ADD(c
, 0xa0001, 20);
607 /* Byte-align with zeros */
608 i
= 8 - (CODE_LENGTH(c
) % 8);
613 CODE_ADD(c
, 0x1, 24);
614 CODE_ADD(c
, 0xb52, 12);
615 CODE_ADD(c
, go
->standard
== GO7007_STD_NTSC
? 2 : 1, 3);
616 CODE_ADD(c
, 0x105, 9);
617 CODE_ADD(c
, 0x505, 16);
618 CODE_ADD(c
, go
->width
, 14);
620 CODE_ADD(c
, go
->height
, 14);
622 /* Byte-align with zeros */
623 i
= 8 - (CODE_LENGTH(c
) % 8);
629 i
= CODE_LENGTH(c
) + 4 * 8;
639 static int gen_mpeg1hdr_to_package(struct go7007
*go
,
640 __le16
*code
, int space
, int *framelen
)
644 unsigned int addr
= 0x19;
645 int i
, off
= 0, chunk
;
647 buf
= kzalloc(5120, GFP_KERNEL
);
651 framelen
[0] = mpeg1_frame_header(go
, buf
, 0, 1, PFRAME
);
652 if (go
->interlace_coding
)
653 framelen
[0] += mpeg1_frame_header(go
, buf
+ framelen
[0] / 8,
655 buf
[0] = framelen
[0] & 0xff;
656 buf
[1] = framelen
[0] >> 8;
658 framelen
[1] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_PRE
);
659 if (go
->interlace_coding
)
660 framelen
[1] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[1] / 8,
662 buf
[i
] = framelen
[1] & 0xff;
663 buf
[i
+ 1] = framelen
[1] >> 8;
665 framelen
[2] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_POST
);
666 if (go
->interlace_coding
)
667 framelen
[2] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[2] / 8,
669 buf
[i
] = framelen
[2] & 0xff;
670 buf
[i
+ 1] = framelen
[2] >> 8;
672 framelen
[3] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_BIDIR
);
673 if (go
->interlace_coding
)
674 framelen
[3] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[3] / 8,
676 buf
[i
] = framelen
[3] & 0xff;
677 buf
[i
+ 1] = framelen
[3] >> 8;
679 mpeg1_sequence_header(go
, buf
+ i
, 0);
681 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
682 if (space
- off
< 32) {
687 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
690 if (mem
+ chunk
> 0x4000)
691 chunk
= 0x4000 - mem
;
692 if (i
+ 2 * chunk
> 5120)
693 chunk
= (5120 - i
) / 2;
696 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
697 code
[off
+ 31] = __cpu_to_le16(addr
);
698 if (mem
+ chunk
== 0x4000) {
703 code
[off
] = __cpu_to_le16(0x1000 | 28);
708 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
716 static int vti_bitlen(struct go7007
*go
)
718 unsigned int i
, max_time_incr
= go
->sensor_framerate
/ go
->fps_scale
;
720 for (i
= 31; (max_time_incr
& ((1 << i
) - 1)) == max_time_incr
; --i
)
725 static int mpeg4_frame_header(struct go7007
*go
, unsigned char *buf
,
726 int modulo
, enum mpeg_frame_type frame
)
729 CODE_GEN(c
, buf
+ 6);
730 int mb_count
= (go
->width
>> 4) * (go
->height
>> 4);
732 CODE_ADD(c
, frame
== PFRAME
? 0x1 : 0x2, 2);
736 CODE_ADD(c
, 0, vti_bitlen(go
));
740 CODE_ADD(c
, 0xc, 11);
743 if (frame
!= BFRAME_EMPTY
) {
744 for (i
= 0; i
< mb_count
; ++i
) {
750 CODE_ADD(c
, 0x47, 8);
753 CODE_ADD(c
, 0x27, 7);
756 CODE_ADD(c
, 0x5f, 8);
758 case BFRAME_EMPTY
: /* keep compiler quiet */
764 /* Byte-align with a zero followed by ones */
765 i
= 8 - (CODE_LENGTH(c
) % 8);
767 CODE_ADD(c
, (1 << (i
- 1)) - 1, i
- 1);
769 i
= CODE_LENGTH(c
) + 4 * 8;
779 static int mpeg4_sequence_header(struct go7007
*go
, unsigned char *buf
, int ext
)
781 const unsigned char head
[] = { 0x00, 0x00, 0x01, 0xb0, go
->pali
,
782 0x00, 0x00, 0x01, 0xb5, 0x09,
783 0x00, 0x00, 0x01, 0x00,
784 0x00, 0x00, 0x01, 0x20, };
786 int fps
= go
->sensor_framerate
/ go
->fps_scale
;
787 CODE_GEN(c
, buf
+ 2 + sizeof(head
));
789 switch (go
->aspect_ratio
) {
790 case GO7007_RATIO_4_3
:
791 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 3 : 2;
793 case GO7007_RATIO_16_9
:
794 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 5 : 4;
801 memcpy(buf
+ 2, head
, sizeof(head
));
802 CODE_ADD(c
, 0x191, 17);
803 CODE_ADD(c
, aspect_ratio
, 4);
805 CODE_ADD(c
, fps
, 16);
807 CODE_ADD(c
, 1001, vti_bitlen(go
));
809 CODE_ADD(c
, go
->width
, 13);
811 CODE_ADD(c
, go
->height
, 13);
812 CODE_ADD(c
, 0x2830, 14);
815 i
= 8 - (CODE_LENGTH(c
) % 8);
817 CODE_ADD(c
, (1 << (i
- 1)) - 1, i
- 1);
819 i
= CODE_LENGTH(c
) + sizeof(head
) * 8;
825 static int gen_mpeg4hdr_to_package(struct go7007
*go
,
826 __le16
*code
, int space
, int *framelen
)
830 unsigned int addr
= 0x19;
831 int i
, off
= 0, chunk
;
833 buf
= kzalloc(5120, GFP_KERNEL
);
837 framelen
[0] = mpeg4_frame_header(go
, buf
, 0, PFRAME
);
839 framelen
[1] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_PRE
);
841 framelen
[2] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_POST
);
843 framelen
[3] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_BIDIR
);
845 mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_EMPTY
);
847 mpeg4_sequence_header(go
, buf
+ i
, 0);
849 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
850 if (space
- off
< 32) {
855 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
858 if (mem
+ chunk
> 0x4000)
859 chunk
= 0x4000 - mem
;
860 if (i
+ 2 * chunk
> 5120)
861 chunk
= (5120 - i
) / 2;
864 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
865 code
[off
+ 31] = __cpu_to_le16(addr
);
866 if (mem
+ chunk
== 0x4000) {
871 code
[off
] = __cpu_to_le16(0x1000 | 28);
876 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
880 addr
= go
->ipb
? 0x14f9 : 0x0af9;
881 memset(buf
, 0, 5120);
882 framelen
[4] = mpeg4_frame_header(go
, buf
, 1, PFRAME
);
884 framelen
[5] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_PRE
);
886 framelen
[6] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_POST
);
888 framelen
[7] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_BIDIR
);
890 mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_EMPTY
);
892 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
893 if (space
- off
< 32) {
898 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
901 if (mem
+ chunk
> 0x4000)
902 chunk
= 0x4000 - mem
;
903 if (i
+ 2 * chunk
> 5120)
904 chunk
= (5120 - i
) / 2;
907 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
908 code
[off
+ 31] = __cpu_to_le16(addr
);
909 if (mem
+ chunk
== 0x4000) {
914 code
[off
] = __cpu_to_le16(0x1000 | 28);
919 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
927 static int brctrl_to_package(struct go7007
*go
,
928 __le16
*code
, int space
, int *framelen
)
930 int converge_speed
= 0;
931 int lambda
= (go
->format
== V4L2_PIX_FMT_MJPEG
|| go
->dvd_mode
) ?
933 int peak_rate
= 6 * go
->bitrate
/ 5;
934 int vbv_buffer
= go
->format
== V4L2_PIX_FMT_MJPEG
?
936 (go
->dvd_mode
? 900000 : peak_rate
);
937 int fps
= go
->sensor_framerate
/ go
->fps_scale
;
939 /* Bizarre math below depends on rounding errors in division */
940 u32 sgop_expt_addr
= go
->bitrate
/ 32 * (go
->ipb
? 3 : 1) * 1001 / fps
;
941 u32 sgop_peak_addr
= peak_rate
/ 32 * 1001 / fps
;
942 u32 total_expt_addr
= go
->bitrate
/ 32 * 1000 / fps
* (fps
/ 1000);
943 u32 vbv_alert_addr
= vbv_buffer
* 3 / (4 * 32);
945 q
> 0 ? sgop_expt_addr
* q
:
946 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
947 q
> 0 ? sgop_expt_addr
* q
:
948 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
949 q
> 0 ? sgop_expt_addr
* q
:
950 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
951 q
> 0 ? sgop_expt_addr
* q
:
952 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
954 u32 calc_q
= q
> 0 ? q
: cplx
[0] / sgop_expt_addr
;
957 0xBF20, go
->ipb
? converge_speed_ipb
[converge_speed
]
958 : converge_speed_ip
[converge_speed
],
959 0xBF21, go
->ipb
? 2 : 0,
960 0xBF22, go
->ipb
? LAMBDA_table
[0][lambda
/ 2 + 50]
962 0xBF23, go
->ipb
? LAMBDA_table
[1][lambda
] : 32767,
964 0xBF25, lambda
> 99 ? 32767 : LAMBDA_table
[3][lambda
],
965 0xBF26, sgop_expt_addr
& 0x0000FFFF,
966 0xBF27, sgop_expt_addr
>> 16,
967 0xBF28, sgop_peak_addr
& 0x0000FFFF,
968 0xBF29, sgop_peak_addr
>> 16,
969 0xBF2A, vbv_alert_addr
& 0x0000FFFF,
970 0xBF2B, vbv_alert_addr
>> 16,
976 0xBF2E, vbv_alert_addr
& 0x0000FFFF,
977 0xBF2F, vbv_alert_addr
>> 16,
978 0xBF30, cplx
[0] & 0x0000FFFF,
979 0xBF31, cplx
[0] >> 16,
980 0xBF32, cplx
[1] & 0x0000FFFF,
981 0xBF33, cplx
[1] >> 16,
982 0xBF34, cplx
[2] & 0x0000FFFF,
983 0xBF35, cplx
[2] >> 16,
984 0xBF36, cplx
[3] & 0x0000FFFF,
985 0xBF37, cplx
[3] >> 16,
988 0xBF3A, total_expt_addr
& 0x0000FFFF,
989 0xBF3B, total_expt_addr
>> 16,
993 0xBF3C, total_expt_addr
& 0x0000FFFF,
994 0xBF3D, total_expt_addr
>> 16,
999 0xBF4A, calc_q
< 4 ? 4 : (calc_q
> 124 ? 124 : calc_q
),
1010 0xBF40, sgop_expt_addr
& 0x0000FFFF,
1011 0xBF41, sgop_expt_addr
>> 16,
1016 0xBF46, (go
->width
>> 4) * (go
->height
>> 4),
1020 0xBF18, framelen
[4],
1021 0xBF19, framelen
[5],
1022 0xBF1A, framelen
[6],
1023 0xBF1B, framelen
[7],
1027 /* Remove once we don't care about matching */
1074 0xBF52, framelen
[0],
1075 0xBF53, framelen
[1],
1076 0xBF54, framelen
[2],
1077 0xBF55, framelen
[3],
1081 return copy_packages(code
, pack
, 6, space
);
1084 static int config_package(struct go7007
*go
, __le16
*code
, int space
)
1086 int fps
= go
->sensor_framerate
/ go
->fps_scale
/ 1000;
1087 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
1088 int brc_window_size
= fps
;
1089 int q_min
= 2, q_max
= 31;
1090 int THACCoeffSet0
= 0;
1097 0xc6c3, go
->format
== V4L2_PIX_FMT_MPEG4
? 0 :
1098 (go
->format
== V4L2_PIX_FMT_H263
? 0 : 1),
1099 0xc680, go
->format
== V4L2_PIX_FMT_MPEG4
? 0xf1 :
1100 (go
->format
== V4L2_PIX_FMT_H263
? 0x61 :
1115 0xd472, (go
->board_info
->sensor_flags
&
1116 GO7007_SENSOR_TV
) &&
1117 (!go
->interlace_coding
) ?
1119 0xd475, (go
->board_info
->sensor_flags
&
1120 GO7007_SENSOR_TV
) &&
1121 (!go
->interlace_coding
) ?
1123 0xc404, go
->interlace_coding
? 0x44 :
1124 (go
->format
== V4L2_PIX_FMT_MPEG4
? 0x11 :
1125 (go
->format
== V4L2_PIX_FMT_MPEG1
? 0x02 :
1126 (go
->format
== V4L2_PIX_FMT_MPEG2
? 0x04 :
1127 (go
->format
== V4L2_PIX_FMT_H263
? 0x08 :
1129 0xbf0a, (go
->format
== V4L2_PIX_FMT_MPEG4
? 8 :
1130 (go
->format
== V4L2_PIX_FMT_MPEG1
? 1 :
1131 (go
->format
== V4L2_PIX_FMT_MPEG2
? 2 :
1132 (go
->format
== V4L2_PIX_FMT_H263
? 4 : 16)))) |
1133 ((go
->repeat_seqhead
? 1 : 0) << 6) |
1134 ((go
->dvd_mode
? 1 : 0) << 9) |
1135 ((go
->gop_header_enable
? 1 : 0) << 10),
1137 0xdd5a, go
->ipb
? 0x14 : 0x0a,
1140 0xc683, THACCoeffSet0
,
1141 0xc40a, (go
->width
<< 4) | rows
,
1142 0xe01a, go
->board_info
->hpi_buffer_cap
,
1164 0xbf66, brc_window_size
,
1171 0xbfe3, go
->ipb
? 3 : 1,
1172 0xc031, go
->board_info
->sensor_flags
&
1173 GO7007_SENSOR_VBI
? 1 : 0,
1177 0xdd88, go
->ipb
? 0x1401 : 0x0a01,
1178 0xdd90, go
->ipb
? 0x1401 : 0x0a01,
1190 0xbfec, (go
->interlace_coding
? 1 << 15 : 0) |
1191 (go
->modet_enable
? 0xa : 0) |
1192 (go
->board_info
->sensor_flags
&
1193 GO7007_SENSOR_VBI
? 1 : 0),
1197 0xbff0, go
->board_info
->sensor_flags
&
1198 GO7007_SENSOR_TV
? 0xf060 : 0xb060,
1203 return copy_packages(code
, pack
, 5, space
);
1206 static int seqhead_to_package(struct go7007
*go
, __le16
*code
, int space
,
1207 int (*sequence_header_func
)(struct go7007
*go
,
1208 unsigned char *buf
, int ext
))
1210 int vop_time_increment_bitlength
= vti_bitlen(go
);
1211 int fps
= go
->sensor_framerate
/ go
->fps_scale
*
1212 (go
->interlace_coding
? 2 : 1);
1213 unsigned char buf
[40] = { };
1214 int len
= sequence_header_func(go
, buf
, 1);
1219 0xbff2, vop_time_increment_bitlength
,
1220 0xbff3, (1 << vop_time_increment_bitlength
) - 1,
1222 0xbfe7, (fps
/ 1000) << 8,
1234 0xc800, buf
[2] << 8 | buf
[3],
1235 0xc801, buf
[4] << 8 | buf
[5],
1236 0xc802, buf
[6] << 8 | buf
[7],
1237 0xc803, buf
[8] << 8 | buf
[9],
1251 0xc808, buf
[10] << 8 | buf
[11],
1252 0xc809, buf
[12] << 8 | buf
[13],
1253 0xc80a, buf
[14] << 8 | buf
[15],
1254 0xc80b, buf
[16] << 8 | buf
[17],
1255 0xc80c, buf
[18] << 8 | buf
[19],
1256 0xc80d, buf
[20] << 8 | buf
[21],
1257 0xc80e, buf
[22] << 8 | buf
[23],
1258 0xc80f, buf
[24] << 8 | buf
[25],
1259 0xc810, buf
[26] << 8 | buf
[27],
1260 0xc811, buf
[28] << 8 | buf
[29],
1261 0xc812, buf
[30] << 8 | buf
[31],
1262 0xc813, buf
[32] << 8 | buf
[33],
1263 0xc814, buf
[34] << 8 | buf
[35],
1264 0xc815, buf
[36] << 8 | buf
[37],
1270 return copy_packages(code
, pack
, 3, space
);
1273 static int relative_prime(int big
, int little
)
1277 while (little
!= 0) {
1278 remainder
= big
% little
;
1285 static int avsync_to_package(struct go7007
*go
, __le16
*code
, int space
)
1287 int arate
= go
->board_info
->audio_rate
* 1001 * go
->fps_scale
;
1288 int ratio
= arate
/ go
->sensor_framerate
;
1289 int adjratio
= ratio
* 215 / 100;
1290 int rprime
= relative_prime(go
->sensor_framerate
,
1291 arate
% go
->sensor_framerate
);
1292 int f1
= (arate
% go
->sensor_framerate
) / rprime
;
1293 int f2
= (go
->sensor_framerate
- arate
% go
->sensor_framerate
) / rprime
;
1296 0xbf98, (u16
)((-adjratio
) & 0xffff),
1297 0xbf99, (u16
)((-adjratio
) >> 16),
1300 0xbff4, f1
> f2
? f1
: f2
,
1301 0xbff5, f1
< f2
? f1
: f2
,
1302 0xbff6, f1
< f2
? ratio
: ratio
+ 1,
1303 0xbff7, f1
> f2
? ratio
: ratio
+ 1,
1306 0xbffa, adjratio
& 0xffff,
1307 0xbffb, adjratio
>> 16,
1313 return copy_packages(code
, pack
, 1, space
);
1316 static int final_package(struct go7007
*go
, __le16
*code
, int space
)
1318 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
1328 ((go
->board_info
->sensor_flags
& GO7007_SENSOR_TV
) &&
1329 (!go
->interlace_coding
) ?
1330 (1 << 14) | (1 << 9) : 0) |
1331 ((go
->encoder_subsample
? 1 : 0) << 8) |
1332 (go
->board_info
->sensor_flags
&
1333 GO7007_SENSOR_CONFIG_MASK
),
1334 ((go
->encoder_v_halve
? 1 : 0) << 14) |
1335 (go
->encoder_v_halve
? rows
<< 9 : rows
<< 8) |
1336 (go
->encoder_h_halve
? 1 << 6 : 0) |
1337 (go
->encoder_h_halve
? go
->width
>> 3 : go
->width
>> 4),
1338 (1 << 15) | (go
->encoder_v_offset
<< 6) |
1339 (1 << 7) | (go
->encoder_h_offset
>> 2),
1343 ((go
->fps_scale
- 1) << 8) |
1344 (go
->board_info
->sensor_flags
& GO7007_SENSOR_TV
?
1347 go
->ipb
? 0xd4c : 0x36b,
1348 (rows
<< 8) | (go
->width
>> 4),
1349 go
->format
== V4L2_PIX_FMT_MPEG4
? 0x0404 : 0,
1350 (1 << 15) | ((go
->interlace_coding
? 1 : 0) << 13) |
1351 ((go
->closed_gop
? 1 : 0) << 12) |
1352 ((go
->format
== V4L2_PIX_FMT_MPEG4
? 1 : 0) << 11) |
1354 ((go
->ipb
? 3 : 0) << 7) |
1355 ((go
->modet_enable
? 1 : 0) << 2) |
1356 ((go
->dvd_mode
? 1 : 0) << 1) | 1,
1357 (go
->format
== V4L2_PIX_FMT_MPEG1
? 0x89a0 :
1358 (go
->format
== V4L2_PIX_FMT_MPEG2
? 0x89a0 :
1359 (go
->format
== V4L2_PIX_FMT_MJPEG
? 0x89a0 :
1360 (go
->format
== V4L2_PIX_FMT_MPEG4
? 0x8920 :
1361 (go
->format
== V4L2_PIX_FMT_H263
? 0x8920 : 0))))),
1362 go
->ipb
? 0x1f15 : 0x1f0b,
1363 go
->ipb
? 0x0015 : 0x000b,
1364 go
->ipb
? 0xa800 : 0x5800,
1366 0x0020 + 0x034b * 0,
1367 0x0020 + 0x034b * 1,
1368 0x0020 + 0x034b * 2,
1369 0x0020 + 0x034b * 3,
1370 0x0020 + 0x034b * 4,
1371 0x0020 + 0x034b * 5,
1372 go
->ipb
? (go
->gop_size
/ 3) : go
->gop_size
,
1373 (go
->height
>> 4) * (go
->width
>> 4) * 110 / 100,
1376 return copy_packages(code
, pack
, 1, space
);
1379 static int audio_to_package(struct go7007
*go
, __le16
*code
, int space
)
1381 int clock_config
= ((go
->board_info
->audio_flags
&
1382 GO7007_AUDIO_I2S_MASTER
? 1 : 0) << 11) |
1383 ((go
->board_info
->audio_flags
&
1384 GO7007_AUDIO_OKI_MODE
? 1 : 0) << 8) |
1385 (((go
->board_info
->audio_bclk_div
/ 4) - 1) << 4) |
1386 (go
->board_info
->audio_main_div
- 1);
1399 0x9000, clock_config
,
1400 0x9001, (go
->board_info
->audio_flags
& 0xffff) |
1402 0x9000, ((go
->board_info
->audio_flags
&
1403 GO7007_AUDIO_I2S_MASTER
?
1426 return copy_packages(code
, pack
, 2, space
);
1429 static int modet_to_package(struct go7007
*go
, __le16
*code
, int space
)
1431 bool has_modet0
= go
->modet
[0].enable
;
1432 bool has_modet1
= go
->modet
[1].enable
;
1433 bool has_modet2
= go
->modet
[2].enable
;
1434 bool has_modet3
= go
->modet
[3].enable
;
1435 int ret
, mb
, i
, addr
, cnt
= 0;
1437 u16 thresholds
[] = {
1439 0xbf82, has_modet0
? go
->modet
[0].pixel_threshold
: 32767,
1440 0xbf83, has_modet1
? go
->modet
[1].pixel_threshold
: 32767,
1441 0xbf84, has_modet2
? go
->modet
[2].pixel_threshold
: 32767,
1442 0xbf85, has_modet3
? go
->modet
[3].pixel_threshold
: 32767,
1443 0xbf86, has_modet0
? go
->modet
[0].motion_threshold
: 32767,
1444 0xbf87, has_modet1
? go
->modet
[1].motion_threshold
: 32767,
1445 0xbf88, has_modet2
? go
->modet
[2].motion_threshold
: 32767,
1446 0xbf89, has_modet3
? go
->modet
[3].motion_threshold
: 32767,
1447 0xbf8a, has_modet0
? go
->modet
[0].mb_threshold
: 32767,
1448 0xbf8b, has_modet1
? go
->modet
[1].mb_threshold
: 32767,
1449 0xbf8c, has_modet2
? go
->modet
[2].mb_threshold
: 32767,
1450 0xbf8d, has_modet3
? go
->modet
[3].mb_threshold
: 32767,
1456 ret
= copy_packages(code
, thresholds
, 1, space
);
1462 memset(pack
, 0, 64);
1464 for (mb
= 0; mb
< 1624; ++mb
) {
1465 pack
[i
* 2 + 3] <<= 2;
1466 pack
[i
* 2 + 3] |= go
->modet_map
[mb
];
1469 pack
[i
* 2 + 2] = addr
++;
1471 if (i
== 10 || mb
== 1623) {
1472 pack
[0] = 0x2000 | i
;
1473 ret
= copy_packages(code
+ cnt
, pack
, 1, space
- cnt
);
1478 memset(pack
, 0, 64);
1480 pack
[i
* 2 + 3] = 0;
1483 memset(pack
, 0, 64);
1485 for (addr
= 0xbb90; addr
< 0xbbfa; ++addr
) {
1486 pack
[i
* 2 + 2] = addr
;
1487 pack
[i
* 2 + 3] = 0;
1489 if (i
== 10 || addr
== 0xbbf9) {
1490 pack
[0] = 0x2000 | i
;
1491 ret
= copy_packages(code
+ cnt
, pack
, 1, space
- cnt
);
1496 memset(pack
, 0, 64);
1502 static int do_special(struct go7007
*go
, u16 type
, __le16
*code
, int space
,
1506 case SPECIAL_FRM_HEAD
:
1507 switch (go
->format
) {
1508 case V4L2_PIX_FMT_MJPEG
:
1509 return gen_mjpeghdr_to_package(go
, code
, space
);
1510 case V4L2_PIX_FMT_MPEG1
:
1511 case V4L2_PIX_FMT_MPEG2
:
1512 return gen_mpeg1hdr_to_package(go
, code
, space
,
1514 case V4L2_PIX_FMT_MPEG4
:
1515 return gen_mpeg4hdr_to_package(go
, code
, space
,
1521 case SPECIAL_BRC_CTRL
:
1522 return brctrl_to_package(go
, code
, space
, framelen
);
1523 case SPECIAL_CONFIG
:
1524 return config_package(go
, code
, space
);
1525 case SPECIAL_SEQHEAD
:
1526 switch (go
->format
) {
1527 case V4L2_PIX_FMT_MPEG1
:
1528 case V4L2_PIX_FMT_MPEG2
:
1529 return seqhead_to_package(go
, code
, space
,
1530 mpeg1_sequence_header
);
1531 case V4L2_PIX_FMT_MPEG4
:
1532 return seqhead_to_package(go
, code
, space
,
1533 mpeg4_sequence_header
);
1537 case SPECIAL_AV_SYNC
:
1538 return avsync_to_package(go
, code
, space
);
1540 return final_package(go
, code
, space
);
1542 return audio_to_package(go
, code
, space
);
1544 return modet_to_package(go
, code
, space
);
1547 "firmware file contains unsupported feature %04x\n", type
);
1551 int go7007_construct_fw_image(struct go7007
*go
, u8
**fw
, int *fwlen
)
1553 const struct firmware
*fw_entry
;
1555 int framelen
[8] = { }; /* holds the lengths of empty frame templates */
1556 int codespace
= 64 * 1024, i
= 0, srclen
, chunk_len
, chunk_flags
;
1560 switch (go
->format
) {
1561 case V4L2_PIX_FMT_MJPEG
:
1562 mode_flag
= FLAG_MODE_MJPEG
;
1564 case V4L2_PIX_FMT_MPEG1
:
1565 mode_flag
= FLAG_MODE_MPEG1
;
1567 case V4L2_PIX_FMT_MPEG2
:
1568 mode_flag
= FLAG_MODE_MPEG2
;
1570 case V4L2_PIX_FMT_MPEG4
:
1571 mode_flag
= FLAG_MODE_MPEG4
;
1576 if (request_firmware(&fw_entry
, GO7007_FW_NAME
, go
->dev
)) {
1578 "unable to load firmware from file \"%s\"\n",
1582 code
= kcalloc(codespace
, 2, GFP_KERNEL
);
1586 src
= (__le16
*)fw_entry
->data
;
1587 srclen
= fw_entry
->size
/ 2;
1588 while (srclen
>= 2) {
1589 chunk_flags
= __le16_to_cpu(src
[0]);
1590 chunk_len
= __le16_to_cpu(src
[1]);
1591 if (chunk_len
+ 2 > srclen
) {
1593 "firmware file \"%s\" appears to be corrupted\n",
1597 if (chunk_flags
& mode_flag
) {
1598 if (chunk_flags
& FLAG_SPECIAL
) {
1599 ret
= do_special(go
, __le16_to_cpu(src
[2]),
1600 &code
[i
], codespace
- i
, framelen
);
1603 "insufficient memory for firmware construction\n");
1608 if (codespace
- i
< chunk_len
) {
1610 "insufficient memory for firmware construction\n");
1613 memcpy(&code
[i
], &src
[2], chunk_len
* 2);
1617 srclen
-= chunk_len
+ 2;
1618 src
+= chunk_len
+ 2;
1620 release_firmware(fw_entry
);
1627 release_firmware(fw_entry
);
1631 MODULE_FIRMWARE(GO7007_FW_NAME
);