1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2005-2006 Micronas USA Inc.
7 * This file contains code to generate a firmware image for the GO7007SB
8 * encoder. Much of the firmware is read verbatim from a file, but some of
9 * it concerning bitrate control and other things that can be configured at
10 * run-time are generated dynamically. Note that the format headers
11 * generated here do not affect the functioning of the encoder; they are
12 * merely parroted back to the host at the start of each frame.
15 #include <linux/module.h>
16 #include <linux/time.h>
18 #include <linux/device.h>
19 #include <linux/i2c.h>
20 #include <linux/firmware.h>
21 #include <linux/slab.h>
22 #include <asm/byteorder.h>
24 #include "go7007-priv.h"
26 #define GO7007_FW_NAME "go7007/go7007tv.bin"
28 /* Constants used in the source firmware image to describe code segments */
30 #define FLAG_MODE_MJPEG (1)
31 #define FLAG_MODE_MPEG1 (1<<1)
32 #define FLAG_MODE_MPEG2 (1<<2)
33 #define FLAG_MODE_MPEG4 (1<<3)
34 #define FLAG_MODE_H263 (1<<4)
35 #define FLAG_MODE_ALL (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
36 FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
38 #define FLAG_SPECIAL (1<<8)
40 #define SPECIAL_FRM_HEAD 0
41 #define SPECIAL_BRC_CTRL 1
42 #define SPECIAL_CONFIG 2
43 #define SPECIAL_SEQHEAD 3
44 #define SPECIAL_AV_SYNC 4
45 #define SPECIAL_FINAL 5
46 #define SPECIAL_AUDIO 6
47 #define SPECIAL_MODET 7
49 /* Little data class for creating MPEG headers bit-by-bit */
52 unsigned char *p
; /* destination */
53 u32 a
; /* collects bits at the top of the variable */
54 int b
; /* bit position of most recently-written bit */
55 int len
; /* written out so far */
58 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
60 #define CODE_ADD(name, val, length) do { \
62 name.a |= (val) << name.b; \
63 while (name.b <= 24) { \
64 *name.p = name.a >> 24; \
72 #define CODE_LENGTH(name) (name.len + (32 - name.b))
74 /* Tables for creating the bitrate control data */
76 static const s16 converge_speed_ip
[101] = {
77 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
78 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
79 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
80 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
82 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
83 5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
84 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
85 19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
86 41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
90 static const s16 converge_speed_ipb
[101] = {
91 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
92 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
95 6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
96 9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
97 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
98 28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
99 57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
100 125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
104 static const s16 LAMBDA_table
[4][101] = {
105 { 16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
106 19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
107 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
108 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
109 32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
110 39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
111 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
112 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
113 67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
114 80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
118 20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
119 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
120 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
121 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
122 40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
123 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
124 58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
125 70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
126 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
127 100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
131 24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
132 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
133 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
134 41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
135 49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
136 58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
137 70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
138 84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
139 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
140 120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
144 32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
145 38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
146 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
147 54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
148 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
149 78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
150 93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
151 112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
152 134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
153 160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
158 /* MPEG blank frame generation tables */
160 enum mpeg_frame_type
{
168 static const u32 addrinctab
[33][2] = {
169 { 0x01, 1 }, { 0x03, 3 }, { 0x02, 3 }, { 0x03, 4 },
170 { 0x02, 4 }, { 0x03, 5 }, { 0x02, 5 }, { 0x07, 7 },
171 { 0x06, 7 }, { 0x0b, 8 }, { 0x0a, 8 }, { 0x09, 8 },
172 { 0x08, 8 }, { 0x07, 8 }, { 0x06, 8 }, { 0x17, 10 },
173 { 0x16, 10 }, { 0x15, 10 }, { 0x14, 10 }, { 0x13, 10 },
174 { 0x12, 10 }, { 0x23, 11 }, { 0x22, 11 }, { 0x21, 11 },
175 { 0x20, 11 }, { 0x1f, 11 }, { 0x1e, 11 }, { 0x1d, 11 },
176 { 0x1c, 11 }, { 0x1b, 11 }, { 0x1a, 11 }, { 0x19, 11 },
180 /* Standard JPEG tables */
182 static const u8 default_intra_quant_table
[] = {
183 8, 16, 19, 22, 26, 27, 29, 34,
184 16, 16, 22, 24, 27, 29, 34, 37,
185 19, 22, 26, 27, 29, 34, 34, 38,
186 22, 22, 26, 27, 29, 34, 37, 40,
187 22, 26, 27, 29, 32, 35, 40, 48,
188 26, 27, 29, 32, 35, 40, 48, 58,
189 26, 27, 29, 34, 38, 46, 56, 69,
190 27, 29, 35, 38, 46, 56, 69, 83
193 static const u8 bits_dc_luminance
[] = {
194 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
197 static const u8 val_dc_luminance
[] = {
198 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
201 static const u8 bits_dc_chrominance
[] = {
202 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
205 static const u8 val_dc_chrominance
[] = {
206 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
209 static const u8 bits_ac_luminance
[] = {
210 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
213 static const u8 val_ac_luminance
[] = {
214 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
215 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
216 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
217 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
218 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
219 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
220 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
221 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
222 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
223 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
224 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
225 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
226 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
227 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
228 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
229 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
230 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
231 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
232 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
233 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
237 static const u8 bits_ac_chrominance
[] = {
238 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
241 static const u8 val_ac_chrominance
[] = {
242 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
243 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
244 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
245 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
246 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
247 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
248 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
249 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
250 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
251 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
252 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
253 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
254 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
255 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
256 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
257 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
258 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
259 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
260 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
261 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
265 /* Zig-zag mapping for quant table
267 * OK, let's do this mapping on the actual table above so it doesn't have
268 * to be done on the fly.
270 static const int zz
[64] = {
271 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
272 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
273 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
274 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
277 static int copy_packages(__le16
*dest
, u16
*src
, int pkg_cnt
, int space
)
279 int i
, cnt
= pkg_cnt
* 32;
284 for (i
= 0; i
< cnt
; ++i
)
285 dest
[i
] = cpu_to_le16p(src
+ i
);
290 static int mjpeg_frame_header(struct go7007
*go
, unsigned char *buf
, int q
)
301 buf
[p
++] = default_intra_quant_table
[0];
302 for (i
= 1; i
< 64; ++i
)
303 /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
304 buf
[p
++] = (default_intra_quant_table
[zz
[i
]] * q
) >> 3;
310 buf
[p
++] = go
->height
>> 8;
311 buf
[p
++] = go
->height
& 0xff;
312 buf
[p
++] = go
->width
>> 8;
313 buf
[p
++] = go
->width
& 0xff;
327 buf
[p
++] = 418 & 0xff;
329 memcpy(buf
+ p
, bits_dc_luminance
+ 1, 16);
331 memcpy(buf
+ p
, val_dc_luminance
, sizeof(val_dc_luminance
));
332 p
+= sizeof(val_dc_luminance
);
334 memcpy(buf
+ p
, bits_dc_chrominance
+ 1, 16);
336 memcpy(buf
+ p
, val_dc_chrominance
, sizeof(val_dc_chrominance
));
337 p
+= sizeof(val_dc_chrominance
);
339 memcpy(buf
+ p
, bits_ac_luminance
+ 1, 16);
341 memcpy(buf
+ p
, val_ac_luminance
, sizeof(val_ac_luminance
));
342 p
+= sizeof(val_ac_luminance
);
344 memcpy(buf
+ p
, bits_ac_chrominance
+ 1, 16);
346 memcpy(buf
+ p
, val_ac_chrominance
, sizeof(val_ac_chrominance
));
347 p
+= sizeof(val_ac_chrominance
);
365 static int gen_mjpeghdr_to_package(struct go7007
*go
, __le16
*code
, int space
)
369 unsigned int addr
= 0x19;
370 int size
= 0, i
, off
= 0, chunk
;
372 buf
= kzalloc(4096, GFP_KERNEL
);
376 for (i
= 1; i
< 32; ++i
) {
377 mjpeg_frame_header(go
, buf
+ size
, i
);
380 chunk
= mjpeg_frame_header(go
, buf
+ size
, 1);
381 memmove(buf
+ size
, buf
+ size
+ 80, chunk
- 80);
384 for (i
= 0; i
< size
; i
+= chunk
* 2) {
385 if (space
- off
< 32) {
390 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
393 if (mem
+ chunk
> 0x4000)
394 chunk
= 0x4000 - mem
;
395 if (i
+ 2 * chunk
> size
)
396 chunk
= (size
- i
) / 2;
399 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
400 code
[off
+ 31] = __cpu_to_le16(addr
++);
403 code
[off
] = __cpu_to_le16(0x1000 | 28);
408 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
416 static int mpeg1_frame_header(struct go7007
*go
, unsigned char *buf
,
417 int modulo
, int pict_struct
, enum mpeg_frame_type frame
)
419 int i
, j
, mb_code
, mb_len
;
420 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
421 CODE_GEN(c
, buf
+ 6);
440 default: /* keep the compiler happy */
441 mb_code
= mb_len
= 0;
445 CODE_ADD(c
, frame
== PFRAME
? 0x2 : 0x3, 13);
446 CODE_ADD(c
, 0xffff, 16);
447 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 0x7 : 0x4, 4);
449 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 0x7 : 0x4, 4);
451 CODE_ADD(c
, 0, 4); /* Is this supposed to be here?? */
452 CODE_ADD(c
, 0, 3); /* What is this?? */
453 /* Byte-align with zeros */
454 j
= 8 - (CODE_LENGTH(c
) % 8);
458 if (go
->format
== V4L2_PIX_FMT_MPEG2
) {
459 CODE_ADD(c
, 0x1, 24);
460 CODE_ADD(c
, 0xb5, 8);
461 CODE_ADD(c
, 0x844, 12);
462 CODE_ADD(c
, frame
== PFRAME
? 0xff : 0x44, 8);
463 if (go
->interlace_coding
) {
464 CODE_ADD(c
, pict_struct
, 4);
466 CODE_ADD(c
, 0x000, 11);
468 CODE_ADD(c
, 0x200, 11);
471 CODE_ADD(c
, 0x20c, 11);
473 /* Byte-align with zeros */
474 j
= 8 - (CODE_LENGTH(c
) % 8);
479 for (i
= 0; i
< rows
; ++i
) {
481 CODE_ADD(c
, i
+ 1, 8);
484 CODE_ADD(c
, mb_code
, mb_len
);
485 if (go
->interlace_coding
) {
487 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
489 if (frame
== BFRAME_BIDIR
) {
491 if (go
->interlace_coding
)
492 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
495 for (j
= (go
->width
>> 4) - 2; j
>= 33; j
-= 33)
496 CODE_ADD(c
, 0x8, 11);
497 CODE_ADD(c
, addrinctab
[j
][0], addrinctab
[j
][1]);
498 CODE_ADD(c
, mb_code
, mb_len
);
499 if (go
->interlace_coding
) {
501 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
503 if (frame
== BFRAME_BIDIR
) {
505 if (go
->interlace_coding
)
506 CODE_ADD(c
, pict_struct
== 1 ? 0x0 : 0x1, 1);
510 /* Byte-align with zeros */
511 j
= 8 - (CODE_LENGTH(c
) % 8);
516 i
= CODE_LENGTH(c
) + 4 * 8;
524 static int mpeg1_sequence_header(struct go7007
*go
, unsigned char *buf
, int ext
)
526 int i
, aspect_ratio
, picture_rate
;
527 CODE_GEN(c
, buf
+ 6);
529 if (go
->format
== V4L2_PIX_FMT_MPEG1
) {
530 switch (go
->aspect_ratio
) {
531 case GO7007_RATIO_4_3
:
532 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 3 : 2;
534 case GO7007_RATIO_16_9
:
535 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 5 : 4;
542 switch (go
->aspect_ratio
) {
543 case GO7007_RATIO_4_3
:
546 case GO7007_RATIO_16_9
:
554 switch (go
->sensor_framerate
) {
562 picture_rate
= go
->interlace_coding
? 6 : 3;
565 picture_rate
= go
->interlace_coding
? 7 : 4;
568 picture_rate
= go
->interlace_coding
? 8 : 5;
571 picture_rate
= 5; /* 30 fps seems like a reasonable default */
575 CODE_ADD(c
, go
->width
, 12);
576 CODE_ADD(c
, go
->height
, 12);
577 CODE_ADD(c
, aspect_ratio
, 4);
578 CODE_ADD(c
, picture_rate
, 4);
579 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 20000 : 0x3ffff, 18);
581 CODE_ADD(c
, go
->format
== V4L2_PIX_FMT_MPEG2
? 112 : 20, 10);
584 /* Byte-align with zeros */
585 i
= 8 - (CODE_LENGTH(c
) % 8);
589 if (go
->format
== V4L2_PIX_FMT_MPEG2
) {
590 CODE_ADD(c
, 0x1, 24);
591 CODE_ADD(c
, 0xb5, 8);
592 CODE_ADD(c
, 0x148, 12);
593 if (go
->interlace_coding
)
594 CODE_ADD(c
, 0x20001, 20);
596 CODE_ADD(c
, 0xa0001, 20);
599 /* Byte-align with zeros */
600 i
= 8 - (CODE_LENGTH(c
) % 8);
605 CODE_ADD(c
, 0x1, 24);
606 CODE_ADD(c
, 0xb52, 12);
607 CODE_ADD(c
, go
->standard
== GO7007_STD_NTSC
? 2 : 1, 3);
608 CODE_ADD(c
, 0x105, 9);
609 CODE_ADD(c
, 0x505, 16);
610 CODE_ADD(c
, go
->width
, 14);
612 CODE_ADD(c
, go
->height
, 14);
614 /* Byte-align with zeros */
615 i
= 8 - (CODE_LENGTH(c
) % 8);
621 i
= CODE_LENGTH(c
) + 4 * 8;
631 static int gen_mpeg1hdr_to_package(struct go7007
*go
,
632 __le16
*code
, int space
, int *framelen
)
636 unsigned int addr
= 0x19;
637 int i
, off
= 0, chunk
;
639 buf
= kzalloc(5120, GFP_KERNEL
);
643 framelen
[0] = mpeg1_frame_header(go
, buf
, 0, 1, PFRAME
);
644 if (go
->interlace_coding
)
645 framelen
[0] += mpeg1_frame_header(go
, buf
+ framelen
[0] / 8,
647 buf
[0] = framelen
[0] & 0xff;
648 buf
[1] = framelen
[0] >> 8;
650 framelen
[1] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_PRE
);
651 if (go
->interlace_coding
)
652 framelen
[1] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[1] / 8,
654 buf
[i
] = framelen
[1] & 0xff;
655 buf
[i
+ 1] = framelen
[1] >> 8;
657 framelen
[2] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_POST
);
658 if (go
->interlace_coding
)
659 framelen
[2] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[2] / 8,
661 buf
[i
] = framelen
[2] & 0xff;
662 buf
[i
+ 1] = framelen
[2] >> 8;
664 framelen
[3] = mpeg1_frame_header(go
, buf
+ i
, 0, 1, BFRAME_BIDIR
);
665 if (go
->interlace_coding
)
666 framelen
[3] += mpeg1_frame_header(go
, buf
+ i
+ framelen
[3] / 8,
668 buf
[i
] = framelen
[3] & 0xff;
669 buf
[i
+ 1] = framelen
[3] >> 8;
671 mpeg1_sequence_header(go
, buf
+ i
, 0);
673 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
674 if (space
- off
< 32) {
679 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
682 if (mem
+ chunk
> 0x4000)
683 chunk
= 0x4000 - mem
;
684 if (i
+ 2 * chunk
> 5120)
685 chunk
= (5120 - i
) / 2;
688 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
689 code
[off
+ 31] = __cpu_to_le16(addr
);
690 if (mem
+ chunk
== 0x4000) {
695 code
[off
] = __cpu_to_le16(0x1000 | 28);
700 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
708 static int vti_bitlen(struct go7007
*go
)
710 unsigned int i
, max_time_incr
= go
->sensor_framerate
/ go
->fps_scale
;
712 for (i
= 31; (max_time_incr
& ((1 << i
) - 1)) == max_time_incr
; --i
)
717 static int mpeg4_frame_header(struct go7007
*go
, unsigned char *buf
,
718 int modulo
, enum mpeg_frame_type frame
)
721 CODE_GEN(c
, buf
+ 6);
722 int mb_count
= (go
->width
>> 4) * (go
->height
>> 4);
724 CODE_ADD(c
, frame
== PFRAME
? 0x1 : 0x2, 2);
728 CODE_ADD(c
, 0, vti_bitlen(go
));
732 CODE_ADD(c
, 0xc, 11);
735 if (frame
!= BFRAME_EMPTY
) {
736 for (i
= 0; i
< mb_count
; ++i
) {
742 CODE_ADD(c
, 0x47, 8);
745 CODE_ADD(c
, 0x27, 7);
748 CODE_ADD(c
, 0x5f, 8);
750 case BFRAME_EMPTY
: /* keep compiler quiet */
756 /* Byte-align with a zero followed by ones */
757 i
= 8 - (CODE_LENGTH(c
) % 8);
759 CODE_ADD(c
, (1 << (i
- 1)) - 1, i
- 1);
761 i
= CODE_LENGTH(c
) + 4 * 8;
771 static int mpeg4_sequence_header(struct go7007
*go
, unsigned char *buf
, int ext
)
773 const unsigned char head
[] = { 0x00, 0x00, 0x01, 0xb0, go
->pali
,
774 0x00, 0x00, 0x01, 0xb5, 0x09,
775 0x00, 0x00, 0x01, 0x00,
776 0x00, 0x00, 0x01, 0x20, };
778 int fps
= go
->sensor_framerate
/ go
->fps_scale
;
779 CODE_GEN(c
, buf
+ 2 + sizeof(head
));
781 switch (go
->aspect_ratio
) {
782 case GO7007_RATIO_4_3
:
783 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 3 : 2;
785 case GO7007_RATIO_16_9
:
786 aspect_ratio
= go
->standard
== GO7007_STD_NTSC
? 5 : 4;
793 memcpy(buf
+ 2, head
, sizeof(head
));
794 CODE_ADD(c
, 0x191, 17);
795 CODE_ADD(c
, aspect_ratio
, 4);
797 CODE_ADD(c
, fps
, 16);
799 CODE_ADD(c
, 1001, vti_bitlen(go
));
801 CODE_ADD(c
, go
->width
, 13);
803 CODE_ADD(c
, go
->height
, 13);
804 CODE_ADD(c
, 0x2830, 14);
807 i
= 8 - (CODE_LENGTH(c
) % 8);
809 CODE_ADD(c
, (1 << (i
- 1)) - 1, i
- 1);
811 i
= CODE_LENGTH(c
) + sizeof(head
) * 8;
817 static int gen_mpeg4hdr_to_package(struct go7007
*go
,
818 __le16
*code
, int space
, int *framelen
)
822 unsigned int addr
= 0x19;
823 int i
, off
= 0, chunk
;
825 buf
= kzalloc(5120, GFP_KERNEL
);
829 framelen
[0] = mpeg4_frame_header(go
, buf
, 0, PFRAME
);
831 framelen
[1] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_PRE
);
833 framelen
[2] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_POST
);
835 framelen
[3] = mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_BIDIR
);
837 mpeg4_frame_header(go
, buf
+ i
, 0, BFRAME_EMPTY
);
839 mpeg4_sequence_header(go
, buf
+ i
, 0);
841 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
842 if (space
- off
< 32) {
847 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
850 if (mem
+ chunk
> 0x4000)
851 chunk
= 0x4000 - mem
;
852 if (i
+ 2 * chunk
> 5120)
853 chunk
= (5120 - i
) / 2;
856 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
857 code
[off
+ 31] = __cpu_to_le16(addr
);
858 if (mem
+ chunk
== 0x4000) {
863 code
[off
] = __cpu_to_le16(0x1000 | 28);
868 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
872 addr
= go
->ipb
? 0x14f9 : 0x0af9;
873 memset(buf
, 0, 5120);
874 framelen
[4] = mpeg4_frame_header(go
, buf
, 1, PFRAME
);
876 framelen
[5] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_PRE
);
878 framelen
[6] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_POST
);
880 framelen
[7] = mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_BIDIR
);
882 mpeg4_frame_header(go
, buf
+ i
, 1, BFRAME_EMPTY
);
884 for (i
= 0; i
< 5120; i
+= chunk
* 2) {
885 if (space
- off
< 32) {
890 code
[off
+ 1] = __cpu_to_le16(0x8000 | mem
);
893 if (mem
+ chunk
> 0x4000)
894 chunk
= 0x4000 - mem
;
895 if (i
+ 2 * chunk
> 5120)
896 chunk
= (5120 - i
) / 2;
899 code
[off
] = __cpu_to_le16(0x4000 | chunk
);
900 code
[off
+ 31] = __cpu_to_le16(addr
);
901 if (mem
+ chunk
== 0x4000) {
906 code
[off
] = __cpu_to_le16(0x1000 | 28);
911 memcpy(&code
[off
+ 2], buf
+ i
, chunk
* 2);
919 static int brctrl_to_package(struct go7007
*go
,
920 __le16
*code
, int space
, int *framelen
)
922 int converge_speed
= 0;
923 int lambda
= (go
->format
== V4L2_PIX_FMT_MJPEG
|| go
->dvd_mode
) ?
925 int peak_rate
= 6 * go
->bitrate
/ 5;
926 int vbv_buffer
= go
->format
== V4L2_PIX_FMT_MJPEG
?
928 (go
->dvd_mode
? 900000 : peak_rate
);
929 int fps
= go
->sensor_framerate
/ go
->fps_scale
;
931 /* Bizarre math below depends on rounding errors in division */
932 u32 sgop_expt_addr
= go
->bitrate
/ 32 * (go
->ipb
? 3 : 1) * 1001 / fps
;
933 u32 sgop_peak_addr
= peak_rate
/ 32 * 1001 / fps
;
934 u32 total_expt_addr
= go
->bitrate
/ 32 * 1000 / fps
* (fps
/ 1000);
935 u32 vbv_alert_addr
= vbv_buffer
* 3 / (4 * 32);
937 q
> 0 ? sgop_expt_addr
* q
:
938 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
939 q
> 0 ? sgop_expt_addr
* q
:
940 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
941 q
> 0 ? sgop_expt_addr
* q
:
942 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
943 q
> 0 ? sgop_expt_addr
* q
:
944 2 * go
->width
* go
->height
* (go
->ipb
? 6 : 4) / 32,
946 u32 calc_q
= q
> 0 ? q
: cplx
[0] / sgop_expt_addr
;
949 0xBF20, go
->ipb
? converge_speed_ipb
[converge_speed
]
950 : converge_speed_ip
[converge_speed
],
951 0xBF21, go
->ipb
? 2 : 0,
952 0xBF22, go
->ipb
? LAMBDA_table
[0][lambda
/ 2 + 50]
954 0xBF23, go
->ipb
? LAMBDA_table
[1][lambda
] : 32767,
956 0xBF25, lambda
> 99 ? 32767 : LAMBDA_table
[3][lambda
],
957 0xBF26, sgop_expt_addr
& 0x0000FFFF,
958 0xBF27, sgop_expt_addr
>> 16,
959 0xBF28, sgop_peak_addr
& 0x0000FFFF,
960 0xBF29, sgop_peak_addr
>> 16,
961 0xBF2A, vbv_alert_addr
& 0x0000FFFF,
962 0xBF2B, vbv_alert_addr
>> 16,
968 0xBF2E, vbv_alert_addr
& 0x0000FFFF,
969 0xBF2F, vbv_alert_addr
>> 16,
970 0xBF30, cplx
[0] & 0x0000FFFF,
971 0xBF31, cplx
[0] >> 16,
972 0xBF32, cplx
[1] & 0x0000FFFF,
973 0xBF33, cplx
[1] >> 16,
974 0xBF34, cplx
[2] & 0x0000FFFF,
975 0xBF35, cplx
[2] >> 16,
976 0xBF36, cplx
[3] & 0x0000FFFF,
977 0xBF37, cplx
[3] >> 16,
980 0xBF3A, total_expt_addr
& 0x0000FFFF,
981 0xBF3B, total_expt_addr
>> 16,
985 0xBF3C, total_expt_addr
& 0x0000FFFF,
986 0xBF3D, total_expt_addr
>> 16,
991 0xBF4A, calc_q
< 4 ? 4 : (calc_q
> 124 ? 124 : calc_q
),
1002 0xBF40, sgop_expt_addr
& 0x0000FFFF,
1003 0xBF41, sgop_expt_addr
>> 16,
1008 0xBF46, (go
->width
>> 4) * (go
->height
>> 4),
1012 0xBF18, framelen
[4],
1013 0xBF19, framelen
[5],
1014 0xBF1A, framelen
[6],
1015 0xBF1B, framelen
[7],
1019 /* Remove once we don't care about matching */
1066 0xBF52, framelen
[0],
1067 0xBF53, framelen
[1],
1068 0xBF54, framelen
[2],
1069 0xBF55, framelen
[3],
1073 return copy_packages(code
, pack
, 6, space
);
1076 static int config_package(struct go7007
*go
, __le16
*code
, int space
)
1078 int fps
= go
->sensor_framerate
/ go
->fps_scale
/ 1000;
1079 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
1080 int brc_window_size
= fps
;
1081 int q_min
= 2, q_max
= 31;
1082 int THACCoeffSet0
= 0;
1089 0xc6c3, go
->format
== V4L2_PIX_FMT_MPEG4
? 0 :
1090 (go
->format
== V4L2_PIX_FMT_H263
? 0 : 1),
1091 0xc680, go
->format
== V4L2_PIX_FMT_MPEG4
? 0xf1 :
1092 (go
->format
== V4L2_PIX_FMT_H263
? 0x61 :
1107 0xd472, (go
->board_info
->sensor_flags
&
1108 GO7007_SENSOR_TV
) &&
1109 (!go
->interlace_coding
) ?
1111 0xd475, (go
->board_info
->sensor_flags
&
1112 GO7007_SENSOR_TV
) &&
1113 (!go
->interlace_coding
) ?
1115 0xc404, go
->interlace_coding
? 0x44 :
1116 (go
->format
== V4L2_PIX_FMT_MPEG4
? 0x11 :
1117 (go
->format
== V4L2_PIX_FMT_MPEG1
? 0x02 :
1118 (go
->format
== V4L2_PIX_FMT_MPEG2
? 0x04 :
1119 (go
->format
== V4L2_PIX_FMT_H263
? 0x08 :
1121 0xbf0a, (go
->format
== V4L2_PIX_FMT_MPEG4
? 8 :
1122 (go
->format
== V4L2_PIX_FMT_MPEG1
? 1 :
1123 (go
->format
== V4L2_PIX_FMT_MPEG2
? 2 :
1124 (go
->format
== V4L2_PIX_FMT_H263
? 4 : 16)))) |
1125 ((go
->repeat_seqhead
? 1 : 0) << 6) |
1126 ((go
->dvd_mode
? 1 : 0) << 9) |
1127 ((go
->gop_header_enable
? 1 : 0) << 10),
1129 0xdd5a, go
->ipb
? 0x14 : 0x0a,
1132 0xc683, THACCoeffSet0
,
1133 0xc40a, (go
->width
<< 4) | rows
,
1134 0xe01a, go
->board_info
->hpi_buffer_cap
,
1156 0xbf66, brc_window_size
,
1163 0xbfe3, go
->ipb
? 3 : 1,
1164 0xc031, go
->board_info
->sensor_flags
&
1165 GO7007_SENSOR_VBI
? 1 : 0,
1169 0xdd88, go
->ipb
? 0x1401 : 0x0a01,
1170 0xdd90, go
->ipb
? 0x1401 : 0x0a01,
1182 0xbfec, (go
->interlace_coding
? 1 << 15 : 0) |
1183 (go
->modet_enable
? 0xa : 0) |
1184 (go
->board_info
->sensor_flags
&
1185 GO7007_SENSOR_VBI
? 1 : 0),
1189 0xbff0, go
->board_info
->sensor_flags
&
1190 GO7007_SENSOR_TV
? 0xf060 : 0xb060,
1195 return copy_packages(code
, pack
, 5, space
);
1198 static int seqhead_to_package(struct go7007
*go
, __le16
*code
, int space
,
1199 int (*sequence_header_func
)(struct go7007
*go
,
1200 unsigned char *buf
, int ext
))
1202 int vop_time_increment_bitlength
= vti_bitlen(go
);
1203 int fps
= go
->sensor_framerate
/ go
->fps_scale
*
1204 (go
->interlace_coding
? 2 : 1);
1205 unsigned char buf
[40] = { };
1206 int len
= sequence_header_func(go
, buf
, 1);
1211 0xbff2, vop_time_increment_bitlength
,
1212 0xbff3, (1 << vop_time_increment_bitlength
) - 1,
1214 0xbfe7, (fps
/ 1000) << 8,
1226 0xc800, buf
[2] << 8 | buf
[3],
1227 0xc801, buf
[4] << 8 | buf
[5],
1228 0xc802, buf
[6] << 8 | buf
[7],
1229 0xc803, buf
[8] << 8 | buf
[9],
1243 0xc808, buf
[10] << 8 | buf
[11],
1244 0xc809, buf
[12] << 8 | buf
[13],
1245 0xc80a, buf
[14] << 8 | buf
[15],
1246 0xc80b, buf
[16] << 8 | buf
[17],
1247 0xc80c, buf
[18] << 8 | buf
[19],
1248 0xc80d, buf
[20] << 8 | buf
[21],
1249 0xc80e, buf
[22] << 8 | buf
[23],
1250 0xc80f, buf
[24] << 8 | buf
[25],
1251 0xc810, buf
[26] << 8 | buf
[27],
1252 0xc811, buf
[28] << 8 | buf
[29],
1253 0xc812, buf
[30] << 8 | buf
[31],
1254 0xc813, buf
[32] << 8 | buf
[33],
1255 0xc814, buf
[34] << 8 | buf
[35],
1256 0xc815, buf
[36] << 8 | buf
[37],
1262 return copy_packages(code
, pack
, 3, space
);
1265 static int relative_prime(int big
, int little
)
1269 while (little
!= 0) {
1270 remainder
= big
% little
;
1277 static int avsync_to_package(struct go7007
*go
, __le16
*code
, int space
)
1279 int arate
= go
->board_info
->audio_rate
* 1001 * go
->fps_scale
;
1280 int ratio
= arate
/ go
->sensor_framerate
;
1281 int adjratio
= ratio
* 215 / 100;
1282 int rprime
= relative_prime(go
->sensor_framerate
,
1283 arate
% go
->sensor_framerate
);
1284 int f1
= (arate
% go
->sensor_framerate
) / rprime
;
1285 int f2
= (go
->sensor_framerate
- arate
% go
->sensor_framerate
) / rprime
;
1288 0xbf98, (u16
)((-adjratio
) & 0xffff),
1289 0xbf99, (u16
)((-adjratio
) >> 16),
1292 0xbff4, f1
> f2
? f1
: f2
,
1293 0xbff5, f1
< f2
? f1
: f2
,
1294 0xbff6, f1
< f2
? ratio
: ratio
+ 1,
1295 0xbff7, f1
> f2
? ratio
: ratio
+ 1,
1298 0xbffa, adjratio
& 0xffff,
1299 0xbffb, adjratio
>> 16,
1305 return copy_packages(code
, pack
, 1, space
);
1308 static int final_package(struct go7007
*go
, __le16
*code
, int space
)
1310 int rows
= go
->interlace_coding
? go
->height
/ 32 : go
->height
/ 16;
1320 ((go
->board_info
->sensor_flags
& GO7007_SENSOR_TV
) &&
1321 (!go
->interlace_coding
) ?
1322 (1 << 14) | (1 << 9) : 0) |
1323 ((go
->encoder_subsample
? 1 : 0) << 8) |
1324 (go
->board_info
->sensor_flags
&
1325 GO7007_SENSOR_CONFIG_MASK
),
1326 ((go
->encoder_v_halve
? 1 : 0) << 14) |
1327 (go
->encoder_v_halve
? rows
<< 9 : rows
<< 8) |
1328 (go
->encoder_h_halve
? 1 << 6 : 0) |
1329 (go
->encoder_h_halve
? go
->width
>> 3 : go
->width
>> 4),
1330 (1 << 15) | (go
->encoder_v_offset
<< 6) |
1331 (1 << 7) | (go
->encoder_h_offset
>> 2),
1335 ((go
->fps_scale
- 1) << 8) |
1336 (go
->board_info
->sensor_flags
& GO7007_SENSOR_TV
?
1339 go
->ipb
? 0xd4c : 0x36b,
1340 (rows
<< 8) | (go
->width
>> 4),
1341 go
->format
== V4L2_PIX_FMT_MPEG4
? 0x0404 : 0,
1342 (1 << 15) | ((go
->interlace_coding
? 1 : 0) << 13) |
1343 ((go
->closed_gop
? 1 : 0) << 12) |
1344 ((go
->format
== V4L2_PIX_FMT_MPEG4
? 1 : 0) << 11) |
1346 ((go
->ipb
? 3 : 0) << 7) |
1347 ((go
->modet_enable
? 1 : 0) << 2) |
1348 ((go
->dvd_mode
? 1 : 0) << 1) | 1,
1349 (go
->format
== V4L2_PIX_FMT_MPEG1
? 0x89a0 :
1350 (go
->format
== V4L2_PIX_FMT_MPEG2
? 0x89a0 :
1351 (go
->format
== V4L2_PIX_FMT_MJPEG
? 0x89a0 :
1352 (go
->format
== V4L2_PIX_FMT_MPEG4
? 0x8920 :
1353 (go
->format
== V4L2_PIX_FMT_H263
? 0x8920 : 0))))),
1354 go
->ipb
? 0x1f15 : 0x1f0b,
1355 go
->ipb
? 0x0015 : 0x000b,
1356 go
->ipb
? 0xa800 : 0x5800,
1358 0x0020 + 0x034b * 0,
1359 0x0020 + 0x034b * 1,
1360 0x0020 + 0x034b * 2,
1361 0x0020 + 0x034b * 3,
1362 0x0020 + 0x034b * 4,
1363 0x0020 + 0x034b * 5,
1364 go
->ipb
? (go
->gop_size
/ 3) : go
->gop_size
,
1365 (go
->height
>> 4) * (go
->width
>> 4) * 110 / 100,
1368 return copy_packages(code
, pack
, 1, space
);
1371 static int audio_to_package(struct go7007
*go
, __le16
*code
, int space
)
1373 int clock_config
= ((go
->board_info
->audio_flags
&
1374 GO7007_AUDIO_I2S_MASTER
? 1 : 0) << 11) |
1375 ((go
->board_info
->audio_flags
&
1376 GO7007_AUDIO_OKI_MODE
? 1 : 0) << 8) |
1377 (((go
->board_info
->audio_bclk_div
/ 4) - 1) << 4) |
1378 (go
->board_info
->audio_main_div
- 1);
1391 0x9000, clock_config
,
1392 0x9001, (go
->board_info
->audio_flags
& 0xffff) |
1394 0x9000, ((go
->board_info
->audio_flags
&
1395 GO7007_AUDIO_I2S_MASTER
?
1418 return copy_packages(code
, pack
, 2, space
);
1421 static int modet_to_package(struct go7007
*go
, __le16
*code
, int space
)
1423 bool has_modet0
= go
->modet
[0].enable
;
1424 bool has_modet1
= go
->modet
[1].enable
;
1425 bool has_modet2
= go
->modet
[2].enable
;
1426 bool has_modet3
= go
->modet
[3].enable
;
1427 int ret
, mb
, i
, addr
, cnt
= 0;
1429 u16 thresholds
[] = {
1431 0xbf82, has_modet0
? go
->modet
[0].pixel_threshold
: 32767,
1432 0xbf83, has_modet1
? go
->modet
[1].pixel_threshold
: 32767,
1433 0xbf84, has_modet2
? go
->modet
[2].pixel_threshold
: 32767,
1434 0xbf85, has_modet3
? go
->modet
[3].pixel_threshold
: 32767,
1435 0xbf86, has_modet0
? go
->modet
[0].motion_threshold
: 32767,
1436 0xbf87, has_modet1
? go
->modet
[1].motion_threshold
: 32767,
1437 0xbf88, has_modet2
? go
->modet
[2].motion_threshold
: 32767,
1438 0xbf89, has_modet3
? go
->modet
[3].motion_threshold
: 32767,
1439 0xbf8a, has_modet0
? go
->modet
[0].mb_threshold
: 32767,
1440 0xbf8b, has_modet1
? go
->modet
[1].mb_threshold
: 32767,
1441 0xbf8c, has_modet2
? go
->modet
[2].mb_threshold
: 32767,
1442 0xbf8d, has_modet3
? go
->modet
[3].mb_threshold
: 32767,
1448 ret
= copy_packages(code
, thresholds
, 1, space
);
1454 memset(pack
, 0, 64);
1456 for (mb
= 0; mb
< 1624; ++mb
) {
1457 pack
[i
* 2 + 3] <<= 2;
1458 pack
[i
* 2 + 3] |= go
->modet_map
[mb
];
1461 pack
[i
* 2 + 2] = addr
++;
1463 if (i
== 10 || mb
== 1623) {
1464 pack
[0] = 0x2000 | i
;
1465 ret
= copy_packages(code
+ cnt
, pack
, 1, space
- cnt
);
1470 memset(pack
, 0, 64);
1472 pack
[i
* 2 + 3] = 0;
1475 memset(pack
, 0, 64);
1477 for (addr
= 0xbb90; addr
< 0xbbfa; ++addr
) {
1478 pack
[i
* 2 + 2] = addr
;
1479 pack
[i
* 2 + 3] = 0;
1481 if (i
== 10 || addr
== 0xbbf9) {
1482 pack
[0] = 0x2000 | i
;
1483 ret
= copy_packages(code
+ cnt
, pack
, 1, space
- cnt
);
1488 memset(pack
, 0, 64);
1494 static noinline_for_stack
int do_special(struct go7007
*go
, u16 type
,
1495 __le16
*code
, int space
, int *framelen
)
1498 case SPECIAL_FRM_HEAD
:
1499 switch (go
->format
) {
1500 case V4L2_PIX_FMT_MJPEG
:
1501 return gen_mjpeghdr_to_package(go
, code
, space
);
1502 case V4L2_PIX_FMT_MPEG1
:
1503 case V4L2_PIX_FMT_MPEG2
:
1504 return gen_mpeg1hdr_to_package(go
, code
, space
,
1506 case V4L2_PIX_FMT_MPEG4
:
1507 return gen_mpeg4hdr_to_package(go
, code
, space
,
1513 case SPECIAL_BRC_CTRL
:
1514 return brctrl_to_package(go
, code
, space
, framelen
);
1515 case SPECIAL_CONFIG
:
1516 return config_package(go
, code
, space
);
1517 case SPECIAL_SEQHEAD
:
1518 switch (go
->format
) {
1519 case V4L2_PIX_FMT_MPEG1
:
1520 case V4L2_PIX_FMT_MPEG2
:
1521 return seqhead_to_package(go
, code
, space
,
1522 mpeg1_sequence_header
);
1523 case V4L2_PIX_FMT_MPEG4
:
1524 return seqhead_to_package(go
, code
, space
,
1525 mpeg4_sequence_header
);
1529 case SPECIAL_AV_SYNC
:
1530 return avsync_to_package(go
, code
, space
);
1532 return final_package(go
, code
, space
);
1534 return audio_to_package(go
, code
, space
);
1536 return modet_to_package(go
, code
, space
);
1539 "firmware file contains unsupported feature %04x\n", type
);
1543 int go7007_construct_fw_image(struct go7007
*go
, u8
**fw
, int *fwlen
)
1545 const struct firmware
*fw_entry
;
1547 int framelen
[8] = { }; /* holds the lengths of empty frame templates */
1548 int codespace
= 64 * 1024, i
= 0, srclen
, chunk_len
, chunk_flags
;
1552 switch (go
->format
) {
1553 case V4L2_PIX_FMT_MJPEG
:
1554 mode_flag
= FLAG_MODE_MJPEG
;
1556 case V4L2_PIX_FMT_MPEG1
:
1557 mode_flag
= FLAG_MODE_MPEG1
;
1559 case V4L2_PIX_FMT_MPEG2
:
1560 mode_flag
= FLAG_MODE_MPEG2
;
1562 case V4L2_PIX_FMT_MPEG4
:
1563 mode_flag
= FLAG_MODE_MPEG4
;
1568 if (request_firmware(&fw_entry
, GO7007_FW_NAME
, go
->dev
)) {
1570 "unable to load firmware from file \"%s\"\n",
1574 code
= kcalloc(codespace
, 2, GFP_KERNEL
);
1578 src
= (__le16
*)fw_entry
->data
;
1579 srclen
= fw_entry
->size
/ 2;
1580 while (srclen
>= 2) {
1581 chunk_flags
= __le16_to_cpu(src
[0]);
1582 chunk_len
= __le16_to_cpu(src
[1]);
1583 if (chunk_len
+ 2 > srclen
) {
1585 "firmware file \"%s\" appears to be corrupted\n",
1589 if (chunk_flags
& mode_flag
) {
1590 if (chunk_flags
& FLAG_SPECIAL
) {
1591 ret
= do_special(go
, __le16_to_cpu(src
[2]),
1592 &code
[i
], codespace
- i
, framelen
);
1595 "insufficient memory for firmware construction\n");
1600 if (codespace
- i
< chunk_len
) {
1602 "insufficient memory for firmware construction\n");
1605 memcpy(&code
[i
], &src
[2], chunk_len
* 2);
1609 srclen
-= chunk_len
+ 2;
1610 src
+= chunk_len
+ 2;
1612 release_firmware(fw_entry
);
1619 release_firmware(fw_entry
);
1623 MODULE_FIRMWARE(GO7007_FW_NAME
);