3 #include "si_cra_internal.h"
4 #include "si_cra_cfg.h"
7 #include "si_mhl_tx_api.h"
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
);
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 };
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
= {
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
)
33 SiiResultCodes_t status
= SII_ERR_FAIL
;
35 if (I2cSendStart(busIndex
, deviceId
, ®Addr
, 1, false) != PLATFORM_SUCCESS
) {
38 if (I2cReceiveStart(busIndex
, deviceId
, pBuffer
, count
, true) != PLATFORM_SUCCESS
) {
46 static SiiResultCodes_t
CraWriteBlockI2c(prefuint_t busIndex
, uint8_t deviceId
, uint8_t regAddr
,
47 const uint8_t *pBuffer
, uint16_t count
)
49 SiiResultCodes_t status
= SII_ERR_FAIL
;
51 if (I2cSendStart(busIndex
, deviceId
, ®Addr
, 1, false) != PLATFORM_SUCCESS
) {
54 if (I2cSendContinue(busIndex
, pBuffer
, count
, true) != PLATFORM_SUCCESS
) {
62 bool_t
SiiCraInitialize(void)
65 craInstance
.lastResultCode
= RESULT_CRA_SUCCESS
;
67 for (i
= 0; i
< SII_CRA_DEVICE_PAGE_COUNT
; i
++) {
69 if( get_hdmi_i2c_addr()== 0x76)
70 l_pageInstance
[i
] = 1;
72 l_pageInstance
[i
] = 0;
74 #if SII_I2C_ADDR == (0x76)
75 l_pageInstance
[i
] = 1;
77 l_pageInstance
[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);
89 craInstance
.lastResultCode
= SII_ERR_INVALID_PARAMETER
;
94 return (craInstance
.lastResultCode
== RESULT_CRA_SUCCESS
);
97 SiiResultCodes_t
SiiCraGetLastResult(void)
99 return (craInstance
.lastResultCode
);
103 bool_t
SiiRegInstanceSet(SiiReg_t virtualAddress
, prefuint_t newInstance
)
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
;
111 craInstance
.lastResultCode
= SII_ERR_INVALID_PARAMETER
;
116 void SiiRegReadBlock(SiiReg_t virtualAddr
, uint8_t *pBuffer
, uint16_t count
)
118 uint8_t regOffset
= (uint8_t) virtualAddr
;
120 #if !defined(__KERNEL__)
121 SiiResultCodes_t status
= SII_ERR_FAIL
;
124 pPage
= &g_addrDescriptor
[l_pageInstance
[virtualAddr
]][virtualAddr
];
125 #if !defined(__KERNEL__)
126 switch (pPage
->busType
) {
129 CraReadBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
, regOffset
, pBuffer
, count
);
133 CraReadBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
,
134 regOffset
+ (uint8_t) (pPage
->address
>> 8), pBuffer
, count
);
142 for (i=0; i<count; i++)
144 *pBuffer = I2C_ReadByte((uint8_t)pPage->address, (regOffset + i));
147 I2C_ReadBlock((uint8_t) pPage
->address
, regOffset
, pBuffer
, count
);
152 uint8_t SiiRegRead(SiiReg_t virtualAddr
)
154 uint8_t value
= 0xFF;
155 uint8_t regOffset
= (uint8_t) virtualAddr
;
157 #if !defined(__KERNEL__)
159 SiiResultCodes_t status
= SII_ERR_FAIL
;
162 pPage
= &g_addrDescriptor
[l_pageInstance
[virtualAddr
]][virtualAddr
];
163 #if !defined(__KERNEL__)
164 switch (pPage
->busType
) {
166 status
= CraReadBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
, regOffset
, &value
, 1);
170 CraReadBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
,
171 regOffset
+ (uint8_t) (pPage
->address
>> 8), &value
, 1);
177 value
= I2C_ReadByte((uint8_t) pPage
->address
, regOffset
);
178 /* printk("value=0x%x\n", value); */
183 void SiiRegWriteBlock(SiiReg_t virtualAddr
, const uint8_t *pBuffer
, uint16_t count
)
185 uint8_t regOffset
= (uint8_t) virtualAddr
;
187 #if !defined(__KERNEL__)
188 SiiResultCodes_t status
= SII_ERR_FAIL
;
191 pPage
= &g_addrDescriptor
[l_pageInstance
[virtualAddr
]][virtualAddr
];
192 #if !defined(__KERNEL__)
193 switch (pPage
->busType
) {
196 CraWriteBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
, regOffset
, pBuffer
,
201 CraWriteBlockI2c(DEV_I2C_0
, (uint8_t) pPage
->address
,
202 regOffset
+ (uint8_t) (pPage
->address
>> 8), pBuffer
, count
);
210 for (i
= 0; i
< count
; i
++) {
211 I2C_WriteByte((uint8_t) pPage
->address
, (regOffset
+ i
), *pBuffer
);
218 void SiiRegWrite(SiiReg_t virtualAddr
, uint8_t value
)
220 uint8_t regOffset
= (uint8_t) virtualAddr
;
222 #if !defined(__KERNEL__)
223 SiiResultCodes_t status
= SII_ERR_FAIL
;
226 pPage
= &g_addrDescriptor
[l_pageInstance
[virtualAddr
]][virtualAddr
];
227 #if !defined(__KERNEL__)
228 switch (pPage
->busType
) {
234 CraWriteBlockI2c(pPage
->busType
, (uint8_t) pPage
->address
, regOffset
, &value
,
238 case DEV_I2C_1_OFFSET
:
239 case DEV_I2C_2_OFFSET
:
240 case DEV_I2C_3_OFFSET
:
242 CraWriteBlockI2c(pPage
->busType
- DEV_I2C_OFFSET
, (uint8_t) pPage
->address
,
243 regOffset
+ (uint8_t) (pPage
->address
>> 8), &value
, 1);
249 I2C_WriteByte((uint8_t) pPage
->address
, regOffset
, value
);
253 void SiiRegModify(SiiReg_t virtualAddr
, uint8_t mask
, uint8_t value
)
256 aByte
= SiiRegRead(virtualAddr
);
258 aByte
|= (mask
& value
);
259 SiiRegWrite(virtualAddr
, aByte
);
262 void SiiRegBitsSet(SiiReg_t virtualAddr
, uint8_t bitMask
, bool_t setBits
)
265 aByte
= SiiRegRead(virtualAddr
);
266 aByte
= (setBits
) ? (aByte
| bitMask
) : (aByte
& ~bitMask
);
267 SiiRegWrite(virtualAddr
, aByte
);
270 void SiiRegBitsSetNew(SiiReg_t virtualAddr
, uint8_t bitMask
, bool_t setBits
)
272 uint8_t newByte
, oldByte
;
273 oldByte
= SiiRegRead(virtualAddr
);
274 newByte
= (setBits
) ? (oldByte
| bitMask
) : (oldByte
& ~bitMask
);
275 if (oldByte
!= newByte
) {
276 SiiRegWrite(virtualAddr
, newByte
);
280 void SiiRegEdidReadBlock(SiiReg_t segmentAddr
, SiiReg_t virtualAddr
, uint8_t *pBuffer
,
284 uint8_t regOffset
= (uint8_t) virtualAddr
;
286 #if !defined(__KERNEL__)
287 SiiResultCodes_t status
= SII_ERR_FAIL
;
288 if ((segmentAddr
& 0xFF) != 0) {
289 regOffset
= (uint8_t) segmentAddr
;
291 pPage
= &g_addrDescriptor
[l_pageInstance
[segmentAddr
]][segmentAddr
];
292 I2cSendStart(pPage
->busType
, pPage
->address
, ®Offset
, 1, false);
295 regOffset
= (uint8_t) virtualAddr
;
297 pPage
= &g_addrDescriptor
[l_pageInstance
[virtualAddr
]][virtualAddr
];
298 #if !defined(__KERNEL__)
299 status
= CraReadBlockI2c(pPage
->busType
, pPage
->address
, regOffset
, pBuffer
, count
);
303 for (i
= 0; i
< count
; i
++) {
305 I2C_ReadByte((uint8_t) pPage
->address
, (uint8_t) (regOffset
+ i
));
312 uint8_t Seg_regOffset
= 0x00;
313 uint8_t regOffset
= (uint8_t) virtualAddr
;
314 uint8_t return_value1
= 0, return_value2
= 0;
316 if ((segmentAddr
& 0xFF) != 0) {
317 Seg_regOffset
= (uint8_t) segmentAddr
;
319 regOffset
= (uint8_t) virtualAddr
;
321 TX_DEBUG_PRINT(("Seg_regOffset=0x%x,regOffset=0x%x,count=%d\n", Seg_regOffset
, regOffset
,
323 if (Seg_regOffset
== 0)
324 return_value1
= I2C_ReadBlock(0xA0, regOffset
, pBuffer
, count
);
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"));