root/sys/arch/evbsh3/stand/mesboot/src/mesboot.c
/*      $NetBSD: mesboot.c,v 1.2 2016/08/15 08:32:46 maxv Exp $ */

#include <macro.h>
#include <mes2.h>

#include <h8/reg770x.h>

#include <string.h>

#define NBBOOT_VERSION  "0.2"
#define KERNEL_TEXTADDR 0x8c002000

static const char *progname;
static int turbo_mode = 1;

void
usage(void)
{

        printf("\r\nNetBSD boot loader ver." NBBOOT_VERSION "\r\n");
        printf("%s [-h] [-0] [kernel binary image file]\n", progname);
        exit(1);
}

int
main(int argc, char **argv)
{
        char *kernel = NULL;
        char *ptr, *mem, *rdptr;
        void (*func)();
        int fd, size, c;
        int i;

        progname = argv[0];

        /* getopt... */
        for (i = 1; i < argc; i++) {
                if (argv[i][0] != '-') {
                        if (kernel == NULL) {
                                kernel = argv[i];
                        }
                } else if (argv[i][0] == '-') {
                        if (argv[i][1] == '0') {
                                turbo_mode = !turbo_mode;
                        } else {
                                usage();
                        }
                }
        }
        if (kernel == NULL)
                kernel = "/mmc0/netbsd.bin";

        printf("\r\nNetBSD boot loader ver." NBBOOT_VERSION "\r\n");
        rdptr = 0;

        ptr = malloc(0x2000);
        if (ptr == 0) {
                printf("No memory\r\n");
                return -1;
        }
        memset(ptr, 0, 0x2000);

        fd = open(kernel, OptRead);
        if (fd == -1) {
                free(ptr);
                printf("can't open %s\r\n", kernel);
                return -1;
        }
        switch(MCR) {
        case 0x5224:
                strcpy(ptr + 0x1100, "mem=8M console=ttySC1,115200 root=/dev/shmmc2");
                break;
        case 0x522c:
                strcpy(ptr + 0x1100, "mem=16M console=ttySC1,115200 root=/dev/shmmc2");
                break;
        case 0x526c:
                strcpy(ptr + 0x1100, "mem=32M console=ttySC1,115200 root=/dev/shmmc2");
                break;
        case 0x5274:
                strcpy(ptr + 0x1100, "mem=64M console=ttySC1,115200 root=/dev/shmmc2");
                break;
        default:
                printf("SDRAM not found!!\r\n");
                return -1;
        }

        mem = (char *)KERNEL_TEXTADDR;
        func = (void *)KERNEL_TEXTADDR;
        printf("NetBSD kernel loading.");
        c = 0;
        do {
                size = read(fd, mem, 0x4000);
                mem = &mem[0x4000];
                if((++c & 0x7) == 0) putchar('.');
        } while (size == 0x4000);
        putchar('\r'), putchar('\n');
        close(fd);

        if (turbo_mode)
                hw_config(HW_CONFIG_TURBO, 1, 0);
        sleep(500);
        INT_DISABLE();
        WTCSR_WR = 0xa500;

        memcpy((char *)0x8c000000, ptr, 0x2000);
        (*func)();
        /*NOTREACHED*/
        return 0;
}