xref: /netbsd/sys/arch/evbsh3/stand/mesboot/src/mesboot.c (revision 6550d01e)
1 /*	$NetBSD: mesboot.c,v 1.1 2010/04/06 15:54:30 nonaka 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 
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