📄 cmd_zsp.c
字号:
unsigned char count, len; unsigned char *ptr; ptr = ( unsigned char * )base; len = length; for ( count = 0; count < len; count ++ ) buf[ count ] = *ptr++; buf[ len ] = '\0'; return;}int get_elf_header(unsigned long base, Bin_Flag *pstru){ pstru->b_snum = get_short( base ); base = base + HALF_LENGTH; pstru->b_binsize = get_short( base ); base = base + HALF_LENGTH; pstru->b_shsize = get_short( base ); base = base + HALF_LENGTH + HALF_LENGTH; pstru->b_shoff = get_long( base ); base = base + HALF_LENGTH + HALF_LENGTH; pstru->b_flag = get_long( base ); return 0;}int get_section_header(unsigned long base, Bin_Shdr *pstru){ get_string( pstru->sh_name, base, NAMELENGTH ); base = base + NAMELENGTH; pstru->sh_type = get_long( base ); base = base + WORD_LENGTH; pstru->sh_addr = get_long( base ); base = base + WORD_LENGTH; pstru->sh_offset = get_long( base ); base = base + WORD_LENGTH; pstru->sh_size = get_long( base ); base = base + WORD_LENGTH; pstru->sh_chknum = get_long( base ); return 0;}int loadbin(void* pvAddress){ unsigned long BIN_SDRAM_ADDR; /*BIN文件在SDRAM中的首地址*/ Bin_Flag *pbinflag = &binflag; Bin_Shdr *pbinshdr = &binshdr; unsigned long base; unsigned long srcaddr; unsigned long destaddr; unsigned long len; unsigned long chknum; unsigned int i,j,k; unsigned long sum ; unsigned char *temp; unsigned long vZSP_DATA_MEMBASEADDR; unsigned long vZSP_INS_MEMBASEADDR; if (NULL == pvAddress) { printf("loadbin: source addr is null",1); return 1; } //printf("Get pvAddress is %p.\n", pvAddress); vZSP_DATA_MEMBASEADDR = ZSP_DATA_MEMBASEADDR; vZSP_INS_MEMBASEADDR = ZSP_INS_MEMBASEADDR; BIN_SDRAM_ADDR = (unsigned long)pvAddress; base = BIN_SDRAM_ADDR; get_elf_header( base, pbinflag ); /* printf("pbinflag->b_snum:%X\n",pbinflag->b_snum); */ /* printf("flag is 0x%16lx\n",pbinflag->b_flag); */ if( (pbinflag->b_flag) != (unsigned long)(0x4E49427F) ) { printf("Wrong BIN flag, maybe not a BIN file or a wrong base address.\n"); return 1; } if( (pbinflag->b_snum) == 0 ) { printf("Section num is 0,error\n"); return 1; } for(i=0;i<pbinflag->b_snum;i++) { base = BIN_SDRAM_ADDR + pbinflag->b_shoff + i*pbinflag->b_shsize; /* printf("Base address is %x.\n", base); */ get_section_header(base, pbinshdr ); srcaddr = BIN_SDRAM_ADDR + pbinshdr->sh_offset; /*需要搬运段的源地址(实地址)*/ if(pbinshdr->sh_type == 0) /*如果是数据段,加上ZSP数据MEM基址*/ destaddr = vZSP_DATA_MEMBASEADDR + pbinshdr->sh_addr; /*需要搬运段的目的地址(实地址)*/ else if(pbinshdr->sh_type == 1) /*如果是指令段,加上ZSP指令MEM基址*/ destaddr = vZSP_INS_MEMBASEADDR + pbinshdr->sh_addr; /*需要搬运段的目的地址(实地址)*/ len = pbinshdr->sh_size; /*需要搬运段的长度(以16bit为单位)*/ chknum = pbinshdr->sh_chknum; /*段的16位校验和*/ /* printf("section name is %s\n", pbinshdr->sh_name); printf("srcaddr is 0x%x\n", pbinshdr->sh_offset); printf("destaddr is 0x%x\n", pbinshdr->sh_addr); printf("len is 0x%x\n", len); */ if(pbinshdr->sh_type == 0) { /* memset((vZSP_DATA_MEMBASEADDR+ pbinshdr->sh_addr),0,len); */ /* loop1: */ /*将该段拷贝到zsp内部相应内存*/ printf("Section %d copy..", i); for(k=0;k<len/2;k++) *((short *)(vZSP_DATA_MEMBASEADDR + pbinshdr->sh_addr + k*2)) = *((short *)(BIN_SDRAM_ADDR+pbinshdr->sh_offset + k*2)); /* memcpy((void *)(vZSP_DATA_MEMBASEADDR + pbinshdr->sh_addr),(void *)(BIN_SDRAM_ADDR+pbinshdr->sh_offset),len); */ /*从zsp内部内存读取数据累加与校验和比较,不符合则重新拷贝*/ sum= 0; temp = (unsigned char *)(vZSP_DATA_MEMBASEADDR+ pbinshdr->sh_addr); for(j=0;j<len;j++) { sum = sum + *temp; temp++; } sum = sum & 0x0FFFF; /*printf("sum is 0x%x\n",sum); */ /*printf("chknum is 0x%x\n",chknum); */ /* if(sum!=chknum ) goto loop1; */ if(sum!=chknum) { printf("checksum error.\n"); return 1; } printf("OK.\n"); } else if(pbinshdr->sh_type == 1) { /* memset((vZSP_INS_MEMBASEADDRV+ pbinshdr->sh_addr),0,len); */ /* loop2: */ /*将该段拷贝到zsp内部相应内存*/ printf("Section %d copy..", i); for(k=0;k<len/2;k++) *((short *)(vZSP_INS_MEMBASEADDR + pbinshdr->sh_addr + k*2)) = *((short *)(BIN_SDRAM_ADDR+pbinshdr->sh_offset + k*2)); /* memcpy((void *)(vZSP_INS_MEMBASEADDR+ pbinshdr->sh_addr),(void *)(BIN_SDRAM_ADDR+pbinshdr->sh_offset),len); */ /*从zsp内部内存读取数据累加与校验和比较,不符合则重新拷贝*/ sum =0; temp = (unsigned char *)(vZSP_INS_MEMBASEADDR+pbinshdr->sh_addr); for(j=0;j<len;j++) { sum = sum + *temp; temp++; } sum = sum & 0x0FFFF; /* printf("sum is 0x%x\n",sum); */ /* printf("chknum is 0x%x\n",chknum); */ /* if(sum!=chknum) goto loop2; */ if(sum!=chknum) { printf("checksum error.\n"); return 1; } printf("OK.\n"); } } return 0; }int do_cmd_zspjtag(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ zspJtag(); return 0;}int do_cmd_vencrest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ printf("video encode reset\n"); vencRst(); return 0;} int do_cmd_vdecrest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ printf("video decode reset\n"); vdecRst(); return 0;} int do_cmd_zsprest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ int hiDo = 1; printf("reset zsp.\n"); hiDo = zspRst(); if (hiDo != 0) { printf("zsp reset in error",1); return 1; } printf("sleep 2 sec.\n"); udelay(2000000); hiDo = zspRstOut(); if (hiDo != 0) { printf("zsp reset out error",1); return 1; } printf("zsp reset ok.\n"); return 0;} int do_cmd_zspstart(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ printf("zsp start(reset)\n"); zspRstOut(); return 0; } int do_cmd_zspstop(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ printf("zsp stop(reset)\n"); zspRst(); return 0;}int do_cmd_loadzsp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ ulong addr ; if (argc != 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } addr = simple_strtoul(argv[1], NULL, 16); vencRst(); udelay(500000); vdecRst(); udelay(500000); zspRst(); udelay(1000000); //printf("address is %x",addr); loadbin(addr); udelay(1000000); zspRstOut(); return 0;}/**************************************************/U_BOOT_CMD( zspjtag, 1, 1, do_cmd_zspjtag, "zspjtag - zspjtag \n", "zspjtag \n" " -zspjtag\n");U_BOOT_CMD( vencrest, 1, 1, do_cmd_vencrest, "vencrest- vencrest \n", "vencrest \n" " -vencrest\n");U_BOOT_CMD( vdecrest, 1, 1, do_cmd_vdecrest, "vdecrest- vdecrest \n", "vdecrest \n" " -vdecrest\n");U_BOOT_CMD( zsprest, 1, 1, do_cmd_zsprest, "zsprest - zsprest \n", "zsprest \n" " -zsprest\n");U_BOOT_CMD( zspstart, 1, 1, do_cmd_zspstart, "zspstart- zspstart \n", "zspstart \n" " -zspstart\n");U_BOOT_CMD( zspstop, 1, 1, do_cmd_zspstop, "zspstop - zspstop \n", "zspstop \n" " -zspstop\n");U_BOOT_CMD( loadzsp, 2, 1, do_cmd_loadzsp, "loadzsp - loadzsp to memery\n", "loadzsp address\n" " -loadzsp to memory from address\n");#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -