static void init_i2c(I2CInfo* i2c) { clock_gate_switch(i2c->clockgate, ON); gpio_custom_io(i2c->iic_sda_gpio, 2); // pull sda low? int i; for (i = 0; i < 19; i++) { gpio_custom_io(i2c->iic_scl_gpio, (i % 2) ? 2 : 0); udelay(5); } gpio_custom_io(i2c->iic_scl_gpio, 5); // generate stop condition? gpio_custom_io(i2c->iic_sda_gpio, 5); SET_REG(i2c->register_8, 0x30); SET_REG(i2c->register_C, 0x37); i2c->operation_result = 0; interrupt_install(i2c->interrupt, i2cIRQHandler, (uint32_t)i2c); interrupt_enable(i2c->interrupt); }
int gpio_setup() { // Initialise it uint8_t v[8]; if (!(GET_REG(POWER + POWER_ID) & 1)) { gpio_custom_io(0x502, 0); gpio_custom_io(0x503, 0); gpio_custom_io(0x504, 0); gpio_pulldown_configure(0x502, GPIOPDDown); gpio_pulldown_configure(0x503, GPIOPDDown); gpio_pulldown_configure(0x504, GPIOPDDown); gpio_custom_io(0x202, 0); gpio_custom_io(0x301, 0); gpio_custom_io(0x304, 0); gpio_custom_io(0x305, 0); gpio_pulldown_configure(0x202, GPIOPDDown); gpio_pulldown_configure(0x301, GPIOPDDown); gpio_pulldown_configure(0x304, GPIOPDDown); gpio_pulldown_configure(0x305, GPIOPDDown); udelay(100); v[0] = chipid_get_gpio_epoch(); v[1] = gpio_pin_state(0x504); v[2] = gpio_pin_state(0x503); v[3] = gpio_pin_state(0x502); v[4] = gpio_pin_state(0x305); v[5] = gpio_pin_state(0x304); v[6] = gpio_pin_state(0x301); v[7] = gpio_pin_state(0x202); gpio_custom_io(0x502, 4); gpio_custom_io(0x503, 4); gpio_custom_io(0x504, 4); gpio_custom_io(0x202, 4); gpio_custom_io(0x301, 4); gpio_custom_io(0x304, 4); gpio_custom_io(0x305, 4); uint32_t new_status = ((v[0] << 3 | v[1] << 2 | v[2] << 1 | v[3]) << 16) | ((v[4] << 3 | v[5] << 2 | v[6] << 1 | v[7]) << 8) | 1; SET_REG(POWER + POWER_ID, (GET_REG(POWER + POWER_ID) & 0xFF000000) | (new_status & 0xFFFFFF)); } interrupt_install(GPIO_INTERRUPT, gpio_handle_interrupt, 0); interrupt_enable(GPIO_INTERRUPT); return 0; }
void gpio_pin_use_as_input(int port) { gpio_custom_io(port, 0); }
void gpio_pin_output(int port, int bit) { gpio_custom_io(port, 0xE | bit); // 0b111U, where U is the argument }
void gpio_pin_output(int port, int bit) { gpio_custom_io(port, (bit&1)+2); // 2 = OFF/ 3 = ON }
void gpio_pin_reset(int port) { gpio_custom_io(port, 4); }