Alik221 0 16 мая, 2017 Опубликовано 16 мая, 2017 · Жалоба Имеется плата с 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 не пускается. В чем может быть проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 16 мая, 2017 Опубликовано 16 мая, 2017 · Жалоба А случаем биты в пределах байта там не нужно перевернуть при записи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 16 мая, 2017 Опубликовано 16 мая, 2017 · Жалоба Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0). И вот что интересно. Обычный микроконтроллер в мелком корпусе будет стоить 0,5 долл или даже дешевле. При этом связь с хостом он никогда не потеряет и всегда будет перепрограммировать ПЛИС. А если постараться то и сканирование выводов можно сделать. А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет. Причем с хоста к железке уже никак не доберетесь. И вот вопрос: "А на кой Вам такие сложности"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить. Альтера любит биты по порядку местами поменять. А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет С максом 10 есть маленькая проблемка, у него флешка внутренняя, никаким контроллером до нее не долезть так что без самопрограммирования никак. Для страховки там 2 региона, в один кладем бутлоадер не изменяемый, в другой прошивку рабочую. Бутлоадер можно защитить, в том числе и железными битами защиты. И никакой кирпич не грозит. Также там встроенный механизм поочередной загрузки в случае повреждения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба Имеется плата с 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alik221 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить. Альтера любит биты по порядку местами поменять. Через "Examine" прочел прошивку, и действительно, прошивка на CFM0 не совпадает с тем, что я пытаюсь прошить. Буду "копать" дальше. У меня та же задача - програмировать rpd файл в MAX10. Не могли бы вы показать как работать с On-Chip Flash IP? Я использовал документ UFM. Там все описано: как стирать область памяти, как записывать, как читать. Более подробно пока не могу описать - только вечером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба еще бы ее хорошо также считать через ваш интерфейс, для сравнения. То есть записать жетагом, и считать через интерфейс и сравнить с файлом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alik221 0 17 мая, 2017 Опубликовано 17 мая, 2017 · Жалоба Все успешно прошилось!!! Оказалось - нужно было выполнить реверс битов. Теперь вручную (через внешние ножки CONFIG_SEL и nCONFIG) могу переключиться на новую прошивку. Осталось только так же по команде от хоста запустить новую прошивку. Для "Jenya7": Схема: Настройки On-Chip Flash IP: 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 0 18 мая, 2017 Опубликовано 18 мая, 2017 (изменено) · Жалоба Для "Jenya7": Спасибо большое. Кстати я нашел сайт, там парень хорошо объясняет. https://embeddedfpgadesign.wordpress.com/20...-max10_flash-v/ Для того кто знает верилог вообще праздник какой то )) Изменено 18 мая, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться