-
-
Notifications
You must be signed in to change notification settings - Fork 39.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Align existing pca9555 driver to better match mcp23018 API (#16277)
- Loading branch information
Showing
6 changed files
with
114 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,6 @@ | ||
/* Copyright 2019 | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
// Copyright 2020 zvecr<[email protected]> | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#include "i2c_master.h" | ||
#include "pca9555.h" | ||
|
||
|
@@ -45,51 +33,74 @@ void pca9555_init(uint8_t slave_addr) { | |
// i2c_stop(); | ||
} | ||
|
||
void pca9555_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf) { | ||
bool pca9555_set_config(uint8_t slave_addr, pca9555_port_t port, uint8_t conf) { | ||
uint8_t addr = SLAVE_TO_ADDR(slave_addr); | ||
uint8_t cmd = port ? CMD_CONFIG_1 : CMD_CONFIG_0; | ||
|
||
i2c_status_t ret = i2c_writeReg(addr, cmd, &conf, sizeof(conf), TIMEOUT); | ||
if (ret != I2C_STATUS_SUCCESS) { | ||
print("pca9555_set_config::FAILED\n"); | ||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
void pca9555_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf) { | ||
bool pca9555_set_output(uint8_t slave_addr, pca9555_port_t port, uint8_t conf) { | ||
uint8_t addr = SLAVE_TO_ADDR(slave_addr); | ||
uint8_t cmd = port ? CMD_OUTPUT_1 : CMD_OUTPUT_0; | ||
|
||
i2c_status_t ret = i2c_writeReg(addr, cmd, &conf, sizeof(conf), TIMEOUT); | ||
if (ret != I2C_STATUS_SUCCESS) { | ||
print("pca9555_set_output::FAILED\n"); | ||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
uint8_t pca9555_readPins(uint8_t slave_addr, uint8_t port) { | ||
bool pca9555_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB) { | ||
uint8_t addr = SLAVE_TO_ADDR(slave_addr); | ||
uint8_t conf[2] = {confA, confB}; | ||
|
||
i2c_status_t ret = i2c_writeReg(addr, CMD_OUTPUT_0, &conf[0], sizeof(conf), TIMEOUT); | ||
if (ret != I2C_STATUS_SUCCESS) { | ||
dprintf("pca9555_set_output::FAILED::%u\n", ret); | ||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
bool pca9555_readPins(uint8_t slave_addr, pca9555_port_t port, uint8_t* out) { | ||
uint8_t addr = SLAVE_TO_ADDR(slave_addr); | ||
uint8_t cmd = port ? CMD_INPUT_1 : CMD_INPUT_0; | ||
|
||
uint8_t data = 0; | ||
i2c_status_t ret = i2c_readReg(addr, cmd, &data, sizeof(data), TIMEOUT); | ||
i2c_status_t ret = i2c_readReg(addr, cmd, out, sizeof(uint8_t), TIMEOUT); | ||
if (ret != I2C_STATUS_SUCCESS) { | ||
print("pca9555_readPins::FAILED\n"); | ||
return false; | ||
} | ||
return data; | ||
|
||
return true; | ||
} | ||
|
||
uint16_t pca9555_readAllPins(uint8_t slave_addr) { | ||
bool pca9555_readPins_all(uint8_t slave_addr, uint16_t* out) { | ||
uint8_t addr = SLAVE_TO_ADDR(slave_addr); | ||
|
||
typedef union { | ||
uint8_t u8[2]; | ||
uint16_t u16; | ||
} data16; | ||
|
||
data16 data; | ||
data16 data = {.u16 = 0}; | ||
|
||
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"); | ||
print("pca9555_readPins_all::FAILED\n"); | ||
return false; | ||
} | ||
return data.u16; | ||
|
||
*out = data.u16; | ||
return true; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,11 @@ | ||
/* Copyright 2019 | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
// Copyright 2020 zvecr<[email protected]> | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#pragma once | ||
|
||
#include <stdint.h> | ||
#include <stdbool.h> | ||
|
||
/* | ||
PCA9555 | ||
,----------. | ||
|
@@ -38,20 +29,60 @@ | |
`----------' | ||
*/ | ||
|
||
#define PCA9555_PORT0 0 | ||
#define PCA9555_PORT1 1 | ||
/** | ||
* Port ID | ||
*/ | ||
typedef enum { | ||
PCA9555_PORT0, | ||
PCA9555_PORT1, | ||
} pca9555_port_t; | ||
|
||
#define ALL_OUTPUT 0 | ||
#define ALL_INPUT 0xFF | ||
#define ALL_LOW 0 | ||
#define ALL_HIGH 0xFF | ||
/** | ||
* Helpers for set_config | ||
*/ | ||
enum { | ||
ALL_OUTPUT = 0, | ||
ALL_INPUT = 0xFF, | ||
}; | ||
|
||
/** | ||
* Helpers for set_output | ||
*/ | ||
enum { | ||
ALL_LOW = 0, | ||
ALL_HIGH = 0xFF, | ||
}; | ||
|
||
/** | ||
* Init expander and any other dependent drivers | ||
*/ | ||
void pca9555_init(uint8_t slave_addr); | ||
|
||
void pca9555_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf); | ||
/** | ||
* Configure input/output to a given port | ||
*/ | ||
bool pca9555_set_config(uint8_t slave_addr, pca9555_port_t port, uint8_t conf); | ||
|
||
void pca9555_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf); | ||
/** | ||
* Write high/low to a given port | ||
*/ | ||
bool pca9555_set_output(uint8_t slave_addr, pca9555_port_t port, uint8_t conf); | ||
|
||
uint8_t pca9555_readPins(uint8_t slave_addr, uint8_t port); | ||
/** | ||
* Write high/low to both ports sequentially | ||
* | ||
* - slightly faster than multiple set_output | ||
*/ | ||
bool pca9555_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB); | ||
|
||
uint16_t pca9555_readAllPins(uint8_t slave_addr); | ||
/** | ||
* Read state of a given port | ||
*/ | ||
bool pca9555_readPins(uint8_t slave_addr, pca9555_port_t port, uint8_t* ret); | ||
|
||
/** | ||
* Read state of both ports sequentially | ||
* | ||
* - slightly faster than multiple readPins | ||
*/ | ||
bool pca9555_readPins_all(uint8_t slave_addr, uint16_t* ret); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters