Completely refactor I2C LED driver initialization from sync to async.

This commit is contained in:
László Monda
2017-03-18 01:37:13 +01:00
parent db7a67a3fe
commit 3f661bc0ad
4 changed files with 20 additions and 16 deletions

View File

@@ -53,16 +53,32 @@ uint8_t ledControlBufferRight[] = {
0b00000000, // no display
};
uint8_t setFunctionFrameBuffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_FUNCTION};
uint8_t setShutdownModeNormalBuffer[] = {LED_DRIVER_REGISTER_SHUTDOWN, SHUTDOWN_MODE_NORMAL};
uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
bool BridgeSlaveLedDriverHandler(uint8_t ledDriverId) {
uint8_t *ledDriverState = ledDriverStates + ledDriverId;
uint8_t ledDriverAddress = ledDriverId ? I2C_ADDRESS_LED_DRIVER_LEFT : I2C_ADDRESS_LED_DRIVER_RIGHT;
uint8_t *ledControlBuffer = ledDriverId ? ledControlBufferLeft : ledControlBufferRight;
switch (*ledDriverState) {
case LedDriverState_SetFunctionFrame:
I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer));
*ledDriverState = LedDriverState_SetShutdownModeNormal;
break;
case LedDriverState_SetShutdownModeNormal:
I2cAsyncWrite(ledDriverAddress, setShutdownModeNormalBuffer, sizeof(setShutdownModeNormalBuffer));
*ledDriverState = LedDriverState_SetFrame1;
break;
case LedDriverState_SetFrame1:
I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer));
*ledDriverState = LedDriverState_InitLedControlRegisters;
break;
case LedDriverState_InitLedControlRegisters:
I2cAsyncWrite(ledDriverAddress, ledControlBuffer, sizeof(ledControlBufferLeft));
*ledDriverState = LedDriverState_Initialized;
break;
break;
case LedDriverState_Initialized:
I2cAsyncWrite(I2C_ADDRESS_LED_DRIVER_LEFT, ledsBuffer, BUFFER_SIZE);
break;

View File

@@ -8,6 +8,9 @@
// Typedefs:
typedef enum {
LedDriverState_SetFunctionFrame,
LedDriverState_SetShutdownModeNormal,
LedDriverState_SetFrame1,
LedDriverState_InitLedControlRegisters,
LedDriverState_Initialized,
} LedDriverState;

View File

@@ -13,18 +13,4 @@ void LedDriver_InitAllLeds(char isEnabled)
PORT_SetPinMux(LED_DRIVER_SDB_PORT, LED_DRIVER_SDB_PIN, kPORT_MuxAsGpio);
GPIO_PinInit(LED_DRIVER_SDB_GPIO, LED_DRIVER_SDB_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
GPIO_WritePinOutput(LED_DRIVER_SDB_GPIO, LED_DRIVER_SDB_PIN, 1);
LedDriver_SetAllLedsTo(isEnabled ? 0xFF : 0x00);
}
void LedDriver_SetAllLedsTo(uint8_t val)
{
uint8_t ledDriverAddresses[] = {I2C_ADDRESS_LED_DRIVER_LEFT, I2C_ADDRESS_LED_DRIVER_RIGHT};
for (uint8_t addressId=0; addressId<sizeof(ledDriverAddresses); addressId++) {
uint8_t address = ledDriverAddresses[addressId];
LedDriver_WriteRegister(address, LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_FUNCTION);
LedDriver_WriteRegister(address, LED_DRIVER_REGISTER_SHUTDOWN, SHUTDOWN_MODE_NORMAL);
LedDriver_WriteRegister(address, LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1);
}
}

View File

@@ -45,7 +45,6 @@
// Functions:
extern void LedDriver_WriteRegister(uint8_t i2cAddress, uint8_t reg, uint8_t val);
extern void LedDriver_SetAllLedsTo(uint8_t val);
extern void LedDriver_InitAllLeds(char isEnabled);
#endif