Перейти к содержанию
    

MAX10. Прошивка по UART.

Имеется плата с Altera MAX10 на борту.

Написал две прошивки: Одна моргает светодиодами (загрузил в CFM0), а другая связывается по UART с компьютером (загрузил в CFM1). Все работает, прошивка переключается (через внешние ножки CONFIG_SEL и nCONFIG).

Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0). Для этого в код включил On-Chip Flash IP, выставил Read and Write на всех секторах (UFM0, UFM1, CFM0, CFM1).

Чтение, стирание и запись в UFM0 и UFM1 работает нормально.

 

По тому же принципу сначала стираю, а затем загружаю в CFM0 (адресное пространство: 0x19000 - 0x2FFFF) .rpd файл, сгенерированный автоматически при сборке .pof файла.

Все успешно пишется (проверил повторным считыванием из памяти и подсчетом CRC кода), но прошивка не запускается (переключиться на эту прошивку пытаюсь внешними ножками CONFIG_SEL и nCONFIG). То есть я "тупо" копирую .rpd файл в адресное пространство CFM0 и перезагружаю MAX10 - но прошивка из CFM0 не пускается.

 

В чем может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0).

И вот что интересно. Обычный микроконтроллер в мелком корпусе будет стоить 0,5 долл или даже дешевле. При этом связь с хостом он никогда не потеряет и всегда будет перепрограммировать ПЛИС. А если постараться то и сканирование выводов можно сделать.

А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет. Причем с хоста к железке уже никак не доберетесь.

И вот вопрос: "А на кой Вам такие сложности"?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить.

Альтера любит биты по порядку местами поменять.

 

А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет

С максом 10 есть маленькая проблемка, у него флешка внутренняя, никаким контроллером до нее не долезть так что без самопрограммирования никак.

Для страховки там 2 региона, в один кладем бутлоадер не изменяемый, в другой прошивку рабочую. Бутлоадер можно защитить, в том числе и железными битами защиты. И никакой кирпич не грозит. Также там встроенный механизм поочередной загрузки в случае повреждения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется плата с Altera MAX10 на борту.

Написал две прошивки: Одна моргает светодиодами (загрузил в CFM0), а другая связывается по UART с компьютером (загрузил в CFM1). Все работает, прошивка переключается (через внешние ножки CONFIG_SEL и nCONFIG).

Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0). Для этого в код включил On-Chip Flash IP, выставил Read and Write на всех секторах (UFM0, UFM1, CFM0, CFM1).

Чтение, стирание и запись в UFM0 и UFM1 работает нормально.

 

По тому же принципу сначала стираю, а затем загружаю в CFM0 (адресное пространство: 0x19000 - 0x2FFFF) .rpd файл, сгенерированный автоматически при сборке .pof файла.

Все успешно пишется (проверил повторным считыванием из памяти и подсчетом CRC кода), но прошивка не запускается (переключиться на эту прошивку пытаюсь внешними ножками CONFIG_SEL и nCONFIG). То есть я "тупо" копирую .rpd файл в адресное пространство CFM0 и перезагружаю MAX10 - но прошивка из CFM0 не пускается.

 

В чем может быть проблема?

У меня та же задача - програмировать rpd файл в MAX10. Не могли бы вы показать как работать с On-Chip Flash IP?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить.

Альтера любит биты по порядку местами поменять.

 

Через "Examine" прочел прошивку, и действительно, прошивка на CFM0 не совпадает с тем, что я пытаюсь прошить. Буду "копать" дальше.

 

У меня та же задача - програмировать rpd файл в MAX10. Не могли бы вы показать как работать с On-Chip Flash IP?

 

Я использовал документ UFM. Там все описано: как стирать область памяти, как записывать, как читать. Более подробно пока не могу описать - только вечером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще бы ее хорошо также считать через ваш интерфейс, для сравнения. То есть записать жетагом, и считать через интерфейс и сравнить с файлом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все успешно прошилось!!! Оказалось - нужно было выполнить реверс битов. Теперь вручную (через внешние ножки CONFIG_SEL и nCONFIG) могу переключиться на новую прошивку.

Осталось только так же по команде от хоста запустить новую прошивку.

 

Для "Jenya7":

 

Схема:

post-97106-1495038404_thumb.jpg

 

Настройки On-Chip Flash IP:

post-97106-1495038574_thumb.png

 


module Test_CFM (   input wire          Clock,
                   input wire          Reset,
                   output reg          CSR_Address,
                   output reg          CSR_REn,
                   output reg  [31:0]  CSR_WData,
                   output reg          CSR_WEn,
                   input wire  [31:0]  CSR_RData,
                   output reg  [17:0]  DATA_Address,
                   output reg          DATA_Read,
                   output reg  [31:0]  DATA_WData,
                   output reg          DATA_WEn,
                   output reg  [3:0]   DATA_BCount,
                   input wire  [31:0]  DATA_RData,
                   input wire          DATA_Wait,
                   input wire          DATA_Valid,
                   output wire         Led_1,
                   output wire         Led_2,
                   output wire         Led_3,
                   output wire         Led_4,
                   output wire         Led_5,
                   input wire  [31:0]  CFM_Data,
                   input wire          CFM_WEn,
                   input wire          CFM_Erase,
                   output wire         CFM_Ready,
                   output wire [4:0]   CFM_State
                   );

       reg [4:0]       State;
       reg [17:0]      Address;
       reg [31:0]      Register;

       localparam      STATE_Idle                                  =   0,
                       STATE_Erase                                 =   1,
                       STATE_Erase___Start_WaitIDLEState           =   3,
                       STATE_Erase___Stop_WaitIDLEState            =   4,
                       STATE_Erase___Start_DisableEraseProtection  =   5,
                       STATE_Erase___Stop_DisableEraseProtection   =   6,
                       STATE_Erase___Start_EraseSector             =   7,
                       STATE_Erase___Stop_EraseSector              =   8,
                       STATE_Erase___Start_WaitEraseSector         =   9,
                       STATE_Erase___Stop_WaitEraseSector          =   10,
                       STATE_Erase___Start_EnableEraseProtection   =   11,
                       STATE_Erase___Stop_EnableEraseProtection    =   12,
                       STATE_Write                                 =   13,
                       STATE_Write___Start_WaitIDLEState           =   14,
                       STATE_Write___Stop_WaitIDLEState            =   15,
                       STATE_Write___Start_DisableEraseProtection  =   16,
                       STATE_Write___Stop_DisableEraseProtection   =   17,
                       STATE_Write___Start_Write                   =   18,
                       STATE_Write___Stop_Write                    =   19,
                       STATE_Write___Start_EnableEraseProtection   =   20,
                       STATE_Write___Stop_EnableEraseProtection    =   21;

       always @( posedge Clock )
       begin
               if ( ~Reset )
               begin
                       State       <=  STATE_Idle;
               end
               else
               begin
                       if ( CFM_Erase )
                       begin
                               Address     <=  18'h18FFF;
                               State       <=  STATE_Erase;
                       end
                       else
                       begin
                               if ( CFM_WEn )
                               begin
                                       State       <=  STATE_Write;
                                       Address     <=  Address + 18'h00001;
                                       Register    <=  CFM_Data;
                               end
                               else
                               begin
                                       case ( State )
                                               STATE_Erase:
                                               begin
                                                       State           <=  STATE_Erase___Start_WaitIDLEState;
                                               end
                                               STATE_Erase___Start_WaitIDLEState:
                                               begin
                                                       CSR_Address     <=  0;
                                                       CSR_REn         <=  1;
                                                       State           <=  STATE_Erase___Stop_WaitIDLEState;
                                               end
                                               STATE_Erase___Stop_WaitIDLEState:
                                               begin
                                                       CSR_REn         <=  0;
                                                       State           <= (CSR_RData[0] == 0 && CSR_RData[1] == 0)?(STATE_Erase___Start_DisableEraseProtection):(STATE_Erase___Start_WaitIDLEState)
;
                                               end
                                               STATE_Erase___Start_DisableEraseProtection:
                                               begin
                                                       CSR_Address     <=  1;
                                                       CSR_WEn         <=  1;
                                                       CSR_WData       <=  32'hF7FFFFFF;
                                                       State           <=  STATE_Erase___Stop_DisableEraseProtection;
                                               end
                                               STATE_Erase___Stop_DisableEraseProtection:
                                               begin
                                                       CSR_WEn         <=  0;
                                                       State           <=  STATE_Erase___Start_EraseSector;
                                               end
                                               STATE_Erase___Start_EraseSector:
                                               begin
                                                       CSR_Address     <=  1;
                                                       CSR_WEn         <=  1;
                                                       CSR_WData       <=  32'hF7DFFFFF;
                                                       State           <=  STATE_Erase___Stop_EraseSector;
                                               end
                                               STATE_Erase___Stop_EraseSector:
                                               begin
                                                       CSR_WEn         <=  0;
                                                       State           <=  STATE_Erase___Start_WaitEraseSector;
                                               end
                                               STATE_Erase___Start_WaitEraseSector:
                                               begin
                                                       CSR_Address     <=  0;
                                                       CSR_REn         <=  1;
                                                       State           <=  STATE_Erase___Stop_WaitEraseSector;
                                               end
                                               STATE_Erase___Stop_WaitEraseSector:
                                               begin
                                                       CSR_REn         <=  0;
                                                       State           <= ( CSR_RData[4] == 1 )?(STATE_Erase___Start_EnableEraseProtection):(STATE_Erase___Start_WaitEraseSector
);
                                               end
                                               STATE_Erase___Start_EnableEraseProtection:
                                               begin
                                                       CSR_Address     <=  1;
                                                       CSR_WData       <=  32'hFFFFFFFF;
                                                       CSR_WEn         <=  1;
                                                       State           <=  STATE_Erase___Stop_EnableEraseProtection;
                                               end
                                               STATE_Erase___Stop_EnableEraseProtection:
                                               begin
                                                       CSR_WEn         <=  0;
                                                       State           <=  STATE_Idle;
                                               end
                                               STATE_Write:
                                               begin
                                                       State           <=  STATE_Write___Start_WaitIDLEState;
                                               end
                                               STATE_Write___Start_WaitIDLEState:
                                               begin
                                                       CSR_Address     <=  0;
                                                       CSR_REn         <=  1;
                                                       State           <=  STATE_Write___Stop_WaitIDLEState;
                                               end
                                               STATE_Write___Stop_WaitIDLEState:
                                               begin
                                                       CSR_REn         <=  0;
                                                       State           <= (CSR_RData[0] == 0 && CSR_RData[1] == 0)?(STATE_Write___Start_DisableEraseProtection):(STATE_Write___Start_WaitIDLEState)
;
                                               end
                                               STATE_Write___Start_DisableEraseProtection:
                                               begin
                                                       CSR_Address     <=  1;
                                                       CSR_WEn         <=  1;
                                                       CSR_WData       <=  32'hF7FFFFFF;
                                                       State           <=  STATE_Write___Stop_DisableEraseProtection;
                                               end
                                               STATE_Write___Stop_DisableEraseProtection:
                                               begin
                                                       CSR_WEn         <=  0;
                                                       State           <=  STATE_Write___Start_Write;
                                               end
                                               STATE_Write___Start_Write:
                                               begin
                                                       if ( ~DATA_Wait )
                                                       begin
                                                               DATA_WEn        <=  1;
                                                               DATA_Address    <=  Address;
                                                               DATA_BCount     <=  1;
                                                               DATA_WData      <=  Register;
                                                               State           <=  STATE_Write___Stop_Write;
                                                       end
                                               end
                                               STATE_Write___Stop_Write:
                                               begin
                                                       if ( ~DATA_Wait )
                                                       begin
                                                               DATA_WEn        <=  0;
                                                               State           <=  STATE_Write___Start_EnableEraseProtection;
                                                       end
                                               end
                                               STATE_Write___Start_EnableEraseProtection:
                                               begin
                                                       CSR_Address     <=  1;
                                                       CSR_WData       <=  32'hFFFFFFFF;
                                                       CSR_WEn         <=  1;
                                                       State           <=  STATE_Write___Stop_EnableEraseProtection;
                                               end
                                               STATE_Write___Stop_EnableEraseProtection:
                                               begin
                                                       CSR_WEn         <=  0;
                                                       State           <=  STATE_Idle;
                                               end
                                       endcase
                               end
                       end
               end
       end

       assign      CFM_Ready   =   ( State == STATE_Idle );
       assign      CFM_State   =   State;

       assign  Led_1   =   Address[0];
       assign  Led_2   =   Address[1];
       assign  Led_3   =   Address[2];
       assign  Led_4   =   Address[3];
       assign  Led_5   =   Address[4];
endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для "Jenya7":

 

Спасибо большое.

 

Кстати я нашел сайт, там парень хорошо объясняет.

https://embeddedfpgadesign.wordpress.com/20...-max10_flash-v/

Для того кто знает верилог вообще праздник какой то ))

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...