56 lines
3.4 KiB
C
56 lines
3.4 KiB
C
#ifndef F28335_BOOT_STORE_H
|
||
#define F28335_BOOT_STORE_H
|
||
#include "../../include/pcan_boot.h"
|
||
|
||
/* All EEPROM offsets/lengths below are OCTETS, CPU destinations are WORDS. */
|
||
/* Физическая EEPROM 256 КиБ: две страницы журнала по 256 октетов,
|
||
* два слота по 130560 октетов. С 0x3FE00 начинается резерв, с 0x3FEFC —
|
||
* прежняя область параметров. Константы ниже не являются CPU word-адресами. */
|
||
#define F28335_AB_SLOT_BYTES 0x1FE00UL
|
||
#define F28335_AB_SLOT_A 0x00200UL
|
||
#define F28335_AB_SLOT_B 0x20000UL
|
||
#define F28335_AB_PARAMS 0x3FEFCUL
|
||
#define F28335_AB_NONE 0xFFU
|
||
#define F28335_AB_RECORD 64U
|
||
#define F28335_AB_MAX_SECTIONS 64U
|
||
|
||
/* Контракт I/O: address и n измеряются в октетах, независимо от sizeof(char).
|
||
* true означает, что выполнена вся операция; короткий обмен должен вернуть false.
|
||
* Callbacks вызываются синхронно из main, а user передаётся им без изменений. */
|
||
typedef struct {
|
||
bool (*read)(void *, uint32_t, pcan_boot_byte_t *, unsigned int);
|
||
bool (*write)(void *, uint32_t, const pcan_boot_byte_t *, unsigned int);
|
||
void *user;
|
||
} f28335_boot_io_t;
|
||
typedef struct {
|
||
f28335_boot_io_t io;
|
||
/* sequence — номер последней публикации; page — выбранная копия журнала.
|
||
* active — подтверждённый слот; pending — кандидат; attempted — уже была проба.
|
||
* valid показывает наличие распознанной записи, io_fault запрещает изменения
|
||
* после ошибки чтения. Отсутствующий слот обозначается NONE, а не нулём. */
|
||
uint32_t sequence;
|
||
unsigned int page, active, pending, attempted;
|
||
bool valid, io_fault;
|
||
pcan_boot_manifest_t image[2];
|
||
} f28335_boot_store_t;
|
||
|
||
uint32_t f28335_boot_crc(uint32_t crc, const pcan_boot_byte_t *p, unsigned int n);
|
||
bool f28335_boot_open(f28335_boot_store_t *s, const f28335_boot_io_t *io);
|
||
/* Blank/unrecognised EEPROM opens successfully with active=NONE. I/O errors fail. */
|
||
bool f28335_boot_prepare(f28335_boot_store_t *s, unsigned int slot);
|
||
bool f28335_boot_write(f28335_boot_store_t *s, unsigned int slot, uint32_t offset,
|
||
const pcan_boot_byte_t *data, unsigned int n);
|
||
bool f28335_boot_verify(f28335_boot_store_t *s, unsigned int slot,
|
||
const pcan_boot_manifest_t *m, uint32_t *entry);
|
||
bool f28335_boot_commit(f28335_boot_store_t *s, unsigned int slot,
|
||
const pcan_boot_manifest_t *m);
|
||
bool f28335_boot_confirm(f28335_boot_store_t *s, unsigned int running_slot);
|
||
/* Records a trial BEFORE returning it; a second unconfirmed boot rolls back. */
|
||
bool f28335_boot_select(f28335_boot_store_t *s, unsigned int *slot);
|
||
/* Запись одного проверенного слова приложения по CPU word-адресу.
|
||
* Должна вернуть false при невозможности записи; после отказа запуск запрещён. */
|
||
typedef bool (*f28335_boot_ram_writer)(void *, uint32_t, uint16_t);
|
||
bool f28335_boot_load(f28335_boot_store_t *s, unsigned int slot,
|
||
f28335_boot_ram_writer write_word, void *user, uint32_t *entry);
|
||
#endif
|