board_utils.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "board_utils.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "driver/gpio.h"
  5. #include "esp_log.h"
  6. static const char TAG[] = "board_utils";
  7. /* ========== Common GPIO ISR service ========== */
  8. static bool s_isr_installed = false;
  9. esp_err_t board_gpio_isr_init(void) {
  10. if (s_isr_installed) {
  11. return ESP_OK;
  12. }
  13. esp_err_t err = gpio_install_isr_service(0);
  14. if (err == ESP_ERR_INVALID_STATE) {
  15. s_isr_installed = true;
  16. return ESP_OK; // already installed
  17. }
  18. if (err != ESP_OK) {
  19. ESP_LOGE(TAG, "Failed to install GPIO ISR service: %s",
  20. esp_err_to_name(err));
  21. return err;
  22. }
  23. s_isr_installed = true;
  24. return ESP_OK;
  25. }
  26. /* ========== Common I2C bus helpers ========== */
  27. esp_err_t board_i2c_add_device(i2c_master_bus_handle_t bus, uint8_t addr,
  28. uint32_t speed_hz,
  29. i2c_master_dev_handle_t *dev) {
  30. if (bus == NULL) {
  31. return ESP_ERR_INVALID_STATE;
  32. }
  33. i2c_device_config_t cfg = {
  34. .dev_addr_length = I2C_ADDR_BIT_LEN_7,
  35. .device_address = addr,
  36. .scl_speed_hz = speed_hz,
  37. };
  38. return i2c_master_bus_add_device(bus, &cfg, dev);
  39. }
  40. esp_err_t board_i2c_remove_device(i2c_master_dev_handle_t dev) {
  41. return i2c_master_bus_rm_device(dev);
  42. }
  43. esp_err_t board_i2c_write(i2c_master_dev_handle_t dev, uint8_t reg,
  44. const uint8_t *data, size_t len) {
  45. if (dev == NULL) {
  46. return ESP_ERR_INVALID_STATE;
  47. }
  48. uint8_t *buf = malloc(len + 1);
  49. if (buf == NULL) {
  50. return ESP_ERR_NO_MEM;
  51. }
  52. buf[0] = reg;
  53. memcpy(buf + 1, data, len);
  54. esp_err_t ret = i2c_master_transmit(dev, buf, len + 1, BOARD_I2C_TIMEOUT_MS);
  55. free(buf);
  56. if (ret != ESP_OK) {
  57. ESP_LOGD(TAG, "I2C write reg 0x%02X failed: %s", reg, esp_err_to_name(ret));
  58. }
  59. return ret;
  60. }
  61. esp_err_t board_i2c_write_raw(i2c_master_dev_handle_t dev, const uint8_t *data,
  62. size_t len) {
  63. if (dev == NULL) {
  64. return ESP_ERR_INVALID_STATE;
  65. }
  66. return i2c_master_transmit(dev, data, len, BOARD_I2C_TIMEOUT_MS);
  67. }
  68. esp_err_t board_i2c_read(i2c_master_dev_handle_t dev, uint8_t reg,
  69. uint8_t *data, size_t len) {
  70. if (dev == NULL) {
  71. return ESP_ERR_INVALID_STATE;
  72. }
  73. return i2c_master_transmit_receive(dev, &reg, 1, data, len,
  74. BOARD_I2C_TIMEOUT_MS);
  75. }