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

📄 bootldr.c

📁 strongarm的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
            putLabeledWord("  flash=", dstwords[i]);            putstr("not checking any more locations\r\n");            goto clear_VPPEN;         }      }   }   putstr("done.\r\n"); clear_VPPEN:   CLR_VPPEN();}static void command_load_flash_region(const char *regionName, unsigned long regionBase, unsigned long regionSize, int flags){   unsigned long img_size = 0; /* size of data */   unsigned long hdr_size = 0; /* size of header */   unsigned long img_dest = VKERNEL_BASE + 1024; /* just a temporary holding area */   unsigned long i;   long xmodem = 0;     putstr("loading flash region "); putstr(regionName); putstr("\r\n");   get_param_value("xmodem", &xmodem);#ifdef CONFIG_XYMODEM   if (xmodem) {#endif      putstr("using xmodem\r\n");      img_size = modem_receive((char*)img_dest, regionSize);#ifdef CONFIG_XYMODEM   } else {      putstr("using xymodem\r\n");      img_size = xymodem_receive((char*)img_dest, regionSize);   }#endif   if (!img_size) {      putstr("download error. aborting.\r\n");      return;   }       putHexInt32(img_size);   putLabeledWord(" bytes loaded to ",img_dest);   if ((img_size % 4) != 0) {      putstr("img_size is not a multiple of 4 -- are we sure that's OK?\r\n");   }   program_flash_region(regionName, regionBase, regionSize, img_dest, img_size, flags);}void command_load_bootldr(int argc, const char **argv){  command_load_flash_region("bootldr", flashDescriptor->bootldr.base, flashDescriptor->bootldr.size, flashDescriptor->bootldr.flags);}void command_load_params(int argc, const char **argv){  command_load_flash_region("params", flashDescriptor->params.base, flashDescriptor->params.size, flashDescriptor->params.flags);}void command_load_usercode(int argc, const char **argv){  command_load_flash_region("usercode", flashDescriptor->usercode.base, flashDescriptor->usercode.size, flashDescriptor->usercode.flags);}void command_load_ramdisk(int argc, const char **argv){  command_load_flash_region("ramdisk", flashDescriptor->ramdisk.base, flashDescriptor->ramdisk.size, flashDescriptor->ramdisk.flags);}static void load_kernel(const char *kernel_region_name,                         unsigned long kernel_region_start, unsigned long kernel_region_size){   unsigned long img_size = 0;   unsigned long img_dest = VKERNEL_BASE;   unsigned long i;     img_size = modem_receive((char*)img_dest+12, kernel_region_size);   if (!img_size) {      putstr("error occured during download. aborting.\r\n");      return;   }       putHexInt32(img_size);   putLabeledWord(" bytes loaded to ",img_dest);   if ((img_size % 4) != 0) {      putstr("img_size is not a multiple of 4 -- are we sure that's OK?\r\n");   }   if ((img_size+12) > kernel_region_size) {      putLabeledWord("kernel too large for region, but programming anyway.  Size=", kernel_region_size);#if FIXME      return;#endif   }   /* set up the header */   {      /* the magic number.. */      *(unsigned long *)(img_dest + 0x0) = KERNELIMG_MAGIC;      /* the actual kernel image size */      *(unsigned long *)(img_dest + 0x4) = img_size;      /* where to copy the image before boot */      *(unsigned long *)(img_dest + 0x8) = VKERNEL_BASE;   }   /* now program flash */   program_flash_region(kernel_region_name, kernel_region_start, kernel_region_size,                        img_dest, img_size, 0);   putstr("done.\r\n");}void command_load_kernel(int argc, const char **argv){   load_kernel("kernel", flashDescriptor->kernel.base, flashDescriptor->kernel.size);}#ifdef BOOT_ALTKERNELvoid command_load_altkernel(int argc, const char **argv){   load_kernel("altkernel", flashDescriptor->altkernel.base, flashDescriptor->altkernel.size);}#endifvoid command_load_debugger(int argc, const char **argv){   command_load_flash_region("debugger", flashDescriptor->debugger.base, flashDescriptor->debugger.size, flashDescriptor->debugger.flags);}void command_peek(int argc, const char **argv){   execcmd(peek_commands,argc-1,argv+1);}void command_peek_ram(int argc, const char **argv){  unsigned long addr = 0;  unsigned long result = 0;  unsigned long offset = 0;    if (argc < 2) { /* default to first command */    putstr("peek ram requires arguments!\r\n");  } else {    addr = strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing addr\r\n");      return;    }    if (strcmp(argv[0], "byte") == 0)       result = *(unsigned char *)(addr);    else if (strcmp(argv[0], "short") == 0)       result = *(unsigned short *)(addr);    else if (strcmp(argv[0], "int") == 0)       result = *(int *)(addr);    else if (strcmp(argv[0], "flash") == 0)       result = flashword[(addr&flash_address_mask) >> 2];    else if (strcmp(argv[0], "gpio") == 0)       /* read from the gpio read port */       result = *(int *)(0x21800008 + addr);    else        result = *(unsigned long *)(addr);    putLabeledWord("  addr  = ",addr);    putLabeledWord("  value = ",result);  }}void command_poke(int argc, const char **argv){   execcmd(poke_commands,argc-1,argv+1);}void command_poke_ram(int argc, const char **argv){  unsigned long addr = 0;  unsigned long value = 0;  unsigned long offset = 0;    if (argc < 3) { /* default to first command */    putstr("poke ram requires arguments!\r\n");  } else {    addr = strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing addr\r\n");      return;    }    value = strtoul(argv[2], NULL, 0);    if (strtoul_err) {      putstr("error parsing value\r\n");      return;    }    putstr("poke ram: \r\n");    putLabeledWord(" addr=", addr);    putLabeledWord(" value=", value);    if (strcmp(argv[0], "byte") == 0) {       *(unsigned char *)(addr) = value;    } else if (strcmp(argv[0], "short") == 0) {       *(unsigned short *)(addr) = value;    } else if (strcmp(argv[0], "int") == 0) {       *(int *)addr = value;    } else if (strcmp(argv[0], "gpio") == 0) {       /* write to the gpio write port */       *(int *)(0x21800000 + addr) = value;    } else if (strcmp(argv[0], "flash") == 0) {       if (programFlashWord(addr & flash_address_mask, value))          putstr("flash write failed!\r\n");    } else {       *(unsigned long *)(addr) = value;    }  }}#ifdef CONFIG_BITSYextern unsigned long delayedBreakpointPC;void command_breakpoint(int argc, const char **argv){  if (argv[1] != NULL) {    const char *pcstr = NULL;    unsigned long pc;    int delayed = 0;    if (strcmp(argv[1], "delayed") == 0) {      delayed = 1;      pcstr = argv[2];    } else {      pcstr = argv[1];    }    pc = strtoul(pcstr, NULL, 0);    pc &= 0xFFFFFFFC;    pc |= 1;    if (delayed) {      putLabeledWord("PC breakpoint will be set after kernel unzip at: ", pc);      delayedBreakpointPC = pc;    } else {      putLabeledWord("Setting hardware PC breakpoint at: ", pc);      __asm__ ("mcr     p15, 0, %0, c14, c8, 0" : : "r" (pc));    }  } else {    unsigned long pc = 0;    putstr("Clearing PC breakpoint");    __asm__ ("mcr     p15, 0, %0, c14, c8, 0" : : "r" (pc));  }}#endifvoid command_qflash(int argc, const char **argv){  unsigned long addr = 0;  unsigned long result = 0;  unsigned long offset = 0;    if (argc < 2) { /* default to first command */    putstr("qflash requires arguments!\r\n");  } else {    addr = strtoul(argv[argc-1], NULL, 0);    if (strtoul_err) {      putstr("error parsing addr\r\n");      return;    }    if (strcmp(argv[1], "id") == 0) {       result = queryFlashID(addr);    } else if (strcmp(argv[1], "security") == 0) {       result = queryFlashSecurity(addr);    } else {       result = queryFlash(addr);    }    putLabeledWord("value = ",result);  }}void command_eflash(int argc, const char **argv){  unsigned long addr = 0;  unsigned long result = 0;  unsigned long offset = 0;    if (argc < 2) { /* default to first command */    putstr("eflash requires arguments: <addr>|chip!\r\n");  } else {    if (strncmp(argv[1], "chip", 4) == 0) {       putstr("erasing flash chip\r\n");       SET_VPPEN();       eraseFlashChip();       CLR_VPPEN();       return;    }    addr = strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing addr: "); putstr(argv[1]); putstr("\r\n");    }    putLabeledWord("addr=", addr);    SET_VPPEN();    result = eraseFlashSector(addr);    CLR_VPPEN();  }}void command_pflash(int argc, const char **argv){  unsigned long addr = 0;  unsigned long len = 0;  unsigned long protect = 0;    if (argc < 4) { /* default to first command */    putstr("pflash requires arguments: <addr> <len> 0/1  (1 -> protect, 0 -> unprotect all)!\r\n");  } else {    addr = strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing addr: "); putstr(argv[1]); putstr("\r\n");    }    len = strtoul(argv[2], NULL, 0);    if (strtoul_err) {      putstr("error parsing len: "); putstr(argv[2]); putstr("\r\n");    }    protect = strtoul(argv[3], NULL, 0);    if (strtoul_err) {      putstr("error parsing protect: "); putstr(argv[3]); putstr("\r\n");    }    putLabeledWord("  addr=", addr);    putLabeledWord("  len=", len);    putLabeledWord("  protect=", protect);    SET_VPPEN();    protectFlashRange(addr, len, protect);    CLR_VPPEN();  }}#if 0void command_reboot(int argc, const char **argv){  if (argc < 1) {    reboot();  } else {    putstr("reboot does not need arguments!\r\n");  }}#endifvoid command_call(int argc, const char **argv){  void (*fcn)(long a0, long a1, long a2, long a3) = NULL;  int offset;    if (argc < 2) {    putstr("usage: call <addr>\r\n");  } else {    long a0 = 0;    long a1 = 0;    long a2 = 0;    long a3 = 0;    fcn = (void*)strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing vaddr\r\n");      return;    }    if (argc > 2) {      a0 = strtoul(argv[2], NULL, 0);    }    if (argc > 3) {      a1 = strtoul(argv[3], NULL, 0);    }    if (argc > 4) {      a2 = strtoul(argv[4], NULL, 0);    }    if (argc > 5) {      a3 = strtoul(argv[5], NULL, 0);    }    flush_caches();    putLabeledWord("Calling fcn=", (long)fcn);    putLabeledWord("  a0=", a0);    putLabeledWord("  a1=", a1);    putLabeledWord("  a2=", a2);    putLabeledWord("  a3=", a3);    fcn(a0, a1, a2, a3);  }}void command_physaddr(int argc, const char **argv){  unsigned long vaddr = 0;  int offset;    if (argc < 2) { /* default to first command */    putstr("physaddr requires vaddr argument!\r\n");  } else {    vaddr = strtoul(argv[1], NULL, 0);    if (strtoul_err) {      putstr("error parsing vaddr\r\n");      return;    }    {      unsigned long mmu_table_entry = mmu_table[vaddr >> 20];      unsigned long paddr = mmu_table_entry & ~((1L << 20) - 1);      unsigned long sectionDescriptor = mmu_table_entry & ((1L << 20) - 1);      putLabeledWord("vaddr=", vaddr);      putLabeledWord("paddr=", paddr);      putLabeledWord("sectionDescriptor=", sectionDescriptor);    }  }}void command_set(int argc, const char **argv){   struct bootblk_param *param = bootldr_params;   const char *paramValueString = argv[2];   if (paramValueString == NULL)      paramValueString = "";   while (param->name != NULL) {      int namelen = strlen(param->name);      if (strncmp(argv[1], param->name, namelen) == 0) {         long value;         int paramValueLen = strlen(paramValueString);         putstr("  setting param=");         putstr(param->name);         putstr(" to value=");         putstr(paramValueString);         putstr("\r\n");         switch (param->paramFormat) {         case PF_STRING: {            if (paramValueLen == 0) {               value = 0;            } else {               char *newstr = malloc(paramValueLen+1);               memcpy(newstr, paramValueString, paramValueLen+1);               value = (long)newstr;            }            break;         }         case PF_DECIMAL:         case PF_HEX:         default:            value = strtoul(paramValueString, NULL, 0);         }         param->value = value;         if (param->update != NULL) {            (param->update)(param);         }      }      param++;   }}void command_params_show(int argc, const char **argv){   struct bootblk_param *params = bootl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -