/* * Modify masked bits in register */ static int pca953x_reg_write(uint8_t chip, uint addr, uint mask, uint data) { uint8_t valb; uint16_t valw; if (pca953x_ngpio(chip) <= 8) { if (i2c_read(chip, addr, 1, &valb, 1)) return -1; valb &= ~mask; valb |= data; return i2c_write(chip, addr, 1, &valb, 1); } else { if (i2c_read(chip, addr << 1, 1, (u8*)&valw, 2)) return -1; valw = le16_to_cpu(valw); valw &= ~mask; valw |= data; valw = cpu_to_le16(valw); return i2c_write(chip, addr << 1, 1, (u8*)&valw, 2); } }
static int pca953x_reg_read(uint8_t chip, uint addr, uint *data) { uint8_t valb; uint16_t valw; if (pca953x_ngpio(chip) <= 8) { if (i2c_read(chip, addr, 1, &valb, 1)) return -1; *data = (int)valb; } else { if (i2c_read(chip, addr << 1, 1, (u8*)&valw, 2)) return -1; *data = (int)valw; } return 0; }
/* * Display pca953x information */ static int pca953x_info(uint8_t chip) { int i; uint data; int nr_gpio = pca953x_ngpio(chip); int msb = nr_gpio - 1; printf("pca953x@ 0x%x (%d pins):\n\n", chip, nr_gpio); printf("gpio pins: "); for (i = msb; i >= 0; i--) printf("%x", i); printf("\n"); for (i = 11 + nr_gpio; i > 0; i--) printf("-"); printf("\n"); if (pca953x_reg_read(chip, PCA953X_CONF, &data) < 0) return -1; printf("conf: "); for (i = msb; i >= 0; i--) printf("%c", data & (1 << i) ? 'i' : 'o'); printf("\n"); if (pca953x_reg_read(chip, PCA953X_POL, &data) < 0) return -1; printf("invert: "); for (i = msb; i >= 0; i--) printf("%c", data & (1 << i) ? '1' : '0'); printf("\n"); if (pca953x_reg_read(chip, PCA953X_IN, &data) < 0) return -1; printf("input: "); for (i = msb; i >= 0; i--) printf("%c", data & (1 << i) ? '1' : '0'); printf("\n"); if (pca953x_reg_read(chip, PCA953X_OUT, &data) < 0) return -1; printf("output: "); for (i = msb; i >= 0; i--) printf("%c", data & (1 << i) ? '1' : '0'); printf("\n"); return 0; }