rockbox/firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c
Michael Sevakis 80278e45aa Bring Gigabeat S bootloader one step close to a release version.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17442 a1c6a512-1295-4272-9138-f99709370657
2008-05-10 18:00:11 +00:00

112 lines
3.8 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Linus Nielsen Feltzing
*
* 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 "config.h"
#include "system.h"
#include "backlight.h"
#include "mc13783.h"
#include "backlight-target.h"
#ifdef HAVE_BACKLIGHT_BRIGHTNESS
/* Table that uses combinations of current level and pwm fraction to get
* as many uniquely-visible brightness levels as possible. The lowest current
* level for any average current is used even though many combinations give
* duplicate values. Current (I) values are in mA. */
static const struct
{
unsigned char md;
unsigned char pwm;
} led_md_pwm_table[] =
{
/* I-level PWM(x/15) I-Avg */
{ 0, 0 }, /* 0 0 0.0 */
{ 1, 1 }, /* 3 1 0.2 */
{ 1, 2 }, /* 3 2 0.4 */
{ 1, 3 }, /* 3 3 0.6 */
{ 1, 4 }, /* 3 4 0.8 */
{ 1, 5 }, /* 3 5 1.0 */
{ 1, 6 }, /* 3 6 1.2 */
{ 1, 7 }, /* 3 7 1.4 */
{ 1, 8 }, /* 3 8 1.6 */
{ 1, 9 }, /* 3 9 1.8 */
{ 1, 10 }, /* 3 10 2.0 */
{ 1, 11 }, /* 3 11 2.2 */
{ 1, 12 }, /* 3 12 2.4 */ /* default */
{ 1, 13 }, /* 3 13 2.6 */
{ 1, 14 }, /* 3 14 2.8 */
{ 1, 15 }, /* 3 15 3.0 */
{ 2, 9 }, /* 6 9 3.6 */
{ 2, 10 }, /* 6 10 4.0 */
{ 2, 11 }, /* 6 11 4.4 */
{ 2, 12 }, /* 6 12 4.8 */
{ 2, 13 }, /* 6 13 5.2 */
{ 2, 14 }, /* 6 14 5.6 */
{ 2, 15 }, /* 6 15 6.0 */
{ 3, 11 }, /* 9 11 6.6 */
{ 3, 12 }, /* 9 12 7.2 */
/* Anything higher is just too much */
};
#endif /* HAVE_BACKLIGHT_BRIGHTNESS */
bool _backlight_init(void)
{
mc13783_write(MC13783_LED_CONTROL0,
MC13783_LEDEN |
MC13783_LEDMDRAMPUP |
MC13783_LEDMDRAMPDOWN |
MC13783_BOOSTEN |
MC13783_ABMODE_MONCH_LEDMD1234 |
MC13783_ABREF_400MV);
return true;
}
void _backlight_on(void)
{
/* LEDEN=1 */
mc13783_set(MC13783_LED_CONTROL0, MC13783_LEDEN);
}
void _backlight_off(void)
{
/* LEDEN=0 */
mc13783_clear(MC13783_LED_CONTROL0, MC13783_LEDEN);
}
#ifdef HAVE_BACKLIGHT_BRIGHTNESS
/* Assumes that the backlight has been initialized */
void _backlight_set_brightness(int brightness)
{
uint32_t data, md, pwm;
if ((unsigned)brightness >= ARRAYLEN(led_md_pwm_table))
brightness = DEFAULT_BRIGHTNESS_SETTING;
data = mc13783_read(MC13783_LED_CONTROL2);
if (data == (uint32_t)-1)
return;
md = led_md_pwm_table[brightness].md;
pwm = led_md_pwm_table[brightness].pwm;
data &= ~(MC13783_LEDMD | MC13783_LEDMDDC);
data |= MC13783_LEDMDw(md) | MC13783_LEDMDDCw(pwm);
mc13783_write(MC13783_LED_CONTROL2, data);
}
#endif /* HAVE_BACKLIGHT_BRIGHTNESS */