Add embedded storage drivers and extend firmware metadata

This commit is contained in:
2026-09-27 01:44:59 +03:00
parent 795a1279b1
commit 2ad29e7ffd
52 changed files with 5801 additions and 3 deletions

View File

@@ -0,0 +1,72 @@
#ifndef SPI_NOR_COMMAND_SERVICE_H
#define SPI_NOR_COMMAND_SERVICE_H
/*
* Переносимый read-only сервис коротких сервисных команд SPI NOR.
*
* Модуль не знает о HAL, Modbus, HTTP и GUI. Он принимает уже распознанный
* spi_nor_t, применяет собственный allowlist и выполняет ровно одну законченную
* транзакцию. Изменяющие команды намеренно отсутствуют в публичном API.
*/
#include "spi_nor.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Четырёх байт достаточно для opcode и 24-битного адреса READ 0x03. */
#define SPI_NOR_COMMAND_SERVICE_MAX_TX_BYTES 4U
#define SPI_NOR_COMMAND_SERVICE_MAX_RX_BYTES 64U
typedef enum
{
SPI_NOR_COMMAND_SERVICE_IDLE = 0,
SPI_NOR_COMMAND_SERVICE_BUSY,
SPI_NOR_COMMAND_SERVICE_OK,
SPI_NOR_COMMAND_SERVICE_INVALID,
SPI_NOR_COMMAND_SERVICE_BLOCKED,
SPI_NOR_COMMAND_SERVICE_UNAVAILABLE,
SPI_NOR_COMMAND_SERVICE_IO_ERROR,
SPI_NOR_COMMAND_SERVICE_TIMEOUT
} spi_nor_command_service_status_t;
typedef struct
{
uint16_t sequence;
uint8_t tx_length;
uint8_t rx_length;
uint8_t tx[SPI_NOR_COMMAND_SERVICE_MAX_TX_BYTES];
} spi_nor_command_service_request_t;
typedef struct
{
spi_nor_command_service_status_t status;
uint16_t sequence;
uint8_t tx_length;
uint8_t rx_length;
uint8_t tx_echo[SPI_NOR_COMMAND_SERVICE_MAX_TX_BYTES];
uint8_t rx[SPI_NOR_COMMAND_SERVICE_MAX_RX_BYTES];
} spi_nor_command_service_response_t;
/*
* Allowlist общий для W25Q64/W25Q128 и SST25VF016B:
* 0x9F JEDEC ID, 0x05 status register 1, 0x03 обычное чтение данных.
*/
spi_nor_command_service_status_t spi_nor_command_service_validate(
const spi_nor_t *device,
const spi_nor_command_service_request_t *request);
/* Process очищает старый ответ и выполняет не более одной SPI-транзакции. */
spi_nor_command_service_status_t spi_nor_command_service_process(
spi_nor_t *device,
const spi_nor_command_service_request_t *request,
spi_nor_command_service_response_t *response);
#ifdef __cplusplus
}
#endif
#endif /* SPI_NOR_COMMAND_SERVICE_H */

View File

@@ -0,0 +1,73 @@
#ifndef SPI_NOR_READ_SERVICE_H
#define SPI_NOR_READ_SERVICE_H
/*
* Ограниченный read-only сервис диагностики SPI NOR.
*
* Сервис отделён от HAL, Modbus и приложения. Владелец передаёт только ёмкость
* и callback чтения, поэтому portable-ядро SpiNor не получает зависимостей GUI.
*/
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Один маленький пакет ограничивает длительность SPI и Modbus main loop. */
#define SPI_NOR_READ_SERVICE_MAX_BYTES 64U
typedef enum
{
SPI_NOR_READ_SERVICE_IDLE = 0,
SPI_NOR_READ_SERVICE_BUSY,
SPI_NOR_READ_SERVICE_OK,
SPI_NOR_READ_SERVICE_INVALID,
SPI_NOR_READ_SERVICE_UNAVAILABLE,
SPI_NOR_READ_SERVICE_IO_ERROR
} spi_nor_read_service_status_t;
/* Callback адаптера не раскрывает драйверу контекст конкретной платформы. */
typedef spi_nor_read_service_status_t (*spi_nor_read_service_read_fn)(
void *context, uint32_t address, void *data, size_t size);
typedef struct
{
void *context;
spi_nor_read_service_read_fn read;
uint32_t capacity_bytes;
} spi_nor_read_service_t;
typedef struct
{
uint32_t address;
uint16_t length;
uint16_t sequence;
} spi_nor_read_service_request_t;
typedef struct
{
spi_nor_read_service_status_t status;
uint32_t address;
uint16_t length;
uint16_t sequence;
uint8_t data[SPI_NOR_READ_SERVICE_MAX_BYTES];
} spi_nor_read_service_response_t;
/* Init проверяет callback и ёмкость, но сам не обращается к SPI. */
spi_nor_read_service_status_t spi_nor_read_service_init(
spi_nor_read_service_t *service, void *context,
spi_nor_read_service_read_fn read, uint32_t capacity_bytes);
/* Process всегда очищает старые данные до проверки нового запроса. */
spi_nor_read_service_status_t spi_nor_read_service_process(
const spi_nor_read_service_t *service,
const spi_nor_read_service_request_t *request,
spi_nor_read_service_response_t *response);
#ifdef __cplusplus
}
#endif
#endif /* SPI_NOR_READ_SERVICE_H */