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

📄 cmd_zsp.c

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