linux/drivers/media/usb/go7007/go7007-fw.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2005-2006 Micronas USA Inc.
   3 *
   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.
   7 *
   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.
  12 */
  13
  14/*
  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.
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/time.h>
  25#include <linux/mm.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>
  31
  32#include "go7007-priv.h"
  33
  34#define GO7007_FW_NAME "go7007/go7007tv.bin"
  35
  36/* Constants used in the source firmware image to describe code segments */
  37
  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 | \
  45                                        FLAG_MODE_H263)
  46#define FLAG_SPECIAL            (1<<8)
  47
  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
  56
  57/* Little data class for creating MPEG headers bit-by-bit */
  58
  59struct code_gen {
  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 */
  64};
  65
  66#define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
  67
  68#define CODE_ADD(name, val, length) do { \
  69        name.b -= (length); \
  70        name.a |= (val) << name.b; \
  71        while (name.b <= 24) { \
  72                *name.p = name.a >> 24; \
  73                ++name.p; \
  74                name.a <<= 8; \
  75                name.b += 8; \
  76                name.len += 8; \
  77        } \
  78} while (0)
  79
  80#define CODE_LENGTH(name) (name.len + (32 - name.b))
  81
  82/* Tables for creating the bitrate control data */
  83
  84static 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,
  95        100
  96};
  97
  98static 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,
 109        300
 110};
 111
 112static 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,
 123                96
 124        },
 125        {
 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,
 136                120
 137        },
 138        {
 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,
 149                144
 150        },
 151        {
 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,
 162                192
 163        }
 164};
 165
 166/* MPEG blank frame generation tables */
 167
 168enum mpeg_frame_type {
 169        PFRAME,
 170        BFRAME_PRE,
 171        BFRAME_POST,
 172        BFRAME_BIDIR,
 173        BFRAME_EMPTY
 174};
 175
 176static 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 },
 185        { 0x18, 11 }
 186};
 187
 188/* Standard JPEG tables */
 189
 190static 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
 199};
 200
 201static const u8 bits_dc_luminance[] = {
 202        0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
 203};
 204
 205static const u8 val_dc_luminance[] = {
 206        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
 207};
 208
 209static const u8 bits_dc_chrominance[] = {
 210        0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
 211};
 212
 213static const u8 val_dc_chrominance[] = {
 214        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
 215};
 216
 217static const u8 bits_ac_luminance[] = {
 218        0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
 219};
 220
 221static 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,
 242        0xf9, 0xfa
 243};
 244
 245static const u8 bits_ac_chrominance[] = {
 246        0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
 247};
 248
 249static 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,
 270        0xf9, 0xfa
 271};
 272
 273/* Zig-zag mapping for quant table
 274 *
 275 * OK, let's do this mapping on the actual table above so it doesn't have
 276 * to be done on the fly.
 277 */
 278static 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
 283};
 284
 285static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
 286{
 287        int i, cnt = pkg_cnt * 32;
 288
 289        if (space < cnt)
 290                return -1;
 291
 292        for (i = 0; i < cnt; ++i)
 293                dest[i] = cpu_to_le16p(src + i);
 294
 295        return cnt;
 296}
 297
 298static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
 299{
 300        int i, p = 0;
 301
 302        buf[p++] = 0xff;
 303        buf[p++] = 0xd8;
 304        buf[p++] = 0xff;
 305        buf[p++] = 0xdb;
 306        buf[p++] = 0;
 307        buf[p++] = 2 + 65;
 308        buf[p++] = 0;
 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;
 313        buf[p++] = 0xff;
 314        buf[p++] = 0xc0;
 315        buf[p++] = 0;
 316        buf[p++] = 17;
 317        buf[p++] = 8;
 318        buf[p++] = go->height >> 8;
 319        buf[p++] = go->height & 0xff;
 320        buf[p++] = go->width >> 8;
 321        buf[p++] = go->width & 0xff;
 322        buf[p++] = 3;
 323        buf[p++] = 1;
 324        buf[p++] = 0x22;
 325        buf[p++] = 0;
 326        buf[p++] = 2;
 327        buf[p++] = 0x11;
 328        buf[p++] = 0;
 329        buf[p++] = 3;
 330        buf[p++] = 0x11;
 331        buf[p++] = 0;
 332        buf[p++] = 0xff;
 333        buf[p++] = 0xc4;
 334        buf[p++] = 418 >> 8;
 335        buf[p++] = 418 & 0xff;
 336        buf[p++] = 0x00;
 337        memcpy(buf + p, bits_dc_luminance + 1, 16);
 338        p += 16;
 339        memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
 340        p += sizeof(val_dc_luminance);
 341        buf[p++] = 0x01;
 342        memcpy(buf + p, bits_dc_chrominance + 1, 16);
 343        p += 16;
 344        memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
 345        p += sizeof(val_dc_chrominance);
 346        buf[p++] = 0x10;
 347        memcpy(buf + p, bits_ac_luminance + 1, 16);
 348        p += 16;
 349        memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
 350        p += sizeof(val_ac_luminance);
 351        buf[p++] = 0x11;
 352        memcpy(buf + p, bits_ac_chrominance + 1, 16);
 353        p += 16;
 354        memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
 355        p += sizeof(val_ac_chrominance);
 356        buf[p++] = 0xff;
 357        buf[p++] = 0xda;
 358        buf[p++] = 0;
 359        buf[p++] = 12;
 360        buf[p++] = 3;
 361        buf[p++] = 1;
 362        buf[p++] = 0x00;
 363        buf[p++] = 2;
 364        buf[p++] = 0x11;
 365        buf[p++] = 3;
 366        buf[p++] = 0x11;
 367        buf[p++] = 0;
 368        buf[p++] = 63;
 369        buf[p++] = 0;
 370        return p;
 371}
 372
 373static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
 374{
 375        u8 *buf;
 376        u16 mem = 0x3e00;
 377        unsigned int addr = 0x19;
 378        int size = 0, i, off = 0, chunk;
 379
 380        buf = kzalloc(4096, GFP_KERNEL);
 381        if (buf == NULL)
 382                return -ENOMEM;
 383
 384        for (i = 1; i < 32; ++i) {
 385                mjpeg_frame_header(go, buf + size, i);
 386                size += 80;
 387        }
 388        chunk = mjpeg_frame_header(go, buf + size, 1);
 389        memmove(buf + size, buf + size + 80, chunk - 80);
 390        size += chunk - 80;
 391
 392        for (i = 0; i < size; i += chunk * 2) {
 393                if (space - off < 32) {
 394                        off = -1;
 395                        goto done;
 396                }
 397
 398                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 399
 400                chunk = 28;
 401                if (mem + chunk > 0x4000)
 402                        chunk = 0x4000 - mem;
 403                if (i + 2 * chunk > size)
 404                        chunk = (size - i) / 2;
 405
 406                if (chunk < 28) {
 407                        code[off] = __cpu_to_le16(0x4000 | chunk);
 408                        code[off + 31] = __cpu_to_le16(addr++);
 409                        mem = 0x3e00;
 410                } else {
 411                        code[off] = __cpu_to_le16(0x1000 | 28);
 412                        code[off + 31] = 0;
 413                        mem += 28;
 414                }
 415
 416                memcpy(&code[off + 2], buf + i, chunk * 2);
 417                off += 32;
 418        }
 419done:
 420        kfree(buf);
 421        return off;
 422}
 423
 424static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
 425                int modulo, int pict_struct, enum mpeg_frame_type frame)
 426{
 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);
 430
 431        switch (frame) {
 432        case PFRAME:
 433                mb_code = 0x1;
 434                mb_len = 3;
 435                break;
 436        case BFRAME_PRE:
 437                mb_code = 0x2;
 438                mb_len = 4;
 439                break;
 440        case BFRAME_POST:
 441                mb_code = 0x2;
 442                mb_len = 3;
 443                break;
 444        case BFRAME_BIDIR:
 445                mb_code = 0x2;
 446                mb_len = 2;
 447                break;
 448        default: /* keep the compiler happy */
 449                mb_code = mb_len = 0;
 450                break;
 451        }
 452
 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);
 456        if (frame != PFRAME)
 457                CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
 458        else
 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);
 463        if (j != 8)
 464                CODE_ADD(c, 0, j);
 465
 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);
 473                        if (go->dvd_mode)
 474                                CODE_ADD(c, 0x000, 11);
 475                        else
 476                                CODE_ADD(c, 0x200, 11);
 477                } else {
 478                        CODE_ADD(c, 0x3, 4);
 479                        CODE_ADD(c, 0x20c, 11);
 480                }
 481                /* Byte-align with zeros */
 482                j = 8 - (CODE_LENGTH(c) % 8);
 483                if (j != 8)
 484                        CODE_ADD(c, 0, j);
 485        }
 486
 487        for (i = 0; i < rows; ++i) {
 488                CODE_ADD(c, 1, 24);
 489                CODE_ADD(c, i + 1, 8);
 490                CODE_ADD(c, 0x2, 6);
 491                CODE_ADD(c, 0x1, 1);
 492                CODE_ADD(c, mb_code, mb_len);
 493                if (go->interlace_coding) {
 494                        CODE_ADD(c, 0x1, 2);
 495                        CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 496                }
 497                if (frame == BFRAME_BIDIR) {
 498                        CODE_ADD(c, 0x3, 2);
 499                        if (go->interlace_coding)
 500                                CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 501                }
 502                CODE_ADD(c, 0x3, 2);
 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) {
 508                        CODE_ADD(c, 0x1, 2);
 509                        CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 510                }
 511                if (frame == BFRAME_BIDIR) {
 512                        CODE_ADD(c, 0x3, 2);
 513                        if (go->interlace_coding)
 514                                CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 515                }
 516                CODE_ADD(c, 0x3, 2);
 517
 518                /* Byte-align with zeros */
 519                j = 8 - (CODE_LENGTH(c) % 8);
 520                if (j != 8)
 521                        CODE_ADD(c, 0, j);
 522        }
 523
 524        i = CODE_LENGTH(c) + 4 * 8;
 525        buf[2] = 0x00;
 526        buf[3] = 0x00;
 527        buf[4] = 0x01;
 528        buf[5] = 0x00;
 529        return i;
 530}
 531
 532static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
 533{
 534        int i, aspect_ratio, picture_rate;
 535        CODE_GEN(c, buf + 6);
 536
 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;
 541                        break;
 542                case GO7007_RATIO_16_9:
 543                        aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
 544                        break;
 545                default:
 546                        aspect_ratio = 1;
 547                        break;
 548                }
 549        } else {
 550                switch (go->aspect_ratio) {
 551                case GO7007_RATIO_4_3:
 552                        aspect_ratio = 2;
 553                        break;
 554                case GO7007_RATIO_16_9:
 555                        aspect_ratio = 3;
 556                        break;
 557                default:
 558                        aspect_ratio = 1;
 559                        break;
 560                }
 561        }
 562        switch (go->sensor_framerate) {
 563        case 24000:
 564                picture_rate = 1;
 565                break;
 566        case 24024:
 567                picture_rate = 2;
 568                break;
 569        case 25025:
 570                picture_rate = go->interlace_coding ? 6 : 3;
 571                break;
 572        case 30000:
 573                picture_rate = go->interlace_coding ? 7 : 4;
 574                break;
 575        case 30030:
 576                picture_rate = go->interlace_coding ? 8 : 5;
 577                break;
 578        default:
 579                picture_rate = 5; /* 30 fps seems like a reasonable default */
 580                break;
 581        }
 582
 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);
 588        CODE_ADD(c, 1, 1);
 589        CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 112 : 20, 10);
 590        CODE_ADD(c, 0, 3);
 591
 592        /* Byte-align with zeros */
 593        i = 8 - (CODE_LENGTH(c) % 8);
 594        if (i != 8)
 595                CODE_ADD(c, 0, i);
 596
 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);
 603                else
 604                        CODE_ADD(c, 0xa0001, 20);
 605                CODE_ADD(c, 0, 16);
 606
 607                /* Byte-align with zeros */
 608                i = 8 - (CODE_LENGTH(c) % 8);
 609                if (i != 8)
 610                        CODE_ADD(c, 0, i);
 611
 612                if (ext) {
 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);
 619                        CODE_ADD(c, 1, 1);
 620                        CODE_ADD(c, go->height, 14);
 621
 622                        /* Byte-align with zeros */
 623                        i = 8 - (CODE_LENGTH(c) % 8);
 624                        if (i != 8)
 625                                CODE_ADD(c, 0, i);
 626                }
 627        }
 628
 629        i = CODE_LENGTH(c) + 4 * 8;
 630        buf[0] = i & 0xff;
 631        buf[1] = i >> 8;
 632        buf[2] = 0x00;
 633        buf[3] = 0x00;
 634        buf[4] = 0x01;
 635        buf[5] = 0xb3;
 636        return i;
 637}
 638
 639static int gen_mpeg1hdr_to_package(struct go7007 *go,
 640                                        __le16 *code, int space, int *framelen)
 641{
 642        u8 *buf;
 643        u16 mem = 0x3e00;
 644        unsigned int addr = 0x19;
 645        int i, off = 0, chunk;
 646
 647        buf = kzalloc(5120, GFP_KERNEL);
 648        if (buf == NULL)
 649                return -ENOMEM;
 650
 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,
 654                                                        0, 2, PFRAME);
 655        buf[0] = framelen[0] & 0xff;
 656        buf[1] = framelen[0] >> 8;
 657        i = 368;
 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,
 661                                                        0, 2, BFRAME_PRE);
 662        buf[i] = framelen[1] & 0xff;
 663        buf[i + 1] = framelen[1] >> 8;
 664        i += 1632;
 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,
 668                                                        0, 2, BFRAME_POST);
 669        buf[i] = framelen[2] & 0xff;
 670        buf[i + 1] = framelen[2] >> 8;
 671        i += 1432;
 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,
 675                                                        0, 2, BFRAME_BIDIR);
 676        buf[i] = framelen[3] & 0xff;
 677        buf[i + 1] = framelen[3] >> 8;
 678        i += 1632 + 16;
 679        mpeg1_sequence_header(go, buf + i, 0);
 680        i += 40;
 681        for (i = 0; i < 5120; i += chunk * 2) {
 682                if (space - off < 32) {
 683                        off = -1;
 684                        goto done;
 685                }
 686
 687                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 688
 689                chunk = 28;
 690                if (mem + chunk > 0x4000)
 691                        chunk = 0x4000 - mem;
 692                if (i + 2 * chunk > 5120)
 693                        chunk = (5120 - i) / 2;
 694
 695                if (chunk < 28) {
 696                        code[off] = __cpu_to_le16(0x4000 | chunk);
 697                        code[off + 31] = __cpu_to_le16(addr);
 698                        if (mem + chunk == 0x4000) {
 699                                mem = 0x3e00;
 700                                ++addr;
 701                        }
 702                } else {
 703                        code[off] = __cpu_to_le16(0x1000 | 28);
 704                        code[off + 31] = 0;
 705                        mem += 28;
 706                }
 707
 708                memcpy(&code[off + 2], buf + i, chunk * 2);
 709                off += 32;
 710        }
 711done:
 712        kfree(buf);
 713        return off;
 714}
 715
 716static int vti_bitlen(struct go7007 *go)
 717{
 718        unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
 719
 720        for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i)
 721                ;
 722        return i + 1;
 723}
 724
 725static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
 726                int modulo, enum mpeg_frame_type frame)
 727{
 728        int i;
 729        CODE_GEN(c, buf + 6);
 730        int mb_count = (go->width >> 4) * (go->height >> 4);
 731
 732        CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
 733        if (modulo)
 734                CODE_ADD(c, 0x1, 1);
 735        CODE_ADD(c, 0x1, 2);
 736        CODE_ADD(c, 0, vti_bitlen(go));
 737        CODE_ADD(c, 0x3, 2);
 738        if (frame == PFRAME)
 739                CODE_ADD(c, 0, 1);
 740        CODE_ADD(c, 0xc, 11);
 741        if (frame != PFRAME)
 742                CODE_ADD(c, 0x4, 3);
 743        if (frame != BFRAME_EMPTY) {
 744                for (i = 0; i < mb_count; ++i) {
 745                        switch (frame) {
 746                        case PFRAME:
 747                                CODE_ADD(c, 0x1, 1);
 748                                break;
 749                        case BFRAME_PRE:
 750                                CODE_ADD(c, 0x47, 8);
 751                                break;
 752                        case BFRAME_POST:
 753                                CODE_ADD(c, 0x27, 7);
 754                                break;
 755                        case BFRAME_BIDIR:
 756                                CODE_ADD(c, 0x5f, 8);
 757                                break;
 758                        case BFRAME_EMPTY: /* keep compiler quiet */
 759                                break;
 760                        }
 761                }
 762        }
 763
 764        /* Byte-align with a zero followed by ones */
 765        i = 8 - (CODE_LENGTH(c) % 8);
 766        CODE_ADD(c, 0, 1);
 767        CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
 768
 769        i = CODE_LENGTH(c) + 4 * 8;
 770        buf[0] = i & 0xff;
 771        buf[1] = i >> 8;
 772        buf[2] = 0x00;
 773        buf[3] = 0x00;
 774        buf[4] = 0x01;
 775        buf[5] = 0xb6;
 776        return i;
 777}
 778
 779static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
 780{
 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, };
 785        int i, aspect_ratio;
 786        int fps = go->sensor_framerate / go->fps_scale;
 787        CODE_GEN(c, buf + 2 + sizeof(head));
 788
 789        switch (go->aspect_ratio) {
 790        case GO7007_RATIO_4_3:
 791                aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
 792                break;
 793        case GO7007_RATIO_16_9:
 794                aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
 795                break;
 796        default:
 797                aspect_ratio = 1;
 798                break;
 799        }
 800
 801        memcpy(buf + 2, head, sizeof(head));
 802        CODE_ADD(c, 0x191, 17);
 803        CODE_ADD(c, aspect_ratio, 4);
 804        CODE_ADD(c, 0x1, 4);
 805        CODE_ADD(c, fps, 16);
 806        CODE_ADD(c, 0x3, 2);
 807        CODE_ADD(c, 1001, vti_bitlen(go));
 808        CODE_ADD(c, 1, 1);
 809        CODE_ADD(c, go->width, 13);
 810        CODE_ADD(c, 1, 1);
 811        CODE_ADD(c, go->height, 13);
 812        CODE_ADD(c, 0x2830, 14);
 813
 814        /* Byte-align */
 815        i = 8 - (CODE_LENGTH(c) % 8);
 816        CODE_ADD(c, 0, 1);
 817        CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
 818
 819        i = CODE_LENGTH(c) + sizeof(head) * 8;
 820        buf[0] = i & 0xff;
 821        buf[1] = i >> 8;
 822        return i;
 823}
 824
 825static int gen_mpeg4hdr_to_package(struct go7007 *go,
 826                                        __le16 *code, int space, int *framelen)
 827{
 828        u8 *buf;
 829        u16 mem = 0x3e00;
 830        unsigned int addr = 0x19;
 831        int i, off = 0, chunk;
 832
 833        buf = kzalloc(5120, GFP_KERNEL);
 834        if (buf == NULL)
 835                return -ENOMEM;
 836
 837        framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
 838        i = 368;
 839        framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
 840        i += 1632;
 841        framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
 842        i += 1432;
 843        framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
 844        i += 1632;
 845        mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
 846        i += 16;
 847        mpeg4_sequence_header(go, buf + i, 0);
 848        i += 40;
 849        for (i = 0; i < 5120; i += chunk * 2) {
 850                if (space - off < 32) {
 851                        off = -1;
 852                        goto done;
 853                }
 854
 855                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 856
 857                chunk = 28;
 858                if (mem + chunk > 0x4000)
 859                        chunk = 0x4000 - mem;
 860                if (i + 2 * chunk > 5120)
 861                        chunk = (5120 - i) / 2;
 862
 863                if (chunk < 28) {
 864                        code[off] = __cpu_to_le16(0x4000 | chunk);
 865                        code[off + 31] = __cpu_to_le16(addr);
 866                        if (mem + chunk == 0x4000) {
 867                                mem = 0x3e00;
 868                                ++addr;
 869                        }
 870                } else {
 871                        code[off] = __cpu_to_le16(0x1000 | 28);
 872                        code[off + 31] = 0;
 873                        mem += 28;
 874                }
 875
 876                memcpy(&code[off + 2], buf + i, chunk * 2);
 877                off += 32;
 878        }
 879        mem = 0x3e00;
 880        addr = go->ipb ? 0x14f9 : 0x0af9;
 881        memset(buf, 0, 5120);
 882        framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
 883        i = 368;
 884        framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
 885        i += 1632;
 886        framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
 887        i += 1432;
 888        framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
 889        i += 1632;
 890        mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
 891        i += 16;
 892        for (i = 0; i < 5120; i += chunk * 2) {
 893                if (space - off < 32) {
 894                        off = -1;
 895                        goto done;
 896                }
 897
 898                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 899
 900                chunk = 28;
 901                if (mem + chunk > 0x4000)
 902                        chunk = 0x4000 - mem;
 903                if (i + 2 * chunk > 5120)
 904                        chunk = (5120 - i) / 2;
 905
 906                if (chunk < 28) {
 907                        code[off] = __cpu_to_le16(0x4000 | chunk);
 908                        code[off + 31] = __cpu_to_le16(addr);
 909                        if (mem + chunk == 0x4000) {
 910                                mem = 0x3e00;
 911                                ++addr;
 912                        }
 913                } else {
 914                        code[off] = __cpu_to_le16(0x1000 | 28);
 915                        code[off + 31] = 0;
 916                        mem += 28;
 917                }
 918
 919                memcpy(&code[off + 2], buf + i, chunk * 2);
 920                off += 32;
 921        }
 922done:
 923        kfree(buf);
 924        return off;
 925}
 926
 927static int brctrl_to_package(struct go7007 *go,
 928                                        __le16 *code, int space, int *framelen)
 929{
 930        int converge_speed = 0;
 931        int lambda = (go->format == V4L2_PIX_FMT_MJPEG || go->dvd_mode) ?
 932                                100 : 0;
 933        int peak_rate = 6 * go->bitrate / 5;
 934        int vbv_buffer = go->format == V4L2_PIX_FMT_MJPEG ?
 935                                go->bitrate :
 936                                (go->dvd_mode ? 900000 : peak_rate);
 937        int fps = go->sensor_framerate / go->fps_scale;
 938        int q = 0;
 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);
 944        u32 cplx[] = {
 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,
 953        };
 954        u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
 955        u16 pack[] = {
 956                0x200e,         0x0000,
 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]
 961                                        : 32767,
 962                0xBF23,         go->ipb ? LAMBDA_table[1][lambda] : 32767,
 963                0xBF24,         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,
 971                0xBF2C,         0,
 972                0xBF2D,         0,
 973                0,              0,
 974
 975                0x200e,         0x0000,
 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,
 986                0xBF38,         0,
 987                0xBF39,         0,
 988                0xBF3A,         total_expt_addr & 0x0000FFFF,
 989                0xBF3B,         total_expt_addr >> 16,
 990                0,              0,
 991
 992                0x200e,         0x0000,
 993                0xBF3C,         total_expt_addr & 0x0000FFFF,
 994                0xBF3D,         total_expt_addr >> 16,
 995                0xBF3E,         0,
 996                0xBF3F,         0,
 997                0xBF48,         0,
 998                0xBF49,         0,
 999                0xBF4A,         calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
1000                0xBF4B,         4,
1001                0xBF4C,         0,
1002                0xBF4D,         0,
1003                0xBF4E,         0,
1004                0xBF4F,         0,
1005                0xBF50,         0,
1006                0xBF51,         0,
1007                0,              0,
1008
1009                0x200e,         0x0000,
1010                0xBF40,         sgop_expt_addr & 0x0000FFFF,
1011                0xBF41,         sgop_expt_addr >> 16,
1012                0xBF42,         0,
1013                0xBF43,         0,
1014                0xBF44,         0,
1015                0xBF45,         0,
1016                0xBF46,         (go->width >> 4) * (go->height >> 4),
1017                0xBF47,         0,
1018                0xBF64,         0,
1019                0xBF65,         0,
1020                0xBF18,         framelen[4],
1021                0xBF19,         framelen[5],
1022                0xBF1A,         framelen[6],
1023                0xBF1B,         framelen[7],
1024                0,              0,
1025
1026#if 0
1027                /* Remove once we don't care about matching */
1028                0x200e,         0x0000,
1029                0xBF56,         4,
1030                0xBF57,         0,
1031                0xBF58,         5,
1032                0xBF59,         0,
1033                0xBF5A,         6,
1034                0xBF5B,         0,
1035                0xBF5C,         8,
1036                0xBF5D,         0,
1037                0xBF5E,         1,
1038                0xBF5F,         0,
1039                0xBF60,         1,
1040                0xBF61,         0,
1041                0xBF62,         0,
1042                0xBF63,         0,
1043                0,              0,
1044#else
1045                0x2008,         0x0000,
1046                0xBF56,         4,
1047                0xBF57,         0,
1048                0xBF58,         5,
1049                0xBF59,         0,
1050                0xBF5A,         6,
1051                0xBF5B,         0,
1052                0xBF5C,         8,
1053                0xBF5D,         0,
1054                0,              0,
1055                0,              0,
1056                0,              0,
1057                0,              0,
1058                0,              0,
1059                0,              0,
1060                0,              0,
1061#endif
1062
1063                0x200e,         0x0000,
1064                0xBF10,         0,
1065                0xBF11,         0,
1066                0xBF12,         0,
1067                0xBF13,         0,
1068                0xBF14,         0,
1069                0xBF15,         0,
1070                0xBF16,         0,
1071                0xBF17,         0,
1072                0xBF7E,         0,
1073                0xBF7F,         1,
1074                0xBF52,         framelen[0],
1075                0xBF53,         framelen[1],
1076                0xBF54,         framelen[2],
1077                0xBF55,         framelen[3],
1078                0,              0,
1079        };
1080
1081        return copy_packages(code, pack, 6, space);
1082}
1083
1084static int config_package(struct go7007 *go, __le16 *code, int space)
1085{
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;
1091        u16 pack[] = {
1092                0x200e,         0x0000,
1093                0xc002,         0x14b4,
1094                0xc003,         0x28b4,
1095                0xc004,         0x3c5a,
1096                0xdc05,         0x2a77,
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 :
1101                                                                        0xd3),
1102                0xc780,         0x0140,
1103                0xe009,         0x0001,
1104                0xc60f,         0x0008,
1105                0xd4ff,         0x0002,
1106                0xe403,         2340,
1107                0xe406,         75,
1108                0xd411,         0x0001,
1109                0xd410,         0xa1d6,
1110                0x0001,         0x2801,
1111
1112                0x200d,         0x0000,
1113                0xe402,         0x018b,
1114                0xe401,         0x8b01,
1115                0xd472,         (go->board_info->sensor_flags &
1116                                                        GO7007_SENSOR_TV) &&
1117                                                (!go->interlace_coding) ?
1118                                        0x01b0 : 0x0170,
1119                0xd475,         (go->board_info->sensor_flags &
1120                                                        GO7007_SENSOR_TV) &&
1121                                                (!go->interlace_coding) ?
1122                                        0x0008 : 0x0009,
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 :
1128                                                                     0x20)))),
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),
1136                0xbf0b,         0,
1137                0xdd5a,         go->ipb ? 0x14 : 0x0a,
1138                0xbf0c,         0,
1139                0xbf0d,         0,
1140                0xc683,         THACCoeffSet0,
1141                0xc40a,         (go->width << 4) | rows,
1142                0xe01a,         go->board_info->hpi_buffer_cap,
1143                0,              0,
1144                0,              0,
1145
1146                0x2008,         0,
1147                0xe402,         0x88,
1148                0xe401,         0x8f01,
1149                0xbf6a,         0,
1150                0xbf6b,         0,
1151                0xbf6c,         0,
1152                0xbf6d,         0,
1153                0xbf6e,         0,
1154                0xbf6f,         0,
1155                0,              0,
1156                0,              0,
1157                0,              0,
1158                0,              0,
1159                0,              0,
1160                0,              0,
1161                0,              0,
1162
1163                0x200e,         0,
1164                0xbf66,         brc_window_size,
1165                0xbf67,         0,
1166                0xbf68,         q_min,
1167                0xbf69,         q_max,
1168                0xbfe0,         0,
1169                0xbfe1,         0,
1170                0xbfe2,         0,
1171                0xbfe3,         go->ipb ? 3 : 1,
1172                0xc031,         go->board_info->sensor_flags &
1173                                        GO7007_SENSOR_VBI ? 1 : 0,
1174                0xc01c,         0x1f,
1175                0xdd8c,         0x15,
1176                0xdd94,         0x15,
1177                0xdd88,         go->ipb ? 0x1401 : 0x0a01,
1178                0xdd90,         go->ipb ? 0x1401 : 0x0a01,
1179                0,              0,
1180
1181                0x200e,         0,
1182                0xbfe4,         0,
1183                0xbfe5,         0,
1184                0xbfe6,         0,
1185                0xbfe7,         fps << 8,
1186                0xbfe8,         0x3a00,
1187                0xbfe9,         0,
1188                0xbfea,         0,
1189                0xbfeb,         0,
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),
1194                0xbfed,         0,
1195                0xbfee,         0,
1196                0xbfef,         0,
1197                0xbff0,         go->board_info->sensor_flags &
1198                                        GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1199                0xbff1,         0,
1200                0,              0,
1201        };
1202
1203        return copy_packages(code, pack, 5, space);
1204}
1205
1206static 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))
1209{
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);
1215        u16 pack[] = {
1216                0x2006,         0,
1217                0xbf08,         fps,
1218                0xbf09,         0,
1219                0xbff2,         vop_time_increment_bitlength,
1220                0xbff3,         (1 << vop_time_increment_bitlength) - 1,
1221                0xbfe6,         0,
1222                0xbfe7,         (fps / 1000) << 8,
1223                0,              0,
1224                0,              0,
1225                0,              0,
1226                0,              0,
1227                0,              0,
1228                0,              0,
1229                0,              0,
1230                0,              0,
1231                0,              0,
1232
1233                0x2007,         0,
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],
1238                0xc406,         64,
1239                0xc407,         len - 64,
1240                0xc61b,         1,
1241                0,              0,
1242                0,              0,
1243                0,              0,
1244                0,              0,
1245                0,              0,
1246                0,              0,
1247                0,              0,
1248                0,              0,
1249
1250                0x200e,         0,
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],
1265                0,              0,
1266                0,              0,
1267                0,              0,
1268        };
1269
1270        return copy_packages(code, pack, 3, space);
1271}
1272
1273static int relative_prime(int big, int little)
1274{
1275        int remainder;
1276
1277        while (little != 0) {
1278                remainder = big % little;
1279                big = little;
1280                little = remainder;
1281        }
1282        return big;
1283}
1284
1285static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1286{
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;
1294        u16 pack[] = {
1295                0x200e,         0,
1296                0xbf98,         (u16)((-adjratio) & 0xffff),
1297                0xbf99,         (u16)((-adjratio) >> 16),
1298                0xbf92,         0,
1299                0xbf93,         0,
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,
1304                0xbff8,         0,
1305                0xbff9,         0,
1306                0xbffa,         adjratio & 0xffff,
1307                0xbffb,         adjratio >> 16,
1308                0xbf94,         0,
1309                0xbf95,         0,
1310                0,              0,
1311        };
1312
1313        return copy_packages(code, pack, 1, space);
1314}
1315
1316static int final_package(struct go7007 *go, __le16 *code, int space)
1317{
1318        int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1319        u16 pack[] = {
1320                0x8000,
1321                0,
1322                0,
1323                0,
1324                0,
1325                0,
1326                0,
1327                2,
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),
1340                (1 << 6),
1341                0,
1342                0,
1343                ((go->fps_scale - 1) << 8) |
1344                        (go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1345                                                (1 << 7) : 0) |
1346                        0x41,
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) |
1353                /*      (1 << 9) |   */
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,
1365                0xffff,
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,
1374        };
1375
1376        return copy_packages(code, pack, 1, space);
1377}
1378
1379static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1380{
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);
1387        u16 pack[] = {
1388                0x200d,         0,
1389                0x9002,         0,
1390                0x9002,         0,
1391                0x9031,         0,
1392                0x9032,         0,
1393                0x9033,         0,
1394                0x9034,         0,
1395                0x9035,         0,
1396                0x9036,         0,
1397                0x9037,         0,
1398                0x9040,         0,
1399                0x9000,         clock_config,
1400                0x9001,         (go->board_info->audio_flags & 0xffff) |
1401                                        (1 << 9),
1402                0x9000,         ((go->board_info->audio_flags &
1403                                                GO7007_AUDIO_I2S_MASTER ?
1404                                                1 : 0) << 10) |
1405                                        clock_config,
1406                0,              0,
1407                0,              0,
1408                0x2005,         0,
1409                0x9041,         0,
1410                0x9042,         256,
1411                0x9043,         0,
1412                0x9044,         16,
1413                0x9045,         16,
1414                0,              0,
1415                0,              0,
1416                0,              0,
1417                0,              0,
1418                0,              0,
1419                0,              0,
1420                0,              0,
1421                0,              0,
1422                0,              0,
1423                0,              0,
1424        };
1425
1426        return copy_packages(code, pack, 2, space);
1427}
1428
1429static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1430{
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;
1436        u16 pack[32];
1437        u16 thresholds[] = {
1438                0x200e,         0,
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,
1451                0xbf8e,         0,
1452                0xbf8f,         0,
1453                0,              0,
1454        };
1455
1456        ret = copy_packages(code, thresholds, 1, space);
1457        if (ret < 0)
1458                return -1;
1459        cnt += ret;
1460
1461        addr = 0xbac0;
1462        memset(pack, 0, 64);
1463        i = 0;
1464        for (mb = 0; mb < 1624; ++mb) {
1465                pack[i * 2 + 3] <<= 2;
1466                pack[i * 2 + 3] |= go->modet_map[mb];
1467                if (mb % 8 != 7)
1468                        continue;
1469                pack[i * 2 + 2] = addr++;
1470                ++i;
1471                if (i == 10 || mb == 1623) {
1472                        pack[0] = 0x2000 | i;
1473                        ret = copy_packages(code + cnt, pack, 1, space - cnt);
1474                        if (ret < 0)
1475                                return -1;
1476                        cnt += ret;
1477                        i = 0;
1478                        memset(pack, 0, 64);
1479                }
1480                pack[i * 2 + 3] = 0;
1481        }
1482
1483        memset(pack, 0, 64);
1484        i = 0;
1485        for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1486                pack[i * 2 + 2] = addr;
1487                pack[i * 2 + 3] = 0;
1488                ++i;
1489                if (i == 10 || addr == 0xbbf9) {
1490                        pack[0] = 0x2000 | i;
1491                        ret = copy_packages(code + cnt, pack, 1, space - cnt);
1492                        if (ret < 0)
1493                                return -1;
1494                        cnt += ret;
1495                        i = 0;
1496                        memset(pack, 0, 64);
1497                }
1498        }
1499        return cnt;
1500}
1501
1502static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
1503                        int *framelen)
1504{
1505        switch (type) {
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,
1513                                                                framelen);
1514                case V4L2_PIX_FMT_MPEG4:
1515                        return gen_mpeg4hdr_to_package(go, code, space,
1516                                                                framelen);
1517                }
1518        case SPECIAL_BRC_CTRL:
1519                return brctrl_to_package(go, code, space, framelen);
1520        case SPECIAL_CONFIG:
1521                return config_package(go, code, space);
1522        case SPECIAL_SEQHEAD:
1523                switch (go->format) {
1524                case V4L2_PIX_FMT_MPEG1:
1525                case V4L2_PIX_FMT_MPEG2:
1526                        return seqhead_to_package(go, code, space,
1527                                        mpeg1_sequence_header);
1528                case V4L2_PIX_FMT_MPEG4:
1529                        return seqhead_to_package(go, code, space,
1530                                        mpeg4_sequence_header);
1531                default:
1532                        return 0;
1533                }
1534        case SPECIAL_AV_SYNC:
1535                return avsync_to_package(go, code, space);
1536        case SPECIAL_FINAL:
1537                return final_package(go, code, space);
1538        case SPECIAL_AUDIO:
1539                return audio_to_package(go, code, space);
1540        case SPECIAL_MODET:
1541                return modet_to_package(go, code, space);
1542        }
1543        dev_err(go->dev,
1544                "firmware file contains unsupported feature %04x\n", type);
1545        return -1;
1546}
1547
1548int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1549{
1550        const struct firmware *fw_entry;
1551        __le16 *code, *src;
1552        int framelen[8] = { }; /* holds the lengths of empty frame templates */
1553        int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1554        int mode_flag;
1555        int ret;
1556
1557        switch (go->format) {
1558        case V4L2_PIX_FMT_MJPEG:
1559                mode_flag = FLAG_MODE_MJPEG;
1560                break;
1561        case V4L2_PIX_FMT_MPEG1:
1562                mode_flag = FLAG_MODE_MPEG1;
1563                break;
1564        case V4L2_PIX_FMT_MPEG2:
1565                mode_flag = FLAG_MODE_MPEG2;
1566                break;
1567        case V4L2_PIX_FMT_MPEG4:
1568                mode_flag = FLAG_MODE_MPEG4;
1569                break;
1570        default:
1571                return -1;
1572        }
1573        if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) {
1574                dev_err(go->dev,
1575                        "unable to load firmware from file \"%s\"\n",
1576                        GO7007_FW_NAME);
1577                return -1;
1578        }
1579        code = kzalloc(codespace * 2, GFP_KERNEL);
1580        if (code == NULL)
1581                goto fw_failed;
1582
1583        src = (__le16 *)fw_entry->data;
1584        srclen = fw_entry->size / 2;
1585        while (srclen >= 2) {
1586                chunk_flags = __le16_to_cpu(src[0]);
1587                chunk_len = __le16_to_cpu(src[1]);
1588                if (chunk_len + 2 > srclen) {
1589                        dev_err(go->dev,
1590                                "firmware file \"%s\" appears to be corrupted\n",
1591                                GO7007_FW_NAME);
1592                        goto fw_failed;
1593                }
1594                if (chunk_flags & mode_flag) {
1595                        if (chunk_flags & FLAG_SPECIAL) {
1596                                ret = do_special(go, __le16_to_cpu(src[2]),
1597                                        &code[i], codespace - i, framelen);
1598                                if (ret < 0) {
1599                                        dev_err(go->dev,
1600                                                "insufficient memory for firmware construction\n");
1601                                        goto fw_failed;
1602                                }
1603                                i += ret;
1604                        } else {
1605                                if (codespace - i < chunk_len) {
1606                                        dev_err(go->dev,
1607                                                "insufficient memory for firmware construction\n");
1608                                        goto fw_failed;
1609                                }
1610                                memcpy(&code[i], &src[2], chunk_len * 2);
1611                                i += chunk_len;
1612                        }
1613                }
1614                srclen -= chunk_len + 2;
1615                src += chunk_len + 2;
1616        }
1617        release_firmware(fw_entry);
1618        *fw = (u8 *)code;
1619        *fwlen = i * 2;
1620        return 0;
1621
1622fw_failed:
1623        kfree(code);
1624        release_firmware(fw_entry);
1625        return -1;
1626}
1627
1628MODULE_FIRMWARE(GO7007_FW_NAME);
1629