mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-07-10 13:29:52 -04:00
Enable HAVE_LCD_FLIP for the Clip Zip and implement lcd_set_flip() in the LCD driver, making the Display -> Flip Display setting work. This lets the player be used upside down, e.g. clipped to clothing with the control buttons pointing up and screen on the bottom. Defining HAVE_LCD_FLIP also activates the existing button remap in button_flip() (firmware/drivers/button.c) for this target: while the display is flipped, LEFT/RIGHT, UP/DOWN and the volume keys are all swapped to match the new orientation, so the whole device is usable upside down, not just readable. The flip is done in hardware by reversing the controller's GRAM write direction and mirroring the write window in lcd_setup_rect, so partial updates keep working and there is no per-frame cost. Both panel variants are handled: the type 0 WiseChip/SEPS114A via MEMORY_WRITE/READ (1Dh, 0x02), and the type 1 Visionox/LD7134 via the Graphic RAM Writing Direction register (05h, 0x03). The direction register is written in lcd_enable(), so it is set while the panel is powered and is re-applied after display standby; lcd_set_flip() cycles the panel off and on so a change to the setting takes effect immediately. For the simulator, which has no real LCD controller, lcd_set_flip() is implemented in the SDL LCD driver (lcd-bitmap.c) as a software mirror of the framebuffer, so the flip is visible in theme previews; the generic uisimulator stub is guarded out when HAVE_LCD_FLIP is defined. Tested on real type 1 / LD7134 hardware in both orientations: display content, button remapping and album art are all correct, and test_fps shows partial updates run at full speed when flipped (1/4 frame 325 fps, matching the non-flipped rate). The type 0 / SEPS114A path uses the same approach; the 0x02 direction value was confirmed to flip a type 0 panel by William Wilgus during review. Change-Id: I99ef13949102b344826e72d1d90c71e2271448a6
138 lines
2.9 KiB
C
138 lines
2.9 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
*
|
|
* Copyright (C) 2002 by Robert E. Hak <rhak@ramapo.edu>
|
|
*
|
|
* Windows Copyright (C) 2002 by Felix Arends
|
|
* X11 Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <stdbool.h>
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#include "lcd.h"
|
|
#if defined(HAVE_TRANSFLECTIVE_LCD) && defined(HAVE_LCD_SLEEP)
|
|
/* in uisimulator/sdl/lcd-bitmap.c */
|
|
extern void sim_backlight(int value);
|
|
#endif
|
|
|
|
#ifdef HAVE_LCD_ENABLE
|
|
static bool lcd_enabled = false;
|
|
#endif
|
|
#ifdef HAVE_LCD_SLEEP
|
|
static bool lcd_sleeping = true;
|
|
#endif
|
|
|
|
#if !defined(HAVE_LCD_FLIP)
|
|
void lcd_set_flip(bool yesno)
|
|
{
|
|
(void)yesno;
|
|
}
|
|
#endif
|
|
|
|
void lcd_set_invert_display(bool invert)
|
|
{
|
|
(void)invert;
|
|
}
|
|
|
|
int lcd_default_contrast(void)
|
|
{
|
|
return 28;
|
|
}
|
|
|
|
#ifdef HAVE_REMOTE_LCD
|
|
void lcd_remote_set_contrast(int val)
|
|
{
|
|
(void)val;
|
|
}
|
|
void lcd_remote_backlight_on(int val)
|
|
{
|
|
(void)val;
|
|
}
|
|
void lcd_remote_backlight_off(int val)
|
|
{
|
|
(void)val;
|
|
}
|
|
|
|
void lcd_remote_set_flip(bool yesno)
|
|
{
|
|
(void)yesno;
|
|
}
|
|
|
|
void lcd_remote_set_invert_display(bool invert)
|
|
{
|
|
(void)invert;
|
|
}
|
|
#endif
|
|
|
|
#ifdef HAVE_LCD_SLEEP
|
|
void lcd_sleep(void)
|
|
{
|
|
lcd_sleeping = true;
|
|
#ifdef HAVE_TRANSFLECTIVE_LCD
|
|
sim_backlight(0); /* completely blacken the screen */
|
|
#endif
|
|
}
|
|
|
|
void lcd_awake(void)
|
|
{
|
|
if (lcd_sleeping)
|
|
{
|
|
send_event(LCD_EVENT_ACTIVATION, NULL);
|
|
lcd_sleeping = false;
|
|
#ifdef HAVE_TRANSFLECTIVE_LCD
|
|
sim_backlight(0); /* Make LCD visible again */
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef HAVE_LCD_ENABLE
|
|
void lcd_enable(bool on)
|
|
{
|
|
if (on && !lcd_enabled)
|
|
{
|
|
#ifdef HAVE_LCD_SLEEP
|
|
/* lcd_awake will handle the activation call */
|
|
lcd_awake();
|
|
#else
|
|
send_event(LCD_EVENT_ACTIVATION, NULL);
|
|
#endif
|
|
}
|
|
lcd_enabled = on;
|
|
}
|
|
#endif
|
|
|
|
#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
|
|
bool lcd_active(void)
|
|
{
|
|
bool retval = false;
|
|
#ifdef HAVE_LCD_ENABLE
|
|
retval = lcd_enabled;
|
|
#endif
|
|
#ifdef HAVE_LCD_SLEEP
|
|
if (!retval)
|
|
retval = !lcd_sleeping;
|
|
#endif
|
|
return retval;
|
|
}
|
|
#endif
|
|
|
|
#ifdef HAVE_LCD_SHUTDOWN
|
|
void lcd_shutdown(void)
|
|
{
|
|
}
|
|
#endif
|