Скорость JTAG в OpenOCD

Issue #4 resolved
Maxim Lashkevich created an issue

Пытаюсь повышать частоту житага JLINK при работе вашего OpenOCD. Почему-то корректно работает только с частотой 300кГц. Если ставить, скажем, 1000кГц и выше то выдает ошибку

Error: Bootflash operation timeout
Error: failed erasing sectors 0 to 16
Error: flash_erase returned -902

Наша версия openocd работает вплоть до 1500кГц на этом житаге и шьет без проблем. На 300 очень низкая скорость прошивки выходит для большого проекта... Во вложении прикладываю логи openocd.

Comments (14)

  1. Bogdan Kolbov
    • changed status to open

    Хм, интересно. Опять же, я пользуюсь swd и при работе с внутреннего клока свободно прошиваю на 1,8 МГц с помощью StLink. Кстати, а вы в свои эксперименты при какой тактовой частоте проводите? Пробовали со внешней?

    Также стоит отметить, что текущая версия openocd отличается от версии годичной давности как минимум тем, что они другую начали использовать билиотеку libjaylink, т.е. возможно на внутреннем уровне изменился подход к оперированию с jtag на jlink. И так как текущая версия openocd является "грязной" девелоперской версией, то вполне возможно, что новая библиотека еще не отлажена как следует.

  2. Bogdan Kolbov

    По логам вижу что происходит событие таймаута при ожидании флага от контроллера флешки. Ради интереса увеличил значение таймаута на порядки.

  3. Maxim Lashkevich reporter

    У нас на плате стоит внешний кварц на 12МГц. Последняя версия openocd с увеличенным таймаутом флешки работает. Может быть в ревизиях камня дело? Цифровые решения говорили, что там менялась скорость работы флешки между самой первой ревизией камня, где еще были проблемы с CAN интерфейсом, и ревизией, где он уже работает. Самая первая ревизия была быстрее, после чего у нас были проблемы с параметром BOOTFLASH->T_ACC - на первой ревизии он был меньше и всё работало. А на последних его надо минимум 6 ставить. У нас запаян камень, где написано NT32M4F1, где работает CAN, но еще не работают ЧРВ.

  4. Bogdan Kolbov

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

    По поводу скорости записи и openocd. В общем там можно еще значительно скорость самой записи поднять, сконфигурировав в процедуре инициализации драйвера тайминги флешки. Но для этого нужно продумать оптимальный способ получения значения текущей тактовой частоты контроллера внутри драйвера, т.к. тайминги завязаны на частоту. Вы не экспериментировали с подобным?

  5. Maxim Lashkevich reporter

    С точки зрения частоты работы житага - 1500КГц работает, но с точки зрения скорости самой прошивки - не очень. Вот отчет работы команды load вашего openocd:

    Loading section .isr_vector, size 0x250 lma 0x0
    Loading section .text, size 0x1f52c lma 0x250
    Loading section .data, size 0x23d4 lma 0x1f77c
    Start address 0x1a78c, load size 138064
    Transfer rate: 18 KB/sec, 13806 bytes/write.
    

    Вот нашего:

    Loading section .isr_vector, size 0x250 lma 0x0
    Loading section .text, size 0x1f52c lma 0x250
    Loading section .data, size 0x23d4 lma 0x1f77c
    Start address 0x1a78c, load size 138064
    Transfer rate: 34 KB/sec, 13806 bytes/write.
    

    В два раза почти разница в скорости. Я думал увеличение значения таймаута на порядки - это было для теста... Так и оставите? По поводу частоты работы и таймингов. Я не в курсе, кажется, не экспериментировали. Сейчас Дмитрий Шпак подойдет и опишет подробнее, как он делал.

  6. Bogdan Kolbov

    Да, таймаут можно увеличить. Это просто превентивная мера от зависаний в while при опросе флагов (хоть они и крайне маловерятны) - нет особой разницы от таймаута в пол секунды или пары секунд.

    А можете этот тестовый elf скинуть? Я чисто для интереса попробую его через swd залить.

    А вообще функции записи, что моей что в вашей версии, сделаны весьма похоже, там простора для фантазий то особо и не нету. И поэтому весьма странным является различие по скорости в целых 2 раза. Кстати, а если не через gdb, а напрямую через openocd, то какие скорости будут?

  7. Dmitry Shpak

    Bogdan Kolbov Как я понял, речь идёт о частоте ядра. В нашем прошиваторе, она никак не настраивается и не сбрасывается. Поэтому алгоритм прошива, загружаемый в RAM работает с той частотой, которую имеет в это время процессор.

    То есть, если никакой программы во флеш не было зашито и PLL не настроен, то алгоритм будет работать с минимальной скоростью (ядро тактируется от внутреннего RC-генератора, вроде). Если же перед началом прошивки во флеше была прога, которая настроила PLL, то прошивка будет идти на частоте 100 МГц.

  8. Bogdan Kolbov

    Пробовал через swd 1,8 МГц. Контроллер работает от внешнего 16 МГц кварца (на CPE "1").

    Напрямую через openocd (функция program):

    wrote 131072 bytes from file /mnt/hgfs/HostPublic/test.elf in 6.328534s (20.226 KiB/s)
    

    Вот через функцию load в gdb:

    Loading section .isr_vector, size 0x250 lma 0x0
    Loading section .text, size 0x1e5a0 lma 0x250
    Loading section .data, size 0x1550 lma 0x1e7f0
    Start address 0x1afc8, load size 130368
    Transfer rate: 16 KB/sec, 13036 bytes/write.
    

    Ну да, в целом цифры скоростей схожи, так что вариант влияния интерфейса можно отбросить.

    Dmitry Shpak, хорошо, я вас понял.

    То есть, если никакой программы во флеш не было зашито и PLL не настроен, 
    то алгоритм будет работать с минимальной скоростью (ядро тактируется от внутреннего RC-генератора, вроде).
    

    А вот это не факт. Если на ноге CPE будет лог. 1, то ядро будет работать на частоте внешнего кварца.

  9. Bogdan Kolbov

    Провел ряд экспериментов. А именно попробовал использовать функции записи из вашего драйвера, заменив свои. Результаты полностью повторяют цифры из моего сообщения выше. Т.е. весьма вероятно что сам мой драйвер здесь не причем и причина кроется явно либо в последней версии openocd либо в железе.

  10. Maxim Lashkevich reporter

    А попробуйте наш openocd тогда целиком? Вдруг на вашем железе через SWD он будет шить с той же скоростью тоже? Правда, он старенький и конфиги ему нужные старенькие.

  11. Bogdan Kolbov

    Попробовал, цифры не особо изменились.

    GDB:

    Loading section .isr_vector, size 0x250 lma 0x0
    Loading section .text, size 0x1e5a0 lma 0x250
    Loading section .data, size 0x1550 lma 0x1e7f0
    Start address 0x1afc8, load size 130368
    Transfer rate: 17 KB/sec, 13036 bytes/write.
    

    OpenOCD:

    ** Programming Started **
    auto erase enabled
    Info : clearing status regiser...
    Info : erasing MAIN memory...
    Info : flash memory erased succesfully.
    target state: halted
    target halted due to breakpoint, current mode: Thread
    xPSR: 0x61000000 pc: 0x20000054 msp: 0x2002fffc
    wrote 1048576 bytes from file filename.elf in 31.172358s (32.850 KiB/s)
    ** Programming Finished **
    ** Verify Started **
    target state: halted
    target halted due to breakpoint, current mode: Thread
    xPSR: 0x61000000 pc: 0x2000002e msp: 0x2002fffc
    target state: halted
    target halted due to breakpoint, current mode: Thread
    xPSR: 0x61000000 pc: 0x2000002e msp: 0x2002fffc
    verified 130368 bytes in 4.193962s (30.356 KiB/s)
    ** Verified OK **
    

    При этом при прошивке напрямую, он делает это странно - пишет всю флеш, а верифицирует непосредственно саму прошивку.

  12. Maxim Lashkevich reporter

    Спасибо. Ну ладно, значит какие-то аппаратные завязки здесь на SWD. Пусть пока остается пока так, тогда? Вы версию с увеличенными таймаутами на форуме как конечную версию выложите? Тему можно закрывать, думаю.

  13. Log in to comment