Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
661 lines
43 KiB
C
661 lines
43 KiB
C
/* Команды обмена, загрузчика, чтения памяти и 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;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|
||
|
||
//@}
|