Implement PWM backlight driver for the Meizus. Update Meizu M3 bootloader to control brightness with the touch strip.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21478 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
d86cf998e8
commit
743dcf7f69
8 changed files with 126 additions and 69 deletions
|
@ -43,7 +43,7 @@
|
|||
#include "rbunicode.h"
|
||||
#include "usb.h"
|
||||
#include "qt1106.h"
|
||||
#include "rockboxlogo.h"
|
||||
#include "bitmaps/rockboxlogo.h"
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
|
@ -128,6 +128,7 @@ void main(void)
|
|||
EINTMSK = 0x11;
|
||||
asm volatile("msr cpsr_c, #0x13\n\t"); // enable interrupts
|
||||
|
||||
backlight_init();
|
||||
lcd_init();
|
||||
lcd_update();
|
||||
|
||||
|
@ -157,6 +158,8 @@ void main(void)
|
|||
if(slider & 0x008000)
|
||||
bl_debug_count(((slider&0xff)) + 1);
|
||||
*/
|
||||
|
||||
_backlight_set_brightness(slider & 0xFF);
|
||||
}
|
||||
|
||||
//power off
|
||||
|
|
|
@ -1241,6 +1241,7 @@ target/arm/s5l8700/meizu-m6sp/lcd-m6sp.c
|
|||
#endif /* MEIZU_M6SP */
|
||||
|
||||
#ifdef MEIZU_M3
|
||||
target/arm/s5l8700/backlight-meizu.c
|
||||
target/arm/s5l8700/meizu-m3/lcd-m3.c
|
||||
drivers/qt1106.c
|
||||
#ifndef SIMULATOR
|
||||
|
|
|
@ -178,8 +178,7 @@
|
|||
#define DEFAULT_CONTRAST_SETTING 19 /* Match boot contrast */
|
||||
|
||||
/* Main LCD backlight brightness range and defaults */
|
||||
/* PCF50506 can output 0%-100% duty cycle but D305A expects %15-100%. */
|
||||
#define MIN_BRIGHTNESS_SETTING 1 /* 15/16 (93.75%) */
|
||||
#define MAX_BRIGHTNESS_SETTING 13 /* 3/16 (18.75%) */
|
||||
#define DEFAULT_BRIGHTNESS_SETTING 8 /* 8/16 (50.00%) = x5 boot default */
|
||||
#define MIN_BRIGHTNESS_SETTING 0
|
||||
#define MAX_BRIGHTNESS_SETTING 255
|
||||
#define DEFAULT_BRIGHTNESS_SETTING 200
|
||||
|
||||
|
|
111
firmware/target/arm/s5l8700/backlight-meizu.c
Normal file
111
firmware/target/arm/s5l8700/backlight-meizu.c
Normal file
|
@ -0,0 +1,111 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2009 by Bertrik Sikken
|
||||
*
|
||||
* 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 "backlight.h"
|
||||
#include "backlight-target.h"
|
||||
#include "system.h"
|
||||
|
||||
/*
|
||||
Interrupt-driven backlight driver using the PWM mode of a hardware timer.
|
||||
|
||||
Backlight brightness is implemented by configuring one of the timers in
|
||||
the SoC for PWM mode. In this mode, two interrupts are generated for each
|
||||
cycle, one at the start of the cycle and another one sometime between the
|
||||
first interrupt and the start of the next cycle. The backlight is switched
|
||||
on at the first interrupt and switched off at the second interrupt. This
|
||||
way, the position in time of the second interrupt determines the duty cycle
|
||||
and thereby the brightness of the backlight.
|
||||
The backlight is switched on and off by means of a GPIO pin.
|
||||
*/
|
||||
|
||||
void INT_TIMERA(void)
|
||||
{
|
||||
unsigned int tacon = TACON;
|
||||
|
||||
/* clear interrupts */
|
||||
TACON = tacon;
|
||||
|
||||
/* TA_INT1, start of PWM cycle: enable backlight */
|
||||
if (tacon & (1 << 17)) {
|
||||
PDAT0 |= (1 << 2);
|
||||
}
|
||||
|
||||
/* TA_INT0, disable backlight until next cycle */
|
||||
if (tacon & (1 << 16)) {
|
||||
PDAT0 &= ~(1 << 2);
|
||||
}
|
||||
}
|
||||
|
||||
void _backlight_set_brightness(int brightness)
|
||||
{
|
||||
if (brightness == MIN_BRIGHTNESS_SETTING) {
|
||||
/* turn backlight fully off and disable interrupt */
|
||||
PDAT0 &= ~(1 << 2);
|
||||
INTMSK &= ~(1 << 5);
|
||||
}
|
||||
else if (brightness == MAX_BRIGHTNESS_SETTING) {
|
||||
/* turn backlight fully on and disable interrupt */
|
||||
PDAT0 |= (1 << 2);
|
||||
INTMSK &= ~(1 << 5);
|
||||
}
|
||||
else {
|
||||
/* set PWM width and enable interrupt */
|
||||
TADATA0 = brightness;
|
||||
INTMSK |= (1 << 5);
|
||||
}
|
||||
}
|
||||
|
||||
void _backlight_on(void)
|
||||
{
|
||||
_backlight_set_brightness(backlight_brightness);
|
||||
}
|
||||
|
||||
void _backlight_off(void)
|
||||
{
|
||||
_backlight_set_brightness(MIN_BRIGHTNESS_SETTING);
|
||||
}
|
||||
|
||||
bool _backlight_init(void)
|
||||
{
|
||||
/* enable backlight pin as GPIO */
|
||||
PCON0 = ((PCON0 & ~(3 << 4)) | (1 << 4));
|
||||
|
||||
/* enable timer clock */
|
||||
PWRCON &= ~(1 << 4);
|
||||
|
||||
/* configure timer */
|
||||
TACMD = (1 << 1); /* TA_CLR */
|
||||
TACMD = (1 << 0); /* TA_EN */
|
||||
TACON = (1 << 13) | /* TA_INT1_EN */
|
||||
(1 << 12) | /* TA_INT0_EN */
|
||||
(1 << 11) | /* TA_START */
|
||||
(3 << 8) | /* TA_CS = PCLK / 64 */
|
||||
(1 << 4); /* TA_MODE_SEL = PWM mode */
|
||||
TADATA1 = MAX_BRIGHTNESS_SETTING; /* set PWM period */
|
||||
TAPRE = 100; /* prescaler */
|
||||
|
||||
_backlight_on();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2008 by Marcoen Hirschberg
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef BACKLIGHT_TARGET_H
|
||||
#define BACKLIGHT_TARGET_H
|
||||
|
||||
bool _backlight_init(void);
|
||||
void _backlight_on(void);
|
||||
void _backlight_off(void);
|
||||
void _backlight_set_brightness(int brightness);
|
||||
|
||||
#endif
|
|
@ -1,29 +0,0 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2008 by Marcoen Hirschberg
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef BACKLIGHT_TARGET_H
|
||||
#define BACKLIGHT_TARGET_H
|
||||
|
||||
bool _backlight_init(void);
|
||||
void _backlight_on(void);
|
||||
void _backlight_off(void);
|
||||
void _backlight_set_brightness(int brightness);
|
||||
|
||||
#endif
|
|
@ -95,12 +95,13 @@ void irq_handler(void)
|
|||
asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
|
||||
"sub sp, sp, #8 \n"); /* Reserve stack */
|
||||
|
||||
int irq_no = INTOFFSET; /* Read clears the corresponding IRQ status */
|
||||
int irq_no = INTOFFSET;
|
||||
|
||||
if ((irq_no & (1<<31)) == 0) /* Ensure invalid flag is not set */
|
||||
{
|
||||
irqvector[irq_no]();
|
||||
}
|
||||
|
||||
/* clear interrupt */
|
||||
SRCPND = (1 << irq_no);
|
||||
INTPND = INTPND;
|
||||
|
||||
asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
|
||||
"ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
|
||||
|
|
Loading…
Reference in a new issue