summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2009-10-08 20:56:51 +0000
committerMichael Sparmann <theseven@rockbox.org>2009-10-08 20:56:51 +0000
commit1fa5d49380a412aa909446d2afeb6c3894e392c6 (patch)
tree90e4eae3b09e33578e490ddb48a22e01a0832460 /firmware/target
parent32b367b042f7e12d06be42e026bc679d48796ede (diff)
downloadrockbox-1fa5d49380a412aa909446d2afeb6c3894e392c6.tar.gz
rockbox-1fa5d49380a412aa909446d2afeb6c3894e392c6.zip
Implemented iPod Nano 2G power_off()
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23014 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c27
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c42
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/pmu-target.h1
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c28
4 files changed, 77 insertions, 21 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
index 07a92a970d..76e35ead30 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
@@ -35,6 +35,10 @@
35/* LCD type 0 register defines */ 35/* LCD type 0 register defines */
36 36
37#define R_ENTRY_MODE 0x03 37#define R_ENTRY_MODE 0x03
38#define R_DISPLAY_CONTROL_1 0x07
39#define R_POWER_CONTROL_1 0x10
40#define R_POWER_CONTROL_2 0x12
41#define R_POWER_CONTROL_3 0x13
38#define R_HORIZ_GRAM_ADDR_SET 0x20 42#define R_HORIZ_GRAM_ADDR_SET 0x20
39#define R_VERT_GRAM_ADDR_SET 0x21 43#define R_VERT_GRAM_ADDR_SET 0x21
40#define R_WRITE_DATA_TO_GRAM 0x22 44#define R_WRITE_DATA_TO_GRAM 0x22
@@ -46,6 +50,8 @@
46 50
47/* LCD type 1 register defines */ 51/* LCD type 1 register defines */
48 52
53#define R_SLEEP_IN 0x10
54#define R_DISPLAY_OFF 0x28
49#define R_COLUMN_ADDR_SET 0x2a 55#define R_COLUMN_ADDR_SET 0x2a
50#define R_ROW_ADDR_SET 0x2b 56#define R_ROW_ADDR_SET 0x2b
51#define R_MEMORY_WRITE 0x2c 57#define R_MEMORY_WRITE 0x2c
@@ -122,6 +128,27 @@ void lcd_set_flip(bool yesno)
122 128
123void lcd_off(void) 129void lcd_off(void)
124{ 130{
131 if (lcd_type == 0)
132 {
133 s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x232);
134 s5l_lcd_write_cmd_data(R_POWER_CONTROL_3, 0x1137);
135 s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x201);
136 s5l_lcd_write_cmd_data(R_POWER_CONTROL_3, 0x137);
137 s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x200);
138 s5l_lcd_write_cmd_data(R_POWER_CONTROL_1, 0x680);
139 s5l_lcd_write_cmd_data(R_POWER_CONTROL_2, 0x160);
140 s5l_lcd_write_cmd_data(R_POWER_CONTROL_3, 0x127);
141 s5l_lcd_write_cmd_data(R_POWER_CONTROL_1, 0x600);
142 }
143 else
144 {
145 s5l_lcd_write_cmd(R_DISPLAY_OFF);
146 s5l_lcd_write_data(0);
147 s5l_lcd_write_data(0);
148 s5l_lcd_write_cmd(R_SLEEP_IN);
149 s5l_lcd_write_data(0);
150 s5l_lcd_write_data(0);
151 }
125} 152}
126 153
127void lcd_on(void) 154void lcd_on(void)
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c
index 7a6407e809..4dd295c21a 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c
@@ -24,30 +24,30 @@
24#include "i2c-s5l8700.h" 24#include "i2c-s5l8700.h"
25 25
26static struct mutex pmu_adc_mutex; 26static struct mutex pmu_adc_mutex;
27int pmu_initialized; 27int pmu_initialized = 0;
28 28
29unsigned char pmu_read(int address) 29void pmu_read_multiple(int address, int count, unsigned char* buffer)
30{ 30{
31 unsigned char tmp; 31 i2c_read(0xe6, address, count, buffer);
32
33 i2c_read(0xe6, address, 1, &tmp);
34
35 return tmp;
36} 32}
37 33
38void pmu_write(int address, unsigned char val) 34void pmu_write_multiple(int address, int count, unsigned char* buffer)
39{ 35{
40 i2c_write(0xe6, address, 1, &val); 36 i2c_write(0xe6, address, count, buffer);
41} 37}
42 38
43void pmu_read_multiple(int address, int count, unsigned char* buffer) 39unsigned char pmu_read(int address)
44{ 40{
45 i2c_read(0xe6, address, count, buffer); 41 unsigned char tmp;
42
43 pmu_read_multiple(address, 1, &tmp);
44
45 return tmp;
46} 46}
47 47
48void pmu_write_multiple(int address, int count, unsigned char* buffer) 48void pmu_write(int address, unsigned char val)
49{ 49{
50 i2c_write(0xe6, address, count, buffer); 50 pmu_write_multiple(address, 1, &val);
51} 51}
52 52
53void pmu_init(void) 53void pmu_init(void)
@@ -88,3 +88,19 @@ int pmu_read_battery_current(void)
88 mutex_unlock(&pmu_adc_mutex); 88 mutex_unlock(&pmu_adc_mutex);
89 return milliamps; 89 return milliamps;
90} 90}
91
92void pmu_switch_power(int gate, int onoff)
93{
94 if (gate < 4)
95 {
96 unsigned char newval = pmu_read(0x3B) & ~(1 << (2 * gate));
97 if (onoff) newval |= 1 << (2 * gate);
98 pmu_write(0x3B, newval);
99 }
100 else if (gate < 7)
101 {
102 unsigned char newval = pmu_read(0x3C) & ~(1 << (2 * (gate - 4)));
103 if (onoff) newval |= 1 << (2 * (gate - 4));
104 pmu_write(0x3C, newval);
105 }
106} \ No newline at end of file
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/pmu-target.h b/firmware/target/arm/s5l8700/ipodnano2g/pmu-target.h
index 7ddfc631fc..43b0f54308 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/pmu-target.h
+++ b/firmware/target/arm/s5l8700/ipodnano2g/pmu-target.h
@@ -31,5 +31,6 @@ void pmu_write_multiple(int address, int count, unsigned char* buffer);
31int pmu_read_battery_voltage(void); 31int pmu_read_battery_voltage(void);
32int pmu_read_battery_current(void); 32int pmu_read_battery_current(void);
33void pmu_init(void); 33void pmu_init(void);
34void pmu_switch_power(int gate, int onoff);
34 35
35#endif 36#endif
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c
index fbd5157fb0..31f23ff9ff 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c
@@ -26,20 +26,32 @@
26#include "ftl-target.h" 26#include "ftl-target.h"
27#include <string.h> 27#include <string.h>
28#include "panic.h" 28#include "panic.h"
29#include "pmu-target.h"
30#include "lcd.h"
29 31
30 32
31/* Power handling for S5L8700 based Meizu players
32
33 The M3 and M6 players appear to use the same pins for power, USB detection
34 and charging status.
35*/
36
37void power_off(void) 33void power_off(void)
38{ 34{
39 if (ftl_sync() != 0) panicf("Failed to unmount flash!"); 35 if (ftl_sync() != 0) panicf("Failed to unmount flash!");
40 36
41 /* TODO: Really power-off */ 37 pmu_write(0x2b, 0); /* Kill the backlight, instantly. */
42 panicf("Poweroff not implemented yet."); 38 pmu_write(0x29, 0);
39
40 lcd_off();
41
42 pmu_switch_power(0, 0);
43 pmu_switch_power(2, 0);
44 pmu_switch_power(3, 0);
45 pmu_switch_power(4, 0);
46 pmu_switch_power(6, 0);
47 pmu_switch_power(7, 0);
48
49 pmu_write(0x36, pmu_read(0x36) & 0xF0);
50 pmu_write(0x34, pmu_read(0x34) & 0xF0);
51 pmu_write(0xD, pmu_read(0xD) | 0x40);
52 pmu_write(0xD, pmu_read(0xD) | 0x02);
53 pmu_write(0xC, 1);
54
43 while(1); 55 while(1);
44} 56}
45 57