mesboot.c revision 1.1
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
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;
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