diff options
author | Bertrik Sikken <bertrik@sikken.nl> | 2009-06-23 18:11:03 +0000 |
---|---|---|
committer | Bertrik Sikken <bertrik@sikken.nl> | 2009-06-23 18:11:03 +0000 |
commit | 743dcf7f69c4afa1efd2f84a2bd0b5e23d53b0b9 (patch) | |
tree | cbd5bb40837fb4ba624edd5ae768fd8e9aa8dfa7 /firmware/target/arm/s5l8700/backlight-meizu.c | |
parent | d86cf998e887d6e1bac2754b3087710926c74a19 (diff) | |
download | rockbox-743dcf7f69c4afa1efd2f84a2bd0b5e23d53b0b9.tar.gz rockbox-743dcf7f69c4afa1efd2f84a2bd0b5e23d53b0b9.zip |
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
Diffstat (limited to 'firmware/target/arm/s5l8700/backlight-meizu.c')
-rw-r--r-- | firmware/target/arm/s5l8700/backlight-meizu.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/firmware/target/arm/s5l8700/backlight-meizu.c b/firmware/target/arm/s5l8700/backlight-meizu.c new file mode 100644 index 0000000000..43cbb16a2d --- /dev/null +++ b/firmware/target/arm/s5l8700/backlight-meizu.c | |||
@@ -0,0 +1,111 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2009 by Bertrik Sikken | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #include <stdbool.h> | ||
22 | |||
23 | #include "config.h" | ||
24 | #include "backlight.h" | ||
25 | #include "backlight-target.h" | ||
26 | #include "system.h" | ||
27 | |||
28 | /* | ||
29 | Interrupt-driven backlight driver using the PWM mode of a hardware timer. | ||
30 | |||
31 | Backlight brightness is implemented by configuring one of the timers in | ||
32 | the SoC for PWM mode. In this mode, two interrupts are generated for each | ||
33 | cycle, one at the start of the cycle and another one sometime between the | ||
34 | first interrupt and the start of the next cycle. The backlight is switched | ||
35 | on at the first interrupt and switched off at the second interrupt. This | ||
36 | way, the position in time of the second interrupt determines the duty cycle | ||
37 | and thereby the brightness of the backlight. | ||
38 | The backlight is switched on and off by means of a GPIO pin. | ||
39 | */ | ||
40 | |||
41 | void INT_TIMERA(void) | ||
42 | { | ||
43 | unsigned int tacon = TACON; | ||
44 | |||
45 | /* clear interrupts */ | ||
46 | TACON = tacon; | ||
47 | |||
48 | /* TA_INT1, start of PWM cycle: enable backlight */ | ||
49 | if (tacon & (1 << 17)) { | ||
50 | PDAT0 |= (1 << 2); | ||
51 | } | ||
52 | |||
53 | /* TA_INT0, disable backlight until next cycle */ | ||
54 | if (tacon & (1 << 16)) { | ||
55 | PDAT0 &= ~(1 << 2); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | void _backlight_set_brightness(int brightness) | ||
60 | { | ||
61 | if (brightness == MIN_BRIGHTNESS_SETTING) { | ||
62 | /* turn backlight fully off and disable interrupt */ | ||
63 | PDAT0 &= ~(1 << 2); | ||
64 | INTMSK &= ~(1 << 5); | ||
65 | } | ||
66 | else if (brightness == MAX_BRIGHTNESS_SETTING) { | ||
67 | /* turn backlight fully on and disable interrupt */ | ||
68 | PDAT0 |= (1 << 2); | ||
69 | INTMSK &= ~(1 << 5); | ||
70 | } | ||
71 | else { | ||
72 | /* set PWM width and enable interrupt */ | ||
73 | TADATA0 = brightness; | ||
74 | INTMSK |= (1 << 5); | ||
75 | } | ||
76 | } | ||
77 | |||
78 | void _backlight_on(void) | ||
79 | { | ||
80 | _backlight_set_brightness(backlight_brightness); | ||
81 | } | ||
82 | |||
83 | void _backlight_off(void) | ||
84 | { | ||
85 | _backlight_set_brightness(MIN_BRIGHTNESS_SETTING); | ||
86 | } | ||
87 | |||
88 | bool _backlight_init(void) | ||
89 | { | ||
90 | /* enable backlight pin as GPIO */ | ||
91 | PCON0 = ((PCON0 & ~(3 << 4)) | (1 << 4)); | ||
92 | |||
93 | /* enable timer clock */ | ||
94 | PWRCON &= ~(1 << 4); | ||
95 | |||
96 | /* configure timer */ | ||
97 | TACMD = (1 << 1); /* TA_CLR */ | ||
98 | TACMD = (1 << 0); /* TA_EN */ | ||
99 | TACON = (1 << 13) | /* TA_INT1_EN */ | ||
100 | (1 << 12) | /* TA_INT0_EN */ | ||
101 | (1 << 11) | /* TA_START */ | ||
102 | (3 << 8) | /* TA_CS = PCLK / 64 */ | ||
103 | (1 << 4); /* TA_MODE_SEL = PWM mode */ | ||
104 | TADATA1 = MAX_BRIGHTNESS_SETTING; /* set PWM period */ | ||
105 | TAPRE = 100; /* prescaler */ | ||
106 | |||
107 | _backlight_on(); | ||
108 | |||
109 | return true; | ||
110 | } | ||
111 | |||