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

📄 bootldr.c

📁 strongarm的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
    len = hdrp->a_bss;    if (len) {	memset(start, 0x00, len);    }    }#endif /* ZBSS */extern char HEX_TO_ASCII_TABLE[16];void dwordtodecimal(char *buf, unsigned long x){  int i = 0;  int j = 0;  char localbuf[16];  while (x > 0) {    unsigned long rem = x % 10;    localbuf[i++] = HEX_TO_ASCII_TABLE[rem];    x /= 10;  }  /* now reverse the characters into buf */  while (i > 0) {    i--;    buf[j++] = localbuf[i];  }}void binarytohex(char *buf, long x, int nbytes){  int i;  int s = 4*(2*nbytes - 1);  if (HEX_TO_ASCII_TABLE[0] != '0')     putstr("HEX_TO_ASCII_TABLE corrupted\n");  for (i = 0; i < 2*nbytes; i++) {    buf[i] = HEX_TO_ASCII_TABLE[(x >> s) & 0xf];    s -= 4;  }  buf[2*nbytes] = 0;}byte strtoul_err;unsigned long strtoul(const char *str, char **endptr, int requestedbase){   unsigned long num = 0;   int i;   char c;   byte digit;   int base = 10;   int nchars = 0;   int leadingZero = 0;   strtoul_err = 0;   while ((c = *str) != 0) {      if (nchars == 0 && c == '0') {         leadingZero = 1;         if (0) putLabeledWord("strtoul: leadingZero nchars=", nchars);         goto step;      } else if (leadingZero && nchars == 1) {         if (c == 'x') {            base = 16;            if (0) putLabeledWord("strtoul: base16 nchars=", nchars);            goto step;         } else if (c = 'o') {            base = 8;            if (0) putLabeledWord("strtoul: base8 nchars=", nchars);            goto step;         }      }      if (0) putLabeledWord("strtoul: c=", c);      if (c >= '0' && c <= '9') {         digit = c - '0';      } else if (c >= 'a' && c <= 'z') {         digit = c - 'a' + 10;      } else if (c >= 'A' && c <= 'Z') {         digit = c - 'A' + 10;      } else {         strtoul_err = 3;         return 0;      }      if (digit >= base) {         strtoul_err = 4;         return 0;      }      num *= base;      num += digit;   step:      str++;      nchars++;   }   return num;}void putLabeledWord(const char *msg, unsigned long value){   char buf[9];   binarytohex(buf,value,4);   putstr(msg);   putstr(buf);   putstr("\r\n");}void putHexInt32(unsigned long value){  char buf[9];  binarytohex(buf,value,4);  putstr(buf);}void putHexInt16(word value){  char buf[9];  binarytohex(buf,value,2);  putstr(buf);}void putHexInt8(byte value){  char buf[3];  binarytohex(buf,value,1);  putstr(buf);}  static struct ebsaboot bootinfo = {   BT_MAGIC_NUMBER,	/* boot info magic number */   0x20000000,		/* virtual addr of arg page */   0x20000000,		/* physical addr of arg page */   NULL,		/* kernel args string pointer */   (pd_entry_t *)MMU_TABLE_START,	/* active L1 page table */   0,		        /* start of physical memory */   DRAM_SIZE,		/* end of physical memory */   SZ_2M+SZ_1M,         /* start of avail phys memory */   48000000,		/* fclk frequency */   UART_BAUD_RATE,    	/* baudrate of serial console */   1 			/* n stop bits */};void print_banner(void){  long armrev = 0;  long corelogicrev = 0;  long cpsr = 0;  __asm__("mrc p15, 0, %0, c0, c0, 0" : "=r" (armrev));  __asm__("mrs %0, cpsr" : "=r" (cpsr));#ifdef CONFIG_SKIFF  corelogicrev = *(volatile unsigned long *)(DC21285_ARMCSR_BASE + PCI_VENDOR_ID);#endif  putstr("\r\n");  putstr(">> ");  putstr(bootprog_name);  putstr(", Rev ");  putHexInt8(VERSION_MAJOR); putstr("."); putHexInt8(VERSION_MINOR); putstr("."); putHexInt8(VERSION_MICRO);  putstr("\r\n");  putstr(">> ");  putstr(bootprog_date);  putstr("\r\n");  putLabeledWord(">>  ARM Processor Rev=", armrev);#if CONFIG_SKIFF  putLabeledWord(">>  Corelogic Rev=", corelogicrev);  if (get_param("mem_fclk_21285") != NULL)    putLabeledWord(">>  Corelogic fclk=", get_param("mem_fclk_21285")->value);#endif  putLabeledWord(">>  CPSR=", cpsr);  putstr(">> (c) 2000 Compaq Cambridge Research Laboratory\r\n");  putstr("Press Return to start the OS now, any other key for monitor menu\r\n");}/* * Reads and returns a character from the serial port *  - Times out after delay iterations checking for presence of character *  - Sets *error_p to UART error bits or -1 on timeout *  - On timeout, sets *error_p to -1 and returns 0 */byte awaitkey(unsigned long delay, int *error_p){  unsigned long i = delay;  byte c;  int errors = 0;  while (1) {    i = delay;#ifdef CONFIG_SKIFF    while (((CSR_READ_BYTE(UARTFLG_REG) & UART_RX_FIFO_EMPTY)) && i)	i--;#else    {       while ((!((*(volatile long *)SA1100_UART3_UTSR1) & SA1100_UTSR1_RNE)) && i)          i--;    }#endif        if (i) {      errors = 0;#ifdef CONFIG_SKIFF      c = CSR_READ_BYTE(UARTDR_REG);      errors = CSR_READ_BYTE(RXSTAT_REG);#else      c = *(volatile long *)SA1100_UART3_UTDR;      errors = (*(volatile long *)SA1100_UART3_UTSR1) & SA1100_UTSR1_ERROR_MASK;#endif      if (!errors) /* if no receive errors found.. */	break; /* get out of here */    } else {      c = 0; /* no one pressed a key. return a NULL and get out of here */      errors = -1;      break;    }  }  if (error_p != NULL)    *error_p = errors;  return(c);}int getc_verbose_errors = 1;int getc_errno = 0;byte getc(void) {   byte c, rxstat;   getc_errno = 0; /* reset errno */#ifdef CONFIG_SKIFF   while ((CSR_READ_BYTE(UARTFLG_REG) & UART_RX_FIFO_EMPTY));   /* must read UARTDR_REG before RXSTAT_REG */   c =  CSR_READ_BYTE(UARTDR_REG);   rxstat = CSR_READ_BYTE(RXSTAT_REG);#elif defined(CONFIG_BITSY)   while ((!((*(volatile long *)SA1100_UART3_UTSR1) & SA1100_UTSR1_RNE)))     /* spin wait */;   c = *(volatile byte *)SA1100_UART3_UTDR;   rxstat = (*(volatile byte *)SA1100_UART3_UTSR1) & SA1100_UTSR1_ERROR_MASK;#else#error no architecture defined for getc#endif   if (rxstat) {      getc_errno = rxstat;      if (getc_verbose_errors) {         putLabeledWord("RXSTAT error: ", rxstat);      }   }   return(c);}#define CMDBUFSIZE 256char cmdBuffer[CMDBUFSIZE];void getcmd(void) {   byte curpos = 0; /* curpos position - index into cmdBuffer */   byte c;   byte noreturn = 1;   /* first clear out the buffer.. */   memset(cmdBuffer, 0, CMDBUFSIZE);   /* here we go..*/   while (noreturn) {      c = getc();      switch (c)         {	 case 0x08:         case 0x06:         case 0x07:         case 0x7E:         case 0x7F: /* backspace / delete */            if (curpos) { /* we're not at the beginning of the line */               curpos--;               putc(0x08); /* go backwards.. */               putc(' ');  /* overwrite the char */               putc(0x08); /* go back again */            }            cmdBuffer[curpos] = '\0';            break;         case '\r':         case '\n':         case '\0':            noreturn = 0;            putc('\r');            putc('\n');            break;         default:            if (curpos < CMDBUFSIZE) {               cmdBuffer[curpos] = c;               /* echo it back out to the screen */               putc(c);               curpos++;            }            break;         }   }   /*     putstr("COMMAND: ");     putstr(cmdBuffer);     for (c=0;c<CMDBUFSIZE;c++) {       putHexInt8(cmdBuffer[c]);       putc(' ');     }     putstr("\r\n");   */}int argc;enum ParseState {   PS_WHITESPACE,   PS_TOKEN,   PS_STRING,   PS_ESCAPE};enum ParseState stackedState;void parseargs(char *argstr, int *argc_p, char **argv){  const char *whitespace = " \t";  int argc = 0;  char c;  enum ParseState lastState = PS_WHITESPACE;     /* tokenize the argstr */  while ((c = *argstr) != 0) {    enum ParseState newState;          if (lastState == PS_ESCAPE) {      newState = stackedState;    } else if (lastState == PS_STRING) {      if (c == '"') {        newState = PS_WHITESPACE;        *argstr = 0;      } else {        newState = PS_STRING;      }    } else if ((c == ' ') || (c == '\t')) {      /* whitespace character */      *argstr = 0;      newState = PS_WHITESPACE;    } else if (c == '"') {      newState = PS_STRING;      *argstr++ = 0;      argv[argc++] = argstr;    } else if (c == '\\') {      stackedState = lastState;      newState = PS_ESCAPE;    } else {      /* token */      if (lastState == PS_WHITESPACE) {        argv[argc++] = argstr;      }            newState = PS_TOKEN;    }    lastState = newState;    argstr++;  }  if (0) {     int i;    putLabeledWord("parseargs: argc=", argc);    for (i = 0; i < argc; i++) {      putstr("   ");      putstr(argv[i]);      putstr("\r\n");    }  }  argv[argc] = NULL;  if (argc_p != NULL)    *argc_p = argc;}void unparseargs(char *argstr, int argc, const char **argv){   int i;   for (i = 0; i < argc; i++) {     if (argv[i] != NULL) {       strcat(argstr, " ");       strcat(argstr, argv[i]);     }   }}int parsecmd(struct bootblk_command *cmdlist, int argc, const char **argv){   /* find the command name */   const char *cmdname = argv[0];   int cmdnum = 0;   if (argc < 1)      return -1;   /* do a string compare for the first offset characters of cmdstr      against each member of the cmdlist */   while (cmdlist[cmdnum].cmdstr != NULL) {      if (strcmp(cmdlist[cmdnum].cmdstr, cmdname) == 0)         return(cmdnum);     cmdnum++;   }   return(-1);}void execcmd(struct bootblk_command *cmdlist, int argc, const char **argv){   int cmdnum = parsecmd(cmdlist, argc, argv);   if (0) {      putstr("execcmd: argv[0]="); putstr(argv[0]); putstr("\r\n");      putLabeledWord("  argc=", argc);      putLabeledWord("  cmdnum=", cmdnum);   }   if (cmdnum >= 0) {      (*cmdlist[cmdnum].cmdfunc)(argc, argv);   } else if (strcmp(argv[1], "help") == 0) {      print_help_on_commands(cmdlist);   } else {#if 1      print_help_on_commands(cmdlist);#else      /* default to the first command and insert it into the head of argv */      int i;      for (i = argc; i >= 0; i--) {         argv[i+1] = argv[i];      }      argc++;      argv[0] = cmdlist[0].cmdstr;      (*cmdlist[0].cmdfunc)(argc, argv);#endif   }}void bootmenu(void){  int cmdnum;  char *cmdpos;  int argc;  char *argv[128];  while (1) {    putstr("boot> ");    getcmd();    if (!cmdBuffer[0])	continue;		/* empty line, ignore */        memset(argv, 0, sizeof(argv));    parseargs(cmdBuffer, &argc, argv);    if (argc > 0) {       execcmd(commands, argc, (const char **)argv);    } else {       print_help_on_commands(commands);    }  }}

⌨️ 快捷键说明

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