1/*	$NetBSD: lcd.c,v 1.1 2008/05/28 14:04:07 tsutsui Exp $	*/
2
3/*-
4 * Copyright (c) 2008 Izumi Tsutsui.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <lib/libsa/stand.h>
28#include <lib/libkern/libkern.h>
29
30#include <dev/ic/hd44780reg.h>
31
32#include <machine/cpu.h>
33
34#include "boot.h"
35
36#define IREG	0x00
37#define DREG	0x10
38
39#if 0
40#define CSR_READ(base, reg)						\
41	(((*(volatile uint32_t *)((base) + (reg))) >> 24), delay(10))
42#endif
43
44#define CSR_WRITE(base, reg, val)					\
45	do {								\
46		*(volatile uint32_t *)((base) + (reg)) = ((val) << 24);	\
47		delay(10);						\
48	} while (/* CONSTCOND */ 0)
49
50#define NCOLS	16
51
52struct lcd_message {
53	char row1[NCOLS];
54	char row2[NCOLS];
55};
56
57static uint32_t lcd_base;
58static const struct lcd_message banner_message = {
59	"NetBSD/cobalt   ",
60	"Bootloader      "
61};
62static const struct lcd_message failed_message = {
63	"Boot failed!    ",
64	"Rebooting...    "
65};
66static struct lcd_message loadfile_message = {
67	"Loading:        ",
68	"                "
69};
70
71static void lcd_puts(const struct lcd_message *);
72
73void
74lcd_init(void)
75{
76
77	lcd_base = MIPS_PHYS_TO_KSEG1(LCD_BASE);
78}
79
80void
81lcd_banner(void)
82{
83
84	lcd_puts(&banner_message);
85}
86
87void
88lcd_loadfile(const char *file)
89{
90
91	memcpy(loadfile_message.row2, file, min(NCOLS, strlen(file)));
92
93	lcd_puts(&loadfile_message);
94}
95
96void
97lcd_failed(void)
98{
99
100	lcd_puts(&failed_message);
101}
102
103static void
104lcd_puts(const struct lcd_message *message)
105{
106	int i;
107
108	for (i = 0; i < NCOLS; i++) {
109		CSR_WRITE(lcd_base, IREG, cmd_ddramset(HD_ROW1_ADDR + i));
110		CSR_WRITE(lcd_base, DREG, message->row1[i]);
111	}
112	for (i = 0; i < NCOLS; i++) {
113		CSR_WRITE(lcd_base, IREG, cmd_ddramset(HD_ROW2_ADDR + i));
114		CSR_WRITE(lcd_base, DREG, message->row2[i]);
115	}
116}
117