Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ISP команды для NXP
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
DreamTwister
Добрый день.
Собственно, такая проблема.
Делаю свою утилиту для заливки прошивок под процессор NXP2388.

Собственно, заинтересовала ISP команда T. В описании на процессор ее нет. В интернете подробного описания - тоже.
Какой ее синтаксис и что она делает?
zltigo
Цитата(DreamTwister @ Apr 21 2010, 14:46) *
Собственно, заинтересовала ISP команда T. В описании на процессор ее нет. В интернете подробного описания - тоже.
Какой ее синтаксис и что она делает?

А с чего Вы взяли, что она есть, если ее нигде нет smile.gif. Провидение? Полагаю, что Вы пытались назвать командой постфикс команды 'G'. Для этого надо знать, что такое Thumb и что такое Arm.
Ну или давайте ссылку не не подробное описание.
DreamTwister
Врятли это префикс команда 'G'. Для своей утилиты использовал "донора" (lpcprog.c lpc21isp.c), где и наткнулся на очень интересный код.

Код
                long chars, xtal;
                unsigned long ticks;
                chars = (17 * IspEnvironment->BinaryLength + 1) / 10;
                WatchDogSeconds = (10 * chars + 5) / atol(IspEnvironment->baud_rate) + 10;
                xtal = atol(IspEnvironment->StringOscillator) * 1000;
                ticks = (unsigned long)WatchDogSeconds * ((xtal + 15) / 16);
                DebugPrintf(2, "Entering ISP; re-synchronizing (watchdog = %ld seconds)\n", WatchDogSeconds);
                sprintf(temp, "T %lu\r\n", ticks);
                SendComPort(IspEnvironment, temp);
                ReceiveComPort(IspEnvironment, Answer, sizeof(Answer)-1, &realsize, 1,100);
                if (strcmp(Answer, "OK\r\n") != 0)
                {
                    ResetKeyboardTtySettings();
                    DebugPrintf(2, "No answer on 'watchdog timer set'\n");
                    return (NO_ANSWER_WDT);
                }
                SendComPort(IspEnvironment, "G 10356\r\n");
                Sleep(200);
                nQuestionMarks = 0;
                WaitForWatchDog = 1;


Как видите тут 'G' без префикса, но она идет после 'T', а не наоборот, да и к тому же у 'T' есть свой собственный операнд. Да и посылка имеет обвязку, как у команды. При отправке оной(T) процессор возвращает код ошибки 12\r\n.

Исходя из приведенного выше кода напрашивается вывод, что это что-то аля запуск со сбросом по WDT.

И еще, искал в интернете и нашел один документик, но, правда, немного не по теме, но там есть замечательная фраза:
http://www.cast.com.au/esdk/lpc2/boot-loader.html

Цитата
There are hidden commands in the boot loader that NXP has chosen not to disclose (for example the T command) which does things in a sneaky way as will be seen later. The G command accepts the argument "tEsT" in lieu of the branch address.
KRS
Цитата(DreamTwister @ Apr 21 2010, 15:46) *
Собственно, заинтересовала ISP команда T.

Есть такая команда! Когда ковырялся с бутлоадером от LPC2129, там еще баги были можно было защищенный flash легко считать.
Но толку от нее мало - парралельная загрузка.
http://electronix.ru/forum/index.php?s=&am...st&p=133717
DreamTwister
Цитата(KRS @ Apr 22 2010, 14:11) *
Есть такая команда! Когда ковырялся с бутлоадером от LPC2129, там еще баги были можно было защищенный flash легко считать.
Но толку от нее мало - парралельная загрузка.
http://electronix.ru/forum/index.php?s=&am...st&p=133717


Спасибо! Буду теперь знать! Думаю пригодится в ближайшем будущем.

Но у меня еще одна проблема. Процессор не реагирует на команду 'G'. Точнее отказывается запускать программу.
В ответ получаю 0\r\n\. А дальше - тишина.
В качестве операндов перепробовал несколько комбинаций адресов. Интересно, что адрес вычисленный процедурой-донором тоже не подошел.
Не подходит ни нулевой адрес, ни адрес таблицы векторов прерываний. Переключение между ARM и Thumb не помогло(запускаю в ARM, ставил второй режим на случай "а вдруг заработает").
KRS
Цитата(DreamTwister @ Apr 22 2010, 12:57) *
Но у меня еще одна проблема. Процессор не реагирует на команду 'G'. Точнее отказывается запускать программу.
В ответ получаю 0\r\n\. А дальше - тишина.

А что должно быть?
0 - это ответ бутлоадера, что все ок! Он запихивает его в FIFO UART и делает вызов по адресу указанному в G, в принципе можно вернуться! (BX LR) и продолжить работу с бутлоадером. Например, для корректной работы надо загрузить функцию, которая отмапит flash на адрес 0. Я еще грузил функции которые позволяли быстро загрузить 8кб в RAM, а потом уже обычными командами бутлоадера шить flash, ( а то родной загрузкой через USB->UART из-за полудуплексоного простокола очень медленно).
И первоначальные тесты платы гружу по очереди в RAM и выполняю, так что G работает без проблем!
DreamTwister
Цитата(KRS @ Apr 22 2010, 15:08) *
И первоначальные тесты платы гружу по очереди в RAM и выполняю, так что G работает без проблем!


А можно узнать модели и версии процессоров, с которыми Вы работали? Я только что провел эксперимент с 'G ' на 2144, все отработало на ура!
Аналогичная последовательность команд на 2388 не приводит к должному результату. Причем 2388 запускается после передергивания питания.
Вот, что самое интересное.

Дак почему же один процессор запускается с "адреса сброса", а второй нет?
KRS
Цитата(DreamTwister @ Apr 22 2010, 13:32) *
Аналогичная последовательность команд на 2388 не приводит к должному результату. Причем 2388 запускается после передергивания питания.

Так вы из флеша пытаетесь запустить штатный код?
Т.к. бутлоадер частично инициализирует переферию, в частности на 23xx, 24xx PLL. Возможно вы его неккорректно отключаете или переинециализируете. И чип виснет.

Цитата(DreamTwister @ Apr 22 2010, 13:32) *
А можно узнать модели и версии процессоров, с которыми Вы работали?

2129, 2103, 1768, 2368, 2478
zltigo
Цитата(DreamTwister @ Apr 22 2010, 05:37) *
ходя из приведенного выше кода напрашивается вывод, что это что-то аля запуск со сбросом по WDT.

исходя из кода эти телодвижения для какого-то неведомого контроллера, который ответит на '?'
"Bootloader" я лично таких НЕ знаю. Наверное какие-нибудь старинные версии загрузчиков.
Цитата(DreamTwister @ Apr 22 2010, 11:32) *
Дак почему же один процессор запускается с "адреса сброса", а второй нет?

Это уже проблемы Вашей программы. Загрузчик запускает исполнение с любого адреса. А чего там у Вас не работает ему не ведомо.
Не забудьте только добавить A или T. А какого, Вы запускаете с какого-то магического адреса, а не с того, с которого он стартует по включению питания, т.е. 0 ?
DreamTwister
Цитата(KRS @ Apr 22 2010, 16:36) *
Так вы из флеша пытаетесь запустить штатный код?
Т.к. бутлоадер частично инициализирует переферию, в частности на 23xx, 24xx PLL. Возможно вы его неккорректно отключаете или переинециализируете. И чип виснет.


Так и есть! Через IAR глянул, что творится в процессоре - висим на while (!PLLSTAT_bit.PLOCK);.


Цитата
Это уже проблемы Вашей программы. Загрузчик запускает исполнение с любого адреса. А чего там у Вас не работает ему не ведомо.
Не забудьте только добавить A или T. А какого, Вы запускаете с какого-то магического адреса, а не с того, с которого он стартует по включению питания, т.е. 0 ?


Магическим адресом является, по сути, адрес таблици векторов прерываний(как я понял), а не 0. Разницы, кстати, замечено не было.


Собственно, проблема ясна. Теперь о путях решения:
1)Правильно инициализировать PLL. Но есть проблема. Не факт, что все прошивки, заливаемые моей утилитой, будут моими, и PLL там будет адекватно проинициализирован.
2)После заливки основной программы прошивать по адресу 0x40000000 прошивку, которая будет делать сброс по WDT и все. После такого сброса можно быть уверенным, что процессор перешел а дефолтовые настройки.
3)Сбросить процессор программно через свою утилиту сразу после загрузки flash. При помощи какого-нибудь недокументированного способа. Но возможно ли это?


Что посоветуете? Писать микроутилиту для RAM, как бы долго это не был?

Цитата(zltigo @ Apr 22 2010, 16:58) *
исходя из кода эти телодвижения для какого-то неведомого контроллера, который ответит на '?'
"Bootloader" я лично таких НЕ знаю. Наверное какие-нибудь старинные версии загрузчиков.

Не забудьте только добавить A или T.



Самого удивило! G без выбора режима, а на ? не Synchronized. Вот, собственно, потому и спросил.
zltigo
Цитата(DreamTwister @ Apr 22 2010, 14:02) *
Магическим адресом является, по сути, адрес таблици векторов прерываний(как я понял), а не 0. Разницы, кстати, замечено не было.

Да ну? От какой сырости таблица стала не с 0 начинаться....
Цитата
Собственно, проблема ясна. Теперь о путях решения:

Проблема совершенно не ясна, поскольку вместо всего это Вам следует после прошивки послать контроллер на 0 адрес И ВСЕ. Причем думать на какой адрес на самом деле не надо - в HEX файле он есть.
Код
AT200/AES ISP/Terminal for LPC2/1000 V0.31.4 by I.Zalts. Windows 5.1
    Erase all FLASH!
    Set Boot Control mode: 0
       HEX file:  [Ctrl+F9] .\works\exe\loader_usm3.hex
    Serial Port: COM12    Baud: 115200
      Oscilator: 72000KHz

Dumb Terminal started
     [Alt+X] to exit

Go to LPC2000 Bootloader...
Wait...
Entering to LPC2000 Bootloader -Ok
Bootcode: 3.3.0
Chip  ID: LPC2378 512KB ROM/32KB SRAM Rev:B (ID:385940773/0x1700FD25)

Erased Sectors 0..27
File    : '.\works\exe\loader_usm3.hex' -Loaded
       Linear Address: 00000000
         Load Address: 00000000
    Run Address Found: 00000000
    End of File
           Image size: 8192
Sector 00..............................................................................
...............
Sector 01..............................................................................
...............
Download Finished.
Now launching (000000) the brand new code....Success.

    Found LPC2378 (Watchdog Mode)
    Loader CRC: Valid
    Kernel CRC: Not Found(FFFFFFFF)
DreamTwister
Цитата(zltigo @ Apr 22 2010, 18:37) *
Да ну? От какой сырости таблица стала не с 0 начинаться....

Проблема совершенно не ясна, поскольку вместо всего это Вам следует после прошивки послать контроллер на 0 адрес И ВСЕ. Причем думать на какой адрес на самом деле не надо - в HEX файле он есть.


Вот в том то и дело, что утилита по прошивке определяет начальный адрес из *.hex файла не 0, что само по себе странно.
Но, как выяснилось после манипуляций с IAR, прошивка стартует, но не замыкает PLL.
Причем с обоих адресов. Вероятно, утилита определяет стартовый адрес не 0, а тот, куда мы попадаем из 0. unsure.gif
Интересная ситуация.

Сейчас меня интересует вопрос сброса после прошивки. Так как выяснилось, что просто перейти на 0-ой адрес - мало!
zltigo
Цитата(DreamTwister @ Apr 23 2010, 05:42) *
Вот в том то и дело, что утилита по прошивке определяет начальный адрес из *.hex файла не 0...
.....Так как выяснилось, что просто перейти на 0-ой адрес - мало!

Простите, но выяснилось только одно - сначала надо научиться писать и написать, то, что прошивать. А потом уже прошивать. И тогда все будет и определяться, и всего будет достаточно.
DreamTwister
Цитата(zltigo @ Apr 23 2010, 11:21) *
Простите, но выяснилось только одно - сначала надо научиться писать и написать, то, что прошивать. А потом уже прошивать. И тогда все будет и определяться, и всего будет достаточно.



Был бы этот *.hex файл полностью моей разработкой - проблем бы не было. Но это не так. Приходиться выкручиваться.
zltigo
Цитата(DreamTwister @ Apr 23 2010, 07:38) *
Приходиться выкручиваться.

Не выкрутитесь, ибо из дерьма шоколад не делается. Займитесь содержимым прошивки.
KRS
А почему бы вам не устроить ресет с помощью watchdog?
zltigo
Цитата(KRS @ Apr 23 2010, 16:17) *
А почему бы вам не устроить ресет с помощью watchdog?

А почему-бы не подумать каким чудом по ресету прошивка с точкой входа фиг знает куда работает, как долго это чудо продлится и что делать, когда везение с вылетом в какое-то состояние, которое сейчас кажется рабочим вдруг закончится.
DreamTwister
Цитата(KRS @ Apr 23 2010, 20:02) *
А почему бы вам не устроить ресет с помощью watchdog?


Сделал, все работает. Прописал с адреса 0x40000200 малюсенькую программку, которая только запускает WDT и все. Теперь процессор полностью сбрасывается и запускает основную прошивку!




Цитата(zltigo @ Apr 23 2010, 21:47) *
А почему-бы не подумать каким чудом по ресету прошивка с точкой входа фиг знает куда работает, как долго это чудо продлится и что делать, когда везение с вылетом в какое-то состояние, которое сейчас кажется рабочим вдруг закончится.



Я прекрасно понимаю Ваше негодование по поводу всего этого, так сказать, "колхоза" со сбросом через WDT и RAM. Логичнее было бы исправить основную прошивку.
Просто в моем случае такой возможности нет. Как следствие - поиск альтернативных путей.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.