Skip to content

Commit 626d521

Browse files
authored
Driver meta field to hold driver-specific data (#91)
Mantain driver abstraction by introducing `meta` field and removing `cs_io_num` field from it, since `cs_io_num` is related only to SPI driver. CS gpio is now stored in `rc522_spi_meta_t` which is attached to drivers meta field upon driver installation.
1 parent a37f67e commit 626d521

File tree

3 files changed

+55
-23
lines changed

3 files changed

+55
-23
lines changed

idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: "3.4.0"
1+
version: "3.4.1"
22
description: "Library for communication with RFID / NFC cards using MFRC522 module"
33
url: "https://github.com/abobija/esp-idf-rc522"
44
repository: "https://github.com/abobija/esp-idf-rc522.git"

internal/rc522_driver_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct rc522_driver_handle
2121
{
2222
void *config;
2323
void *device;
24-
gpio_num_t cs_io_num;
24+
void *meta; /* <! Additional (driver specific) data */
2525
rc522_driver_install_handler_t install;
2626
rc522_driver_send_handler_t send;
2727
rc522_driver_receive_handler_t receive;

src/driver/rc522_spi.c

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,39 @@
66

77
RC522_LOG_DEFINE_BASE();
88

9+
typedef struct
10+
{
11+
gpio_num_t cs_io_num;
12+
} rc522_spi_meta_t;
13+
914
static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans);
15+
1016
static void rc522_spi_transaction_post_cb(spi_transaction_t *trans);
1117

18+
static esp_err_t rc522_spi_uninstall(const rc522_driver_handle_t driver);
19+
1220
static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver)
1321
{
1422
RC522_CHECK(driver == NULL);
1523
RC522_CHECK(driver->config == NULL);
1624

25+
esp_err_t ret = ESP_OK;
26+
27+
rc522_spi_meta_t *meta = calloc(1, sizeof(rc522_spi_meta_t));
28+
ESP_GOTO_ON_FALSE(meta != NULL, ESP_ERR_NO_MEM, error, TAG, "nomem");
29+
driver->meta = (void *)meta;
30+
1731
rc522_spi_config_t *conf = (rc522_spi_config_t *)(driver->config);
1832

1933
if (conf->bus_config) {
2034
// overwrite bus config
21-
conf->bus_config->quadwp_io_num = -1;
22-
conf->bus_config->quadhd_io_num = -1;
35+
conf->bus_config->quadwp_io_num = GPIO_NUM_NC;
36+
conf->bus_config->quadhd_io_num = GPIO_NUM_NC;
2337

24-
RC522_RETURN_ON_ERROR(spi_bus_initialize(conf->host_id, conf->bus_config, conf->dma_chan));
38+
ESP_GOTO_ON_ERROR(spi_bus_initialize(conf->host_id, conf->bus_config, conf->dma_chan),
39+
error,
40+
TAG,
41+
"spi bus initialization failed");
2542
}
2643
else {
2744
RC522_LOGD("skips spi bus initialization");
@@ -50,32 +67,38 @@ static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver)
5067
// ESP32 SPI bus has limitation of 3 CS lines, so we need to use
5168
// software control for CS line in order to use more devices.
5269
{
53-
driver->cs_io_num = conf->dev_config.spics_io_num;
54-
conf->dev_config.spics_io_num = -1;
70+
meta->cs_io_num = conf->dev_config.spics_io_num;
71+
conf->dev_config.spics_io_num = GPIO_NUM_NC;
5572

5673
gpio_config_t cs_conf = {
5774
.intr_type = GPIO_INTR_DISABLE,
5875
.mode = GPIO_MODE_OUTPUT,
59-
.pin_bit_mask = (1ULL << driver->cs_io_num),
76+
.pin_bit_mask = (1ULL << meta->cs_io_num),
6077
.pull_down_en = GPIO_PULLDOWN_DISABLE,
6178
.pull_up_en = GPIO_PULLUP_DISABLE,
6279
};
6380

64-
RC522_RETURN_ON_ERROR(gpio_config(&cs_conf));
65-
RC522_RETURN_ON_ERROR(gpio_set_level(driver->cs_io_num, 1));
81+
ESP_GOTO_ON_ERROR(gpio_config(&cs_conf), error, TAG, "cs gpio config failed");
82+
ESP_GOTO_ON_ERROR(gpio_set_level(meta->cs_io_num, 1), error, TAG, "cs set level failed");
6683

6784
conf->dev_config.pre_cb = &rc522_spi_transaction_pre_cb;
6885
conf->dev_config.post_cb = &rc522_spi_transaction_post_cb;
6986
}
7087

71-
RC522_RETURN_ON_ERROR(
72-
spi_bus_add_device(conf->host_id, &conf->dev_config, (spi_device_handle_t *)(&driver->device)));
88+
ESP_GOTO_ON_ERROR(spi_bus_add_device(conf->host_id, &conf->dev_config, (spi_device_handle_t *)(&driver->device)),
89+
error,
90+
TAG,
91+
"spi bus add device failed");
7392

7493
if (conf->rst_io_num > GPIO_NUM_NC) {
75-
RC522_RETURN_ON_ERROR(rc522_driver_init_rst_pin(conf->rst_io_num));
94+
ESP_GOTO_ON_ERROR(rc522_driver_init_rst_pin(conf->rst_io_num), error, TAG, "init rst pin failed");
7695
}
7796

78-
return ESP_OK;
97+
goto exit;
98+
error:
99+
RC522_LOG_ON_ERROR(rc522_spi_uninstall(driver));
100+
exit:
101+
return ret;
79102
}
80103

81104
static esp_err_t rc522_spi_send(const rc522_driver_handle_t driver, uint8_t address, const rc522_bytes_t *bytes)
@@ -143,16 +166,23 @@ static esp_err_t rc522_spi_reset(const rc522_driver_handle_t driver)
143166
static esp_err_t rc522_spi_uninstall(const rc522_driver_handle_t driver)
144167
{
145168
RC522_CHECK(driver == NULL);
146-
RC522_CHECK(driver->device == NULL);
147-
RC522_CHECK(driver->config == NULL);
148169

149-
RC522_RETURN_ON_ERROR(spi_bus_remove_device((spi_device_handle_t)(driver->device)));
150-
driver->device = NULL;
170+
if (driver->meta) {
171+
free(driver->meta);
172+
driver->meta = NULL;
173+
}
151174

152-
rc522_spi_config_t *conf = (rc522_spi_config_t *)(driver->config);
175+
if (driver->device) {
176+
RC522_LOG_ON_ERROR(spi_bus_remove_device((spi_device_handle_t)(driver->device)));
177+
driver->device = NULL;
178+
}
153179

154-
if (conf->bus_config) {
155-
RC522_RETURN_ON_ERROR(spi_bus_free(conf->host_id));
180+
if (driver->config) {
181+
rc522_spi_config_t *conf = (rc522_spi_config_t *)(driver->config);
182+
183+
if (conf->bus_config) {
184+
RC522_LOG_ON_ERROR(spi_bus_free(conf->host_id));
185+
}
156186
}
157187

158188
return ESP_OK;
@@ -177,11 +207,13 @@ esp_err_t rc522_spi_create(const rc522_spi_config_t *config, rc522_driver_handle
177207
static void rc522_spi_transaction_pre_cb(spi_transaction_t *trans)
178208
{
179209
rc522_driver_handle_t driver = (rc522_driver_handle_t)trans->user;
180-
RC522_LOG_ON_ERROR(gpio_set_level(driver->cs_io_num, 0));
210+
rc522_spi_meta_t *meta = (rc522_spi_meta_t *)(driver->meta);
211+
RC522_LOG_ON_ERROR(gpio_set_level(meta->cs_io_num, 0));
181212
}
182213

183214
static void rc522_spi_transaction_post_cb(spi_transaction_t *trans)
184215
{
185216
rc522_driver_handle_t driver = (rc522_driver_handle_t)trans->user;
186-
RC522_LOG_ON_ERROR(gpio_set_level(driver->cs_io_num, 1));
217+
rc522_spi_meta_t *meta = (rc522_spi_meta_t *)(driver->meta);
218+
RC522_LOG_ON_ERROR(gpio_set_level(meta->cs_io_num, 1));
187219
}

0 commit comments

Comments
 (0)