Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | #include "si_common.h" |
2 | #include "si_cra.h" | |
3 | #include "si_cra_internal.h" | |
4 | #include "si_cra_cfg.h" | |
5 | #include "sii_hal.h" | |
6 | #include "hdmi_cust.h" | |
7 | #include "si_mhl_tx_api.h" | |
8 | ||
9 | #if defined(__KERNEL__) | |
10 | extern uint8_t I2C_ReadByte(uint8_t deviceID, uint8_t offset); | |
11 | extern void I2C_WriteByte(uint8_t deviceID, uint8_t offset, uint8_t value); | |
12 | #endif | |
13 | ||
14 | #if 0 ///SII_I2C_ADDR == (0x76) | |
15 | static prefuint_t l_pageInstance[SII_CRA_DEVICE_PAGE_COUNT] = { 1 }; | |
16 | #else ///default is 0x72 | |
17 | static prefuint_t l_pageInstance[SII_CRA_DEVICE_PAGE_COUNT] = { 0 }; | |
18 | #endif | |
19 | extern pageConfig_t g_addrDescriptor[SII_CRA_MAX_DEVICE_INSTANCES][SII_CRA_DEVICE_PAGE_COUNT]; | |
20 | extern SiiReg_t g_siiRegPageBaseReassign[]; | |
21 | extern SiiReg_t g_siiRegPageBaseRegs[SII_CRA_DEVICE_PAGE_COUNT]; | |
22 | CraInstanceData_t craInstance = { | |
23 | 0, | |
24 | 0, | |
25 | SII_SUCCESS, | |
26 | 0, | |
27 | }; | |
28 | ||
29 | #if !defined(__KERNEL__) | |
30 | static SiiResultCodes_t CraReadBlockI2c(prefuint_t busIndex, uint8_t deviceId, uint8_t regAddr, | |
31 | uint8_t *pBuffer, uint16_t count) | |
32 | { | |
33 | SiiResultCodes_t status = SII_ERR_FAIL; | |
34 | do { | |
35 | if (I2cSendStart(busIndex, deviceId, ®Addr, 1, false) != PLATFORM_SUCCESS) { | |
36 | break; | |
37 | } | |
38 | if (I2cReceiveStart(busIndex, deviceId, pBuffer, count, true) != PLATFORM_SUCCESS) { | |
39 | break; | |
40 | } | |
41 | status = SII_SUCCESS; | |
42 | } while (0); | |
43 | return (status); | |
44 | } | |
45 | ||
46 | static SiiResultCodes_t CraWriteBlockI2c(prefuint_t busIndex, uint8_t deviceId, uint8_t regAddr, | |
47 | const uint8_t *pBuffer, uint16_t count) | |
48 | { | |
49 | SiiResultCodes_t status = SII_ERR_FAIL; | |
50 | do { | |
51 | if (I2cSendStart(busIndex, deviceId, ®Addr, 1, false) != PLATFORM_SUCCESS) { | |
52 | break; | |
53 | } | |
54 | if (I2cSendContinue(busIndex, pBuffer, count, true) != PLATFORM_SUCCESS) { | |
55 | break; | |
56 | } | |
57 | status = SII_SUCCESS; | |
58 | } while (0); | |
59 | return (status); | |
60 | } | |
61 | #endif | |
62 | bool_t SiiCraInitialize(void) | |
63 | { | |
64 | prefuint_t i, index; | |
65 | craInstance.lastResultCode = RESULT_CRA_SUCCESS; | |
66 | ||
67 | for (i = 0; i < SII_CRA_DEVICE_PAGE_COUNT; i++) { | |
68 | #if 1 | |
69 | if( get_hdmi_i2c_addr()== 0x76) | |
70 | l_pageInstance[i] = 1; | |
71 | else | |
72 | l_pageInstance[i] = 0; | |
73 | #else | |
74 | #if SII_I2C_ADDR == (0x76) | |
75 | l_pageInstance[i] = 1; | |
76 | #else | |
77 | l_pageInstance[i] = 0; | |
78 | #endif | |
79 | #endif | |
80 | } | |
81 | ||
82 | i = 0; | |
83 | while (g_siiRegPageBaseReassign[i] != 0xFFFF) { | |
84 | index = g_siiRegPageBaseReassign[i] >> 8; | |
85 | if ((index < SII_CRA_DEVICE_PAGE_COUNT) && (g_siiRegPageBaseRegs[index] != 0xFF)) { | |
86 | SiiRegWrite(g_siiRegPageBaseRegs[index], | |
87 | g_siiRegPageBaseReassign[index] & 0x00FF); | |
88 | } else { | |
89 | craInstance.lastResultCode = SII_ERR_INVALID_PARAMETER; | |
90 | break; | |
91 | } | |
92 | i++; | |
93 | } | |
94 | return (craInstance.lastResultCode == RESULT_CRA_SUCCESS); | |
95 | } | |
96 | ||
97 | SiiResultCodes_t SiiCraGetLastResult(void) | |
98 | { | |
99 | return (craInstance.lastResultCode); | |
100 | } | |
101 | ||
102 | #if 0 | |
103 | bool_t SiiRegInstanceSet(SiiReg_t virtualAddress, prefuint_t newInstance) | |
104 | { | |
105 | prefuint_t va = virtualAddress >> 8; | |
106 | craInstance.lastResultCode = RESULT_CRA_SUCCESS; | |
107 | if ((va < SII_CRA_DEVICE_PAGE_COUNT) && (newInstance < SII_CRA_MAX_DEVICE_INSTANCES)) { | |
108 | l_pageInstance[va] = newInstance; | |
109 | return (true); | |
110 | } | |
111 | craInstance.lastResultCode = SII_ERR_INVALID_PARAMETER; | |
112 | return (false); | |
113 | } | |
114 | #endif | |
115 | ||
116 | void SiiRegReadBlock(SiiReg_t virtualAddr, uint8_t *pBuffer, uint16_t count) | |
117 | { | |
118 | uint8_t regOffset = (uint8_t) virtualAddr; | |
119 | pageConfig_t *pPage; | |
120 | #if !defined(__KERNEL__) | |
121 | SiiResultCodes_t status = SII_ERR_FAIL; | |
122 | #endif | |
123 | virtualAddr >>= 8; | |
124 | pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr]; | |
125 | #if !defined(__KERNEL__) | |
126 | switch (pPage->busType) { | |
127 | case DEV_I2C_0: | |
128 | status = | |
129 | CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, pBuffer, count); | |
130 | break; | |
131 | case DEV_I2C_OFFSET: | |
132 | status = | |
133 | CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, | |
134 | regOffset + (uint8_t) (pPage->address >> 8), pBuffer, count); | |
135 | break; | |
136 | default: | |
137 | break; | |
138 | } | |
139 | #else | |
140 | { | |
141 | /*int i; | |
142 | for (i=0; i<count; i++) | |
143 | { | |
144 | *pBuffer = I2C_ReadByte((uint8_t)pPage->address, (regOffset + i)); | |
145 | ++pBuffer; | |
146 | } */ | |
147 | I2C_ReadBlock((uint8_t) pPage->address, regOffset, pBuffer, count); | |
148 | } | |
149 | #endif | |
150 | } | |
151 | ||
152 | uint8_t SiiRegRead(SiiReg_t virtualAddr) | |
153 | { | |
154 | uint8_t value = 0xFF; | |
155 | uint8_t regOffset = (uint8_t) virtualAddr; | |
156 | pageConfig_t *pPage; | |
157 | #if !defined(__KERNEL__) | |
158 | #error | |
159 | SiiResultCodes_t status = SII_ERR_FAIL; | |
160 | #endif | |
161 | virtualAddr >>= 8; | |
162 | pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr]; | |
163 | #if !defined(__KERNEL__) | |
164 | switch (pPage->busType) { | |
165 | case DEV_I2C_0: | |
166 | status = CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, &value, 1); | |
167 | break; | |
168 | case DEV_I2C_OFFSET: | |
169 | status = | |
170 | CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, | |
171 | regOffset + (uint8_t) (pPage->address >> 8), &value, 1); | |
172 | break; | |
173 | default: | |
174 | break; | |
175 | } | |
176 | #else | |
177 | value = I2C_ReadByte((uint8_t) pPage->address, regOffset); | |
178 | /* printk("value=0x%x\n", value); */ | |
179 | #endif | |
180 | return (value); | |
181 | } | |
182 | ||
183 | void SiiRegWriteBlock(SiiReg_t virtualAddr, const uint8_t *pBuffer, uint16_t count) | |
184 | { | |
185 | uint8_t regOffset = (uint8_t) virtualAddr; | |
186 | pageConfig_t *pPage; | |
187 | #if !defined(__KERNEL__) | |
188 | SiiResultCodes_t status = SII_ERR_FAIL; | |
189 | #endif | |
190 | virtualAddr >>= 8; | |
191 | pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr]; | |
192 | #if !defined(__KERNEL__) | |
193 | switch (pPage->busType) { | |
194 | case DEV_I2C_0: | |
195 | status = | |
196 | CraWriteBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, pBuffer, | |
197 | count); | |
198 | break; | |
199 | case DEV_I2C_OFFSET: | |
200 | status = | |
201 | CraWriteBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, | |
202 | regOffset + (uint8_t) (pPage->address >> 8), pBuffer, count); | |
203 | break; | |
204 | default: | |
205 | break; | |
206 | } | |
207 | #else | |
208 | { | |
209 | int i; | |
210 | for (i = 0; i < count; i++) { | |
211 | I2C_WriteByte((uint8_t) pPage->address, (regOffset + i), *pBuffer); | |
212 | ++pBuffer; | |
213 | } | |
214 | } | |
215 | #endif | |
216 | } | |
217 | ||
218 | void SiiRegWrite(SiiReg_t virtualAddr, uint8_t value) | |
219 | { | |
220 | uint8_t regOffset = (uint8_t) virtualAddr; | |
221 | pageConfig_t *pPage; | |
222 | #if !defined(__KERNEL__) | |
223 | SiiResultCodes_t status = SII_ERR_FAIL; | |
224 | #endif | |
225 | virtualAddr >>= 8; | |
226 | pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr]; | |
227 | #if !defined(__KERNEL__) | |
228 | switch (pPage->busType) { | |
229 | case DEV_I2C_0: | |
230 | case DEV_I2C_1: | |
231 | case DEV_I2C_2: | |
232 | case DEV_I2C_3: | |
233 | status = | |
234 | CraWriteBlockI2c(pPage->busType, (uint8_t) pPage->address, regOffset, &value, | |
235 | 1); | |
236 | break; | |
237 | case DEV_I2C_OFFSET: | |
238 | case DEV_I2C_1_OFFSET: | |
239 | case DEV_I2C_2_OFFSET: | |
240 | case DEV_I2C_3_OFFSET: | |
241 | status = | |
242 | CraWriteBlockI2c(pPage->busType - DEV_I2C_OFFSET, (uint8_t) pPage->address, | |
243 | regOffset + (uint8_t) (pPage->address >> 8), &value, 1); | |
244 | break; | |
245 | default: | |
246 | break; | |
247 | } | |
248 | #else | |
249 | I2C_WriteByte((uint8_t) pPage->address, regOffset, value); | |
250 | #endif | |
251 | } | |
252 | ||
253 | void SiiRegModify(SiiReg_t virtualAddr, uint8_t mask, uint8_t value) | |
254 | { | |
255 | uint8_t aByte; | |
256 | aByte = SiiRegRead(virtualAddr); | |
257 | aByte &= (~mask); | |
258 | aByte |= (mask & value); | |
259 | SiiRegWrite(virtualAddr, aByte); | |
260 | } | |
261 | ||
262 | void SiiRegBitsSet(SiiReg_t virtualAddr, uint8_t bitMask, bool_t setBits) | |
263 | { | |
264 | uint8_t aByte; | |
265 | aByte = SiiRegRead(virtualAddr); | |
266 | aByte = (setBits) ? (aByte | bitMask) : (aByte & ~bitMask); | |
267 | SiiRegWrite(virtualAddr, aByte); | |
268 | } | |
269 | ||
270 | void SiiRegBitsSetNew(SiiReg_t virtualAddr, uint8_t bitMask, bool_t setBits) | |
271 | { | |
272 | uint8_t newByte, oldByte; | |
273 | oldByte = SiiRegRead(virtualAddr); | |
274 | newByte = (setBits) ? (oldByte | bitMask) : (oldByte & ~bitMask); | |
275 | if (oldByte != newByte) { | |
276 | SiiRegWrite(virtualAddr, newByte); | |
277 | } | |
278 | } | |
279 | ||
280 | void SiiRegEdidReadBlock(SiiReg_t segmentAddr, SiiReg_t virtualAddr, uint8_t *pBuffer, | |
281 | uint16_t count) | |
282 | { | |
283 | #if 0 | |
284 | uint8_t regOffset = (uint8_t) virtualAddr; | |
285 | pageConfig_t *pPage; | |
286 | #if !defined(__KERNEL__) | |
287 | SiiResultCodes_t status = SII_ERR_FAIL; | |
288 | if ((segmentAddr & 0xFF) != 0) { | |
289 | regOffset = (uint8_t) segmentAddr; | |
290 | segmentAddr >>= 8; | |
291 | pPage = &g_addrDescriptor[l_pageInstance[segmentAddr]][segmentAddr]; | |
292 | I2cSendStart(pPage->busType, pPage->address, ®Offset, 1, false); | |
293 | } | |
294 | #endif | |
295 | regOffset = (uint8_t) virtualAddr; | |
296 | virtualAddr >>= 8; | |
297 | pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr]; | |
298 | #if !defined(__KERNEL__) | |
299 | status = CraReadBlockI2c(pPage->busType, pPage->address, regOffset, pBuffer, count); | |
300 | #else | |
301 | { | |
302 | int i; | |
303 | for (i = 0; i < count; i++) { | |
304 | *pBuffer = | |
305 | I2C_ReadByte((uint8_t) pPage->address, (uint8_t) (regOffset + i)); | |
306 | ++pBuffer; | |
307 | } | |
308 | } | |
309 | #endif | |
310 | #endif | |
311 | ||
312 | uint8_t Seg_regOffset = 0x00; | |
313 | uint8_t regOffset = (uint8_t) virtualAddr; | |
314 | uint8_t return_value1 = 0, return_value2 = 0; | |
315 | ||
316 | if ((segmentAddr & 0xFF) != 0) { | |
317 | Seg_regOffset = (uint8_t) segmentAddr; | |
318 | } | |
319 | regOffset = (uint8_t) virtualAddr; | |
320 | ||
321 | TX_DEBUG_PRINT(("Seg_regOffset=0x%x,regOffset=0x%x,count=%d\n", Seg_regOffset, regOffset, | |
322 | count)); | |
323 | if (Seg_regOffset == 0) | |
324 | return_value1 = I2C_ReadBlock(0xA0, regOffset, pBuffer, count); | |
325 | else | |
326 | return_value2 = | |
327 | I2C_ReadSegmentBlockEDID(0xA0, Seg_regOffset, regOffset, pBuffer, count); | |
328 | if (return_value1 > 0) | |
329 | TX_DEBUG_PRINT(("IIC_SCL_TIMEOUT,return_value1\n")); | |
330 | if (return_value2 > 0) | |
331 | TX_DEBUG_PRINT(("IIC_SCL_TIMEOUT,return_value2\n")); | |
332 | ||
333 | } |