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
13 static const char *progname;
14 static int turbo_mode = 1;
15
16 void
usage(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
main(int argc,char ** argv)26 main(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