Библиотека для приёма и программирования прошивки через CAN-интерфейс. Предназначена для загрузки firmware во флеш-память микроконтроллера.
Данный модуль обеспечивает приём данных прошивки, передаваемых по CAN-протоколу, их буферизацию и последующую запись во флеш-память по секторам. Поддерживается потоковый режим приёма с автоматической синхронизацией блоков данных.
Данные прошивки передаются в следующем формате:
| Смещение | Размер | Описание |
|---|---|---|
| 0 | 2 байта | Ключ (0x08AA) |
| 2 | 16 байт | Зарезервировано (8 слов по 2 байта) |
Каждый блок имеет следующую структуру:
| Поле | Размер | Описание |
|---|---|---|
| Точка входа (Entry Point) | 4 байта | Адрес начала выполнения после загрузки (только в первом блоке) |
| Размер блока | 2 байта | Размер блока в 16-битных словах |
| Адрес назначения | 4 байта | Адрес во флеш-памяти для загрузки блока |
| Данные | переменный | Непосредственно данные прошивки (размер = размер блока * 2 байта) |
Блок с размером = 0 сигнализирует об окончании передачи данных.
AA 08 00 00 00 00 00 00 ; Ключ (0x08AA) + резерв 00 00 00 00 00 00 00 00 00 00 00 00 3F 00 00 80 ; Точка входа (0x003F8000) 05 00 3F 00 10 90 ; Блок 1: размер=5 слов, адрес=0x003F9010 01 00 02 00 03 00 04 00 ; Данные блока 1 (5 слов) 05 00 02 00 3F 00 00 80 ; Блок 2: размер=2 слова, адрес=0x003F8000 00 77 25 76 ; Данные блока 2 (2 слова) 00 00 ; Завершение загрузки
Инициализирует процесс загрузки прошивки. Должна быть вызвана один раз перед началом приёма данных.
Параметры: нет
Возвращает: нет
Основная функция обработки принятых CAN-данных. Вызывается каждый раз при получении нового CAN-сообщения.
Параметры:
rx_buff_from_can- указатель на буфер с принятыми даннымиlength- длина данных в байтах (обычно 8 для CAN)
Возвращает: нет
Примечание: Функция сохраняет состояние между вызовами, что позволяет обрабатывать данные, разбитые на несколько CAN-сообщений.
Функция-заглушка для отправки CAN-сообщений. Должна быть реализована пользователем для конкретной CAN-периферии.
Параметры:
id- идентификатор CAN-сообщенияdata- указатель на данные для отправкиlength- длина данных в 16-битных словах
Функция XLNX_CAN_sendMessage отправляет следующие сообщения:
| Код | Описание |
|---|---|
| 0x0001 | Готовность принять следующий сектор |
| 0x0002 | Завершение загрузки прошивки |
static struct {
uint32_t currentAddr; // Текущий адрес для записи
uint16_t blockSizeWords; // Размер текущего блока (в словах)
uint16_t wordCount; // Счётчик принятых слов
uint8_t buffer[256]; // Буфер для накопления данных
uint8_t bufferIndex; // Индекс в буфере
uint8_t state; // 0=ожидание, 1=приём данных
uint8_t sectorBuffer[0x4000]; // Буфер сектора (16KB)
uint32_t sectorAddr; // Адрес текущего сектора
uint16_t sectorOffset; // Смещение в секторе
uint16_t remainingBytes; // Остаток байт в блоке
uint16_t skipBytes; // Байты для пропуска
uint32_t entriPoint; // Точка входа
} g_progState;