Add embedded storage drivers and extend firmware metadata
This commit is contained in:
72
c/spi-nor/Diagnostics/Inc/spi_nor_command_service.h
Normal file
72
c/spi-nor/Diagnostics/Inc/spi_nor_command_service.h
Normal 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 */
|
||||
73
c/spi-nor/Diagnostics/Inc/spi_nor_read_service.h
Normal file
73
c/spi-nor/Diagnostics/Inc/spi_nor_read_service.h
Normal 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 */
|
||||
Reference in New Issue
Block a user