|
main_ubi_sdk v 0.1.3
This is UBI4 documentation
|
Bootloader иструкция по использованию
Условные обозначения, которые будут использоваться далее: MAIN - основная выполняемая программа. BOOTLOADER - программа для загрузки прошивки * В библиотеке UBI_SDK.h находятся define BOOTLOADER_FW и MAIN_FW. Они необходимы, чтобы выбрать тип прошивки. Соответственно, MAIN_FW позволяет подключать только те куски кода, которые используются в основной программе. Если этот define не объявлен, то эти куски кода не будут включены, так как в программе-загрузчика они не используются. * Задача программы-загрузчика - только залить прошивку. Никакой функционал она более не выполняет. * В библиотеке UBI_SDK.h так же находятся define, необходимые для обеспечения функционала обновления MAIN: CHUNCK_SIZE - размер принимаемых кусочков (конкретно кусок файла прошивки, а не целая посылка). COMPARE_DATA_MASK - маска, которая определяет, какую информацию о плате необходимо будет верифицировать для определения корректности отправляемой прошивки. MAIN_PROGRAM_START_ADDRESS - адрес начала MAIN. BOOTLOADER_START_ADDRESS - адрес начала BOOTLOADER. * Информация о define так же продублирована здесь по пути: Базовые модули -> UBI_SDK. *
Лучше всего, чтобы выбираемое число было 2^n 32, 64, 128, 256 и 512. ПО запрашивает у устройства, сколько кусочков необходимо отправлять. ПО так же имеет возможность не учитывать эту настройку, а передавать столько, сколько решил пользователь. (Возможно, сам пользователь вообще ничего решать не будет. Поставить везде 512 б, получать это значение в ПО. Но при прошивки через BLE уже не учитывать базовое значение, а отправлять по 128 б) *
Маска записана в двоичном виде. Всего используется 10 бит, поэтому число 16-ти битное. Каждый бит определяет, сравнивает ли программа ту или иную характеристику. 0 - не сравнивает, 1 - сравнивает. Есть два пути составить маску: 1) В ручную, прописывая биты, основываясь на структуре base_BoardInfo_struct. В этом случае так, как написаны поля, к таком же порядке и стоит выставлять биты, начиная с младшего (BoardName - нулевой бит, BoardVersion - первый и т.д.). 2) С помощью генератора маски (пока не написан). *
Меняется в зависимости от выбранного контроллера. *
Не меняется. Он всегда содержит значение начала Flash-памяти. *
В библиотеке update_fw: 1) base_BootloaderInfo_struct (device_info_struct.h); 2) base_FWInfo_struct (device_info_struct.h); 3) base_BoardInfo_struct (device_info_struct.h); 4) FW_info_struct (update_fw.h). В библиотеке bootloader: 1) base_BootloaderInfo_struct (device_info_struct.h); 2) base_FWInfo_struct (device_info_struct.h). Они объявлены глобально только для своих библиотек и обращение к ним доступно только в них же. Не нужно extern куда-нибудь. Для присвоения значений, с которыми следует работать, есть функции, доступные для внешнего вызова (подробнее о них - в следующих разделах). *
BOOTLOADER - примерно одинаковый по объему для всех типов устройств. Отличие - установка необходимой конфигурации (например, подтяжка периферии к какому-либо уровню). Поэтому выделяется на него всегда одинаковое количество памяти. Программа-загрузчик всегда лежит в начале flash-памяти. MAIN - адрес для начала основной программы зависит от двух факторов: 1) Размер BOOTLOADER; 2) Структура распределения памяти контроллера (страницы, сектора, сколько содержится и т.д.). Так же, во flash содержится таблица данных, необходимых для работы устройства. Расположение таблицы определяется относительно конца flash-памяти (отступ зависит от тех же факторов, что и адрес для начала основной программы). * Функция подсчета адреса для data_table находится в библиотеке flash_driver.h под названием get_address_data_table, возвращает 32-х битное значение-адрес, где должна лежать необходимая информация. *
В не зависимости от того, что за программа (MAIN или BOOTLOADER), необходимо выполнить следующие действия: 1) Подключить библиотеку UBI_SDK.h; 2) Раскомментировать необходимые define (что за контроллер, что за устройство, что за тип программы); 3) Изменить значение необходимых define (относящиеся к прошивке, описаны выше); 4) В device_info должны быть переменные следующие глобальные переменные: * - base_BootloaderInfo_struct* boot_from_flash; * - base_FWInfo_struct FW_from_flash; * - base_BoardInfo_struct Board_from_flash; * - (extern) base_BootloaderInfo_struct *BootloaderInfo; * - (extern) base_FWInfo_struct FW_Info; * - (extern) base_BoardInfo_struct Board_Info; * Первые три - переменные, с которыми программа будет работать непосредственно. Последние три - базовое заполнение для как раз тех структур (extern - могут лежать в другой библиотеке), если при считывании что-то пошло не так. 5) Там, где происходит получение данных из flash обязательно прочитать boot_from_flash, FW_from_flash и Board_Info; 6) Теперь необходимо отправить эти данные в две библиотеки, которые помогают работать с прошивкой (функции Get_Struct_For_Check_Jump и Init_Need_Struct_For_FW); 7) В главном исполняемом файле main.c после init_device_info() необходимо вызвать функцию Jump_To_Main(); 8) После инициализации всей периферии, нужно вызвать Set_Configuration_For_Bootloader() (она будет выполняться только в случае, если это программа-загрузчик).
Сама библиотека bootloader.c/h может находится в папке SDK/Src или в папке Core/Src. Значения не имеет.
Все ее функции доступны для вызова в других файлах, где подключена эта библиотека.
Функция определяет, должен ли контроллер переходить в программу MAIN. Контроллер переходит при следующих условиях: