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

Добрый день.

Собственно, такая проблема.

Делаю свою утилиту для заливки прошивок под процессор NXP2388.

 

Собственно, заинтересовала ISP команда T. В описании на процессор ее нет. В интернете подробного описания - тоже.

Какой ее синтаксис и что она делает?

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


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

Собственно, заинтересовала ISP команда T. В описании на процессор ее нет. В интернете подробного описания - тоже.

Какой ее синтаксис и что она делает?

А с чего Вы взяли, что она есть, если ее нигде нет :). Провидение? Полагаю, что Вы пытались назвать командой постфикс команды 'G'. Для этого надо знать, что такое Thumb и что такое Arm.

Ну или давайте ссылку не не подробное описание.

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


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

Врятли это префикс команда '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.

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


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

Собственно, заинтересовала ISP команда T.

Есть такая команда! Когда ковырялся с бутлоадером от LPC2129, там еще баги были можно было защищенный flash легко считать.

Но толку от нее мало - парралельная загрузка.

http://electronix.ru/forum/index.php?s=&am...st&p=133717

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


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

Есть такая команда! Когда ковырялся с бутлоадером от LPC2129, там еще баги были можно было защищенный flash легко считать.

Но толку от нее мало - парралельная загрузка.

http://electronix.ru/forum/index.php?s=&am...st&p=133717

 

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

 

Но у меня еще одна проблема. Процессор не реагирует на команду 'G'. Точнее отказывается запускать программу.

В ответ получаю 0\r\n\. А дальше - тишина.

В качестве операндов перепробовал несколько комбинаций адресов. Интересно, что адрес вычисленный процедурой-донором тоже не подошел.

Не подходит ни нулевой адрес, ни адрес таблицы векторов прерываний. Переключение между ARM и Thumb не помогло(запускаю в ARM, ставил второй режим на случай "а вдруг заработает").

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


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

Но у меня еще одна проблема. Процессор не реагирует на команду 'G'. Точнее отказывается запускать программу.

В ответ получаю 0\r\n\. А дальше - тишина.

А что должно быть?

0 - это ответ бутлоадера, что все ок! Он запихивает его в FIFO UART и делает вызов по адресу указанному в G, в принципе можно вернуться! (BX LR) и продолжить работу с бутлоадером. Например, для корректной работы надо загрузить функцию, которая отмапит flash на адрес 0. Я еще грузил функции которые позволяли быстро загрузить 8кб в RAM, а потом уже обычными командами бутлоадера шить flash, ( а то родной загрузкой через USB->UART из-за полудуплексоного простокола очень медленно).

И первоначальные тесты платы гружу по очереди в RAM и выполняю, так что G работает без проблем!

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


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

И первоначальные тесты платы гружу по очереди в RAM и выполняю, так что G работает без проблем!

 

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

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

Вот, что самое интересное.

 

Дак почему же один процессор запускается с "адреса сброса", а второй нет?

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


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

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

Так вы из флеша пытаетесь запустить штатный код?

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

 

А можно узнать модели и версии процессоров, с которыми Вы работали?

2129, 2103, 1768, 2368, 2478

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


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

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

исходя из кода эти телодвижения для какого-то неведомого контроллера, который ответит на '?'

"Bootloader" я лично таких НЕ знаю. Наверное какие-нибудь старинные версии загрузчиков.

Дак почему же один процессор запускается с "адреса сброса", а второй нет?

Это уже проблемы Вашей программы. Загрузчик запускает исполнение с любого адреса. А чего там у Вас не работает ему не ведомо.

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

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


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

Так вы из флеша пытаетесь запустить штатный код?

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

 

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

 

 

Это уже проблемы Вашей программы. Загрузчик запускает исполнение с любого адреса. А чего там у Вас не работает ему не ведомо.

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

 

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

 

 

Собственно, проблема ясна. Теперь о путях решения:

1)Правильно инициализировать PLL. Но есть проблема. Не факт, что все прошивки, заливаемые моей утилитой, будут моими, и PLL там будет адекватно проинициализирован.

2)После заливки основной программы прошивать по адресу 0x40000000 прошивку, которая будет делать сброс по WDT и все. После такого сброса можно быть уверенным, что процессор перешел а дефолтовые настройки.

3)Сбросить процессор программно через свою утилиту сразу после загрузки flash. При помощи какого-нибудь недокументированного способа. Но возможно ли это?

 

 

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

 

исходя из кода эти телодвижения для какого-то неведомого контроллера, который ответит на '?'

"Bootloader" я лично таких НЕ знаю. Наверное какие-нибудь старинные версии загрузчиков.

 

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

 

 

Самого удивило! G без выбора режима, а на ? не Synchronized. Вот, собственно, потому и спросил.

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


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

Магическим адресом является, по сути, адрес таблици векторов прерываний(как я понял), а не 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)

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


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

Да ну? От какой сырости таблица стала не с 0 начинаться....

 

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

 

Вот в том то и дело, что утилита по прошивке определяет начальный адрес из *.hex файла не 0, что само по себе странно.

Но, как выяснилось после манипуляций с IAR, прошивка стартует, но не замыкает PLL.

Причем с обоих адресов. Вероятно, утилита определяет стартовый адрес не 0, а тот, куда мы попадаем из 0. :unsure:

Интересная ситуация.

 

Сейчас меня интересует вопрос сброса после прошивки. Так как выяснилось, что просто перейти на 0-ой адрес - мало!

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


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

Вот в том то и дело, что утилита по прошивке определяет начальный адрес из *.hex файла не 0...

.....Так как выяснилось, что просто перейти на 0-ой адрес - мало!

Простите, но выяснилось только одно - сначала надо научиться писать и написать, то, что прошивать. А потом уже прошивать. И тогда все будет и определяться, и всего будет достаточно.

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


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

Простите, но выяснилось только одно - сначала надо научиться писать и написать, то, что прошивать. А потом уже прошивать. И тогда все будет и определяться, и всего будет достаточно.

 

 

Был бы этот *.hex файл полностью моей разработкой - проблем бы не было. Но это не так. Приходиться выкручиваться.

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


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

Приходиться выкручиваться.

Не выкрутитесь, ибо из дерьма шоколад не делается. Займитесь содержимым прошивки.

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


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

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

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

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

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

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

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

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

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

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