Skip to content
Snippets Groups Projects
Forked from card10 / firmware
1667 commits behind the upstream repository.
portexpander.c 1.50 KiB
#include "portexpander.h"

#include "i2c.h"

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>

static bool detected = false;

void portexpander_init(void)
{
    uint8_t addr = 0x21;
    int ret;

    // Enable pull-ups for buttons
    uint8_t command[] = {0x43, 0x68};
    ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);

    if(ret != 2) {
        printf("portexpander NOT detected\n");
        detected = false;
        return;
    }
    detected = true;

    // Set _all_ outputs to open-drain to support the high side p-channel transistors.
    command[0] = 0x4F; command[1] = 0x01;
    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);

    // Enable outputs for transistors and the LED
    command[0] = 0x03; command[1] = 0x68;
    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);

    // Set outputs to high (i.e. open-drain)
    command[0] = 0x01; command[1] = 0x97;
    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);

    // Turn on LEDs
    // TODO: only turn on LEDs if value != 0,0,0 && dim > 0
    command[0] = 0x01; command[1] = 0x90;
    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);

}

uint8_t portexpander_get(void)
{
    uint8_t addr = 0x21;
    uint8_t command[] = {0x00};
    uint8_t buf = 0xFF;

    if(detected) {
        I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1);
        I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0);
    }

    return buf;
}

bool portexpander_detected(void)
{
    return detected;
}