/* Команды обмена, загрузчика, чтения памяти и 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(Addressbuffer[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(AddressRS_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 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; /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } //@}