diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/s5l8700/meizu-m6sl/lcd-m6sl.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/firmware/target/arm/s5l8700/meizu-m6sl/lcd-m6sl.c b/firmware/target/arm/s5l8700/meizu-m6sl/lcd-m6sl.c index 1affab3b01..567023d35e 100644 --- a/firmware/target/arm/s5l8700/meizu-m6sl/lcd-m6sl.c +++ b/firmware/target/arm/s5l8700/meizu-m6sl/lcd-m6sl.c | |||
@@ -29,6 +29,110 @@ | |||
29 | /*** definitions ***/ | 29 | /*** definitions ***/ |
30 | 30 | ||
31 | 31 | ||
32 | #define SPIDELAY(_x) void(_x); | ||
33 | |||
34 | #define SETMOSI() (PDAT4 |= (1 << 3)) | ||
35 | #define CLRMOSI() (PDAT4 &= ~(1 << 3)) | ||
36 | |||
37 | #define MISO ((PDAT1 >> 1) & 1) | ||
38 | |||
39 | #define SETCLK() (PDAT4 |= (1 << 2)) | ||
40 | #define CLRCLK() (PDAT4 &= ~(1 << 2)) | ||
41 | |||
42 | #define SETSS() (PDAT7 |= (1 << 1)) | ||
43 | #define CLRSS() (PDAT7 &= ~(1 << 1)) | ||
44 | |||
45 | void init_lcd_spi(void) | ||
46 | { | ||
47 | int oldval; | ||
48 | |||
49 | oldval = PCON1; | ||
50 | //Set P1.1 to input | ||
51 | PCON1 = ((oldval & ~(0xf << 4))); | ||
52 | |||
53 | oldval = PCON4; | ||
54 | //Set P4.2 and 4.3 to output | ||
55 | PCON4 = ((oldval & ~(0xf << 8 | 0xf << 12)) | (1 << 8 | 1 << 12)); | ||
56 | |||
57 | oldval = PCON4; | ||
58 | //Set P4.2 and 4.3 to output | ||
59 | PCON4 = ((oldval & ~(0xf << 8 | 0xf << 12)) | (1 << 8 | 1 << 12)); | ||
60 | |||
61 | oldval = PCON7; | ||
62 | //Set P7.0 and 7.1 to output | ||
63 | PCON7 = ((oldval & ~(0xf << 0 | 0xf << 4)) | (1 << 0 | 1 << 4)); | ||
64 | |||
65 | SETSS(); | ||
66 | SETCLK(); | ||
67 | } | ||
68 | |||
69 | static inline void delay(int duration) | ||
70 | { | ||
71 | volatile int i; | ||
72 | for(i=0;i<duration;i++); | ||
73 | } | ||
74 | |||
75 | unsigned int lcd_spi_io(unsigned int output,unsigned int bits,unsigned int inskip) | ||
76 | { | ||
77 | unsigned int input = 0; | ||
78 | unsigned int i; | ||
79 | |||
80 | //delay(10); // < 470 us | ||
81 | |||
82 | CLRSS(); | ||
83 | //delay(13); // > 22 us | ||
84 | |||
85 | for (i = 0; i < bits+inskip; i++) { | ||
86 | |||
87 | CLRCLK(); | ||
88 | |||
89 | if(i<bits) | ||
90 | { | ||
91 | if (output & (1 << (bits-1))) | ||
92 | SETMOSI(); | ||
93 | else | ||
94 | CLRMOSI(); | ||
95 | output <<= 1; | ||
96 | } | ||
97 | else | ||
98 | { | ||
99 | CLRMOSI(); | ||
100 | } | ||
101 | |||
102 | //delay(20); // >> 6.7 us | ||
103 | |||
104 | SETCLK(); | ||
105 | |||
106 | if(i>=inskip) | ||
107 | { | ||
108 | input <<= 1; | ||
109 | input |= MISO; | ||
110 | } | ||
111 | |||
112 | //delay(20); // >> 6.7 us | ||
113 | } | ||
114 | |||
115 | SETSS(); | ||
116 | |||
117 | return (input); | ||
118 | } | ||
119 | |||
120 | |||
121 | void spi_set_reg(unsigned char reg,unsigned short value) | ||
122 | { | ||
123 | lcd_spi_io(0x700000|reg,24,0); // possibly 0x74 | ||
124 | lcd_spi_io(0x720000|value,24,0); // possibly 0x77 | ||
125 | } | ||
126 | |||
127 | unsigned int lcd_read_id(void) | ||
128 | { | ||
129 | unsigned int device_code; | ||
130 | lcd_spi_io(0x700000,24,0); // possibly 0x74 | ||
131 | |||
132 | device_code=lcd_spi_io(0x7300,16,24); // possibly 0x77 | ||
133 | return device_code; | ||
134 | } | ||
135 | |||
32 | /** globals **/ | 136 | /** globals **/ |
33 | 137 | ||
34 | static int xoffset; /* needed for flip */ | 138 | static int xoffset; /* needed for flip */ |