1
0
Fork 0

Increase matrix scanning speed on xd84 (#7517)

* Increase matrix scanning speed

* Fix func name in failure output
This commit is contained in:
Joel Challis 2019-12-03 19:39:21 +00:00 committed by GitHub
parent 1c8208ad9a
commit 1718dfa658
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 36 deletions

View file

@ -76,3 +76,20 @@ uint8_t pca9555_readPins(uint8_t slave_addr, uint8_t port) {
} }
return data; return data;
} }
uint16_t pca9555_readAllPins(uint8_t slave_addr) {
uint8_t addr = SLAVE_TO_ADDR(slave_addr);
typedef union {
uint8_t u8[2];
uint16_t u16;
} data16;
data16 data;
i2c_status_t ret = i2c_readReg(addr, CMD_INPUT_0, &data.u8[0], sizeof(data), TIMEOUT);
if (ret != I2C_STATUS_SUCCESS) {
print("pca9555_readAllPins::FAILED\n");
}
return data.u16;
}

View file

@ -53,3 +53,5 @@ void pca9555_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf);
void pca9555_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf); void pca9555_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf);
uint8_t pca9555_readPins(uint8_t slave_addr, uint8_t port); uint8_t pca9555_readPins(uint8_t slave_addr, uint8_t port);
uint16_t pca9555_readAllPins(uint8_t slave_addr);

View file

@ -36,6 +36,7 @@ static void init_pins(void) {
// init all rows - IC1 port0 input // init all rows - IC1 port0 input
pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT); // same as initial state pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT); // same as initial state
pca9555_set_output(IC1, PCA9555_PORT0, ALL_LOW);
} }
static void select_row(uint8_t row) { static void select_row(uint8_t row) {
@ -44,18 +45,21 @@ static void select_row(uint8_t row) {
uint8_t pin = row; uint8_t pin = row;
uint8_t mask = 1 << pin; uint8_t mask = 1 << pin;
pca9555_set_output(IC1, PCA9555_PORT0, ALL_HIGH & (~mask)); // we configure output once in init, as pca9555 remembers state when flipping between input/output
// pca9555_set_output(IC1, PCA9555_PORT0, ALL_HIGH & (~mask));
pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT & (~mask)); pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT & (~mask));
} }
static uint16_t read_cols(void) { static uint16_t read_cols(void) {
uint16_t state_1 = pca9555_readPins(IC2, PCA9555_PORT0); // uint16_t state_1 = pca9555_readPins(IC2, PCA9555_PORT0);
uint16_t state_2 = pca9555_readPins(IC2, PCA9555_PORT1); // uint16_t state_2 = pca9555_readPins(IC2, PCA9555_PORT1);
uint16_t state = pca9555_readAllPins(IC2);
// For the XD84 all cols are on the same IC and mapped sequentially // For the XD84 all cols are on the same IC and mapped sequentially
// while this technically gives 16 column reads, // while this technically gives 16 column reads,
// the 16th column can never be set so is safely ignored // the 16th column can never be set so is safely ignored
return ~((state_2 << 8) | state_1); // return ~((state_2 << 8) | state_1);
return ~state;
} }
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
@ -67,7 +71,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
// Select row and wait for row selection to stabilize // Select row and wait for row selection to stabilize
select_row(current_row); select_row(current_row);
wait_us(30); // Skip the wait_us(30); as i2c is slow enough to debounce the io changes
current_matrix[current_row] = read_cols(); current_matrix[current_row] = read_cols();