diff options
Diffstat (limited to 'firmware/target/arm/s5l8700')
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 | ||
123 | void lcd_off(void) | 129 | void 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 | ||
127 | void lcd_on(void) | 154 | void 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 | ||
26 | static struct mutex pmu_adc_mutex; | 26 | static struct mutex pmu_adc_mutex; |
27 | int pmu_initialized; | 27 | int pmu_initialized = 0; |
28 | 28 | ||
29 | unsigned char pmu_read(int address) | 29 | void 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 | ||
38 | void pmu_write(int address, unsigned char val) | 34 | void 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 | ||
43 | void pmu_read_multiple(int address, int count, unsigned char* buffer) | 39 | unsigned 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 | ||
48 | void pmu_write_multiple(int address, int count, unsigned char* buffer) | 48 | void 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 | ||
53 | void pmu_init(void) | 53 | void 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 | |||
92 | void 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); | |||
31 | int pmu_read_battery_voltage(void); | 31 | int pmu_read_battery_voltage(void); |
32 | int pmu_read_battery_current(void); | 32 | int pmu_read_battery_current(void); |
33 | void pmu_init(void); | 33 | void pmu_init(void); |
34 | void 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 | |||
37 | void power_off(void) | 33 | void 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 | ||