Home | History | Annotate | Line # | Download | only in src
mesboot.c revision 1.1
      1 /*	$NetBSD$	*/
      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 
     13 static const char *progname;
     14 static int turbo_mode = 1;
     15 
     16 void
     17 usage(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 
     25 int
     26 main(int argc, char **argv)
     27 {
     28 	char *kernel;
     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