static void i2c_send_byte(int Grp, unsigned char c) { int i; local_irq_disable(); for (i = 0; i < 8; i ++) { DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(1); if (c & (1<<(7-i))) i2c_set(Grp, PINI2C_SDA); else i2c_clr(Grp, PINI2C_SDA); DELAY(1); i2c_set(Grp, PINI2C_SCL); DELAY(1); i2c_clr(Grp, PINI2C_SCL); } local_irq_enable(); DELAY(1); }
static void i2c_send_ack(void) { DELAY(1); i2c_clr(SCL); DELAY(1); i2c_set(SDA); DELAY(1); i2c_set(SCL); DELAY(1); i2c_clr(SCL); DELAY(1); i2c_clr(SDA); DELAY(1); }
/* receives an acknowledge from I2C rountine. * * @return value: 0--Ack received; 1--Nack received * */ static int i2c_receive_ack(void) { int nack; unsigned char regvalue; DELAY(1); regvalue = HW_REG(GPIO_0_DIR); regvalue &= (~SDA); HW_REG(GPIO_0_DIR) = regvalue; DELAY(1); i2c_clr(SCL); DELAY(1); i2c_set(SCL); DELAY(1); nack = i2c_data_read(); DELAY(1); i2c_clr(SCL); DELAY(1); // i2c_set(SDA); // DELAY(1); if (nack == 0) return 1; return 0; }
/* receives a character from I2C rountine. * * @return value: character received * */ static unsigned char i2c_receive_byte(void) { int j=0; int i; unsigned char regvalue; local_irq_disable(); for (i=0; i<8; i++) { DELAY(1); i2c_clr(SCL); DELAY(1); i2c_set(SCL); regvalue = HW_REG(GPIO_0_DIR); regvalue &= (~SDA); HW_REG(GPIO_0_DIR) = regvalue; DELAY(1); if (i2c_data_read()) j+=(1<<(7-i)); DELAY(1); i2c_clr(SCL); } local_irq_enable(); DELAY(1); // i2c_clr(SDA); // DELAY(1); return j; }
static int i2c_receive_ack(int Grp) { int nack; unsigned char regvalue; DELAY(1); regvalue = HW_REG(GPIO_I2C_DIR[Grp]); regvalue &= (~GPIO_I2C_BIT[Grp][PINI2C_SDA]); HW_REG(GPIO_I2C_DIR[Grp]) = regvalue; DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(1); i2c_set(Grp, PINI2C_SCL); DELAY(1); nack = i2c_data_read(Grp); DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(1); return !nack; }
static unsigned char i2c_receive_byte(int Grp) { int j = 0; int i; unsigned char regvalue; local_irq_disable(); for (i = 0; i < 8; i ++) { DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(2); i2c_set(Grp, PINI2C_SCL); regvalue = HW_REG(GPIO_I2C_DIR[Grp]); regvalue &= (~GPIO_I2C_BIT[Grp][PINI2C_SDA]); HW_REG(GPIO_I2C_DIR[Grp]) = regvalue; DELAY(1); if (i2c_data_read(Grp)) { j+=(1<<(7-i)); } DELAY(1); i2c_clr(Grp, PINI2C_SCL); } local_irq_enable(); DELAY(1); return j; }
/* * sends a stop bit via I2C rountine. * */ static void i2c_stop_bit(void) { /* clock the ack */ DELAY(1); i2c_set(SCL); DELAY(1); i2c_clr(SCL); /* actual stop bit */ DELAY(1); i2c_clr(SDA); DELAY(1); i2c_set(SCL); DELAY(1); i2c_set(SDA); DELAY(1); }
/* * sends a start bit via I2C rountine. * */ static void i2c_start_bit(void) { DELAY(1); i2c_set(SDA | SCL); DELAY(1); i2c_clr(SDA); DELAY(1); }
static void i2c_send_ack(int Grp) { DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(1); i2c_set(Grp, PINI2C_SDA); DELAY(1); i2c_set(Grp, PINI2C_SCL); DELAY(1); i2c_clr(Grp, PINI2C_SCL); DELAY(1); i2c_clr(Grp, PINI2C_SDA); DELAY(1); }
static void i2c_start_bit(int Grp) { DELAY(1); i2c_set(Grp, PINI2C_DAT); DELAY(1); i2c_clr(Grp, PINI2C_SDA); DELAY(2); }
static void i2c_stop_bit(int Grp) { /* clock the ack */ DELAY(1); i2c_set(Grp, PINI2C_SCL); DELAY(1); i2c_clr(Grp, PINI2C_SCL); /* actual stop bit */ DELAY(1); i2c_clr(Grp, PINI2C_SDA); DELAY(1); i2c_set(Grp, PINI2C_SCL); DELAY(1); i2c_set(Grp, PINI2C_SDA); DELAY(1); }
/* * sends a character over I2C rountine. * * @param c: character to send * */ static void i2c_send_byte(unsigned char c) { int i; local_irq_disable(); for (i=0; i<8; i++) { DELAY(1); i2c_clr(SCL); DELAY(1); if (c & (1<<(7-i))) i2c_set(SDA); else i2c_clr(SDA); DELAY(1); i2c_set(SCL); DELAY(1); i2c_clr(SCL); } DELAY(1); // i2c_set(SDA); local_irq_enable(); }
static int __init gpio_i2c_init(void) { int ret; //unsigned int reg; ret = misc_register(&gpioi2c_dev); if(0 != ret) return -1; #if 1 //printk(KERN_INFO OSDRV_MODULE_VERSION_STRING "\n"); //reg = HW_REG(SC_PERCTRL1); //reg |= 0x00004000; //HW_REG(SC_PERCTRL1) = reg; i2c_set(SCL | SDA); #endif return 0; }
int process_command(int argc, char** argv) { int status = 0; if (strcmp(argv[1], "help") == 0) { print_help(); return 0; } else if (strcmp(argv[1], "version") == 0) { print_version(); return 0; } else if (strcmp(argv[1], "list") == 0) { print_busses(); return 0; } else if (strcmp(argv[1], "detect") == 0) { if (argc == 3) { int bus = strtol(argv[2], NULL, 0); i2c_detect_devices(bus); return 0; } else { print_command_error(); return 1; } } else if ((strcmp(argv[1], "get") == 0) || (strcmp(argv[1], "getrpt") == 0)) { if (argc == 5) { int interation = 0; mraa_boolean_t should_repeat = strcmp(argv[1], "getrpt") == 0; int bus = strtol(argv[2], NULL, 0); uint8_t device_address = strtol(argv[3], NULL, 0); uint8_t register_address = strtol(argv[4], NULL, 0); // fprintf(stdout, "Device %02X, Register = %02X\n", device_address, register_address); uint8_t data; do { if (i2c_get(bus, device_address, register_address, &data) == MRAA_SUCCESS) { if (should_repeat) fprintf(stdout, "%4d: ", interation); fprintf(stdout, "Register %#02X = %#02X\n", register_address, data); status = 0; } else { fprintf(stdout, "i2c get failed\n"); status = 1; } interation++; usleep(10000); } while (should_repeat && status == 0); } else { print_command_error(); status = 1; } return status; } else if ((strcmp(argv[1], "set") == 0)) { if (argc == 6) { int bus = strtol(argv[2], NULL, 0); uint8_t device_address = strtol(argv[3], NULL, 0); uint8_t register_address = strtol(argv[4], NULL, 0); uint8_t value = strtol(argv[5], NULL, 0); fprintf(stdout, "Device %02X, Register = %02X, Value = %02X\n", device_address, register_address, value); if (i2c_set(bus, device_address, register_address, value) != MRAA_SUCCESS) { fprintf(stdout, "i2c set failed\n"); return 0; } return 1; } else { print_command_error(); return 1; } } else { print_command_error(); return 1; } }
int process_command(int argc, char** argv) { if (strcmp(argv[1], "help") == 0) { print_help(); return 0; } else if (strcmp(argv[1], "version") == 0) { print_version(); return 0; } else if (strcmp(argv[1], "list") == 0) { print_busses(); return 0; } else if (strcmp(argv[1], "detect") == 0) { if (argc == 3) { int bus = strtol(argv[2], NULL, 0); i2c_detect_devices(bus); return 0; } else { print_command_error(); return 1; } } else if ((strcmp(argv[1], "get") == 0)) { if (argc == 5) { int bus = strtol(argv[2], NULL, 0); uint8_t device_address = strtol(argv[3], NULL, 0); uint8_t register_address = strtol(argv[4], NULL, 0); // fprintf(stdout, "Device %02X, Register = %02X\n", device_address, register_address); uint8_t data; if (i2c_get(bus, device_address, register_address, &data) == MRAA_SUCCESS) { fprintf(stdout, "Register %#02X = %#02X\n", register_address, data); return 0; } else { fprintf(stdout, "i2c get failed\n"); return 1; } } else { print_command_error(); return 1; } } else if ((strcmp(argv[1], "set") == 0)) { if (argc == 6) { int bus = strtol(argv[2], NULL, 0); uint8_t device_address = strtol(argv[3], NULL, 0); uint8_t register_address = strtol(argv[4], NULL, 0); uint8_t value = strtol(argv[5], NULL, 0); fprintf(stdout, "Device %02X, Register = %02X, Value = %02X\n", device_address, register_address, value); if (i2c_set(bus, device_address, register_address, value) != MRAA_SUCCESS) { fprintf(stdout, "i2c set failed\n"); return 0; } return 1; } else { print_command_error(); return 1; } } else { print_command_error(); return 1; } }