====== HS-I2C (HighSpeed) ====== This page introduces how you can I2C interface using Expansion Board. The Expansion Board have two I2C devices.\\ You can use the devices via H/W I2C(I2C-A : HS-I2C). {{:en:xu4:xu4_hsi2c_with_expansion.png?700|}} **H/W I2C(I2C-A : HS-I2C)** ^ Kernel 3.10.y\\ (node name) ^ Kernel 4.9.y\\ (node name) ^ Pin Number\\ (XU4-CON11) ^ Net Name ^ Export Number ^ Description ^ | /dev/i2c-1 | /dev/i2c-5 | 4 | GPA2[2](I2C_5.SDA) | 187 | SDA | | ::: | ::: | 6 | GPA2[3](I2C_5.SCL) | 188 | SCL | I2C-A(HS-I2C) doesn't work with i2cdetect command on Kenrnel 3.10.y * Using the H/W I2C(I2C-A : HS-I2C) with Expansion Board. I2C Physical Address : 0x12CB0000 **HW-HSI2C Test Code** //------------------------------------------------------------------------------------------------------------ // // ODROID-XU4 with Shifter Shield I2C Test Application. // I2C Node : /dev/i2c-3 // // Compile : gcc -o // Run : sudo ./ // //------------------------------------------------------------------------------------------------------------ #include #include #include #include #include #include #include #include #include #include //------------------------------------------------------------------------------------------------------------ // // Global handle Define // //------------------------------------------------------------------------------------------------------------ // I2C definitions #define I2C_SLAVE 0x0703 #define I2C_SMBUS 0x0720 /* SMBus-level access */ #define I2C_SMBUS_READ 1 #define I2C_SMBUS_WRITE 0 // SMBus transaction types #define I2C_SMBUS_QUICK 0 #define I2C_SMBUS_BYTE 1 #define I2C_SMBUS_BYTE_DATA 2 #define I2C_SMBUS_WORD_DATA 3 #define I2C_SMBUS_PROC_CALL 4 #define I2C_SMBUS_BLOCK_DATA 5 #define I2C_SMBUS_I2C_BLOCK_BROKEN 6 #define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ #define I2C_SMBUS_I2C_BLOCK_DATA 8 // SMBus messages #define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ #define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ // Structures used in the ioctl() calls union i2c_smbus_data { uint8_t byte; uint16_t word; uint8_t block [I2C_SMBUS_BLOCK_MAX + 2] ; // block [0] is used for length + one more for PEC }; struct i2c_smbus_ioctl_data { char read_write; uint8_t command ; int size; union i2c_smbus_data *data; }; static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args ; args.read_write = rw ; args.command = command ; args.size = size ; args.data = data ; return ioctl (fd, I2C_SMBUS, &args) ; } int i2c_smbus_read_byte_data(int fd, int reg) { union i2c_smbus_data data; if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data)) return -1 ; else return data.byte & 0xFF ; } //------------------------------------------------------------------------------------------------------------ // // I2C: // //------------------------------------------------------------------------------------------------------------ // kernel 4.9.y device node // const char *i2cHandleNode = "/dev/i2c-5"; // kernel 3.10.y device node const char *i2cHandleNode = "/dev/i2c-1"; static int i2c_fd = -1; //------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------ // // LCD Update Function: // //------------------------------------------------------------------------------------------------------------ static void data_update (void) { int val1, val2; static unsigned long count = 0; if(i2c_fd == -1) return; // set BH1780 Sensor I2C Address if(ioctl(i2c_fd, I2C_SLAVE, 0x29) < 0) { fprintf(stdout, "%s : ioctl BH1780 I2C_SLAVE Setup Error!\n", __func__); return; } // BH1780 Part ID Read val1 = i2c_smbus_read_byte_data(i2c_fd, 0x0A); // set Pressure Sensor I2C Address if(ioctl(i2c_fd, I2C_SLAVE, 0x77) < 0) { fprintf(stdout, "%s : ioctl PRESSURE I2C_SLAVE Setup Error!\n", __func__); return; } // Pressure Sensor CHIP ID Read val2 = i2c_smbus_read_byte_data(i2c_fd, 0xD0); fprintf(stdout, "%s : count = %ld BH1780 ID = 0x%02X, PRESSURE ID = 0x%02X\n", __func__, count++, val1, val2); } //------------------------------------------------------------------------------------------------------------ // // system init // //------------------------------------------------------------------------------------------------------------ int system_init(void) { if((i2c_fd = open(i2cHandleNode, O_RDWR)) < 0) { fprintf(stdout, "%s : %s Open Error!\n", __func__, i2cHandleNode); return -1; } return 0; } //------------------------------------------------------------------------------------------------------------ // // Start Program // //------------------------------------------------------------------------------------------------------------ int main (int argc, char *argv[]) { if (system_init() < 0) { fprintf (stderr, "%s: System Init failed\n", __func__); fflush(stdout); return -1; } for(;;) { usleep(100000); data_update(); fflush(stdout); } return 0 ; } //------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------