1/* $NetBSD: mesboot.c,v 1.2 2016/08/15 08:32:46 maxv Exp $ */ 2 3#include <macro.h> 4#include <mes2.h> 5 6#include <h8/reg770x.h> 7 8#include <string.h> 9 10#define NBBOOT_VERSION "0.2" 11#define KERNEL_TEXTADDR 0x8c002000 12 13static const char *progname; 14static int turbo_mode = 1; 15 16void 17usage(void) 18{ 19 20 printf("\r\nNetBSD boot loader ver." NBBOOT_VERSION "\r\n"); 21 printf("%s [-h] [-0] [kernel binary image file]\n", progname); 22 exit(1); 23} 24 25int 26main(int argc, char **argv) 27{ 28 char *kernel = NULL; 29 char *ptr, *mem, *rdptr; 30 void (*func)(); 31 int fd, size, c; 32 int i; 33 34 progname = argv[0]; 35 36 /* getopt... */ 37 for (i = 1; i < argc; i++) { 38 if (argv[i][0] != '-') { 39 if (kernel == NULL) { 40 kernel = argv[i]; 41 } 42 } else if (argv[i][0] == '-') { 43 if (argv[i][1] == '0') { 44 turbo_mode = !turbo_mode; 45 } else { 46 usage(); 47 } 48 } 49 } 50 if (kernel == NULL) 51 kernel = "/mmc0/netbsd.bin"; 52 53 printf("\r\nNetBSD boot loader ver." NBBOOT_VERSION "\r\n"); 54 rdptr = 0; 55 56 ptr = malloc(0x2000); 57 if (ptr == 0) { 58 printf("No memory\r\n"); 59 return -1; 60 } 61 memset(ptr, 0, 0x2000); 62 63 fd = open(kernel, OptRead); 64 if (fd == -1) { 65 free(ptr); 66 printf("can't open %s\r\n", kernel); 67 return -1; 68 } 69 switch(MCR) { 70 case 0x5224: 71 strcpy(ptr + 0x1100, "mem=8M console=ttySC1,115200 root=/dev/shmmc2"); 72 break; 73 case 0x522c: 74 strcpy(ptr + 0x1100, "mem=16M console=ttySC1,115200 root=/dev/shmmc2"); 75 break; 76 case 0x526c: 77 strcpy(ptr + 0x1100, "mem=32M console=ttySC1,115200 root=/dev/shmmc2"); 78 break; 79 case 0x5274: 80 strcpy(ptr + 0x1100, "mem=64M console=ttySC1,115200 root=/dev/shmmc2"); 81 break; 82 default: 83 printf("SDRAM not found!!\r\n"); 84 return -1; 85 } 86 87 mem = (char *)KERNEL_TEXTADDR; 88 func = (void *)KERNEL_TEXTADDR; 89 printf("NetBSD kernel loading."); 90 c = 0; 91 do { 92 size = read(fd, mem, 0x4000); 93 mem = &mem[0x4000]; 94 if((++c & 0x7) == 0) putchar('.'); 95 } while (size == 0x4000); 96 putchar('\r'), putchar('\n'); 97 close(fd); 98 99 if (turbo_mode) 100 hw_config(HW_CONFIG_TURBO, 1, 0); 101 sleep(500); 102 INT_DISABLE(); 103 WTCSR_WR = 0xa500; 104 105 memcpy((char *)0x8c000000, ptr, 0x2000); 106 (*func)(); 107 /*NOTREACHED*/ 108 return 0; 109} 110