#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