19cd9a79f57e79d81840b5e83050d434445f81c50wangkun/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 49cd9a79f57e79d81840b5e83050d434445f81c50wangkun * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 249cd9a79f57e79d81840b5e83050d434445f81c50wangkun */ 259cd9a79f57e79d81840b5e83050d434445f81c50wangkun 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 28f91c8768670386683a281cc39141e21bdda9c97fKun Wang 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/* 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 32bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Fei Jiang <fei.jiang@intel.com> 33bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 34bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 35bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 369cd9a79f57e79d81840b5e83050d434445f81c50wangkun#include <stdio.h> 379cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define TOPAZ_FW_FILE_NAME_ANDROID "/etc/firmware/topaz_fw.bin" 389cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define MSVDX_FW_FILE_NAME_ANDROID "/etc/firmware/msvdx_fw.bin" 399cd9a79f57e79d81840b5e83050d434445f81c50wangkun 409cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define TOPAZ_FW_FILE_NAME_MEEGO "/lib/firmware/topaz_fw.bin" 419cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define MSVDX_FW_FILE_NAME_MEEGO "/lib/firmware/msvdx_fw.bin" 429cd9a79f57e79d81840b5e83050d434445f81c50wangkun 439cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct topaz_fw_info_item_s { 449cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned short ver; 459cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned short codec; 469cd9a79f57e79d81840b5e83050d434445f81c50wangkun 479cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int text_size; 489cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int data_size; 499cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int data_location; 509cd9a79f57e79d81840b5e83050d434445f81c50wangkun}; 519cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef struct topaz_fw_info_item_s topaz_fw_info_item_t; 529cd9a79f57e79d81840b5e83050d434445f81c50wangkun 539cd9a79f57e79d81840b5e83050d434445f81c50wangkunenum topaz_fw_codec_e { 549cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_JPEG = 0, 559cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H264_NO_RC, 569cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H264_VBR, 579cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H264_CBR, 589cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H264_VCM, 599cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H263_NO_RC, 609cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H263_VBR, 619cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_H263_CBR, 629cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_MPEG4_NO_RC, 639cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_MPEG4_VBR, 649cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_MPEG4_CBR, 659cd9a79f57e79d81840b5e83050d434445f81c50wangkun FW_NUM 669cd9a79f57e79d81840b5e83050d434445f81c50wangkun}; 679cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef enum topaz_fw_codec_e topaz_fw_codec_t; 689cd9a79f57e79d81840b5e83050d434445f81c50wangkun 699cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct fw_table_s { 709cd9a79f57e79d81840b5e83050d434445f81c50wangkun topaz_fw_codec_t index; 719cd9a79f57e79d81840b5e83050d434445f81c50wangkun topaz_fw_info_item_t header; 72e6da98f5ac1372fe4af4eef50115654b3ce6ef6fhding // unsigned int *fw_text; 73e6da98f5ac1372fe4af4eef50115654b3ce6ef6fhding // unsigned int *fw_data; 749cd9a79f57e79d81840b5e83050d434445f81c50wangkun}; 759cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef struct fw_table_s fw_table_t; 769cd9a79f57e79d81840b5e83050d434445f81c50wangkun 779cd9a79f57e79d81840b5e83050d434445f81c50wangkun 789cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct msvdx_fw { 799cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int ver; 809cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int text_size; 819cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int data_size; 829cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int data_location; 839cd9a79f57e79d81840b5e83050d434445f81c50wangkun}; 849cd9a79f57e79d81840b5e83050d434445f81c50wangkun 859cd9a79f57e79d81840b5e83050d434445f81c50wangkun 869cd9a79f57e79d81840b5e83050d434445f81c50wangkunstatic char *codec_to_string(int codec) 879cd9a79f57e79d81840b5e83050d434445f81c50wangkun{ 889cd9a79f57e79d81840b5e83050d434445f81c50wangkun switch (codec) { 899cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H264_NO_RC: 909cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H264_NO_RC"; 919cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H264_VBR: 929cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H264_VBR"; 939cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H264_CBR: 949cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H264_CBR"; 959cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H264_VCM: 969cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H264_VCM"; 979cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H263_NO_RC: 989cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H263_NO_RC"; 999cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H263_VBR: 1009cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H263_VBR"; 1019cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_H263_CBR: 1029cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "H263_CBR"; 1039cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_MPEG4_NO_RC: 1049cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "MPEG4_NO_RC"; 1059cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_MPEG4_VBR: 1069cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "MPEG4_VBR"; 1079cd9a79f57e79d81840b5e83050d434445f81c50wangkun case FW_MPEG4_CBR: 1089cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "MPEG4_CBR"; 1099cd9a79f57e79d81840b5e83050d434445f81c50wangkun default: 1109cd9a79f57e79d81840b5e83050d434445f81c50wangkun return "Undefined codec"; 1119cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1129cd9a79f57e79d81840b5e83050d434445f81c50wangkun return ""; 1139cd9a79f57e79d81840b5e83050d434445f81c50wangkun} 1149cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1159cd9a79f57e79d81840b5e83050d434445f81c50wangkunint main() 1169cd9a79f57e79d81840b5e83050d434445f81c50wangkun{ 1179cd9a79f57e79d81840b5e83050d434445f81c50wangkun FILE *fp = NULL; 1189cd9a79f57e79d81840b5e83050d434445f81c50wangkun topaz_fw_codec_t iter = FW_H264_NO_RC; 1199cd9a79f57e79d81840b5e83050d434445f81c50wangkun // unsigned int read_data; 1209cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned int i, lseek; 1219cd9a79f57e79d81840b5e83050d434445f81c50wangkun unsigned char system_id = 0; 1229cd9a79f57e79d81840b5e83050d434445f81c50wangkun fw_table_t topaz_fw_table[FW_NUM + 1]; 1239cd9a79f57e79d81840b5e83050d434445f81c50wangkun struct msvdx_fw fw; 1249cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1259cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1269cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* open file 1279cd9a79f57e79d81840b5e83050d434445f81c50wangkun * RRRdetermine Android or Meego 1289cd9a79f57e79d81840b5e83050d434445f81c50wangkun * system_id = 0 Android 1299cd9a79f57e79d81840b5e83050d434445f81c50wangkun * system_id = 1 Meego 1309cd9a79f57e79d81840b5e83050d434445f81c50wangkun */ 1319cd9a79f57e79d81840b5e83050d434445f81c50wangkun fp = fopen(TOPAZ_FW_FILE_NAME_ANDROID, "r"); 1329cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1339cd9a79f57e79d81840b5e83050d434445f81c50wangkun if (NULL == fp) { 1349cd9a79f57e79d81840b5e83050d434445f81c50wangkun fp = fopen(TOPAZ_FW_FILE_NAME_MEEGO, "r"); 1359cd9a79f57e79d81840b5e83050d434445f81c50wangkun if (NULL == fp) { 1369cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("\nSystem isn't Android or Meego\n\n"); 1379cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("\nCan't open topaz_fw.bin\n"); 1389cd9a79f57e79d81840b5e83050d434445f81c50wangkun return -1; 1399cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1409cd9a79f57e79d81840b5e83050d434445f81c50wangkun system_id = 1; 1419cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("\nSystem is Meego\n\n"); 1429cd9a79f57e79d81840b5e83050d434445f81c50wangkun } else { 1439cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("\nSystem is Android\n\n"); 1449cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1459cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1469cd9a79f57e79d81840b5e83050d434445f81c50wangkun // fseek (fp, 0, SEEK_SET); 1479cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1489cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topza:Try to read and print topaz_fw_table...\n\n\n\n"); 1499cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1509cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* read fw table into the topz_fw_table */ 1519cd9a79f57e79d81840b5e83050d434445f81c50wangkun while (iter < FW_NUM) { 1529cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1539cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* read header */ 1549cd9a79f57e79d81840b5e83050d434445f81c50wangkun fread(&(topaz_fw_table[iter].header), sizeof(topaz_fw_table[iter].header), 1, fp); 1559cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1569cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* print header */ 1579cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: index : %s\n", codec_to_string(topaz_fw_table[iter].header.codec)); 1589cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: ver : 0x%04x\n", topaz_fw_table[iter].header.ver); 1599cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: Codec : %s\n", codec_to_string(topaz_fw_table[iter].header.codec)); 1609cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: text_size : %d\n", (topaz_fw_table[iter].header.text_size >> 2)); 1619cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: data_size : %d\n", (topaz_fw_table[iter].header.data_size >> 2)); 1629cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("topaz: data_location : 0x%08x\n\n", topaz_fw_table[iter].header.data_location); 1639cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1649cd9a79f57e79d81840b5e83050d434445f81c50wangkun fseek(fp, topaz_fw_table[iter].header.text_size + topaz_fw_table[iter].header.data_size, SEEK_CUR); 1659cd9a79f57e79d81840b5e83050d434445f81c50wangkun#if 0 1669cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* read and print fw_text */ 1679cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("fw_text = {\n"); 1689cd9a79f57e79d81840b5e83050d434445f81c50wangkun for (i = 0; i < (topaz_fw_table[iter].header.text_size >> 2); i++) { 1699cd9a79f57e79d81840b5e83050d434445f81c50wangkun fread(&read_data, 1, 4, fp); 1709cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf(" 0x%08x\n", read_data); 1719cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1729cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf(" }\n\n\n\n"); 1739cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1749cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* read and print fw_data */ 1759cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("fw_data = {\n"); 1769cd9a79f57e79d81840b5e83050d434445f81c50wangkun for (i = 0; i < (topaz_fw_table[iter].header.data_size >> 2); i++) { 1779cd9a79f57e79d81840b5e83050d434445f81c50wangkun fread(&read_data, 1, 4, fp); 1789cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf(" 0x%08x\n", read_data); 1799cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1809cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf(" }\n\n\n\n"); 1819cd9a79f57e79d81840b5e83050d434445f81c50wangkun#endif 1829cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1839cd9a79f57e79d81840b5e83050d434445f81c50wangkun ++iter; 1849cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1859cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1869cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* close topaz_fw.bin file */ 1879cd9a79f57e79d81840b5e83050d434445f81c50wangkun fclose(fp); 1889cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1899cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("\n\n\n\nmsvdx:Try to read and print msvdx_fw...\n\n\n\n"); 1909cd9a79f57e79d81840b5e83050d434445f81c50wangkun 1919cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* open msvdx_fw.bin */ 1929cd9a79f57e79d81840b5e83050d434445f81c50wangkun if (system_id == 0) { 1939cd9a79f57e79d81840b5e83050d434445f81c50wangkun fp = fopen(MSVDX_FW_FILE_NAME_ANDROID, "r"); 1949cd9a79f57e79d81840b5e83050d434445f81c50wangkun } else { 1959cd9a79f57e79d81840b5e83050d434445f81c50wangkun fp = fopen(MSVDX_FW_FILE_NAME_MEEGO, "r"); 1969cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 1979cd9a79f57e79d81840b5e83050d434445f81c50wangkun if (NULL == fp) { 1989cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("Can't open msvdx_fw.bin\n"); 1999cd9a79f57e79d81840b5e83050d434445f81c50wangkun return -1; 2009cd9a79f57e79d81840b5e83050d434445f81c50wangkun } 2019cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2029cd9a79f57e79d81840b5e83050d434445f81c50wangkun // fseek (fp, 0, SEEK_SET); 2039cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2049cd9a79f57e79d81840b5e83050d434445f81c50wangkun /*read and print fw*/ 2059cd9a79f57e79d81840b5e83050d434445f81c50wangkun fread(&fw, sizeof(fw), 1, fp); 2069cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2079cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx slice switch firmware: ver : 0x%04x\n", fw.ver); 2089cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx slice switch firmware: text_size : %d\n", fw.text_size); 2099cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx slice switch firmware: data_size : %d\n", fw.data_size); 2109cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx slice switch firmware: data_location : 0x%08x\n\n", fw.data_location); 2119cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2129cd9a79f57e79d81840b5e83050d434445f81c50wangkun lseek = ((sizeof(fw) + (fw.text_size + fw.data_size) * 4 + 0xfff) & ~0xfff); 2139cd9a79f57e79d81840b5e83050d434445f81c50wangkun fseek(fp, lseek, SEEK_SET); 2149cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2159cd9a79f57e79d81840b5e83050d434445f81c50wangkun /*read and print fw*/ 2169cd9a79f57e79d81840b5e83050d434445f81c50wangkun fread(&fw, sizeof(fw), 1, fp); 2179cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2189cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx frame switch firmware: ver : 0x%04x\n", fw.ver); 2199cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx frame switch firmware: text_size : %d\n", fw.text_size); 2209cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx frame switch firmware: data_size : %d\n", fw.data_size); 2219cd9a79f57e79d81840b5e83050d434445f81c50wangkun printf("msvdx frame switch firmware: data_location : 0x%08x\n\n", fw.data_location); 2229cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2239cd9a79f57e79d81840b5e83050d434445f81c50wangkun /* close msvdx_fw.bin file */ 2249cd9a79f57e79d81840b5e83050d434445f81c50wangkun fclose(fp); 2259cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2269cd9a79f57e79d81840b5e83050d434445f81c50wangkun return 0; 2279cd9a79f57e79d81840b5e83050d434445f81c50wangkun} 2289cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2299cd9a79f57e79d81840b5e83050d434445f81c50wangkun 2309cd9a79f57e79d81840b5e83050d434445f81c50wangkun 231