⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_zsp.c

📁 华为 HI3510 BOOTLOADER HIBOOT 源码包
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -