Files
Balsam_167/Source/Internal/bios.c
Andrey f741741cf8 Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
2026-10-12 12:24:48 +03:00

661 lines
43 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Команды обмена, загрузчика, чтения памяти и EEPROM. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "crc16.h": таблицы и функции вычисления контрольных сумм CRC. */
#include "crc16.h"
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
//#include "flash_tools.h"
//#include "spartan_tools.h"
//#include "big_dsp_module.h"
int flag_DEBUG = false; /* Флаг отладочного режима */ /* Объявляет flag_DEBUG — флаг DEBUG; false — данные false. Начальное значение задаётся справа от знака равенства. */
//static unsigned int *RecvPtr;
//static int BS_LoadOK = false; /** Флаг успешности приема блока */
/**********************************************************/
/* Прототипы функций, используемых и определенных в файле */
/**********************************************************/
//static int _getbyte(int *addr, int offs);
/* Начинает функцию read_memory; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
unsigned int read_memory(unsigned long addr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает read_memory и возвращает (*(volatile int *)(addr)). */
return (*(volatile int *)(addr));
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию write_memory; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void write_memory(unsigned long addr, unsigned int data)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение (*(volatile int *)( addr )) = data;; порядок элементов сохраняется. */
(*(volatile int *)( addr )) = data;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
/* Начинает функцию get_command; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
int get_command(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет cmd — данные cmd. */
int cmd;
/* Объявляет crc — данные crc; rcrc — данные rcrc. */
unsigned int crc, rcrc;
/* Проверяет if(rs_arr->RS_DataReady); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) // Данные по RS пришли
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_DataReady значением false; rs arr RS данные Ready. */
rs_arr->RS_DataReady = false;
/* Записывает cmd значением rs_arr->RS_Header[1]; данные cmd. */
cmd = rs_arr->RS_Header[1]; // Прочитали номер команды
// Провераем длину команды дла считываниа CRC
/* Проверяет if((RS_Len[cmd]<3) или (RS_Len[cmd]>MAX_RECEIVE_LENGTH)); последующий оператор выполняется только при истинном условии. */
if((RS_Len[cmd]<3) || (RS_Len[cmd]>MAX_RECEIVE_LENGTH))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Завершает get_command и возвращает -1. */
return -1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(cmd == CMD_LOAD); последующий оператор выполняется только при истинном условии. */
if(cmd == CMD_LOAD) // Если команда загрузки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением cmd; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = cmd;
/* Завершает get_command и возвращает cmd. */
return cmd; // Нет проверки crc
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else // Все остальные команды
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Считываем crc из посылки
/* Записывает crc значением (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |; данные crc. */
crc = (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |
/* Продолжает список аргументов, полей или выражение (rs_arr->RS_Header[RS_Len[cmd]-2]) ;; порядок элементов сохраняется. */
(rs_arr->RS_Header[RS_Len[cmd]-2]) ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Рассчитываем crc из посылки
/* Записывает rcrc значением 0xffff; данные rcrc. */
rcrc = 0xffff;
/* Записывает rcrc значением get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) ); данные rcrc. */
rcrc = get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) );
/* Проверяет if(crc == rcrc); последующий оператор выполняется только при истинном условии. */
if(crc == rcrc) // Провераем crc
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением cmd; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = cmd;
/* Завершает get_command и возвращает cmd. */
return cmd;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Завершает get_command и возвращает -1. */
return -1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Стандартный ответ, без параметров */
/* Начинает функцию Answer; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void Answer(RS_DATA *rs_arr,int n)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc — данные crc. */
int crc;
/* Записывает flag_DEBUG значением true; флаг DEBUG. */
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением n; rs arr буфер. */
rs_arr->buffer[1] = n;
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16( crc, rs_arr->buffer, 2); данные crc. */
crc = get_crc_16( crc, rs_arr->buffer, 2);
/* Записывает rs_arr->buffer[2] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[2] = LOBYTE(crc);
/* Записывает rs_arr->buffer[3] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[3] = HIBYTE(crc);
/* Записывает rs_arr->buffer[4] значением 0; rs arr буфер. */
rs_arr->buffer[4] = 0;
/* Записывает rs_arr->buffer[5] значением 0; rs arr буфер. */
rs_arr->buffer[5] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 6);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Внутреннаа ф-циа */
/* Начинает функцию _getbyte; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
static char _getbyte(unsigned int *addr, int32 offs)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет address — адрес. Хранит указатель на данные. */
unsigned int *address;
/* Объявляет byte — данные byte. */
unsigned int byte;
/* Записывает address значением addr + offs/2; адрес. */
address = addr + offs/2;
/* Записывает byte значением *address; данные byte. */
byte = *address;
/* Проверяет if(offs%2) return LOBYTE(byte); последующий оператор выполняется только при истинном условии. */
if(offs%2) return LOBYTE(byte);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else return HIBYTE(byte);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* начальные установки (не работает)*/
/* Начинает функцию init; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void init(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/*
if(rs_arr->RS_Header[2]==3)
{
if (rs_arr->curr_baud!=57600)
{ RS_SetLineSpeed(rs_arr,57600);
rs_arr->curr_baud= 57600;
} }
if(rs_arr->RS_Header[2]==4)
{
if (rs_arr->curr_baud!=115200)
{ RS_SetLineSpeed(rs_arr,115200);
rs_arr->curr_baud= 115200;
} }
Answer(rs_arr,CMD_INIT);
rs_arr->BS_LoadOK = false;
*/
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/**@name Комманды
* Комманды, вызываемые через последовательный канал
*/
//@{
/** Инициировать загрузку блока.
Настраивает прием блока данных */
/* Начинает функцию initload; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void initload(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает rs_arr->RS_Length значением rs_arr->RS_Header[9] & 0xFF; rs arr RS длина. */
rs_arr->RS_Length = rs_arr->RS_Header[9] & 0xFF;
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[8] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[7] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[6] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Увеличивает rs_arr->RS_Length значением 2; rs arr RS длина. */
rs_arr->RS_Length += 2;
/* Записывает rs_arr->pRS_RecvPtr значением (unsigned int *)Address; данные rs_arr->pRS_RecvPtr. */
rs_arr->pRS_RecvPtr = (unsigned int *)Address; //(unsigned int *)Address;
/* Записывает rs_arr->pRecvPtr значением (unsigned int *)Address; данные rs_arr->pRecvPtr. */
rs_arr->pRecvPtr = (unsigned int *)Address; //(unsigned int *)Address;
/* Записывает no_write значением 1; no запись. */
no_write = 1;
/* Вызывает Answer с аргументами (rs_arr,CMD_INITLOAD) в текущей последовательности операций. */
Answer(rs_arr,CMD_INITLOAD);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Загрузка блока.
Вызываетса после загрузки блока через RS */
/* Начинает функцию load; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void load(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет rcrc — данные rcrc; crc — данные crc. */
unsigned int rcrc, crc;
/* Записывает crc значением (_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-1) << 8) +; данные crc. */
crc = (_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-1) << 8) +
/* Вызывает _getbyte с аргументами (rs_arr->pRecvPtr, rs_arr->RS_Length-2) в текущей последовательности операций. */
_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-2);
/* Записывает rs_arr->RS_Header[0] значением rs_arr->addr_recive; данные rs_arr->RS_Header. */
rs_arr->RS_Header[0] = rs_arr->addr_recive;
// CNTRL_ADDR;
/* Записывает rs_arr->RS_Header[1] значением CMD_LOAD; данные rs_arr->RS_Header. */
rs_arr->RS_Header[1]=CMD_LOAD;
/* Записывает rcrc значением 0xffff; данные rcrc. */
rcrc = 0xffff;
/* Записывает rcrc значением get_crc_16( rcrc, rs_arr->RS_Header, 2); данные rcrc. */
rcrc = get_crc_16( rcrc, rs_arr->RS_Header, 2);
/* Записывает rcrc значением get_crc_16b( rcrc, rs_arr->pRecvPtr, rs_arr->RS_Length-2); данные rcrc. */
rcrc = get_crc_16b( rcrc, rs_arr->pRecvPtr, rs_arr->RS_Length-2);
/* Проверяет if(rcrc == crc); последующий оператор выполняется только при истинном условии. */
if(rcrc == crc)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает Answer с аргументами (rs_arr,CMD_LOAD) в текущей последовательности операций. */
Answer(rs_arr,CMD_LOAD);
/* Записывает rs_arr->BS_LoadOK значением true; данные rs_arr->BS_LoadOK. */
rs_arr->BS_LoadOK = true;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->BS_LoadOK значением false; данные rs_arr->BS_LoadOK. */
rs_arr->BS_LoadOK = false;
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/** Выполнить программу в формате Serial Boot.
@precondition Должна быть произведена загрузка блока
Адрес программы беретса из заголовка и
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
@see load */
/* Начинает функцию run; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void run (RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает run без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прочитать ачейку памати */
/* Начинает функцию peek; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void peek(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Объявляет Data — данные; crc — данные crc. */
unsigned int Data, crc;
/* Записывает flag_DEBUG значением true; флаг DEBUG. */
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Проверяет if(Address<PROM_LEN); последующий оператор выполняется только при истинном условии. */
if(Address<PROM_LEN)
/* Вызывает Seeprom_read. Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
Seeprom_read(Address,(unsigned int *)&Data,2);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else Data = read_memory(Address);
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением CMD_PEEK; rs arr буфер. */
rs_arr->buffer[1] = CMD_PEEK;
/* Записывает rs_arr->buffer[2] значением LOBYTE(Data); rs arr буфер. */
rs_arr->buffer[2] = LOBYTE(Data);
/* Записывает rs_arr->buffer[3] значением HIBYTE(Data); rs arr буфер. */
rs_arr->buffer[3] = HIBYTE(Data);
/* Записывает rs_arr->buffer[4] значением LOBYTE(CpuTimer2.InterruptCount); rs arr буфер. */
rs_arr->buffer[4] = LOBYTE(CpuTimer2.InterruptCount);
/* Записывает rs_arr->buffer[5] значением HIBYTE(CpuTimer2.InterruptCount); rs arr буфер. */
rs_arr->buffer[5] = HIBYTE(CpuTimer2.InterruptCount);
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16(crc, rs_arr->buffer, 6); данные crc. */
crc = get_crc_16(crc, rs_arr->buffer, 6);
/* Записывает rs_arr->buffer[6] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[6] = LOBYTE(crc);
/* Записывает rs_arr->buffer[7] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[7] = HIBYTE(crc);
/* Записывает rs_arr->buffer[8] значением 0; rs arr буфер. */
rs_arr->buffer[8] = 0;
/* Записывает rs_arr->buffer[9] значением 0; rs arr буфер. */
rs_arr->buffer[9] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 10);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Записать в ачейку памати */
/* Начинает функцию poke; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void poke(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Объявляет Data — данные. */
unsigned int Data;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Data значением 0; данные. */
Data = 0;
/* Записывает Data значением (Data<<8) | (rs_arr->RS_Header[7] & 0xFF); данные. */
Data = (Data<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Data значением (Data<<8) | (rs_arr->RS_Header[6] & 0xFF); данные. */
Data = (Data<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Проверяет if(Address<PROM_LEN); последующий оператор выполняется только при истинном условии. */
if(Address<PROM_LEN)
/* Вызывает Seeprom_write. Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
Seeprom_write(Address,(unsigned int *)&Data,2);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else write_memory(Address,Data);
/* Вызывает Answer с аргументами (rs_arr,CMD_POKE) в текущей последовательности операций. */
Answer(rs_arr,CMD_POKE);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Передать блок памати */
/* Начинает функцию upload; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void upload(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение int32 Address, Length, crc;; порядок элементов сохраняется. */
int32 Address, Length, crc;
/* Записывает no_write значением 1; no запись. */
no_write = 1; // Флаг отладочного режима
// stopp=1;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Length значением rs_arr->RS_Header[9] & 0xFF; длина. */
Length = rs_arr->RS_Header[9] & 0xFF;
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[8] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[7] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[6] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением CMD_UPLOAD; rs arr буфер. */
rs_arr->buffer[1] = CMD_UPLOAD;
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16( crc, rs_arr->buffer, 2); данные crc. */
crc = get_crc_16( crc, rs_arr->buffer, 2);
/* Записывает crc значением get_crc_16b( crc, (unsigned int *)Address, Length); данные crc. */
crc = get_crc_16b( crc, (unsigned int *)Address, Length);
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
/* Записывает rs_arr->buffer[0] значением CMD_UPLOAD; rs arr буфер. */
rs_arr->buffer[0] = CMD_UPLOAD;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
/* Вызывает RS_BSend. Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */
RS_BSend(rs_arr,(unsigned int*)Address, Length);
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
/* Записывает rs_arr->buffer[0] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[0] = LOBYTE(crc);
/* Записывает rs_arr->buffer[1] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[1] = HIBYTE(crc);
/* Записывает rs_arr->buffer[2] значением 0; rs arr буфер. */
rs_arr->buffer[2] = 0;
/* Записывает rs_arr->buffer[3] значением 0; rs arr буфер. */
rs_arr->buffer[3] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 4+2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить XILINX.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
так же смотрит магическое слово в начале прошивки
@see load */
/* Начинает функцию xflash; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void xflash(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает xflash без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
@see load */
/* Начинает функцию tflash; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void tflash(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// volatile unsigned long Address1,Address2;
// volatile unsigned long Length, LengthW;
/*
if(!rs_arr->BS_LoadOK)
{
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
return;
}
Address1 = rs_arr->RS_Header[5] & 0xFF;
Address1 = (Address1<<8) | (rs_arr->RS_Header[4] & 0xFF);
Address1 = (Address1<<8) | (rs_arr->RS_Header[3] & 0xFF);
Address1 = (Address1<<8) | (rs_arr->RS_Header[2] & 0xFF);
Address2 = rs_arr->RS_Header[9] & 0xFF;
Address2 = (Address2<<8) | (rs_arr->RS_Header[8] & 0xFF);
Address2 = (Address2<<8) | (rs_arr->RS_Header[7] & 0xFF);
Address2 = (Address2<<8) | (rs_arr->RS_Header[6] & 0xFF);
Length = rs_arr->RS_Header[13] & 0xFF;
Length = (Length<<8) | (rs_arr->RS_Header[12] & 0xFF);
Length = (Length<<8) | (rs_arr->RS_Header[11] & 0xFF);
Length = (Length<<8) | (rs_arr->RS_Header[10] & 0xFF);
LengthW = Length/2;
if (LengthW*2<Length) LengthW++;
if( (Address2 < 0x100000) || (Address2 > 0x180000) || ((Address2+LengthW) > 0x180000) )
{
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
return;
}
run_flash_data(Address1,Address2, LengthW );
Answer(rs_arr,CMD_TFLASH);
*/
/* Завершает tflash без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
@see load */
/* Начинает функцию extendbios; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void extendbios(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address1 — адрес 1; Address2 — адрес 2; Length — длина. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned long Address1,Address2,Length;
/* Объявляет code — данные code. */
unsigned int code;
/* Записывает Address1 значением rs_arr->RS_Header[5] & 0xFF; адрес 1. */
Address1 = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Address2 значением rs_arr->RS_Header[9] & 0xFF; адрес 2. */
Address2 = rs_arr->RS_Header[9] & 0xFF;
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[8] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[7] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[6] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Записывает Length значением rs_arr->RS_Header[13] & 0xFF; длина. */
Length = rs_arr->RS_Header[13] & 0xFF;
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[12] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[12] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[11] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[11] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[10] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[10] & 0xFF);
/* Записывает code значением rs_arr->RS_Header[14] & 0xFF; данные code. */
code=rs_arr->RS_Header[14] & 0xFF;
/* Вызывает switch с аргументами ( code ) в текущей последовательности операций. */
switch ( code )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Прошиваем EPROM Из RAM
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* 0x44 is intentionally rejected by old firmware. Conversely this build
* rejects legacy code 4, preventing writes with the wrong GUI profile. */
/* Ветвь выбора для 0x44; выполняется при совпадении селектора switch. */
case 0x44:
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Ветвь выбора для 4; выполняется при совпадении селектора switch. */
case 4:
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Проверяет if (!Length или Address1 >= BALSAM167_EEPROM_FIRMWARE_BYTES/2UL или; последующий оператор выполняется только при истинном условии. */
if (!Length || Address1 >= BALSAM167_EEPROM_FIRMWARE_BYTES/2UL ||
/* Продолжает список аргументов, полей или выражение Length > BALSAM167_EEPROM_FIRMWARE_BYTES-Address1*2UL) return;; порядок элементов сохраняется. */
Length > BALSAM167_EEPROM_FIRMWARE_BYTES-Address1*2UL) return;
/* Вызывает Seeprom_write. Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
Seeprom_write(Address1,(unsigned int*)Address2,Length);
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
// Читаем из EPROM в RAM
/* Ветвь выбора для 5; выполняется при совпадении селектора switch. */
case 5: Seeprom_read(Address1,(unsigned int*)Address2,Length);
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Обрабатывает значения селектора, для которых нет отдельной ветви case. */
default:
/* Завершает extendbios без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает Answer с аргументами (rs_arr,CMD_EXTEND) в текущей последовательности операций. */
Answer(rs_arr,CMD_EXTEND);
/* Завершает extendbios без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
//@}