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

GOWIN JTAG программирование из МК

Здравствуйте.

Кто-нибудь делал для Gowin обновление конфигурации по JTAG с микроконтроллера ?

Что-то описание у них мутное какое-то. В описании одно пишут.

Создал SVF файл - так как-то иначе все выходит.

У меня пока что получилось только ID и регистр статуса прочитать.

Теперь бьюсь со стиранием - никак не выходит.

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


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

1 hour ago, dimka76 said:

Здравствуйте.

Кто-нибудь делал для Gowin обновление конфигурации по JTAG с микроконтроллера ?

Что-то описание у них мутное какое-то. В описании одно пишут.

Создал SVF файл - так как-то иначе все выходит.

У меня пока что получилось только ID и регистр статуса прочитать.

Теперь бьюсь со стиранием - никак не выходит.

Сделано и работает. bin файл из папки \impl\pnr

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


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

On 10/7/2022 at 12:16 PM, Realking said:

Сделано и работает. bin файл из папки \impl\pnr

Я в исходном сообщении забыл указать, что интересует программирование встроенной FLASH, а не внешней.

Вы каким документом пользовались ?

У вас какая марка FPGA ?

У меня GW1N-9

В UG290 в описании алгоритма стирания FALSH написано

Quote

7. Move the state machine in turn: Run-Test-ldle -> Select-DR-Scan->
Capture-DR -> Shift-DR -> Transfer 32 bits-> Exit1-DR -> Update-DR ->
Run-Test-ldle (This step only applied to GW1N-4.Skip this step for
other devices);

 

Но в сгенерированном SVF файле этот пункт присутствует.

Пробовал выполнять это действие, пробовал не выполнят. Все равно не стирается.

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


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

Заработало у меня стирание.

Пропустил в документации UG290 одно важное замечание в разделе Read ID CODE Instance

Quote

4. Move the state machine, back to Run-Test-Idle after going from Exit1-IR to Update-IR, and then run the state machine at least 3 clock cycles in Run-Test-Idle.

После добавление этих дополнительны тактов в конце загрузки регистра инструкций стирание заработало.

Только вот ни на диаграмме состояний (Figure 6-10), ни на временной диаграмме (Fugure 6-8 и Figure 6-9) это никак не отображено.

Также ничего об этом не сказано в разделе Instruction Register and Data register.

 

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


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

Доброго дня!
Задача у меня та же: программирование GW1N-9 микроконтроллером через JTAG.
Благодарю за подсказку выше (про 3 clock cycles), получилось прошить SRAM, наконец-то DONE взлетел!
Далее пытаюсь прошить внутренний FLASH, никак не получается.
Есть много сомнений и вопросов:
1) Bitstream (.bin) должен быть одинаковый для SRAM и FLASH ?
2) Должна ли быть разница в порядке бит каждого байта (для SRAM - MSB, для FLASH - LSB) ?
3) Что делать с 4-х байтовым autoboot-pattern (ничего/ вставить в начале/ заменить в начале 4 байта) ?
4) Что такое address ? Индекс 256-байтного блока сдвинутый на 6 ?
Это конечно не все возможные вопросы... )))
Но может кто-нибудь прояснит

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


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

On 11/13/2022 at 1:05 PM, Ask78 said:

1) Bitstream (.bin) должен быть одинаковый для SRAM и FLASH ?
2) Должна ли быть разница в порядке бит каждого байта (для SRAM - MSB, для FLASH - LSB) ?
3) Что делать с 4-х байтовым autoboot-pattern (ничего/ вставить в начале/ заменить в начале 4 байта) ?
4) Что такое address ? Индекс 256-байтного блока сдвинутый на 6 ?

1) Не знаю, со SRAM не работал

2) см. п1

   Но для FLASH я выталкиваю младшим битом вперед. При этом еще и из бинарного файла читаю не байтами,

   а 32-х битными словами. И перед отправкой этих слов я в них меняю порядок байт с Little-endian на Big-endian.

   Может и костыль, но без этого у меня не работало.

3) Его после завершения программирования надо вставить (записать) по нужному адресу. Иначе ПЛИС

   не будет грузить FLASH в свою SRAM при реконфигурации.

4) С эти действительно мутно как-то.

 

Создайте в Gowin IDE файл SVF и пользуйтесь им как шпаргалкой. Очень помогает.

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


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

dimka76, благодарю за подсказки, заработало, ура!!!
SVF действительно полезно смотреть как шпаргалку.

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


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

Доброго всем времени суток!

При реализации механизма программирования внутренней флеш-памяти ПЛИС GW1N-9C через JTAG на GPIO МК внезапно выяснилось, что данные в Y-страницы флеш-памяти (4 байта) необходимо писать в перевёрнутом виде, т.е. младший по смешению из bin-файла байт (например, по смещению 0) пишется по смещению старшего байта (т.е. по смещению 3) и так далее. При этом, что интересно, в генерируемом средой Gowin Programmer SVF-файле этого переворота нет, судя по моим наблюдениям. Соответственно если использовать SVF без модификаций, то КМК прошить им ПЛИС не получится. Может быть кто-то пробовал и готов поделиться результатом?

В документации от Gowin на этот счёт путаница: они пишут про программирование Y-страницы начиная с LSB, говоря о битах, но на самом деле LSB - это младший байт. При этом в проекте openFPGALoader (файл src/gowin.cpp) также присутствует переворот (tx[3-x] = t[x]), что подтверждает мою гипотезу:

for (int ypage = 0; ypage < nb_iter; ypage++) {
  unsigned char *t = buffer+xoffset + 4*ypage;
  for (int x=0; x < 4; x++) {
    if (page == 0)
      tx[3-x] = t[x];
    else
      tx[x] = t[x];
  }
  _jtag->shiftDR(tx, NULL, 32);

  if (!is_gw1n1)
    _jtag->toggleClk(40);
}

Условие page == 0 соответствует программированию конфигурации ПЛИС. При прошивке пользовательской области флеша переворот байт не выполняется.

В любом случае после добавления аналогичного кода перестановки байт в слове Y-страницы прошивка успешно стартовала и ПЛИС работает как было задумано.

PS: В руководстве от Gowin процедура верификации внутреннего флеша после программирования также описана некорректно. Для её лучшего понимания советую посмотреть на генерируемый средой SVF-файл.

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


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

Продолжение истории про программирование Gowin:
1. Прошитая сигнатура Readable Pattern, дающая возможность чтения флеша, действует до выполнения двух последовательных команд реконфигурации. Т.е. если мы прошиваем образ с Readable Pattern, выполняем реконфигурирование, читаем и сравниваем, а далее перезаписываем в начало нулевой Y-страницы в нулевой X-странице значение Autoboot pattern, то после очередной реконфигурации мы имеем вполне рабочую ПЛИС с вполне успешно читаемой внутренней флеш-память. Если выполнить ещё одну операцию реконфигурирования, то доступ на чтение пропадает. Однако для гарантии лучше дёрнуть питанием.

2. В паузах между транзакциями на шине уровень TCK должен быть нулём. При единице в периоды неактивности наблюдаются непонятные случайные сбои. Например, внутренняя флеш может стираться через раз или даже через пять попыток.

3. При чтении регистров (например Status) и т.п. через TDI нужно вдвигать нули. При вдвигании единиц наблюдались непонятные сбои при программировании. Оригинальный Gowin Programmer делает именно так.

4. Требование к частоте при программировании относится к операциям стирания флеша, записи адреса Y-страницы и записи данных Y-страницы. Т.е. для успешного программирования Y-страницы необходимо без каких либо задержек сразу после перехода TAP в состояние Run-Test/Idle дать требуемое и описанное в документации число импульсов на определённой частоте. Если будет пауза или частота будет ниже (например, 1 МГц), то страница может не записаться, может записаться с искажениями или даже бывает сдвиг на одну страницу, т.е. первая страница пишется на место нулевой и так далее.

В целом резюме такое: алгоритм программирования, описанный в документации, логика работы Gowin Programmer и алгоритм программирования в виде SFV это три разных алгоритма. Причём если последовательность программирования через JTAG из Gowin Programmer ещё хоть как-то соответствует данным их SVF, то оба два этих алгоритма слабо похоже на описание в из документа.

PS: в итоге после многих мытарств удалось реализовать прошивку GW1N-9C из МК через JTAG на GPIO-пинах МК с использованием встроенного PWM, позволяющего сформировать требуемый тактовый сигнал в паузах. В качестве примера можно посмотреть на реализацию эмуляции JTAG на базе MPSSE в проекте RV-Debugger - https://github.com/sipeed/RV-Debugger-BL702/blob/main/firmware/app/usb2uartjtag/jtag_process.c.gowin, которая как раз содержит в себе довольно много костылей для вышеописанных случаев.

 

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


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

On 3/8/2023 at 7:37 PM, makc said:

Продолжение истории про программирование Gowin:

Я реализовал программирование по JTAG. Подглядывал в SVF файл. Фактически деле больше по SVF, чем по документации, но документацией тоже пользовался.

И openFPGAloader тоже смотрел.

Вот моя темка кстати 

 

 

А в чем собственно у вас вопрос ? Как  я понял вы же уже все реализовали.

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


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

8 минут назад, dimka76 сказал:

А в чем собственно у вас вопрос ? Как  я понял вы же уже все реализовали.

Тема была создана для обмена опытом и обсуждения особенностей программирования, которые не всегда покрыты документацией. Вопрос у меня глобально остался только один: у кого-нибудь получилось прошить внутренний флеш с верификацией с помощью генерируемого средой SVF? У меня через OpenOCD+кабель на FT2232H так и не получилось, хотя тот же кабель без единого сбоя шьёт из Gowin Programmer.

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


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

On 3/8/2023 at 10:55 PM, makc said:

Тема была создана для обмена опытом и обсуждения особенностей программирования, которые не всегда покрыты документацией. Вопрос у меня глобально остался только один: у кого-нибудь получилось прошить внутренний флеш с верификацией с помощью генерируемого средой SVF? У меня через OpenOCD+кабель на FT2232H так и не получилось, хотя тот же кабель без единого сбоя шьёт из Gowin Programmer.

Я bin файл прошиваю.

On 3/8/2023 at 10:55 PM, makc said:

Тема была создана для обмена опытом и обсуждения особенностей программирования

Может тогда с моей темой как объединить ?

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


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

8 минут назад, dimka76 сказал:

Я bin файл прошиваю.

Я не про "что", а про "как". Понятное дело, что в SVF лежит преобразованный bin + ещё кто что.

9 минут назад, dimka76 сказал:

Может тогда с моей темой как объединить ?

Объединил.

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


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

Освежу темку. Кто-нибудь пользовался утилитой svf2jam для конвертации svf-файла в jam-файл ? Запускаю эту утилиту с двумя параметрами - входной и выходной файл. В результате получаю выходной файл нулевой длины и сообщение "TCK Frequency set to 0 MHz". Хотя частота во входном файле задана 2,5 МГц. Не могу понять что происходит и чего не хватает для нормальной работы этой утилите.

 

svf2jam.jpg

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


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

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

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

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

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

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

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

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

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

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