Created
June 3, 2021 13:41
-
-
Save Wolfvak/67fc9947739fcc05e8ac8e297e0cc866 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
REGISTERS: | |
IO:10009160 ; unsigned __int16 REG_SIF_UNK00 | |
IO:10009160 REG_SIF_UNK00 % 2 ; DATA XREF: sub_24075C08+4↓o | |
IO:10009160 ; sub_24075C08+104↓r ... | |
IO:10009162 ; unsigned __int16 REG_SIF_OUTPUT_ENABLE_maybe | |
IO:10009162 REG_SIF_OUTPUT_ENABLE_maybe % 2 ; DATA XREF: SDRAM:2400064C↓o | |
IO:10009162 ; SDRAM:24000654↓w ... | |
IO:10009164 ; unsigned __int8 REG_SIF_OUTPUT | |
IO:10009164 REG_SIF_OUTPUT % 2 ; DATA XREF: sub_24075C08+130↓r | |
IO:10009164 ; sub_24075C08+138↓w ... | |
IO:10009164 ; [2] = SCL | |
IO:10009164 ; [3] = SDA | |
IO:10009166 ; unsigned __int16 REG_SIF_INPUT | |
IO:10009166 REG_SIF_INPUT % 2 | |
00000004 ; enum SIF_LINE_BITS, mappedto_40, bitfield | |
00000004 SIF_LINE_SCL EQU 4 | |
00000008 SIF_LINE_SDA EQU 8 | |
00000008 | |
/* SDA */ | |
void i2cSetOE_SDA(void) | |
{ | |
REG_SIF_UNK00 |= SIF_LINE_SDA; | |
REG_SIF_OUTPUT_ENABLE_maybe |= SIF_LINE_SDA; | |
} | |
void i2cClrOE_SDA(void) | |
{ | |
REG_SIF_UNK00 |= SIF_LINE_SDA; | |
REG_SIF_OUTPUT_ENABLE_maybe &= ~SIF_LINE_SDA; | |
} | |
bool i2cGetSDA(void) | |
{ | |
unsigned __int16 v0; // r3 | |
v0 = REG_SIF_UNK00; | |
REG_SIF_UNK00 = v0 | SIF_LINE_SDA; | |
REG_SIF_OUTPUT_ENABLE_maybe &= ~SIF_LINE_SDA; | |
return (REG_SIF_INPUT & SIF_LINE_SDA) != 0; | |
} | |
void __fastcall i2cDriveSDA(unsigned __int8 sda) | |
{ | |
unsigned __int8 v1; // r3 | |
REG_SIF_UNK00 |= SIF_LINE_SDA; | |
REG_SIF_OUTPUT_ENABLE_maybe |= SIF_LINE_SDA; | |
if ( sda == 1 ) | |
v1 = REG_SIF_OUTPUT | SIF_LINE_SDA; | |
else | |
v1 = REG_SIF_OUTPUT & ~SIF_LINE_SDA; | |
REG_SIF_OUTPUT = v1; | |
} | |
/* SCL */ | |
void __fastcall i2cDriveSCL(unsigned __int8 scl) | |
{ | |
unsigned __int8 v1; // r3 | |
REG_SIF_UNK00 |= SIF_LINE_SCL; | |
REG_SIF_OUTPUT_ENABLE_maybe |= SIF_LINE_SCL; | |
if ( scl == 1 ) | |
v1 = REG_SIF_OUTPUT | SIF_LINE_SCL; | |
else | |
v1 = REG_SIF_OUTPUT & ~SIF_LINE_SCL; | |
REG_SIF_OUTPUT = v1; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void __cdecl i2cStartCondition() | |
{ | |
i2cDriveSDA(1u); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
i2cDriveSDA(0); | |
waitClocks7(0x28u); | |
i2cDriveSCL(0); | |
} | |
void i2cStopCondition(void) | |
{ | |
i2cDriveSDA(0); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
i2cDriveSDA(1u); | |
waitClocks7(0x28u); | |
i2cDriveSCL(0); | |
} | |
bool __cdecl i2cTxAck() | |
{ | |
bool v0; // r4 | |
bool v1; // r5 | |
i2cClrOE_SDA(); | |
waitClocks7(0x2Du); | |
v0 = 0; | |
v1 = i2cGetSDA(); | |
waitClocks7(0x28u); | |
i2cSetOE_SDA(); | |
waitClocks7(0x2Du); | |
i2cDriveSDA(0); | |
waitClocks7(0x28u); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
i2cDriveSCL(0); | |
waitClocks7(0x28u); | |
if ( v1 ) | |
oscall_SerialPrint(off_24289158); // "SPMP_IoIIC_Ack_Tx Fail!!\n" | |
else | |
v0 = 1; | |
waitClocks7(0x28u); | |
return v0; | |
} | |
void i2cRxAck(void) | |
{ | |
i2cDriveSDA(0); | |
waitClocks7(0x28u); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
i2cDriveSCL(0); | |
waitClocks7(0x28u); | |
} | |
void i2cSendNack_maybe(void) | |
{ | |
i2cDriveSDA(1u); | |
waitClocks7(0x28u); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
i2cDriveSCL(0); | |
waitClocks7(0x28u); | |
i2cDriveSDA(0); | |
waitClocks7(0x28u); | |
} | |
void __fastcall i2cSendByte(unsigned __int8 data) | |
{ | |
int v1; // r4 | |
unsigned int v2; // r5 | |
unsigned __int8 v3; // r0 | |
v1 = data; | |
v2 = 0; | |
do | |
{ | |
v3 = 1; | |
if ( !(v1 & 0x80) ) | |
v3 = 0; | |
i2cDriveSDA(v3); | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
v1 = 2 * v1 & 0xFF; | |
i2cDriveSCL(0); | |
i2cDriveSDA(0); | |
waitClocks7(0x28u); | |
v2 = (v2 + 1) & 0xFF; | |
} | |
while ( v2 <= 7 ); | |
} | |
void __fastcall i2cReadByte(unsigned __int8 *data) | |
{ | |
unsigned __int8 *v1; // r7 | |
unsigned int v2; // r4 | |
unsigned int v3; // r6 | |
bool v4; // r5 | |
v1 = data; | |
i2cClrOE_SDA(); | |
waitClocks7(0x2Du); | |
v2 = 0; | |
v3 = 0x80; | |
*v1 = 0; | |
do | |
{ | |
i2cDriveSCL(1u); | |
waitClocks7(0x28u); | |
v4 = i2cGetSDA(); | |
waitClocks7(0x28u); | |
if ( v4 ) | |
*v1 |= v3; | |
i2cDriveSCL(0); | |
waitClocks7(0x28u); | |
v2 = (v2 + 1) & 0xFF; | |
v3 >>= 1; | |
} | |
while ( v2 <= 7 ); | |
i2cSetOE_SDA(); | |
waitClocks7(0x2Du); | |
} | |
void __fastcall BK1080_i2cRead(unsigned __int8 reg, unsigned __int8 *buf, unsigned __int8 len) | |
{ | |
int v3; // r4 | |
unsigned __int8 *v4; // r6 | |
int v5; // r5 | |
int v6; // r0 | |
int v7; // r5 | |
int v8; // r4 | |
v3 = len; | |
v4 = buf; | |
v5 = reg; | |
i2cStartCondition(); // START | |
i2cSendByte(0x80u); // DEVICE ADDRESS | |
i2cTxAck(); | |
v6 = 2 * v5 & 0xFF | 1; | |
v7 = v3 - 1; | |
v8 = 0; | |
i2cSendByte(v6); // REGISTER ADDRESS | |
i2cTxAck(); | |
if ( v7 > 0 ) | |
{ | |
do | |
{ | |
i2cReadByte(&v4[v8]); // DATA | |
i2cRxAck(); | |
v8 = (v8 + 1) & 0xFF; | |
} | |
while ( v8 < v7 ); | |
} | |
i2cReadByte(&v4[v8]); | |
i2cSendNack_maybe(); // NACK | |
i2cStopCondition(); // STOP | |
} | |
void __fastcall BK1080_i2cWrite(unsigned __int8 address, unsigned __int8 *buffer, unsigned __int8 length) | |
{ | |
unsigned int v3; // r4 | |
unsigned __int8 *v4; // r6 | |
char v5; // r5 | |
unsigned __int8 v6; // r0 | |
unsigned int v7; // r5 | |
v3 = length; | |
v4 = buffer; | |
v5 = 2 * address; | |
i2cStartCondition(); // START | |
i2cSendByte(0x80u); // DEVICE ADDRESS | |
i2cTxAck(); | |
v6 = v5 & 0xFE; | |
v7 = 0; | |
i2cSendByte(v6); // DEVICE REGISTER | |
i2cTxAck(); | |
if ( v3 > 0 ) | |
{ | |
do | |
{ | |
i2cSendByte(v4[v7]); // DATA | |
i2cTxAck(); | |
v7 = (v7 + 1) & 0xFF; | |
} | |
while ( v7 < v3 ); | |
} | |
i2cStopCondition(); // STOP | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment