From 06bc627c993b742997473bd76c75795c4b165cae Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sat, 11 Mar 2006 09:28:49 +0000 Subject: [PATCH] Removed lcd_roll() and lcd_remote_roll() functions. These functions were not really portable. Removed the only plugin that used lcd_roll(): Oscillograph. Oscilloscope offers everything that oscillograph did and more, in a portable way. * Bumped & sorted plugin API. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8995 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugin.c | 25 +-- apps/plugin.h | 28 ++- apps/plugins/SOURCES | 1 - apps/plugins/oscillograph.c | 300 ----------------------------- firmware/drivers/lcd-h100-remote.c | 26 --- firmware/drivers/lcd-h100.c | 18 -- firmware/drivers/lcd-h300.c | 13 -- firmware/drivers/lcd-ipod.c | 26 --- firmware/drivers/lcd-ipodvideo.c | 13 -- firmware/drivers/lcd-recorder.c | 12 -- 10 files changed, 21 insertions(+), 441 deletions(-) delete mode 100644 apps/plugins/oscillograph.c diff --git a/apps/plugin.c b/apps/plugin.c index ac1825180e..63097a2589 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -104,9 +104,6 @@ static const struct plugin_api rockbox_api = { PREFIX(lcd_icon), lcd_double_height, #else -#ifndef SIMULATOR - lcd_roll, -#endif lcd_set_drawmode, lcd_get_drawmode, lcd_setfont, @@ -155,9 +152,6 @@ static const struct plugin_api rockbox_api = { lcd_remote_puts, lcd_remote_puts_scroll, lcd_remote_stop_scroll, -#ifndef SIMULATOR - lcd_remote_roll, -#endif lcd_remote_set_drawmode, lcd_remote_get_drawmode, lcd_remote_setfont, @@ -245,6 +239,14 @@ static const struct plugin_api rockbox_api = { profile_func_exit, #endif +#ifdef SIMULATOR + /* special simulator hooks */ +#if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 + sim_lcd_ex_init, + sim_lcd_ex_update_rect, +#endif +#endif + /* strings and memory */ snprintf, strcpy, @@ -290,6 +292,7 @@ static const struct plugin_api rockbox_api = { pcm_set_frequency, pcm_is_playing, pcm_play_pause, + pcm_calculate_peaks, #endif #endif @@ -401,18 +404,10 @@ static const struct plugin_api rockbox_api = { screen_dump_set_hook, #endif show_logo, + tree_get_context, /* new stuff at the end, sort into place next time the API gets incompatible */ - tree_get_context, -#if defined(SIMULATOR) && defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 - sim_lcd_ex_init, - sim_lcd_ex_update_rect, -#endif - -#if (CONFIG_CODEC == SWCODEC) - pcm_calculate_peaks, -#endif }; int plugin_load(const char* plugin, void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index 81a58626bf..ed4588d906 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -99,12 +99,12 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 10 +#define PLUGIN_API_VERSION 11 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any new function which are "waiting" at the end of the function table) */ -#define PLUGIN_MIN_API_VERSION 10 +#define PLUGIN_MIN_API_VERSION 11 /* plugin return codes */ enum plugin_status { @@ -137,9 +137,6 @@ struct plugin_api { void (*PREFIX(lcd_icon))(int icon, bool enable); void (*lcd_double_height)(bool on); #else -#ifndef SIMULATOR - void (*lcd_roll)(int pixels); -#endif void (*lcd_set_drawmode)(int mode); int (*lcd_get_drawmode)(void); void (*lcd_setfont)(int font); @@ -200,9 +197,6 @@ struct plugin_api { void (*lcd_remote_puts)(int x, int y, const unsigned char *string); void (*lcd_remote_lcd_puts_scroll)(int x, int y, const unsigned char* string); void (*lcd_remote_lcd_stop_scroll)(void); -#ifndef SIMULATOR - void (*lcd_remote_roll)(int pixels); -#endif void (*lcd_remote_set_drawmode)(int mode); int (*lcd_remote_get_drawmode)(void); void (*lcd_remote_setfont)(int font); @@ -298,6 +292,14 @@ struct plugin_api { void (*profile_func_exit)(void *this_fn, void *call_site); #endif +#ifdef SIMULATOR + /* special simulator hooks */ +#if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 + void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int)); + void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height); +#endif +#endif + /* strings and memory */ int (*snprintf)(char *buf, size_t size, const char *fmt, ...); char* (*strcpy)(char *dst, const char *src); @@ -344,6 +346,7 @@ struct plugin_api { void (*pcm_set_frequency)(unsigned int frequency); bool (*pcm_is_playing)(void); void (*pcm_play_pause)(bool play); + void (*pcm_calculate_peaks)(int *left, int *right); #endif #endif /* !SIMULATOR */ @@ -466,16 +469,7 @@ struct plugin_api { void (*screen_dump_set_hook)(void (*hook)(int fh)); #endif int (*show_logo)(void); - struct tree_context* (*tree_get_context)(void); -#if defined(SIMULATOR) && defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 - void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int)); - void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height); -#endif - -#if (CONFIG_CODEC == SWCODEC) - void (*pcm_calculate_peaks)(int *left, int *right); -#endif /* new stuff at the end, sort into place next time the API gets incompatible */ diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index a0c2f3630b..75c88b3b70 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -44,7 +44,6 @@ chip8.c demystify.c flipit.c minesweeper.c -oscillograph.c oscilloscope.c pong.c rockblox.c diff --git a/apps/plugins/oscillograph.c b/apps/plugins/oscillograph.c deleted file mode 100644 index ed0e7a87af..0000000000 --- a/apps/plugins/oscillograph.c +++ /dev/null @@ -1,300 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 Philipp Pertermann - * - * All files in this archive are subject to the GNU General Public License. - * See the file COPYING in the source tree root for full license agreement. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "plugin.h" - -#ifdef HAVE_LCD_BITMAP - -PLUGIN_HEADER - -/* The different drawing modes */ -#define DRAW_MODE_FILLED 0 -#define DRAW_MODE_OUTLINE 1 -#define DRAW_MODE_PIXEL 2 -#define DRAW_MODE_COUNT 3 - -#define MAX_PEAK 0x8000 - -/* variable button definitions */ -#if CONFIG_KEYPAD == RECORDER_PAD -#define OSCILLOGRAPH_QUIT BUTTON_OFF -#define OSCILLOGRAPH_SPEED_UP BUTTON_UP -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN -#define OSCILLOGRAPH_ROLL BUTTON_F1 -#define OSCILLOGRAPH_MODE BUTTON_F2 -#define OSCILLOGRAPH_SPEED_RESET BUTTON_F3 -#define OSCILLOGRAPH_PAUSE BUTTON_PLAY - -#elif CONFIG_KEYPAD == ONDIO_PAD -#define OSCILLOGRAPH_QUIT BUTTON_OFF -#define OSCILLOGRAPH_SPEED_UP BUTTON_UP -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN -#define OSCILLOGRAPH_ROLL BUTTON_RIGHT -#define OSCILLOGRAPH_MODE BUTTON_MENU -#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT - -#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ - (CONFIG_KEYPAD == IRIVER_H300_PAD) -#define OSCILLOGRAPH_QUIT BUTTON_OFF -#define OSCILLOGRAPH_SPEED_UP BUTTON_UP -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN -#define OSCILLOGRAPH_ROLL BUTTON_RIGHT -#define OSCILLOGRAPH_MODE BUTTON_SELECT -#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT - -#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \ - (CONFIG_KEYPAD == IPOD_4G_PAD) -#define OSCILLOGRAPH_QUIT BUTTON_MENU -#define OSCILLOGRAPH_SPEED_UP BUTTON_SCROLL_FWD -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_SCROLL_BACK -#define OSCILLOGRAPH_ROLL BUTTON_RIGHT -#define OSCILLOGRAPH_MODE BUTTON_SELECT -#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT - -#elif (CONFIG_KEYPAD == GIGABEAT_PAD) -#define OSCILLOGRAPH_QUIT BUTTON_POWER -#define OSCILLOGRAPH_SPEED_UP BUTTON_UP -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN -#define OSCILLOGRAPH_ROLL BUTTON_RIGHT -#define OSCILLOGRAPH_MODE BUTTON_SELECT -#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT - -#elif CONFIG_KEYPAD == IAUDIO_X5_PAD -#define OSCILLOGRAPH_QUIT BUTTON_POWER -#define OSCILLOGRAPH_SPEED_UP BUTTON_UP -#define OSCILLOGRAPH_SPEED_DOWN BUTTON_DOWN -#define OSCILLOGRAPH_ROLL BUTTON_RIGHT -#define OSCILLOGRAPH_MODE BUTTON_SELECT -#define OSCILLOGRAPH_SPEED_RESET BUTTON_LEFT - -#endif - -#if SIMULATOR && (CONFIG_CODEC != SWCODEC) -#define mas_codec_readreg(x) rand()%MAX_PEAK -#endif - -/* global api struct pointer */ -static struct plugin_api* rb; -/* number of ticks between two volume samples */ -static int speed = 1; -#ifndef SIMULATOR -/* roll == true -> lcd rolls */ -static bool roll = true; -#endif -/* see DRAW_MODE_XXX constants for valid values */ -static int drawMode = DRAW_MODE_FILLED; - -/** - * cleanup on return / usb - */ -void cleanup(void *parameter) -{ - (void)parameter; -#ifndef SIMULATOR - /* restore to default roll position. - Looks funny if you forget to do this... */ - rb->lcd_roll(0); -#endif - rb->lcd_update(); -} - -/** - * Displays a vertically scrolling oscillosgraph using - * hardware scrolling of the display. The user can change - * speed - */ -enum plugin_status plugin_start(struct plugin_api* api, void* parameter) -{ - int button; - /* stores current volume value left */ - int left; - /* stores current volume value right */ - int right; - /* specifies the current position on the lcd */ - int y = LCD_WIDTH - 1; - - /* only needed when drawing lines */ - int lastLeft = 0; - int lastRight = 0; - int lasty = 0; - - bool exit = false; - - (void)parameter; - rb = api; - - /* the main loop */ - while (!exit) { - - /* read the volume info */ -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - left = rb->mas_codec_readreg(0xC); - right = rb->mas_codec_readreg(0xD); -#elif (CONFIG_CODEC == SWCODEC) - rb->pcm_calculate_peaks(&left, &right); -#endif - - left = left / (MAX_PEAK / (LCD_WIDTH / 2 - 2)); - right = right / (MAX_PEAK / (LCD_WIDTH / 2 - 2)); - - /* delete current line */ - rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_drawline(0, y, LCD_WIDTH-1, y); - - rb->lcd_set_drawmode(DRMODE_SOLID); - switch (drawMode) { - case DRAW_MODE_FILLED: - rb->lcd_drawline(LCD_WIDTH / 2 + 1 , y, - LCD_WIDTH / 2 + 1 + right, y); - rb->lcd_drawline(LCD_WIDTH / 2 - 1 , y, - LCD_WIDTH / 2 - 1 -left , y); - break; - - case DRAW_MODE_OUTLINE: - /* last position needed for lines */ - lasty = MAX(y-1, 0); - - /* Here real lines were neccessary because - anything else was ugly. */ - rb->lcd_drawline(LCD_WIDTH / 2 + right , y, - LCD_WIDTH / 2 + lastRight , lasty); - rb->lcd_drawline(LCD_WIDTH / 2 - left , y, - LCD_WIDTH / 2 - lastLeft, lasty); - - /* have to store the old values for drawing lines - the next time */ - lastRight = right; - lastLeft = left; - break; - - case DRAW_MODE_PIXEL: - /* straight and simple */ - rb->lcd_drawpixel(LCD_WIDTH / 2 + right, y); - rb->lcd_drawpixel(LCD_WIDTH / 2 - left, y); - break; - } - - - /* increment and adjust the drawing position */ - y++; - if (y >= LCD_HEIGHT) - y = 0; - -#ifndef SIMULATOR - /* I roll before update because otherwise the new - line would appear at the wrong end of the display */ - if (roll) - rb->lcd_roll(y); -#endif - - /* now finally make the new sample visible */ - rb->lcd_update_rect(0, MAX(y-1, 0), LCD_WIDTH, 2); - - /* There are two mechanisms to alter speed: - 1.) slowing down is achieved by increasing - the time waiting for user input. This - mechanism uses positive values. - 2.) speeding up is achieved by leaving out - the user input check for (-speed) volume - samples. For this mechanism negative values - are used. - */ - - if (speed >= 0 || ((speed < 0) && (y % (-speed) == 0))) { - bool draw = false; - - /* speed values > 0 slow the oszi down. By user input - speed might become < 1. If a value < 1 was - passed user input would be disabled. Thus - it must be ensured that at least 1 is passed. */ - - /* react to user input */ - button = rb->button_get_w_tmo(MAX(speed, 1)); - switch (button) { - case OSCILLOGRAPH_SPEED_UP: - speed++; - draw = true; - break; - - case OSCILLOGRAPH_SPEED_DOWN: - speed--; - draw = true; - break; - -#ifdef OSCILLOGRAPH_PAUSE - case OSCILLOGRAPH_PAUSE: - /* pause the demo */ - rb->button_get(true); - break; -#endif - -#ifndef SIMULATOR - case OSCILLOGRAPH_ROLL: - /* toggle rolling */ - roll = !roll; - break; -#endif - - case OSCILLOGRAPH_MODE: - /* step through the display modes */ - drawMode ++; - drawMode = drawMode % DRAW_MODE_COUNT; - -#ifndef SIMULATOR - /* lcd buffer might be rolled so that - the transition from LCD_HEIGHT to 0 - takes place in the middle of the screen. - That produces ugly results in DRAW_MODE_OUTLINE - mode. If rolling is enabled this change will - be reverted before the next update anyway.*/ - rb->lcd_roll(0); -#endif - break; - - case OSCILLOGRAPH_SPEED_RESET: - speed = 1; - draw = true; - break; - - case OSCILLOGRAPH_QUIT: - exit = true; - break; - - default: - if (rb->default_event_handler_ex(button, cleanup, NULL) - == SYS_USB_CONNECTED) - return PLUGIN_USB_CONNECTED; - break; - } - - if (draw) { - char buf[16]; - rb->snprintf(buf, sizeof buf, "Speed: %d", -speed); - rb->lcd_putsxy(0, (y + LCD_HEIGHT - 8) % LCD_HEIGHT, buf); - rb->lcd_update_rect(0, (y + LCD_HEIGHT - 8) % LCD_HEIGHT, - LCD_WIDTH, 8); - } - } - } - - cleanup(NULL); - /* standard return */ - return PLUGIN_OK; -} - -#endif diff --git a/firmware/drivers/lcd-h100-remote.c b/firmware/drivers/lcd-h100-remote.c index df735ca40d..a6d584c3fb 100644 --- a/firmware/drivers/lcd-h100-remote.c +++ b/firmware/drivers/lcd-h100-remote.c @@ -100,7 +100,6 @@ static bool remote_initialized = false; static bool cached_invert = false; static bool cached_flip = false; static int cached_contrast = 32; -static int cached_roll = 0; #endif /* scrolling */ @@ -393,30 +392,6 @@ void lcd_remote_set_flip(bool yesno) } } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_REMOTE_HEIGHT. */ -void lcd_remote_roll(int lines) -{ - char data[2]; - - cached_roll = lines; - - if (remote_initialized) - { - lines &= LCD_REMOTE_HEIGHT-1; - data[0] = lines & 0xff; - data[1] = lines >> 8; - - lcd_remote_write_command(LCD_REMOTE_CNTL_INIT_LINE | 0x0); // init line - lcd_remote_write_data(data, 2); - } -} - /* The actual LCD init */ static void remote_lcd_init(void) { @@ -443,7 +418,6 @@ static void remote_lcd_init(void) lcd_remote_set_flip(cached_flip); lcd_remote_set_contrast(cached_contrast); lcd_remote_set_invert_display(cached_invert); - lcd_remote_roll(cached_roll); } static int _remote_type = 0; diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c index 7b67ad023c..1d80458679 100644 --- a/firmware/drivers/lcd-h100.c +++ b/firmware/drivers/lcd-h100.c @@ -136,19 +136,6 @@ void lcd_set_flip(bool yesno) } } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - lines &= LCD_HEIGHT-1; - lcd_write_command_ex(LCD_CNTL_DISPLAY_START_LINE, lines, -1); -} - #endif /* !SIMULATOR */ /* LCD init */ @@ -163,8 +150,6 @@ void lcd_init(void) void lcd_init(void) { - static unsigned char area_data[4] = { 0x01, 0x00, 0x7f, 0x80 }; - /* GPO35 is the LCD A0 pin GPO46 is LCD RESET */ or_l(0x00004008, &GPIO1_OUT); @@ -198,9 +183,6 @@ void lcd_init(void) sleep(HZ/10); /* 100 ms pause */ lcd_write_command_ex(LCD_CNTL_POWER_CONTROL, 0x17, -1); - lcd_write_command(LCD_CNTL_AREA_SCROLL); - lcd_write_data(area_data, sizeof(area_data)); - lcd_write_command_ex(LCD_CNTL_DISPLAY_START_LINE, 0, -1); lcd_write_command_ex(LCD_CNTL_GRAY_SCALE_PATTERN, 0x42, -1); lcd_write_command_ex(LCD_CNTL_DISPLAY_MODE, 0, -1); /* Greyscale mode */ diff --git a/firmware/drivers/lcd-h300.c b/firmware/drivers/lcd-h300.c index 8ee6b1c47e..046bd3a9cb 100644 --- a/firmware/drivers/lcd-h300.c +++ b/firmware/drivers/lcd-h300.c @@ -107,19 +107,6 @@ void lcd_set_flip(bool yesno) (void)yesno; } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - (void)lines; -} - - /* LCD init */ void lcd_init_device(void) { diff --git a/firmware/drivers/lcd-ipod.c b/firmware/drivers/lcd-ipod.c index 4df47f9f20..2d190d3d70 100644 --- a/firmware/drivers/lcd-ipod.c +++ b/firmware/drivers/lcd-ipod.c @@ -141,19 +141,6 @@ void lcd_blit(const unsigned char* data, int x, int by, int width, (void)stride; } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - /* TODO Implement lcd_roll() */ - lines &= LCD_HEIGHT-1; -} - /*** hardware configuration ***/ /* Update the display. @@ -314,19 +301,6 @@ void lcd_set_flip(bool yesno) (void)yesno; } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - /* TODO: Implement lcd_roll() */ - lines &= LCD_HEIGHT-1; -} - /* LCD init */ void lcd_init_device(void) { diff --git a/firmware/drivers/lcd-ipodvideo.c b/firmware/drivers/lcd-ipodvideo.c index 066616959e..84b830377e 100644 --- a/firmware/drivers/lcd-ipodvideo.c +++ b/firmware/drivers/lcd-ipodvideo.c @@ -50,19 +50,6 @@ void lcd_set_flip(bool yesno) (void)yesno; } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - /* TODO: Implement lcd_roll() */ - lines &= LCD_HEIGHT-1; -} - /* LCD init */ void lcd_init_device(void) { diff --git a/firmware/drivers/lcd-recorder.c b/firmware/drivers/lcd-recorder.c index 22388815ae..7a44acf590 100644 --- a/firmware/drivers/lcd-recorder.c +++ b/firmware/drivers/lcd-recorder.c @@ -226,18 +226,6 @@ void lcd_set_flip(bool yesno) #endif } -/* Rolls up the lcd display by the specified amount of lines. - * Lines that are rolled out over the top of the screen are - * rolled in from the bottom again. This is a hardware - * remapping only and all operations on the lcd are affected. - * -> - * @param int lines - The number of lines that are rolled. - * The value must be 0 <= pixels < LCD_HEIGHT. */ -void lcd_roll(int lines) -{ - lcd_write_command(LCD_SET_DISPLAY_START_LINE | (lines & (LCD_HEIGHT-1))); -} - #endif /* !SIMULATOR */ /* LCD init */