修改软件版本号及启动状态信息
发布时间:2020-12-15 18:28:07 所属栏目:百科 来源:网络整理
导读:#include stdio.h#include stdlib.h#include string.h#include unistd.h#include sys/stat.h#include sys/types.h#include fcntl.h#include dirent.htypedef unsigned char U8;typedef unsigned int U32;#define DEBUG_THIS#if defined(DEBUG_THIS)#define D
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <dirent.h> typedef unsigned char U8; typedef unsigned int U32; #define DEBUG_THIS #if defined(DEBUG_THIS) #define DBGMODL "CHAGESTATE" #define dbg_print(outflag,...) do{switch(outflag){case 1:printf("n<INFO> " DBGMODL ": [%s],Line %d ",__FUNCTION__,__LINE__);printf(__VA_ARGS__);fflush(stdout);break;case 2: printf("n<ERROR> " DBGMODL ": [%s],__LINE__);printf(__VA_ARGS__);fflush(stdout);break;default:break;}}while(0) #else #define dbg_print #endif #define E2P_JWT_LOADER_SIZE_FDCA 20 typedef struct { U8 activation; U8 pid[2]; U8 table_id; U8 freq[4]; U8 symbol[4]; U8 modulation; U8 block_index; U8 version[2]; U8 crc[4]; }JWT_UPDATE_FDCA_t; typedef struct{ U8 manufacturer_id; U8 model_id; U8 majorhardwrare_id; U8 subhardwrare_id; U8 ca_ident_number[4]; U8 release_number[4]; U8 broadcaster[4]; U8 signature[152]; U8 batch_id; U8 MAC_address[6]; U8 build_year; U8 build_week; U8 STB_provider_id[2]; U8 manager_code[4]; U8 hardware_code[4]; U8 software_version[4]; U8 reserved[61]; U8 crc[4]; }JWT_UPDATE_BCA_t; typedef struct{ U8 major_mrs_version; U8 sub_mrs_version; U8 reserved1[8]; U8 release_year; U8 release_month; U8 release_date; U8 reserved2[11]; U8 fdca_image[E2P_JWT_LOADER_SIZE_FDCA]; U8 signature[152]; U8 crc[4]; }JWT_UPDATE_FLASH_HEADER_t; extern char *optarg; //global variable char exe_filename[20]=" "; U8 chgstate = 0,ori_chgstate = 0; U8 sw_ver = 0,ori_sw_ver = 0; U8 auto_reboot = 0; U32 dumplen = 2048; U32 fgda_offset = 512; U32 bca_offset = 0; U8 quit = 0; char dumpfile[256]="/mnt/info/stbinfotmp"; #ifdef BCM7581B0 U8 mtdnum = 7; char *filename="/mnt/usb/kv_7581b0_update/usb_update.cfg"; char *platform="bcm7581b0"; #endif #ifdef BCM7019C0 U8 mtdnum = 11; char *filename="/mnt/usb/kv_update/usb_update.cfg"; char *platform="bcm7019c0"; #endif unsigned long ulTable_MPEG32_ota[256] = { 0x00000000L,0x04C11DB7L,0x09823B6EL,0x0D4326D9L,0x130476DCL,0x17C56B6BL,0x1A864DB2L,0x1E475005L,0x2608EDB8L,0x22C9F00FL,0x2F8AD6D6L,0x2B4BCB61L,0x350C9B64L,0x31CD86D3L,0x3C8EA00AL,0x384FBDBDL,0x4C11DB70L,0x48D0C6C7L,0x4593E01EL,0x4152FDA9L,0x5F15ADACL,0x5BD4B01BL,0x569796C2L,0x52568B75L,0x6A1936C8L,0x6ED82B7FL,0x639B0DA6L,0x675A1011L,0x791D4014L,0x7DDC5DA3L,0x709F7B7AL,0x745E66CDL,0x9823B6E0L,0x9CE2AB57L,0x91A18D8EL,0x95609039L,0x8B27C03CL,0x8FE6DD8BL,0x82A5FB52L,0x8664E6E5L,0xBE2B5B58L,0xBAEA46EFL,0xB7A96036L,0xB3687D81L,0xAD2F2D84L,0xA9EE3033L,0xA4AD16EAL,0xA06C0B5DL,0xD4326D90L,0xD0F37027L,0xDDB056FEL,0xD9714B49L,0xC7361B4CL,0xC3F706FBL,0xCEB42022L,0xCA753D95L,0xF23A8028L,0xF6FB9D9FL,0xFBB8BB46L,0xFF79A6F1L,0xE13EF6F4L,0xE5FFEB43L,0xE8BCCD9AL,0xEC7DD02DL,0x34867077L,0x30476DC0L,0x3D044B19L,0x39C556AEL,0x278206ABL,0x23431B1CL,0x2E003DC5L,0x2AC12072L,0x128E9DCFL,0x164F8078L,0x1B0CA6A1L,0x1FCDBB16L,0x018AEB13L,0x054BF6A4L,0x0808D07DL,0x0CC9CDCAL,0x7897AB07L,0x7C56B6B0L,0x71159069L,0x75D48DDEL,0x6B93DDDBL,0x6F52C06CL,0x6211E6B5L,0x66D0FB02L,0x5E9F46BFL,0x5A5E5B08L,0x571D7DD1L,0x53DC6066L,0x4D9B3063L,0x495A2DD4L,0x44190B0DL,0x40D816BAL,0xACA5C697L,0xA864DB20L,0xA527FDF9L,0xA1E6E04EL,0xBFA1B04BL,0xBB60ADFCL,0xB6238B25L,0xB2E29692L,0x8AAD2B2FL,0x8E6C3698L,0x832F1041L,0x87EE0DF6L,0x99A95DF3L,0x9D684044L,0x902B669DL,0x94EA7B2AL,0xE0B41DE7L,0xE4750050L,0xE9362689L,0xEDF73B3EL,0xF3B06B3BL,0xF771768CL,0xFA325055L,0xFEF34DE2L,0xC6BCF05FL,0xC27DEDE8L,0xCF3ECB31L,0xCBFFD686L,0xD5B88683L,0xD1799B34L,0xDC3ABDEDL,0xD8FBA05AL,0x690CE0EEL,0x6DCDFD59L,0x608EDB80L,0x644FC637L,0x7A089632L,0x7EC98B85L,0x738AAD5CL,0x774BB0EBL,0x4F040D56L,0x4BC510E1L,0x46863638L,0x42472B8FL,0x5C007B8AL,0x58C1663DL,0x558240E4L,0x51435D53L,0x251D3B9EL,0x21DC2629L,0x2C9F00F0L,0x285E1D47L,0x36194D42L,0x32D850F5L,0x3F9B762CL,0x3B5A6B9BL,0x0315D626L,0x07D4CB91L,0x0A97ED48L,0x0E56F0FFL,0x1011A0FAL,0x14D0BD4DL,0x19939B94L,0x1D528623L,0xF12F560EL,0xF5EE4BB9L,0xF8AD6D60L,0xFC6C70D7L,0xE22B20D2L,0xE6EA3D65L,0xEBA91BBCL,0xEF68060BL,0xD727BBB6L,0xD3E6A601L,0xDEA580D8L,0xDA649D6FL,0xC423CD6AL,0xC0E2D0DDL,0xCDA1F604L,0xC960EBB3L,0xBD3E8D7EL,0xB9FF90C9L,0xB4BCB610L,0xB07DABA7L,0xAE3AFBA2L,0xAAFBE615L,0xA7B8C0CCL,0xA379DD7BL,0x9B3660C6L,0x9FF77D71L,0x92B45BA8L,0x9675461FL,0x8832161AL,0x8CF30BADL,0x81B02D74L,0x857130C3L,0x5D8A9099L,0x594B8D2EL,0x5408ABF7L,0x50C9B640L,0x4E8EE645L,0x4A4FFBF2L,0x470CDD2BL,0x43CDC09CL,0x7B827D21L,0x7F436096L,0x7200464FL,0x76C15BF8L,0x68860BFDL,0x6C47164AL,0x61043093L,0x65C52D24L,0x119B4BE9L,0x155A565EL,0x18197087L,0x1CD86D30L,0x029F3D35L,0x065E2082L,0x0B1D065BL,0x0FDC1BECL,0x3793A651L,0x3352BBE6L,0x3E119D3FL,0x3AD08088L,0x2497D08DL,0x2056CD3AL,0x2D15EBE3L,0x29D4F654L,0xC5A92679L,0xC1683BCEL,0xCC2B1D17L,0xC8EA00A0L,0xD6AD50A5L,0xD26C4D12L,0xDF2F6BCBL,0xDBEE767CL,0xE3A1CBC1L,0xE760D676L,0xEA23F0AFL,0xEEE2ED18L,0xF0A5BD1DL,0xF464A0AAL,0xF9278673L,0xFDE69BC4L,0x89B8FD09L,0x8D79E0BEL,0x803AC667L,0x84FBDBD0L,0x9ABC8BD5L,0x9E7D9662L,0x933EB0BBL,0x97FFAD0CL,0xAFB010B1L,0xAB710D06L,0xA6322BDFL,0xA2F33668L,0xBCB4666DL,0xB8757BDAL,0xB5365D03L,0xB1F740B4L }; U32 calculateCRC(U8 *pData,U8 len) { U32 section_len; U32 calucate_crc; U8 *tempData = pData; section_len = len; calucate_crc = 0xFFFFFFFF; /* calculate CRC */ while (section_len--) { calucate_crc = ulTable_MPEG32_ota[((calucate_crc >> 24) ^ *tempData++) & 0xFFL] ^ (calucate_crc << 8); } return calucate_crc; } void print_help(char *name) { printf("此程序用作更改机顶盒的信息-n改变进入选项,-s改变软件版本号n"); printf("用法:%s ?[选项] <[-n state] [-s sw_ver]>n",name); printf("选项有:-m 指定的mtd号(默认是7)n"); printf(" :-f 指定要导出的文件名(默认为/mnt/info/stbinfotmp)n"); printf(" :-l 指定要导出的数据长度(默认为2048)n"); printf(" :-o 指定信息表的偏移(默认为512)n"); printf(" :-a 指定修改完成后是否自动重新启动机顶盒(默认是不自动重启)n"); printf("举例如:%s -n 0x1b -antt将信息修改为0x1b后,自动重启n",name); printf(" :%s -n 0x1b -m 9 -f /mnt/tmp -l 1024 -o 256n",name); printf("This Program is for %s by KINGVONn",platform); printf("Any Problem You can contact me:lqrensn@163.comn"); } //parse input paramerter void parse_input(int argc,char *argv[]) { int opt; U8 chgstate_flag = 0; U8 tmpbuf[2]; if(argc <2) { print_help(exe_filename); exit(-1); } //To compatible the version before if(argc == 2) { if(!strncmp(argv[1],"-h",2)) { print_help(exe_filename); exit(0); } if((!strncmp(argv[1],"0x",2)) || (!strncmp(argv[1],"0X",2))) { chgstate = strtoul(argv[1],NULL,16); } else { chgstate = atoi(argv[1]); } dbg_print(1,"The change value is %dn",chgstate); return; } while((opt = getopt(argc,argv,"ahn:m:f:s:l:")) != -1) { switch(opt) { case 'n': if((!strncmp(optarg,2)) || (!strncmp(optarg,2))) { chgstate = strtoul(optarg,16); } else { chgstate = atoi(optarg); } dbg_print(1,chgstate); chgstate_flag = 1; break; case 'm': mtdnum = atoi(optarg); break; case 's': if((!strncmp(optarg,2))) { sw_ver = strtoul(optarg,16); } else { sw_ver = atoi(optarg); } dbg_print(1,"The changed SW Version is %dn",sw_ver); chgstate_flag = 1; break; case 'f': strcpy(dumpfile,optarg); break; case 'l': dumplen = atoi(optarg); break; case 'o': fgda_offset = atoi(optarg); break; case 'a': auto_reboot = 1; break; default: print_help(exe_filename); exit(-1); break; } } if(chgstate_flag != 1) { printf("Your Must Set the State Vaule or changed SW version!n"); print_help(exe_filename); exit(-1); } } //get dir from file name void getdir(char *src,char **buf) { int l = strlen(src); dbg_print(1,"src:%s,len:%dn",src,l); char *p = strrchr(src,'/'); int len = strlen(p); dbg_print(1,"*p=%s,p,len); strncpy(*buf,(l-len)); (*buf)[l-len]=' '; dbg_print(1,"buf:%sn",*buf); } //check the dir if exist,dump the file to dir int check_dump_file(void) { char *buf; int status; char cmd[64]=" "; if(!access(dumpfile,R_OK)) { dbg_print(1,"The file allready existed !n"); return 0; } buf = malloc(50); memset(buf,' ',sizeof(buf)); //if file is not exist,then mkdir the path and dump the file getdir(dumpfile,&buf); dbg_print(1,"dir name is %sn",buf); if(opendir(buf) == NULL) { status = mkdir(buf,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); if(status == -1) { printf("mkdir %s errorn",buf); free(buf); return -1; } } free(buf); sprintf(cmd,"nanddump -q -o -l %d -f %s /dev/mtd%d",dumplen,dumpfile,mtdnum); system(cmd); return 0; } int jwtdrv_flash_read(const char *filename,U32 offset,U32 len,U8 *buff) { int flag = 0; FILE *fp = NULL; int nflag=-1; fp = fopen(filename,"r+"); if(NULL == fp) { fclose(fp); return -1; } fseek(fp,offset,SEEK_SET); nflag = fread(buff,1,len,fp); fclose(fp); if(0 > nflag) { return -1; } return nflag; } int jwtdrv_flash_write(const char *filename,U8 *buff) { int fp; int nflag = -1; fp = open(filename,O_RDWR); if(-1 == fp) { return -1; } lseek(fp,SEEK_SET); // fseek(fp,SEEK_SET); nflag = write(fp,buff,len); // nflag=fwrite(buff,fp); if(0 > nflag) { close(fp); return -1; } fsync(fp); close(fp); return 0; } int parse_str(char *ssrc,char *src,char *dst) { char *ptr; ptr = strstr(ssrc,src); ptr = strchr(ssrc,'='); ptr++; strcpy(dst,ptr); dbg_print(1,dst); return 0; } int buf_to_int(char *buf) { int conved = 0; if((!strncmp(buf,2)) || (!strncmp(buf,2))) { conved = strtoul(buf,16); } else { conved = atoi(buf); } return conved; } int read_cfg_from_usb() { FILE *fp = NULL; char chptr[256]; char *ptr; char buf[256]; #if 0 fp = fopen("usb_update.cfg","rb"); #else fp = fopen(filename,"rb"); #endif if(fp == NULL) { printf("Open File from USB errorn"); return -1; } while(fgets(chptr,256,fp)!=' ') { if(strncasecmp(chptr,"[E_JWT_USB_UPDATE]",17) == 0) { printf("End of JWT Usb Update config!n"); break; } if(strncasecmp(chptr,"[S_JWT_USB_UPDATE]",17) == 0) { fgets(chptr,fp); parse_str(chptr,"state=",buf); chgstate = buf_to_int(buf); fgets(chptr,"sw_ver=",buf); sw_ver = buf_to_int(buf); fgets(chptr,"stbmtd=",buf); mtdnum = buf_to_int(buf); fgets(chptr,"dumpfile=",buf); strncpy(dumpfile,buf,strlen(dumpfile)); fgets(chptr,"dumplen=",buf); dumplen = buf_to_int(buf); fgets(chptr,"off_bca=",buf); bca_offset = buf_to_int(buf); fgets(chptr,"off_fgda=",buf); fgda_offset = buf_to_int(buf); fgets(chptr,"auto_reboot=",buf); auto_reboot = buf_to_int(buf); fgets(chptr,"debug_print=",buf); quit = buf_to_int(buf); } } if(fp != NULL) { fclose(fp); } return 0; } void printf_usb_cfg() { printf("chgstate:0x%xn",chgstate); printf("sw_ver:0x%xn",sw_ver); printf("mtdnum:%dn",mtdnum); printf("dumpfile:%sn",dumpfile); printf("dumplen:%dn",dumplen); printf("bca_offset:%dn",bca_offset); printf("fgda_offset:%dn",fgda_offset); printf("auto_reboot:%dn",auto_reboot); } int main(int argc,char *argv[]) { int ret = 0; char *buf; U32 FDCACRCValue; U32 BCACrc32Value; JWT_UPDATE_FDCA_t fdca_t; JWT_UPDATE_BCA_t bca_t; char cmd[128]=" "; //save the bin file name strcpy(exe_filename,argv[0]); buf = malloc(1024); memset(buf,1024); //parse parameter if(argc<=1) { //read input from usbdisk ret = read_cfg_from_usb(); if(-1 ==ret) { return -1; } } else { //input paramater parse_input(argc,argv); } //check the file ret = check_dump_file(); if(ret !=0) { dbg_print(2,"check and dump file errorn"); return -1; } //get default stb infomation ret = jwtdrv_flash_read(dumpfile,1024,buf); if(ret < 0) { dbg_print(2,"flash read errorn"); return -1; } else { memcpy(&fdca_t,&buf[512],sizeof(fdca_t)); memcpy(&bca_t,sizeof(bca_t)); ori_chgstate = fdca_t.activation; ori_sw_ver = bca_t.software_version[1]; } #if 0 memset(&buf[offset],chgstate,1); #else if((chgstate < 0x17) || (chgstate > 0x2a)) { printf("Your input State error,use defaultn"); chgstate = ori_chgstate; } else { fdca_t.activation = chgstate; FDCACRCValue = calculateCRC((U8 *)&fdca_t,sizeof(fdca_t) - 4); fdca_t.crc[0] = (FDCACRCValue >> 24) & 0xFF; fdca_t.crc[1] = (FDCACRCValue >> 16) & 0xFF; fdca_t.crc[2] = (FDCACRCValue >> 8) & 0xFF; fdca_t.crc[3] = FDCACRCValue & 0xFF; memcpy(&buf[512],&fdca_t,sizeof(fdca_t)); } #endif if((sw_ver <= 0) || (sw_ver > 255)) { printf("Your input SW_VER:%d error(0,255],Use dafaultn"); sw_ver = ori_sw_ver; } else { bca_t.software_version[1] = (unsigned char)sw_ver; BCACrc32Value = calculateCRC((U8 *)&bca_t,sizeof(bca_t)-4); bca_t.crc[0] = (U8)((BCACrc32Value >> 24) & 0xff); bca_t.crc[1] = (U8)((BCACrc32Value >> 16) & 0xff); bca_t.crc[2] = (U8)((BCACrc32Value >> 8) & 0xff); bca_t.crc[3] = (U8)(BCACrc32Value & 0xff); memcpy(buf,&bca_t,sizeof(bca_t)); } if(jwtdrv_flash_write(dumpfile,buf) != 0) { dbg_print(2,"flash write errorn"); return -1; } if(!quit) { printf_usb_cfg(); } //erase flash first sprintf(cmd,"flash_erase -q /dev/mtd%d 0 0",mtdnum); system(cmd); //write to flash sprintf(cmd,"nandwrite -q /dev/mtd%d %s",mtdnum,dumpfile); system(cmd); if(auto_reboot)system("reboot"); return 0; } Makefile .PHONY: all clean help CROSS?=mipsel-linux- ifeq ($(CROSS),) arch:=x86 endif ifeq ($(findstring mips,$(CROSS)),mips) arch=mipsel else arch=other endif ifeq ($(findstring 7581,${platform}),7581) CFLAGS += -DBCM7581B0 endif ifeq ($(findstring 7019,7019) CFLAGS += -DBCM7019C0 endif target:=chgstate_$(platform)_$(arch) all: $(if ${platform},$(error platform must be set!!!)) @echo "flag ${CFLAGS} over" $(CROSS)gcc ${CFLAGS} -o ${target} chgstate.c clean: rm -fr *.o chgstate_* help: @echo -e "*********************************************n*" @echo -e "* This Program Used for n* modify sw version and boot flag" @echo -e "*n*" @echo -e "*Example:" @echo -e "*tmake platform=7581" @echo -e "*tmake platform=7019" @echo -e "*n*********************************************" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |