Skip to content

Instantly share code, notes, and snippets.

@Wolfvak
Created June 3, 2021 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Wolfvak/67fc9947739fcc05e8ac8e297e0cc866 to your computer and use it in GitHub Desktop.
Save Wolfvak/67fc9947739fcc05e8ac8e297e0cc866 to your computer and use it in GitHub Desktop.
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;
}
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