📄 cmd_zsp.c
字号:
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_zsprest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ unsigned long t; printf("ZSP set to reset mode.\n"); t = readl(0x101e0020); writel( (t|(1<<5)) & (~0x01), 0x101e0020); t = readl(0x101e0020); writel( t&(~(1<<5)), 0x101e0020); t = readl(0x101e003C); writel( t|(1<<6), 0x101e003C); udelay(100); return 0;} int do_cmd_zspstart(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){// int hiDo = 1; unsigned long t; do_cmd_zsprest(NULL, 0, 0, NULL); printf("ZSP running ...\n"); t = readl(0x101e0020); writel( t|0x01, 0x101e0020); udelay(100); return 0; } int zspJtag(void){ int k; int size; //unsigned short *pointer; //unsigned long regValue; unsigned short *pointer = (unsigned short *)(ZSP_IMEM_ADDRESS + (RESET_ADDR<<1)); //void *pReg = (void *)(ZSP_CONTROL_REG); do_cmd_zsprest(NULL, 0, 0, NULL); size = sizeof(jtagData)/sizeof(unsigned short); printf("ZSP JTAG data size is %#x \n", size); for(k=0;k<size;k++) { *pointer++ = jtagData[k]; } do_cmd_zspstart(NULL, 0, 0, NULL); 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); do_cmd_zsprest(NULL, 0, 0, NULL); if(loadbin((void*)addr)) return 0; do_cmd_zspstart(NULL, 0, 0, NULL); return 0;}/**************************************************/U_BOOT_CMD( zspjtag, 1, 1, do_cmd_zspjtag, "zspjtag - zspjtag \n", "zspjtag \n" " -zspjtag\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( 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 + -