Module Name: src Committed By: tsutsui Date: Thu Mar 9 14:05:59 UTC 2017
Modified Files: src/distrib/sets/lists/comp: md.luna68k src/etc/etc.luna68k: MAKEDEV.conf src/sys/arch/luna68k/conf: GENERIC INSTALL files.luna68k majors.luna68k src/sys/arch/luna68k/dev: lcd.c src/sys/arch/luna68k/include: Makefile src/sys/arch/luna68k/luna68k: machdep.c mainbus.c Added Files: src/sys/arch/luna68k/include: lcd.h Log Message: Add a driver for LUNA's front panel LCD. Ported from OpenBSD/luna88k. Reviewed by enami@. Tested by Naruaki Etomi and me. A 68k LUNA with this driver will be demonstrated at AsiaBSDCon NetBSD booth by Etomi-san, with LUNA-88K2 running OpenBSD/luna88k by Kenji Aoyama. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/distrib/sets/lists/comp/md.luna68k cvs rdiff -u -r1.10 -r1.11 src/etc/etc.luna68k/MAKEDEV.conf cvs rdiff -u -r1.120 -r1.121 src/sys/arch/luna68k/conf/GENERIC cvs rdiff -u -r1.20 -r1.21 src/sys/arch/luna68k/conf/INSTALL cvs rdiff -u -r1.25 -r1.26 src/sys/arch/luna68k/conf/files.luna68k cvs rdiff -u -r1.21 -r1.22 src/sys/arch/luna68k/conf/majors.luna68k cvs rdiff -u -r1.7 -r1.8 src/sys/arch/luna68k/dev/lcd.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/luna68k/include/Makefile cvs rdiff -u -r0 -r1.1 src/sys/arch/luna68k/include/lcd.h cvs rdiff -u -r1.99 -r1.100 src/sys/arch/luna68k/luna68k/machdep.c cvs rdiff -u -r1.14 -r1.15 src/sys/arch/luna68k/luna68k/mainbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/comp/md.luna68k diff -u src/distrib/sets/lists/comp/md.luna68k:1.21 src/distrib/sets/lists/comp/md.luna68k:1.22 --- src/distrib/sets/lists/comp/md.luna68k:1.21 Sat Dec 3 17:38:02 2016 +++ src/distrib/sets/lists/comp/md.luna68k Thu Mar 9 14:05:58 2017 @@ -1,4 +1,4 @@ -# $NetBSD: md.luna68k,v 1.21 2016/12/03 17:38:02 tsutsui Exp $ +# $NetBSD: md.luna68k,v 1.22 2017/03/09 14:05:58 tsutsui Exp $ ./usr/include/ieeefp.h comp-c-include ./usr/include/luna68k comp-c-include ./usr/include/luna68k/_G_config.h comp-obsolete obsolete @@ -27,6 +27,7 @@ ./usr/include/luna68k/int_types.h comp-c-include ./usr/include/luna68k/intr.h comp-c-include ./usr/include/luna68k/kcore.h comp-c-include +./usr/include/luna68k/lcd.h comp-c-include ./usr/include/luna68k/limits.h comp-c-include ./usr/include/luna68k/lock.h comp-c-include ./usr/include/luna68k/math.h comp-c-include Index: src/etc/etc.luna68k/MAKEDEV.conf diff -u src/etc/etc.luna68k/MAKEDEV.conf:1.10 src/etc/etc.luna68k/MAKEDEV.conf:1.11 --- src/etc/etc.luna68k/MAKEDEV.conf:1.10 Thu Feb 16 13:13:39 2017 +++ src/etc/etc.luna68k/MAKEDEV.conf Thu Mar 9 14:05:58 2017 @@ -1,10 +1,10 @@ -# $NetBSD: MAKEDEV.conf,v 1.10 2017/02/16 13:13:39 tsutsui Exp $ +# $NetBSD: MAKEDEV.conf,v 1.11 2017/03/09 14:05:58 tsutsui Exp $ all_md) makedev ttya sd0 sd1 sd2 sd3 cd0 cd1 st0 st1 makedev wscons makedev scsibus0 scsibus1 - makedev xp + makedev xp lcd ;; tty[ab]) @@ -26,3 +26,8 @@ xp) major=40; minor=0; mode=0644 mkdev xp c $major $minor $mode ;; + +lcd) + major=41; minor=0; mode=0644 + mkdev lcd c $major $minor $mode + ;; Index: src/sys/arch/luna68k/conf/GENERIC diff -u src/sys/arch/luna68k/conf/GENERIC:1.120 src/sys/arch/luna68k/conf/GENERIC:1.121 --- src/sys/arch/luna68k/conf/GENERIC:1.120 Sat Dec 3 17:38:02 2016 +++ src/sys/arch/luna68k/conf/GENERIC Thu Mar 9 14:05:58 2017 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.120 2016/12/03 17:38:02 tsutsui Exp $ +# $NetBSD: GENERIC,v 1.121 2017/03/09 14:05:58 tsutsui Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/luna68k/conf/std.luna68k" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.120 $" +#ident "GENERIC-$Revision: 1.121 $" makeoptions COPTS="-O2 -fno-reorder-blocks" # see share/mk/sys.mk @@ -151,6 +151,9 @@ mainbus0 at root clock0 at mainbus0 +# LCD on front panel +lcd0 at mainbus0 + # uPD7201 SIO sio0 at mainbus0 siotty0 at sio0 # ttya Index: src/sys/arch/luna68k/conf/INSTALL diff -u src/sys/arch/luna68k/conf/INSTALL:1.20 src/sys/arch/luna68k/conf/INSTALL:1.21 --- src/sys/arch/luna68k/conf/INSTALL:1.20 Sun Sep 18 14:20:23 2016 +++ src/sys/arch/luna68k/conf/INSTALL Thu Mar 9 14:05:58 2017 @@ -1,4 +1,4 @@ -# $NetBSD: INSTALL,v 1.20 2016/09/18 14:20:23 christos Exp $ +# $NetBSD: INSTALL,v 1.21 2017/03/09 14:05:58 tsutsui Exp $ # # config for installation ramdisk kernel # @@ -130,6 +130,9 @@ mainbus0 at root clock0 at mainbus0 +# LCD on front panel +lcd0 at mainbus0 + # uPD7201 SIO sio0 at mainbus0 siotty0 at sio0 # ttya Index: src/sys/arch/luna68k/conf/files.luna68k diff -u src/sys/arch/luna68k/conf/files.luna68k:1.25 src/sys/arch/luna68k/conf/files.luna68k:1.26 --- src/sys/arch/luna68k/conf/files.luna68k:1.25 Sat Dec 3 17:38:02 2016 +++ src/sys/arch/luna68k/conf/files.luna68k Thu Mar 9 14:05:58 2017 @@ -1,5 +1,5 @@ # -# $NetBSD: files.luna68k,v 1.25 2016/12/03 17:38:02 tsutsui Exp $ +# $NetBSD: files.luna68k,v 1.26 2017/03/09 14:05:58 tsutsui Exp $ # maxpartitions 8 maxusers 2 8 64 @@ -22,7 +22,6 @@ file arch/m68k/m68k/procfs_machdep.c pro file arch/m68k/m68k/sys_machdep.c file arch/m68k/m68k/vm_machdep.c file dev/cons.c -file arch/luna68k/dev/lcd.c device mainbus {} attach mainbus at root @@ -32,6 +31,10 @@ device clock attach clock at mainbus file arch/luna68k/dev/timekeeper.c clock +device lcd +attach lcd at mainbus +file arch/luna68k/dev/lcd.c lcd needs-flag + attach le at mainbus: le24 file arch/luna68k/dev/if_le.c le Index: src/sys/arch/luna68k/conf/majors.luna68k diff -u src/sys/arch/luna68k/conf/majors.luna68k:1.21 src/sys/arch/luna68k/conf/majors.luna68k:1.22 --- src/sys/arch/luna68k/conf/majors.luna68k:1.21 Sat Dec 3 17:38:02 2016 +++ src/sys/arch/luna68k/conf/majors.luna68k Thu Mar 9 14:05:58 2017 @@ -1,4 +1,4 @@ -# $NetBSD: majors.luna68k,v 1.21 2016/12/03 17:38:02 tsutsui Exp $ +# $NetBSD: majors.luna68k,v 1.22 2017/03/09 14:05:58 tsutsui Exp $ # # Device majors for luna68k # @@ -37,6 +37,7 @@ device-major cgd char 37 block 15 cgd device-major ksyms char 38 ksyms device-major wsfont char 39 wsfont device-major xp char 40 xp +device-major lcd char 41 lcd device-major nsmb char 98 nsmb Index: src/sys/arch/luna68k/dev/lcd.c diff -u src/sys/arch/luna68k/dev/lcd.c:1.7 src/sys/arch/luna68k/dev/lcd.c:1.8 --- src/sys/arch/luna68k/dev/lcd.c:1.7 Sat Nov 12 13:44:26 2011 +++ src/sys/arch/luna68k/dev/lcd.c Thu Mar 9 14:05:58 2017 @@ -1,4 +1,5 @@ -/* $NetBSD: lcd.c,v 1.7 2011/11/12 13:44:26 tsutsui Exp $ */ +/* $NetBSD: lcd.c,v 1.8 2017/03/09 14:05:58 tsutsui Exp $ */ +/* $OpenBSD: lcd.c,v 1.7 2015/02/10 22:42:35 miod Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,19 +32,21 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: lcd.c,v 1.7 2011/11/12 13:44:26 tsutsui Exp $"); - -/* - * XXX - * Following code segments are subject to change. - * XXX - */ +__KERNEL_RCSID(0, "$NetBSD: lcd.c,v 1.8 2017/03/09 14:05:58 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <sys/conf.h> #include <sys/device.h> +#include <sys/ioctl.h> +#include <sys/fcntl.h> +#include <sys/errno.h> +#include <machine/autoconf.h> #include <machine/cpu.h> +#include <machine/lcd.h> + +#include "ioconf.h" #define PIO1_MODE_OUTPUT 0x84 #define PIO1_MODE_INPUT 0x94 @@ -65,6 +68,8 @@ __KERNEL_RCSID(0, "$NetBSD: lcd.c,v 1.7 #define LCD_HOME 0x02 #define LCD_LOCATE(X, Y) (((Y) & 1 ? 0xc0 : 0x80) | ((X) & 0x0f)) +#define LCD_MAXBUFLEN 80 + struct pio { volatile u_int8_t portA; volatile u_int8_t portB; @@ -72,6 +77,39 @@ struct pio { volatile u_int8_t cntrl; }; +/* Autoconf stuff */ +static int lcd_match(device_t, cfdata_t, void *); +static void lcd_attach(device_t, device_t, void *); + +dev_type_open(lcdopen); +dev_type_close(lcdclose); +dev_type_write(lcdwrite); +dev_type_ioctl(lcdioctl); + +const struct cdevsw lcd_cdevsw = { + .d_open = lcdopen, + .d_close = lcdclose, + .d_read = noread, + .d_write = lcdwrite, + .d_ioctl = lcdioctl, + .d_stop = nostop, + .d_tty = notty, + .d_poll = nopoll, + .d_mmap = nommap, + .d_kqfilter = nokqfilter, + .d_discard = nodiscard, + .d_flag = 0 +}; + +struct lcd_softc { + device_t sc_dev; + + bool sc_opened; +}; + +CFATTACH_DECL_NEW(lcd, sizeof(struct lcd_softc), + lcd_match, lcd_attach, NULL, NULL); + void lcdbusywait(void); void lcdput(int); void lcdctrl(int); @@ -81,6 +119,165 @@ void greeting(void); static char lcd_boot_message1[] = " NetBSD/luna68k "; static char lcd_boot_message2[] = " SX-9100/DT "; +/* + * Autoconf functions + */ +static int +lcd_match(device_t parent, cfdata_t cf, void *aux) +{ + struct mainbus_attach_args *ma = aux; + + if (strcmp(ma->ma_name, lcd_cd.cd_name)) + return 0; + if (badaddr((void *)ma->ma_addr, 4)) + return 0; + return 1; +} + +static void +lcd_attach(device_t parent, device_t self, void *aux) +{ + + printf("\n"); + + /* Say hello to the world on LCD. */ + greeting(); +} + +/* + * open/close/write/ioctl + */ +int +lcdopen(dev_t dev, int flags, int fmt, struct lwp *l) +{ + int unit; + struct lcd_softc *sc; + + unit = minor(dev); + sc = device_lookup_private(&lcd_cd, unit); + if (sc == NULL) + return ENXIO; + if (sc->sc_opened) + return EBUSY; + sc->sc_opened = true; + + return 0; +} + +int +lcdclose(dev_t dev, int flags, int fmt, struct lwp *l) +{ + int unit; + struct lcd_softc *sc; + + unit = minor(dev); + sc = device_lookup_private(&lcd_cd, unit); + sc->sc_opened = false; + + return 0; +} + +int +lcdwrite(dev_t dev, struct uio *uio, int flag) +{ + int error; + size_t len, i; + char buf[LCD_MAXBUFLEN]; + + len = uio->uio_resid; + + if (len > LCD_MAXBUFLEN) + return EIO; + + error = uiomove(buf, len, uio); + if (error) + return EIO; + + for (i = 0; i < len; i++) { + lcdput((int)buf[i]); + } + + return 0; +} + +int +lcdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) +{ + int val; + + /* check if the device opened with write mode */ + switch (cmd) { + case LCDCLS: + case LCDHOME: + case LCDMODE: + case LCDDISP: + case LCDMOVE: + case LCDSEEK: + case LCDRESTORE: + if ((flag & FWRITE) == 0) + return EACCES; + break; + } + + switch (cmd) { + case LCDCLS: + lcdctrl(LCD_CLS); + break; + + case LCDHOME: + lcdctrl(LCD_HOME); + break; + + case LCDMODE: + val = *(int *)addr; + switch (val) { + case LCDMODE_C_LEFT: + case LCDMODE_C_RIGHT: + case LCDMODE_D_LEFT: + case LCDMODE_D_RIGHT: + lcdctrl(val); + break; + default: + return EINVAL; + } + break; + + case LCDDISP: + val = *(int *)addr; + if ((val & 0x7) != val) + return EINVAL; + lcdctrl(val | 0x8); + break; + + case LCDMOVE: + val = *(int *)addr; + switch (val) { + case LCDMOVE_C_LEFT: + case LCDMOVE_C_RIGHT: + case LCDMOVE_D_LEFT: + case LCDMOVE_D_RIGHT: + lcdctrl(val); + break; + default: + return EINVAL; + } + break; + + case LCDSEEK: + val = *(int *)addr & 0x7f; + lcdctrl(val | 0x80); + break; + + case LCDRESTORE: + greeting(); + break; + + default: + return ENOTTY; + } + return EPASSTHROUGH; +} + void lcdbusywait(void) { Index: src/sys/arch/luna68k/include/Makefile diff -u src/sys/arch/luna68k/include/Makefile:1.19 src/sys/arch/luna68k/include/Makefile:1.20 --- src/sys/arch/luna68k/include/Makefile:1.19 Sat Dec 3 17:38:02 2016 +++ src/sys/arch/luna68k/include/Makefile Thu Mar 9 14:05:58 2017 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.19 2016/12/03 17:38:02 tsutsui Exp $ +# $NetBSD: Makefile,v 1.20 2017/03/09 14:05:58 tsutsui Exp $ INCSDIR= /usr/include/luna68k @@ -12,7 +12,7 @@ INCS= ansi.h aout_machdep.h asm.h autoco int_const.h int_fmtio.h int_limits.h int_mwgwtypes.h int_types.h \ intr.h \ kcore.h \ - limits.h lock.h \ + lcd.h limits.h lock.h \ math.h mcontext.h mutex.h \ param.h pcb.h pmap.h pmc.h proc.h profile.h psl.h pte.h ptrace.h reg.h \ rwlock.h setjmp.h signal.h \ Index: src/sys/arch/luna68k/luna68k/machdep.c diff -u src/sys/arch/luna68k/luna68k/machdep.c:1.99 src/sys/arch/luna68k/luna68k/machdep.c:1.100 --- src/sys/arch/luna68k/luna68k/machdep.c:1.99 Fri Aug 21 10:48:06 2015 +++ src/sys/arch/luna68k/luna68k/machdep.c Thu Mar 9 14:05:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.99 2015/08/21 10:48:06 christos Exp $ */ +/* $NetBSD: machdep.c,v 1.100 2017/03/09 14:05:59 tsutsui Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.99 2015/08/21 10:48:06 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.100 2017/03/09 14:05:59 tsutsui Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -319,7 +319,6 @@ cpu_startup(void) { vaddr_t minaddr, maxaddr; char pbuf[9]; - extern void greeting(void); if (fputype != FPU_NONE) m68k_make_fpu_idle_frame(); @@ -348,11 +347,6 @@ cpu_startup(void) format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free)); printf("avail memory = %s\n", pbuf); - - /* - * Say "Hi" to the world - */ - greeting(); } void Index: src/sys/arch/luna68k/luna68k/mainbus.c diff -u src/sys/arch/luna68k/luna68k/mainbus.c:1.14 src/sys/arch/luna68k/luna68k/mainbus.c:1.15 --- src/sys/arch/luna68k/luna68k/mainbus.c:1.14 Sat Dec 3 17:38:02 2016 +++ src/sys/arch/luna68k/luna68k/mainbus.c Thu Mar 9 14:05:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mainbus.c,v 1.14 2016/12/03 17:38:02 tsutsui Exp $ */ +/* $NetBSD: mainbus.c,v 1.15 2017/03/09 14:05:59 tsutsui Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.14 2016/12/03 17:38:02 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.15 2017/03/09 14:05:59 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v static const struct mainbus_attach_args luna_devs[] = { { "clock", 0x45000000, -1 }, /* Mostek TimeKeeper */ + { "lcd", 0x4d000000, -1 }, /* Sharp LM16X212 LCD module */ { "le", 0xf1000000, 3 }, /* Am7990 */ { "sio", 0x51000000, 6 }, /* uPD7201A */ { "xp", 0x71000000, 1 }, /* HD647180XP */ @@ -51,6 +52,7 @@ static const struct mainbus_attach_args static const struct mainbus_attach_args luna2_devs[] = { { "clock", 0x45000000, -1 }, /* Dallas TimeKeeper */ + { "lcd", 0x4d000000, -1 }, /* Sharp LM16X212 LCD module */ { "le", 0xf1000000, 3 }, /* Am7990 */ { "sio", 0x51000000, 6 }, /* uPD7201A */ { "xp", 0x71000000, 1 }, /* HD647180XP */ Added files: Index: src/sys/arch/luna68k/include/lcd.h diff -u /dev/null src/sys/arch/luna68k/include/lcd.h:1.1 --- /dev/null Thu Mar 9 14:05:59 2017 +++ src/sys/arch/luna68k/include/lcd.h Thu Mar 9 14:05:58 2017 @@ -0,0 +1,67 @@ +/* $NetBSD: lcd.h,v 1.1 2017/03/09 14:05:58 tsutsui Exp $ */ +/* $OpenBSD: lcd.h,v 1.2 2011/03/23 16:54:35 pirofti Exp $ */ + +/* + * Copyright (c) 2007 Kenji AOYAMA <aoy...@nk-home.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _MACHINE_LCD_H_ +#define _MACHINE_LCD_H_ + +/* + * NetBSD/luna68k LCD driver + * (taken from OpenBSD/luna88k LCD driver) + */ + +/* The ioctl defines */ + +#define LCDCLS _IO('L', 1) /* Clear LCD screen */ +#define LCDHOME _IO('L', 2) /* Move the cursor to left-upper */ +#define LCDMODE _IOW('L', 3, int) /* Set the data entry mode */ +#define LCDDISP _IOW('L', 4, int) /* Blink, cursor, and display on/off */ +#define LCDMOVE _IOW('L', 5, int) /* Move cursor / shift display area */ +#define LCDSEEK _IOW('L', 6, int) /* Move the cursor to specified position */ +#define LCDRESTORE _IO('L', 7) /* Restore boot-time LCD message */ + +/* argument value for each ioctl */ + +/* LCDMODE; when a character data is written, then ... */ +#define LCDMODE_C_LEFT 0x04 /* cursor moves left */ +#define LCDMODE_C_RIGHT 0x06 /* cursor moves right */ +#define LCDMODE_D_LEFT 0x05 /* display area shifts to left */ +#define LCDMODE_D_RIGHT 0x07 /* display area shifts to right */ + +/* LCDDISP; you can use these values or'ed */ +#define LCD_DISPLAY 0x04 /* LCD display on */ +#define LCD_CURSOR 0x02 /* Cursor on */ +#define LCD_BLINK 0x01 /* Blink on */ + +/* LCDMOVE; just move the cursor or shift the display area */ +#define LCDMOVE_C_LEFT 0x10 /* cursor moves left */ +#define LCDMOVE_C_RIGHT 0x14 /* cursor moves right */ +#define LCDMOVE_D_LEFT 0x18 /* display area shifts to left */ +#define LCDMOVE_D_RIGHT 0x1c /* display area shifts to right */ + +#endif /* _MACHINE_LCD_H_ */