/*
* INTEL CONFIDENTIAL
* Copyright 2007 Intel Corporation. All Rights Reserved.
* Copyright 2005-2007 Imagination Technologies Limited. All Rights Reserved.
*
* The source code contained or described herein and all documents related to
* the source code ("Material") are owned by Intel Corporation or its suppliers
* or licensors. Title to the Material remains with Intel Corporation or its
* suppliers and licensors. The Material may contain trade secrets and
* proprietary and confidential information of Intel Corporation and its
* suppliers and licensors, and is protected by worldwide copyright and trade
* secret laws and treaty provisions. No part of the Material may be used,
* copied, reproduced, modified, published, uploaded, posted, transmitted,
* distributed, or disclosed in any way without Intel's prior express written
* permission.
*
* No license under any patent, copyright, trade secret or other intellectual
* property right is granted to or conferred upon you by disclosure or delivery
* of the Materials, either expressly, by implication, inducement, estoppel or
* otherwise. Any license under such intellectual property rights must be
* express and approved by Intel in writing.
*/
/*
* Authors:
* Elaine Wang <zhaohan.ren@intel.com>
*
*/
#include <stdio.h>
#include "JPEGMasterFirmware_bin.h"
#include "H264MasterFirmware_bin.h"
#include "H264MasterFirmwareCBR_bin.h"
#include "H264MasterFirmwareVBR_bin.h"
#include "H264MasterFirmwareVCM_bin.h"
#include "H264MasterFirmwareLLRC_bin.h"
#include "H264MasterFirmwareALL_bin.h"
#include "H263MasterFirmware_bin.h"
#include "H263MasterFirmwareCBR_bin.h"
#include "H263MasterFirmwareVBR_bin.h"
//#include "H263MasterFirmwareLLRC_bin.h"
#include "MPG2MasterFirmware_bin.h"
#include "MPG2MasterFirmwareCBR_bin.h"
#include "MPG2MasterFirmwareVBR_bin.h"
//#include "MPG2MasterFirmwareLLRC_bin.h"
#include "MPG4MasterFirmware_bin.h"
#include "MPG4MasterFirmwareCBR_bin.h"
#include "MPG4MasterFirmwareVBR_bin.h"
#include "MPG4MasterFirmwareLLRC_bin.h"
#include "H264MVCMasterFirmware_bin.h"
#include "H264MVCMasterFirmwareCBR_bin.h"
#include "H264MVCMasterFirmwareVBR_bin.h"
#include "H264MVCMasterFirmwareLLRC_bin.h"
#include "thread0_bin.h"
#include "Primary_VRL.txt"
#define FW_VER 0x5D
#define FW_FILE_NAME_A0 "topazhp_fw.bin"
#define FW_FILE_NAME_B0 "topazhp_fw_b0.bin"
static const unsigned char pad_val = 0x0;
#define FW_MASTER_INFO(codec,prefix) \
{ FW_MASTER_##codec,\
{ FW_VER,\
FW_MASTER_##codec,\
ui32##prefix##_MasterMTXTOPAZFWTextSize,\
ui32##prefix##_MasterMTXTOPAZFWDataSize,\
ui32##prefix##_MasterMTXTOPAZFWDataOrigin\
},\
aui32##prefix##_MasterMTXTOPAZFWText, aui32##prefix##_MasterMTXTOPAZFWData \
}
#define FW_SLAVE_INFO(codec,prefix) \
{ FW_SLAVE_##codec,\
{ FW_VER,\
FW_SLAVE_##codec,\
ui32##prefix##_SlaveMTXTOPAZFWTextSize,\
ui32##prefix##_SlaveMTXTOPAZFWDataSize,\
ui32##prefix##_SlaveMTXTOPAZFWDataOrigin\
},\
aui32##prefix##_SlaveMTXTOPAZFWText, aui32##prefix##_SlaveMTXTOPAZFWData \
}
struct topaz_fw_info_item_s {
unsigned short ver;
unsigned short codec;
unsigned int text_size;
unsigned int data_size;
unsigned int data_location;
};
typedef struct topaz_fw_info_item_s topaz_fw_info_item_t;
/* Commented out all the SLAVE structure according to DDK */
enum topaz_fw_codec_e {
FW_MASTER_JPEG = 0, //!< JPEG
FW_MASTER_H264_NO_RC, //!< H264 with no rate control
FW_MASTER_H264_VBR, //!< H264 variable bitrate
FW_MASTER_H264_CBR, //!< H264 constant bitrate
FW_MASTER_H264_VCM, //!< H264 video conferance mode
FW_MASTER_H264_LLRC, //!< H264 low-latency rate control
FW_MASTER_H264ALL,
FW_MASTER_H263_NO_RC, //!< H263 with no rate control
FW_MASTER_H263_VBR, //!< H263 variable bitrate
FW_MASTER_H263_CBR, //!< H263 constant bitrate
FW_MASTER_MPEG4_NO_RC, //!< MPEG4 with no rate control
FW_MASTER_MPEG4_VBR, //!< MPEG4 variable bitrate
FW_MASTER_MPEG4_CBR, //!< MPEG4 constant bitrate
FW_MASTER_MPEG2_NO_RC, //!< MPEG2 with no rate control
FW_MASTER_MPEG2_VBR, //!< MPEG2 variable bitrate
FW_MASTER_MPEG2_CBR, //!< MPEG2 constant bitrate
FW_MASTER_H264MVC_NO_RC, //!< MVC H264 with no rate control
FW_MASTER_H264MVC_CBR, //!< MVC H264 constant bitrate
FW_MASTER_H264MVC_VBR, //!< MVC H264 variable bitrate
FW_MASTER_H264MVC_LLRC, //!< MVC H264 low-latency rate control
FW_NUM
};
typedef enum topaz_fw_codec_e topaz_fw_codec_t;
struct fw_table_s {
topaz_fw_codec_t index;
topaz_fw_info_item_t header;
unsigned int *fw_text;
unsigned int *fw_data;
};
typedef struct fw_table_s fw_table_t;
#define SECURE_ALIGN 1
#define B0_ALIGN 4
#define SECURE_VRL_HEADER 728
#define SECURE_FIP_HEADER 296
struct fw_table_A0 {
unsigned int addr;
unsigned int text_size_bytes;
unsigned int data_size_bytes;
unsigned int data_relocation;
};
static void create_firmware_A0(fw_table_t *tng_fw_table, FILE *fp)
{
struct fw_table_A0 sec_t[FW_NUM];
const unsigned int ui_secure_align = SECURE_ALIGN - 1;
unsigned int i = 0;
int iter = 0;
int size = 0;
printf("fm num is %d\n", FW_NUM);
/////////////////////////////////////////////////
size = SECURE_VRL_HEADER + SECURE_FIP_HEADER;
for (iter = 0; iter < size; iter++) {
fwrite(&pad_val, 1, 1, fp);
}
/////////////////////////////////////////////////
iter = 0;
sec_t[iter].addr = FW_NUM * 16 + SECURE_VRL_HEADER + SECURE_FIP_HEADER;
sec_t[iter].text_size_bytes = tng_fw_table[iter].header.text_size * 4;
sec_t[iter].data_size_bytes = tng_fw_table[iter].header.data_size * 4;
sec_t[iter].data_relocation = tng_fw_table[iter].header.data_location;
fwrite(&(sec_t[iter]), sizeof(struct fw_table_A0), 1, fp);
iter = 1;
/* write fw table into the file */
while (iter < FW_NUM) {
sec_t[iter - 1].text_size_bytes = (sec_t[iter - 1].text_size_bytes + ui_secure_align) & (~ui_secure_align);
sec_t[iter - 1].data_size_bytes = (sec_t[iter - 1].data_size_bytes + ui_secure_align) & (~ui_secure_align);
sec_t[iter].addr = sec_t[iter-1].addr + sec_t[iter-1].text_size_bytes + sec_t[iter-1].data_size_bytes;
sec_t[iter].text_size_bytes = tng_fw_table[iter].header.text_size * 4;
sec_t[iter].data_size_bytes = tng_fw_table[iter].header.data_size * 4;
sec_t[iter].data_relocation = tng_fw_table[iter].header.data_location;
fwrite(&(sec_t[iter]), sizeof(struct fw_table_A0), 1, fp);
++iter;
}
sec_t[iter - 1].text_size_bytes = (sec_t[iter - 1].text_size_bytes + ui_secure_align) & (~ui_secure_align);
sec_t[iter - 1].data_size_bytes = (sec_t[iter - 1].data_size_bytes + ui_secure_align) & (~ui_secure_align);
iter = 0;
while (iter < FW_NUM) {
/* write text */
size = tng_fw_table[iter].header.text_size * 4;
fwrite(tng_fw_table[iter].fw_text, 1, size, fp);
for (i = 0; i < (sec_t[iter].text_size_bytes - size); i++)
fwrite(&pad_val, 1, 1, fp);
/* write data */
size = tng_fw_table[iter].header.data_size * 4;
fwrite(tng_fw_table[iter].fw_data, 1, size, fp);
for (i = 0; i < (sec_t[iter].data_size_bytes - size); i++)
fwrite(&pad_val, 1, 1, fp);
fflush(fp);
++iter;
}
return ;
}
struct fw_table_B0 {
unsigned int addr;
unsigned int text_size_dword;
unsigned int data_size_dword;
unsigned int text_size_bytes;
};
static const char FIP_Header[] = {
0x24, 0x56, 0x45, 0x43,
0x01, 0x00, 0x01, 0x00,
0x4a, 0x00, 0x00, 0x00,
0x8e, 0x00, 0x00, 0x00,
0x22, 0x00, 0x9c, 0x00,
0x0e, 0x00, 0x00, 0x00
};
static void create_firmware_B0(fw_table_t *tng_fw_table, FILE *fp)
{
struct fw_table_B0 sec_t[FW_NUM];
const unsigned int i_align = B0_ALIGN - 1;
const unsigned int data_loco = 0x0ffff;
unsigned int i = 0;
int iter = 0;
int size = 0;
printf("fm num is %d\n", FW_NUM);
/////////////////////////////////////////////////
size = sizeof(FIP_Header);
fwrite(FIP_Header, size, 1, fp);
printf("FIP header is %d, 296\n", size);
size = SECURE_FIP_HEADER - sizeof(FIP_Header);
for (iter = 0; iter < size; iter++) {
fwrite(&pad_val, 1, 1, fp);
}
/////////////////////////////////////////////////
iter = 0;
sec_t[iter].addr = FW_NUM * 16 + SECURE_VRL_HEADER + SECURE_FIP_HEADER;
sec_t[iter].text_size_bytes = tng_fw_table[iter].header.data_location & data_loco;
sec_t[iter].text_size_dword = sec_t[iter].text_size_bytes >> 2;
sec_t[iter].data_size_dword = (tng_fw_table[iter].header.data_size + i_align) & (~i_align);
fwrite(&(sec_t[iter]), sizeof(struct fw_table_B0), 1, fp);
iter = 1;
/* write fw table into the file */
while (iter < FW_NUM) {
sec_t[iter].addr = sec_t[iter-1].addr +
sec_t[iter-1].text_size_bytes +
(sec_t[iter-1].data_size_dword << 2);
sec_t[iter].text_size_bytes = tng_fw_table[iter].header.data_location & data_loco;
sec_t[iter].text_size_dword = sec_t[iter].text_size_bytes >> 2;
sec_t[iter].data_size_dword = (tng_fw_table[iter].header.data_size + i_align) & (~i_align);
fwrite(&(sec_t[iter]), sizeof(struct fw_table_B0), 1, fp);
++iter;
}
iter = 0;
while (iter < FW_NUM) {
/* write text */
size = tng_fw_table[iter].header.text_size * 4;
fwrite(tng_fw_table[iter].fw_text, 1, size, fp);
for (i = 0; i < (sec_t[iter].text_size_bytes - size); i++)
fwrite(&pad_val, 1, 1, fp);
/* write data */
size = tng_fw_table[iter].header.data_size * 4;
fwrite(tng_fw_table[iter].fw_data, 1, size, fp);
for (i = 0; i < ((sec_t[iter].data_size_dword << 2) - size); i++)
fwrite(&pad_val, 1, 1, fp);
fflush(fp);
++iter;
}
return ;
}
static void normal_firmware(fw_table_t *topaz_fw_table, FILE *fp)
{
unsigned int i = 0;
topaz_fw_codec_t iter = 0;
int size = 0;
printf("fm num is %d\n", FW_NUM);
/* write fw table into the file */
while (iter < FW_NUM) {
/* record the size use bytes */
topaz_fw_table[iter].header.data_size *= 4;
topaz_fw_table[iter].header.text_size *= 4;
/* write header */
fwrite(&(topaz_fw_table[iter].header), sizeof(topaz_fw_table[iter].header), 1, fp);
/* write text */
size = topaz_fw_table[iter].header.text_size;
fwrite(topaz_fw_table[iter].fw_text, 1, size, fp);
/* write data */
size = topaz_fw_table[iter].header.data_size;
fwrite(topaz_fw_table[iter].fw_data, 1, size, fp);
++iter;
}
}
int main()
{
FILE *fp = NULL;
fw_table_t topaz_fw_table[] = {
FW_MASTER_INFO(JPEG, JPEG), //FW_MASTER_JPEG = 0, //!< JPEG
FW_MASTER_INFO(H264_NO_RC, H264),//FW_MASTER_H264_NO_RC, //!< H264 with no rate control
FW_MASTER_INFO(H264_VBR, H264VBR),//FW_MASTER_H264_VBR, //!< H264 variable bitrate
FW_MASTER_INFO(H264_CBR, H264CBR),//FW_MASTER_H264_CBR, //!< H264 constant bitrate
FW_MASTER_INFO(H264_VCM, H264VCM),//FW_MASTER_H264_VCM, //!< H264 video conferance mode
FW_MASTER_INFO(H264_LLRC, H264LLRC),//FW_MASTER_H264_LLRC, //!< H264 low-latency rate control
FW_MASTER_INFO(H264ALL, H264ALL),
FW_MASTER_INFO(H263_NO_RC, H263),//FW_MASTER_H263_NO_RC, //!< H263 with no rate control
FW_MASTER_INFO(H263_VBR, H263VBR),//FW_MASTER_H263_VBR, //!< H263 variable bitrate
FW_MASTER_INFO(H263_CBR, H263CBR),//FW_MASTER_H263_CBR, //!< H263 constant bitrate
FW_MASTER_INFO(MPEG4_NO_RC, MPG4),//FW_MASTER_MPEG4_NO_RC, //!< MPEG4 with no rate control
FW_MASTER_INFO(MPEG4_VBR, MPG4VBR),//FW_MASTER_MPEG4_VBR, //!< MPEG4 variable bitrate
FW_MASTER_INFO(MPEG4_CBR, MPG4CBR),//FW_MASTER_MPEG4_CBR, //!< MPEG4 constant bitrate
FW_MASTER_INFO(MPEG2_NO_RC, MPG2),//FW_MASTER_MPEG2_NO_RC, //!< MPEG2 with no rate control
FW_MASTER_INFO(MPEG2_VBR, MPG2VBR),//FW_MASTER_MPEG2_VBR, //!< MPEG2 variable bitrate
FW_MASTER_INFO(MPEG2_CBR, MPG2CBR),//FW_MASTER_MPEG2_CBR, //!< MPEG2 constant bitrate
FW_MASTER_INFO(H264MVC_NO_RC, H264MVC),//FW_MASTER_H264MVC_NO_RC, //!< MVC H264 with no rate control
FW_MASTER_INFO(H264MVC_CBR, H264MVCCBR),//FW_MASTER_H264MVC_CBR, //!< MVC H264 constant bitrate
FW_MASTER_INFO(H264MVC_VBR, H264MVCVBR),//FW_MASTER_H264MVC_VBR, //!< MVC H264 variable bitrate
FW_MASTER_INFO(H264MVC_LLRC, H264MVCLLRC),//FW_MASTER_H264MVC_LLRC, //!< MVC H264 low-latency rate control
};
#ifdef B0_DEBUG
printf("fw_num is %d, fw = %d\n", FW_NUM, (int)sizeof(topaz_fw_table));
for(i = 0; i < FW_NUM; i++) {
topaz_fw_table[i].index = i;
topaz_fw_table[i].header.ver = FW_VER;
topaz_fw_table[i].header.codec = FW_MASTER_H264_NO_RC;
topaz_fw_table[i].header.text_size = 6883;
topaz_fw_table[i].header.data_size = 2997;
topaz_fw_table[i].header.data_location = 0x82886b90;
topaz_fw_table[i].fw_text = aui32H264_MasterMTXTOPAZFWText;
topaz_fw_table[i].fw_data = aui32H264_MasterMTXTOPAZFWData;
}
#endif
/* open file */
fp = fopen(FW_FILE_NAME_A0, "w");
if (NULL == fp)
return -1;
create_firmware_A0(topaz_fw_table, fp);
/* close file */
fclose(fp);
fp = fopen(FW_FILE_NAME_B0, "w");
if (NULL == fp)
return -1;
create_firmware_B0(topaz_fw_table, fp);
/* close file */
fclose(fp);
return 0;
}