// i2c state machine // used for read or write or parts thereof // con indicates what to do // // See OMAP TRM S 18.5.1.3: Figure 18-29 `I2C Master Transmitter Mode, Polling Method' static void executeStateMachine(uint32_t base, uint16_t con, uint8_t sa, uint8_t *buffer, int count) { int timeout; uint16_t st; int i = 0; BOOLEAN redoreg = TRUE; do { MMIO_WRITE16(base + I2C_SA, sa); MMIO_WRITE16(base + I2C_CNT, count); MMIO_WRITE16(base + I2C_CON, con); timeout = TIMEOUT * 10; while (i < count) { st = MMIO_READ16(base + I2C_STAT); if (st & I2C_STAT_NACK) { MMIO_WRITE16(base + I2C_STAT, I2C_STAT_NACK); break; //goto redoreg; } else if (st & I2C_STAT_AL) { MMIO_WRITE16(base + I2C_STAT, I2C_STAT_AL); break; //goto redoreg; } else if (st & I2C_STAT_ARDY) { MMIO_WRITE16(base + I2C_STAT, I2C_STAT_ARDY); continue; } else if (st & I2C_STAT_RDR) { // not sure if i need this ... MMIO_WRITE16(base + I2C_STAT, I2C_STAT_XDR); redoreg = FALSE; } else if (st & I2C_STAT_XRDY) { MMIO_WRITE16(base + I2C_DATA, buffer[i++]); MMIO_WRITE16(base + I2C_STAT, I2C_STAT_XRDY); redoreg = FALSE; } else if (st & I2C_STAT_RRDY) { buffer[i++] = MMIO_READ16(base + I2C_DATA); MMIO_WRITE16(base + I2C_STAT, I2C_STAT_RRDY); redoreg = FALSE; } else if (timeout-- == 0) { kernel_print("i2c_read: receive timeout\r\n"); return; } } } while (redoreg == TRUE); // wait for transfer complete? timeout = TIMEOUT; while ((MMIO_READ16(base + I2C_STAT) & I2C_STAT_ARDY) == 0) if (!timeout--) { kernel_print("i2c_write: wait-complete timeout\r\n"); return; } MMIO_WRITE16(base + I2C_STAT, I2C_STAT_ARDY); }
static void waitidle(uint32_t base) { int timeout; // wait for bus-busy off timeout = TIMEOUT * 10; while (MMIO_READ16(base + I2C_STAT) & I2C_STAT_BB) { if (!timeout--) { kernel_print("i2c_write: wait-idle timeout\r\n"); return; } } }
void fs_test() { file_t* file; char buffer[512]; //char text[] = { 't', 'e', 's', 't', '\n', '\r' }; char text[] = "new file\n\r\0"; devices_init(); mmchs_init(); fs_init(); fl_listdirectory("/"); file = (file_t*) fl_fopen("/test/thenewest.txt", "a"); fl_fwrite(text, sizeof(text), sizeof(text), file); fl_fclose(file); fl_listdirectory("/test/"); file = (file_t*) fl_fopen("/test/thenewest.txt", "r"); fl_fread(buffer, 512, sizeof(text), file); kernel_print(buffer); fl_fclose(file); }