xref: /netbsd-src/sys/arch/evbarm/stand/bootimx23/common.c (revision 94de07308fa702688d56949a9efc73b223f72255)
1*94de0730Smatt /* $Id: common.c,v 1.4 2013/10/07 17:36:40 matt Exp $ */
2da8587eaSjkunz 
3da8587eaSjkunz /*
4da8587eaSjkunz  * Copyright (c) 2012 The NetBSD Foundation, Inc.
5da8587eaSjkunz  * All rights reserved.
6da8587eaSjkunz  *
7da8587eaSjkunz  * This code is derived from software contributed to The NetBSD Foundation
8da8587eaSjkunz  * by Petri Laakso.
9da8587eaSjkunz  *
10da8587eaSjkunz  * Redistribution and use in source and binary forms, with or without
11da8587eaSjkunz  * modification, are permitted provided that the following conditions
12da8587eaSjkunz  * are met:
13da8587eaSjkunz  * 1. Redistributions of source code must retain the above copyright
14da8587eaSjkunz  *    notice, this list of conditions and the following disclaimer.
15da8587eaSjkunz  * 2. Redistributions in binary form must reproduce the above copyright
16da8587eaSjkunz  *    notice, this list of conditions and the following disclaimer in the
17da8587eaSjkunz  *    documentation and/or other materials provided with the distribution.
18da8587eaSjkunz  *
19da8587eaSjkunz  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20da8587eaSjkunz  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21da8587eaSjkunz  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22da8587eaSjkunz  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23da8587eaSjkunz  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24da8587eaSjkunz  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25da8587eaSjkunz  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26da8587eaSjkunz  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27da8587eaSjkunz  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28da8587eaSjkunz  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29da8587eaSjkunz  * POSSIBILITY OF SUCH DAMAGE.
30da8587eaSjkunz  */
31da8587eaSjkunz 
32da8587eaSjkunz #include <sys/param.h>
335379dc38Sjkunz #include <sys/types.h>
34da8587eaSjkunz #include <sys/cdefs.h>
35da8587eaSjkunz 
36*94de0730Smatt #include <lib/libsa/stand.h>
37*94de0730Smatt 
38da8587eaSjkunz #include <arm/imx/imx23_digctlreg.h>
39da8587eaSjkunz #include <arm/imx/imx23_uartdbgreg.h>
40da8587eaSjkunz 
41da8587eaSjkunz #include "common.h"
42da8587eaSjkunz 
43da8587eaSjkunz /*
445379dc38Sjkunz  * Delay us microseconds.
45da8587eaSjkunz  */
46da8587eaSjkunz void
delay(unsigned int us)475379dc38Sjkunz delay(unsigned int us)
48da8587eaSjkunz {
49*94de0730Smatt         volatile uint32_t *us_r;
50da8587eaSjkunz 
51*94de0730Smatt 	us_r = (uint32_t *)(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS);
52da8587eaSjkunz 
53*94de0730Smatt         *us_r = 0;
54*94de0730Smatt         while (*us_r < us)
55*94de0730Smatt                 ;
56da8587eaSjkunz 
57da8587eaSjkunz         return;
58da8587eaSjkunz }
59da8587eaSjkunz 
60da8587eaSjkunz /*
61*94de0730Smatt  * Write character c to debug UART.
62da8587eaSjkunz  */
63da8587eaSjkunz void
putchar(int c)64*94de0730Smatt putchar(int c)
65da8587eaSjkunz {
66*94de0730Smatt 	volatile uint8_t *fr_r, *dr_r;
67*94de0730Smatt 
68*94de0730Smatt 	fr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGFR);
69*94de0730Smatt 	dr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGDR);
70da8587eaSjkunz 
71da8587eaSjkunz         /* Wait until transmit FIFO has space for the new character. */
72*94de0730Smatt         while (*fr_r & HW_UARTDBGFR_TXFF)
73*94de0730Smatt                 ;
74da8587eaSjkunz 
75*94de0730Smatt 	*dr_r = c;
76*94de0730Smatt #ifdef DIAGNOSTIC
77*94de0730Smatt 
785379dc38Sjkunz 	/* Flush: Wait until transmit FIFO contents are written to UART. */
79*94de0730Smatt 	while (!(*fr_r & HW_UARTDBGFR_TXFE))
80*94de0730Smatt 		;
815379dc38Sjkunz #endif
82da8587eaSjkunz 
83da8587eaSjkunz 	return;
84da8587eaSjkunz }
85bf9547b2Sjkunz 
86bf9547b2Sjkunz /*
87bf9547b2Sjkunz  * Read character from debug UART.
88bf9547b2Sjkunz  */
89bf9547b2Sjkunz int
getchar(void)90bf9547b2Sjkunz getchar(void)
91bf9547b2Sjkunz {
92*94de0730Smatt 	volatile uint8_t *fr_r, *dr_r;
93*94de0730Smatt 
94*94de0730Smatt 	fr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGFR);
95*94de0730Smatt 	dr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGDR);
96bf9547b2Sjkunz 
97bf9547b2Sjkunz 	/* Wait until receive FIFO has character(s) */
98*94de0730Smatt 	while (*fr_r & HW_UARTDBGFR_RXFE)
99*94de0730Smatt 		;
100bf9547b2Sjkunz 
101*94de0730Smatt 	return *dr_r;
102*94de0730Smatt }
103bf9547b2Sjkunz 
104*94de0730Smatt void
vpanic(const char * fmt,va_list ap)105*94de0730Smatt vpanic(const char *fmt, va_list ap)
106*94de0730Smatt {
107*94de0730Smatt 	printf(fmt, ap);
108*94de0730Smatt 	for(;;);
109*94de0730Smatt 
110*94de0730Smatt 	/* NOTREACHED */
111bf9547b2Sjkunz }
112