static int w9966_rReg_i2c(struct w9966_dev* cam, int reg) { int data; w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if ( w9966_i2c_wbyte(cam, W9966_I2C_W_ID) == -1 || w9966_i2c_wbyte(cam, reg) == -1 ) return -1; w9966_i2c_setsda(cam, 1); if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if ( w9966_i2c_wbyte(cam, W9966_I2C_R_ID) == -1 || (data = w9966_i2c_rbyte(cam)) == -1 ) return -1; w9966_i2c_setsda(cam, 0); if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setsda(cam, 1); return data; }
// Read a register from the i2c device. // Expects claimed pdev. -1 on error static int w9966_i2c_rreg(struct w9966_dev* cam, int device, int reg) { int data; w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if (!w9966_i2c_wbyte(cam, device << 1) || !w9966_i2c_wbyte(cam, reg)) return -1; w9966_i2c_setsda(cam, 1); if (!w9966_i2c_setscl(cam, 1)) return -1; w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if (!w9966_i2c_wbyte(cam, (device << 1) | 1) || (data = w9966_i2c_rbyte(cam)) == -1) return -1; w9966_i2c_setsda(cam, 0); if (!w9966_i2c_setscl(cam, 1)) return -1; w9966_i2c_setsda(cam, 1); return data; }
/* Write a register to the i2c device. Expects claimed pdev. -1 on error */ static int w9966_write_reg_i2c(struct w9966 *cam, int reg, int data) { w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if (w9966_i2c_wbyte(cam, W9966_I2C_W_ID) == -1 || w9966_i2c_wbyte(cam, reg) == -1 || w9966_i2c_wbyte(cam, data) == -1) return -1; w9966_i2c_setsda(cam, 0); if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setsda(cam, 1); return 0; }
static int w9966_i2c_rbyte(struct w9966 *cam) { unsigned char data = 0x00; int i; w9966_i2c_setsda(cam, 1); for (i = 0; i < 8; i++) { if (w9966_i2c_setscl(cam, 1) == -1) return -1; data = data << 1; if (w9966_i2c_getsda(cam)) data |= 0x01; w9966_i2c_setscl(cam, 0); } return data; }
// Write a register to the i2c device. // Expects claimed pdev. // 1 on success, else 0 static int w9966_i2c_wreg(struct w9966_dev* cam, int device, int reg, int data) { w9966_i2c_setsda(cam, 0); w9966_i2c_setscl(cam, 0); if (!w9966_i2c_wbyte(cam, device << 1) || !w9966_i2c_wbyte(cam, reg) || !w9966_i2c_wbyte(cam, data)) return 0; w9966_i2c_setsda(cam, 0); if (!w9966_i2c_setscl(cam, 1)) return 0; w9966_i2c_setsda(cam, 1); return 1; }
// Write a byte with ack to the i2c bus. // Expects a claimed pdev. // 1 on success, else 0 static int w9966_i2c_wbyte(struct w9966_dev* cam, int data) { int i; for (i = 7; i >= 0; i--) { w9966_i2c_setsda(cam, (data >> i) & 0x01); if (!w9966_i2c_setscl(cam, 1) || !w9966_i2c_setscl(cam, 0)) return 0; } w9966_i2c_setsda(cam, 1); if (!w9966_i2c_setscl(cam, 1) || !w9966_i2c_setscl(cam, 0)) return 0; return 1; }
// Read a data byte with ack from the i2c-bus // Expects a claimed pdev. -1 on error static int w9966_i2c_rbyte(struct w9966_dev* cam) { u8 data = 0x00; int i; w9966_i2c_setsda(cam, 1); for (i = 0; i < 8; i++) { if (!w9966_i2c_setscl(cam, 1)) return -1; data = data << 1; if (w9966_i2c_getsda(cam)) data |= 0x01; w9966_i2c_setscl(cam, 0); } return data; }
// Write a byte with ack to the i2c bus. // Expects a claimed pdev. -1 on error static int w9966_i2c_wbyte(struct w9966_dev* cam, int data) { int i; for (i = 7; i >= 0; i--) { w9966_i2c_setsda(cam, (data >> i) & 0x01); if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setscl(cam, 0); } w9966_i2c_setsda(cam, 1); if (w9966_i2c_setscl(cam, 1) == -1) return -1; w9966_i2c_setscl(cam, 0); return 0; }