Home | History | Annotate | Line # | Download | only in bootimx23
args_prep.c revision 1.1.22.1
      1  1.1.22.1  pgoyette /* $Id: args_prep.c,v 1.1.22.1 2017/03/20 06:57:13 pgoyette Exp $ */
      2       1.1     jkunz 
      3       1.1     jkunz /*
      4       1.1     jkunz  * Copyright (c) 2012 The NetBSD Foundation, Inc.
      5       1.1     jkunz  * All rights reserved.
      6       1.1     jkunz  *
      7       1.1     jkunz  * This code is derived from software contributed to The NetBSD Foundation
      8       1.1     jkunz  * by Petri Laakso.
      9       1.1     jkunz  *
     10       1.1     jkunz  * Redistribution and use in source and binary forms, with or without
     11       1.1     jkunz  * modification, are permitted provided that the following conditions
     12       1.1     jkunz  * are met:
     13       1.1     jkunz  * 1. Redistributions of source code must retain the above copyright
     14       1.1     jkunz  *    notice, this list of conditions and the following disclaimer.
     15       1.1     jkunz  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1     jkunz  *    notice, this list of conditions and the following disclaimer in the
     17       1.1     jkunz  *    documentation and/or other materials provided with the distribution.
     18       1.1     jkunz  *
     19       1.1     jkunz  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20       1.1     jkunz  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21       1.1     jkunz  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22       1.1     jkunz  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23       1.1     jkunz  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24       1.1     jkunz  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25       1.1     jkunz  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26       1.1     jkunz  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27       1.1     jkunz  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28       1.1     jkunz  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29       1.1     jkunz  * POSSIBILITY OF SUCH DAMAGE.
     30       1.1     jkunz  */
     31       1.1     jkunz 
     32       1.1     jkunz /* (c) for ngets() below:
     33       1.1     jkunz  *
     34       1.1     jkunz  * Copyright (c) 1993
     35       1.1     jkunz  *	The Regents of the University of California.  All rights reserved.
     36       1.1     jkunz  *
     37       1.1     jkunz  * Redistribution and use in source and binary forms, with or without
     38       1.1     jkunz  * modification, are permitted provided that the following conditions
     39       1.1     jkunz  * are met:
     40       1.1     jkunz  * 1. Redistributions of source code must retain the above copyright
     41       1.1     jkunz  *    notice, this list of conditions and the following disclaimer.
     42       1.1     jkunz  * 2. Redistributions in binary form must reproduce the above copyright
     43       1.1     jkunz  *    notice, this list of conditions and the following disclaimer in the
     44       1.1     jkunz  *    documentation and/or other materials provided with the distribution.
     45       1.1     jkunz  * 3. All advertising materials mentioning features or use of this software
     46       1.1     jkunz  *    must display the following acknowledgement:
     47       1.1     jkunz  *	This product includes software developed by the University of
     48       1.1     jkunz  *	California, Berkeley and its contributors.
     49       1.1     jkunz  * 4. Neither the name of the University nor the names of its contributors
     50       1.1     jkunz  *    may be used to endorse or promote products derived from this software
     51       1.1     jkunz  *    without specific prior written permission.
     52       1.1     jkunz  *
     53       1.1     jkunz  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     54       1.1     jkunz  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     55       1.1     jkunz  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     56       1.1     jkunz  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     57       1.1     jkunz  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     58       1.1     jkunz  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     59       1.1     jkunz  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     60       1.1     jkunz  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     61       1.1     jkunz  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     62       1.1     jkunz  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     63       1.1     jkunz  * SUCH DAMAGE.
     64       1.1     jkunz  *
     65       1.1     jkunz  *	@(#)gets.c	8.1 (Berkeley) 6/11/93
     66       1.1     jkunz  */
     67       1.1     jkunz 
     68       1.1     jkunz 
     69       1.1     jkunz #include <sys/param.h>
     70       1.1     jkunz #include <sys/types.h>
     71       1.1     jkunz #include <sys/cdefs.h>
     72       1.1     jkunz 
     73       1.1     jkunz #include <lib/libsa/stand.h>
     74       1.1     jkunz #include <lib/libkern/libkern.h>
     75       1.1     jkunz 
     76       1.1     jkunz #include <arm/arm32/pte.h>
     77       1.1     jkunz #define _LOCORE
     78       1.1     jkunz #include <arm/imx/imx23var.h>
     79       1.1     jkunz #undef _LOCORE
     80       1.1     jkunz #include <evbarm/bootconfig.h>
     81       1.1     jkunz 
     82       1.1     jkunz #include <arm/imx/imx23_digctlreg.h>
     83       1.1     jkunz #include <arm/imx/imx23_uartdbgreg.h>
     84       1.1     jkunz 
     85       1.1     jkunz #include "common.h"
     86       1.1     jkunz 
     87       1.1     jkunz static void ngets(char *, int);
     88       1.1     jkunz 
     89       1.1     jkunz #define L1_PAGE_TABLE (DRAM_BASE + MEMSIZE * 1024 * 1024 - L1_TABLE_SIZE)
     90       1.1     jkunz #define BOOTIMX23_ARGS (L1_PAGE_TABLE - MAX_BOOT_STRING - 1)
     91       1.1     jkunz 
     92       1.1     jkunz #define PROMPT_DELAY 5000000 /* Wait 5 seconds user to press any key. */
     93       1.1     jkunz 
     94       1.1     jkunz int
     95       1.1     jkunz args_prep(void)
     96       1.1     jkunz {
     97       1.1     jkunz 	u_int prompt;
     98       1.1     jkunz 	char *boot_args = (char *)BOOTIMX23_ARGS;
     99       1.1     jkunz 
    100       1.1     jkunz 	/* Copy default boot arguments. */
    101       1.1     jkunz 	memset((void *)boot_args, 0x00, MAX_BOOT_STRING);
    102       1.1     jkunz 	strcpy(boot_args, KERNEL_BOOT_ARGS);
    103       1.1     jkunz 
    104       1.1     jkunz 	prompt = 0;
    105       1.1     jkunz 
    106       1.1     jkunz 	/* Enable debug UART data reception which was not enabled by the ROM. */
    107       1.1     jkunz 	uint16_t cr = REG_RD_HW(HW_UARTDBG_BASE + HW_UARTDBGCR);
    108       1.1     jkunz 	cr |= HW_UARTDBGCR_RXE;
    109       1.1     jkunz 	REG_WR_HW(HW_UARTDBG_BASE + HW_UARTDBGCR, cr);
    110       1.1     jkunz 
    111       1.1     jkunz 	printf("Press any key to drop into boot prompt...\n\r");
    112       1.1     jkunz 
    113       1.1     jkunz 	REG_WR(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS_CLR, 0xFFFFFFFF);
    114       1.1     jkunz 
    115       1.1     jkunz 	while (REG_RD(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS) < PROMPT_DELAY) {
    116       1.1     jkunz 		if (!(REG_RD_HW(HW_UARTDBG_BASE + HW_UARTDBGFR) &
    117       1.1     jkunz 		    HW_UARTDBGFR_RXFE)) {
    118       1.1     jkunz 			/* RX FIFO is not empty, some key was pressed. */
    119       1.1     jkunz 			REG_RD(HW_UARTDBG_BASE + HW_UARTDBGDR); /* Flush. */
    120       1.1     jkunz 			prompt = 1;
    121       1.1     jkunz 			break;
    122       1.1     jkunz 		}
    123       1.1     jkunz 	}
    124       1.1     jkunz 
    125       1.1     jkunz 	if (prompt) {
    126       1.1     jkunz 		memset((void *)boot_args, 0x00, MAX_BOOT_STRING);
    127       1.1     jkunz 		printf("boot: ");
    128       1.1     jkunz 		ngets(boot_args, MAX_BOOT_STRING);
    129       1.1     jkunz 	}
    130       1.1     jkunz 
    131       1.1     jkunz 	return 0;
    132       1.1     jkunz }
    133       1.1     jkunz 
    134       1.1     jkunz /*
    135       1.1     jkunz  * gets() with constrained input length.
    136       1.1     jkunz  *
    137       1.1     jkunz  * Copied from: sys/arch/ia64/stand/common/gets.c
    138       1.1     jkunz  */
    139       1.1     jkunz static void
    140       1.1     jkunz ngets(char *buf, int n)
    141       1.1     jkunz {
    142       1.1     jkunz 	int c;
    143       1.1     jkunz 	char *lp;
    144       1.1     jkunz 
    145       1.1     jkunz 	for (lp = buf;;) {
    146       1.1     jkunz 		switch (c = getchar() & 0177) {
    147       1.1     jkunz 		case '\n':
    148       1.1     jkunz 		case '\r':
    149       1.1     jkunz 			*lp = '\0';
    150       1.1     jkunz 			putchar('\n');
    151       1.1     jkunz 			return;
    152       1.1     jkunz 		case '\b':
    153       1.1     jkunz 		case '\177':
    154       1.1     jkunz 			if (lp > buf) {
    155       1.1     jkunz 				lp--;
    156       1.1     jkunz 				putchar('\b');
    157       1.1     jkunz 				putchar(' ');
    158       1.1     jkunz 				putchar('\b');
    159       1.1     jkunz 			}
    160       1.1     jkunz 			break;
    161       1.1     jkunz 		case 'r'&037: {
    162       1.1     jkunz 			char *p;
    163       1.1     jkunz 
    164       1.1     jkunz 			putchar('\n');
    165       1.1     jkunz 			for (p = buf; p < lp; ++p)
    166       1.1     jkunz 				putchar(*p);
    167       1.1     jkunz 			break;
    168       1.1     jkunz 		}
    169       1.1     jkunz 		case 'u'&037:
    170       1.1     jkunz 		case 'w'&037:
    171       1.1     jkunz 			lp = buf;
    172       1.1     jkunz 			putchar('\n');
    173       1.1     jkunz 			break;
    174       1.1     jkunz 		default:
    175       1.1     jkunz 			if ((n < 1) || ((lp - buf) < n)) {
    176       1.1     jkunz 				*lp++ = c;
    177       1.1     jkunz 				putchar(c);
    178       1.1     jkunz 			}
    179       1.1     jkunz 		}
    180       1.1     jkunz 	}
    181       1.1     jkunz 	/*NOTREACHED*/
    182       1.1     jkunz }
    183