Files
MTGcompanion/components/rc522/src/rc522_driver.c

109 lines
2.6 KiB
C

#include <string.h>
#include <driver/gpio.h>
#include "rc522_types_internal.h"
#include "rc522_driver_internal.h"
RC522_LOG_DEFINE_BASE();
esp_err_t rc522_driver_init_rst_pin(gpio_num_t rst_io_num)
{
RC522_CHECK(rst_io_num < 0);
gpio_config_t io_conf = {
.intr_type = GPIO_INTR_DISABLE,
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = (1ULL << rst_io_num),
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.pull_up_en = GPIO_PULLUP_ENABLE,
};
RC522_RETURN_ON_ERROR(gpio_config(&io_conf));
RC522_RETURN_ON_ERROR(gpio_set_level(rst_io_num, !RC522_DRIVER_HARD_RST_PIN_PWR_DOWN_LEVEL));
return ESP_OK;
}
inline esp_err_t rc522_driver_install(const rc522_driver_handle_t driver)
{
RC522_CHECK(driver == NULL);
return driver->install(driver);
}
inline esp_err_t rc522_driver_send(const rc522_driver_handle_t driver, uint8_t address, const rc522_bytes_t *bytes)
{
RC522_CHECK(driver == NULL);
RC522_CHECK_BYTES(bytes);
return driver->send(driver, address, bytes);
}
inline esp_err_t rc522_driver_receive(const rc522_driver_handle_t driver, uint8_t address, rc522_bytes_t *bytes)
{
RC522_CHECK(driver == NULL);
RC522_CHECK_BYTES(bytes);
return driver->receive(driver, address, bytes);
}
inline esp_err_t rc522_driver_reset(const rc522_driver_handle_t driver)
{
RC522_CHECK(driver == NULL);
return driver->reset(driver);
}
inline esp_err_t rc522_driver_uninstall(const rc522_driver_handle_t driver)
{
RC522_CHECK(driver == NULL);
return driver->uninstall(driver);
}
esp_err_t rc522_driver_create(const void *config, size_t config_size, rc522_driver_handle_t *driver)
{
RC522_CHECK(config == NULL);
RC522_CHECK(config_size == 0);
RC522_CHECK(driver == NULL);
esp_err_t ret = ESP_OK;
rc522_driver_handle_t _driver = calloc(1, sizeof(struct rc522_driver_handle));
ESP_RETURN_ON_FALSE(_driver != NULL, ESP_ERR_NO_MEM, TAG, "nomem");
_driver->config = calloc(1, config_size);
ESP_GOTO_ON_FALSE(_driver->config != NULL, ESP_ERR_NO_MEM, error, TAG, "nomem");
memcpy(_driver->config, config, config_size);
goto success;
error:
rc522_driver_destroy(_driver);
goto exit;
success:
*driver = _driver;
exit:
return ret;
}
esp_err_t rc522_driver_destroy(rc522_driver_handle_t driver)
{
RC522_CHECK(driver == NULL);
if (driver->config) {
free(driver->config);
driver->config = NULL;
}
driver->install = NULL;
driver->send = NULL;
driver->receive = NULL;
driver->uninstall = NULL;
driver->device = NULL;
free(driver);
return ESP_OK;
}