36 if (!desc)
return false;
37 memset(desc, 0,
sizeof(sao_descriptor_t));
42 LOG_D(
TAG,
"Failed to read magic bytes");
46 if (buf[0] != 0x53 || buf[1] != 0x41 || buf[2] != 0x4F || buf[3] != 0x31) {
47 LOG_D(
TAG,
"Invalid magic: %02X %02X %02X %02X", buf[0], buf[1], buf[2], buf[3]);
58 if (
sao_read_eeprom(offset,
reinterpret_cast<uint8_t*
>(desc->name), name_len) != ESP_OK)
return false;
59 desc->name[name_len] =
'\0';
64 uint8_t drv_name_len = 0;
68 if (drv_name_len > 0) {
69 if (
sao_read_eeprom(offset,
reinterpret_cast<uint8_t*
>(desc->primary_driver.name), drv_name_len) != ESP_OK) {
72 desc->primary_driver.name[drv_name_len] =
'\0';
73 offset += drv_name_len;
77 uint8_t drv_data_len = 0;
81 if (desc->primary_driver.data_len > 0) {
82 if (
sao_read_eeprom(offset, desc->primary_driver.data, desc->primary_driver.data_len) != ESP_OK) {
85 offset += desc->primary_driver.data_len;
89 uint8_t extra_count = 0;
94 for (uint8_t i = 0; i < desc->extra_driver_count; i++) {
98 if (drv_name_len > 0) {
100 reinterpret_cast<uint8_t*
>(desc->extra_drivers[i].name),
101 drv_name_len) != ESP_OK) {
104 desc->extra_drivers[i].name[drv_name_len] =
'\0';
105 offset += drv_name_len;
110 desc->extra_drivers[i].data_len =
112 if (desc->extra_drivers[i].data_len > 0) {
114 desc->extra_drivers[i].data_len) != ESP_OK) {
117 offset += desc->extra_drivers[i].data_len;
200 if (!buf || len == 0)
return;
205 "No SAO detected\n\nConnect an SAO module\nto the SAO port and\nunlock to detect it.");
211 pos += snprintf(buf + pos, len - pos,
"Driver: %s\n",
215 if (pos <
static_cast<int>(len) &&
g_sao_descriptor.primary_driver.data_len > 0) {
216 pos += snprintf(buf + pos, len - pos,
"Driver Data:");
217 for (
int i = 0; i <
g_sao_descriptor.primary_driver.data_len && pos < static_cast<int>(len) - 3; i++) {
218 pos += snprintf(buf + pos, len - pos,
" %02X",
g_sao_descriptor.primary_driver.data[i]);
220 pos += snprintf(buf + pos, len - pos,
"\n");
223 if (pos <
static_cast<int>(len) &&
g_sao_descriptor.extra_driver_count > 0) {
224 pos += snprintf(buf + pos, len - pos,
"Extra Drivers: %d\n",
g_sao_descriptor.extra_driver_count);
225 for (
int i = 0; i <
g_sao_descriptor.extra_driver_count && pos < static_cast<int>(len); i++) {
226 pos += snprintf(buf + pos, len - pos,
" - %s\n",
g_sao_descriptor.extra_drivers[i].name);
static esp_err_t sao_read_eeprom(uint8_t mem_addr, uint8_t *data, size_t len)
Reads bytes from SAO EEPROM at a given memory address.