You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
14 KiB
399 lines
14 KiB
/* |
|
* 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; |
|
}
|
|
|