Beispiel #1
0
// 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);
}
Beispiel #2
0
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;
    }
  }

}
Beispiel #3
0
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);


}