|
Проблема с LPC1768, Не записывается внутренний флеш по адресу 0x70000 |
|
|
|
Dec 6 2010, 20:04
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Имеется LPC1768. Написан свой загрузчик по UART, расположен в первых 16K флэш памяти. Все работало нормально. Но недавно программа увеличилась в размерах и потребовалась запись уже в предпоследний сектор флешки - по адресу 0x70000. И тут произошла засада - оно просто не пишется, функция IAP возвращает SUCCESS, а данные по адресу не записаны. Начал разбираться что до как. В итоге есть две платы, на обоих LPC1768, но с разными маркировками. На одной память пишется нормально, на второй - такая вот ерунда. И эта проблемная плата не одна такая - на данный момент три опытные штуки, процессоры на них из одной партии. Прочитал BootROM, дизассемблировал, нашел много интересного  . У LPC-ей оказывается есть 2 килобайта теневого флеша, и там записано много любопытных вещей - ID процессора, точки старта, методы блокировки JTAG, и - таблица адресов секторов. Так вот - у сбойных чипов эта таблица для предпоследнего сектора содержит 0x78000 вместо законных 0x70000 в нормальном чипе. Такая информация в теневой флешке могла быть записана только на заводе. Вопрос такой - кто-нибудь уже написал такую большую программу для LPC17xx, что понадобился сектор по адресу 0x70000? Или просто у кого-нибудь были проблемы с флешкой по адресу 0x70000?
|
|
|
|
|
Dec 7 2010, 08:09
|
Группа: Участник
Сообщений: 11
Регистрация: 27-02-07
Пользователь №: 25 714

|
Цитата(VslavX @ Dec 6 2010, 23:04)  Прочитал BootROM, дизассемблировал, нашел много интересного  . У LPC-ей оказывается есть 2 килобайта теневого флеша, и там записано много любопытных вещей - ID процессора, точки старта, методы блокировки JTAG, и - таблица адресов секторов. не расскажешь как? ну или результаты поподробнее. заранее спасибо
|
|
|
|
|
Dec 7 2010, 12:23
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(oman @ Dec 7 2010, 13:09)  не расскажешь как? ну или результаты поподробнее. заранее спасибо Это всё в отладчике видно. Даже если нет отладчика, то просто залить прогу, которая будет сливать память (флэш) бутлодера через любой инентерфейс (UART например). Цитата(VslavX @ Dec 7 2010, 01:04)  Вопрос такой - кто-нибудь уже написал такую большую программу для LPC17xx, что понадобился сектор по адресу 0x70000? Или просто у кого-нибудь были проблемы с флешкой по адресу 0x70000? Чертовски странно. Я такую большую прогу не писал, но зато сохранял настройки по адресу 0x78000, в последний сектор. Проблем не было. Зачем было извращаться (разработчикам) с предпоследним сектором - непонятно.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Dec 7 2010, 13:48
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(scifi @ Dec 7 2010, 09:08)  А вообще LPC1768 уже официально доведённый продукт? Может быть, это у Вас инженерные образцы? Рабочие процессоры: S61873.1 ZSD0936- - 36 неделя 2009-го Нерабочие процессоры: SU5617.1 ZSD1012- - 12 неделя 2010-го Обе партии вполне серийные Еще отличие - в ранних чипах загрузчик 4.1, в новых - 4.2. Судя по всему - загрузчик тоже записан во отдельную флеш, так как ревизия чипа не менялась, поэтому маловероятно чтобы делали новую маску только для изменения BootROM. Цитата(oman @ Dec 7 2010, 10:09)  не расскажешь как? ну или результаты поподробнее. заранее спасибо Берем считываем отладчиком или своей программой 8 килобайт по адресу 0x1FFFE000 в файл, потом запускаем IDA и много думаем  Потом выясняем как осуществляется доступ к теневым 2K и соответственно пишем свою программку чтобы эти 2 килобайта прочитать. А результаты пока такие что в партии процессоров в этих 2килобайтах глючная таблица адресов начала предпоследнего сектора Цитата(GetSmart @ Dec 7 2010, 14:23)  Чертовски странно. Я такую большую прогу не писал, но зато сохранял настройки по адресу 0x78000, в последний сектор. Проблем не было. А для последнего сектора проблем и нету - для него в теневой таблице записан правильный базовый адрес.
|
|
|
|
|
Dec 7 2010, 13:55
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(GetSmart @ Dec 7 2010, 15:49)  FlashMagic тоже не может прописать адреса 0x70000..0x77ffff ? Не пробовал. А что - это идея, надо бы проверить, спасибо. Правда у меня там RS-232 нету и перемычки на 2.10 тоже. Upd: попробовал. Программа flashmagic ублюдочная - 6 мегабайт инсталлятор, полчаса грузит в свой внутренний буфер большой хекс файл. Сначала просто выполнил стирание и записал большой файл. Он записался нормально! Я даже обалдел слегка. Потом вспомнил что IAP то возвращает успех. И записал снова и выполнил верификацию - опа - олень попался - ничего не записано! То есть баг тот же самый. Общий итог - через FlashMagic и заводской загрузчик тоже не работает. И на том же самом месте. В-общем-то у меня к NXP основная претензия - закрытость загрузчика и алгоритма записи в память. А теперь они еще и напортачили там
|
|
|
|
|
Dec 8 2010, 05:56
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(GetSmart @ Dec 7 2010, 23:50)  VslavX, у Вас есть код для чтение 2к теневого флэш 17хх? А как бы я его иначе прочитал?  CODE DWORD save[512];
__ramfunc void copy_hidden_flash(void) { DWORD i; PDWORD s, d;
i = 512; s = (PDWORD)NULL; d = save; *((volatile DWORD*)0x40084000) |= 0x40; do { *d++ = *s++; } while(--i); *((volatile DWORD*)0x40084000) &= ~0x40; }
Функция должна быть в RAM, потому как программный флеш полностью отрубается при переключении на теневую флешку. Приведенной выше функцией я скопировал теневой флеш в RAM и потом его уже разбирал.
|
|
|
|
|
Dec 9 2010, 09:04
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070

|
Цитата(VslavX @ Dec 7 2010, 16:55)  В-общем-то у меня к NXP основная претензия - закрытость загрузчика и алгоритма записи в память. А после дизассемблирования алгоритм записи в память не появился? Если напрямую, без использования их ПЗУ работать? И как еще один вариант. Попробовать настроить регистры отладчика или MPU на перехват обращения к глючной части теневого ПЗУ и подправить результат.
|
|
|
|
|
Dec 9 2010, 10:26
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(vmp @ Dec 9 2010, 11:04)  А после дизассемблирования алгоритм записи в память не появился? Если напрямую, без использования их ПЗУ работать? В принципе появился, но с документацией лучше. В принципе я запросил ее у NXP хотя бы касательно программирования флешки, посмотрим что скажут. Цитата(vmp @ Dec 9 2010, 11:04)  И как еще один вариант. Попробовать настроить регистры отладчика или MPU на перехват обращения к глючной части теневого ПЗУ и подправить результат. Думал я об этом, возни достаточно много - когда идет обращение к теневой флешке, то основная флеш не работает - это обработчик исключения надо в ОЗУ размещать, а все обработчики у меня по шаблону автогенерируюся и на HAL/RTOS завязаны. Но, наверное от шаблона отступить все-таки можно. MPU у меня уже используется, все регионы заняты, а вот точка останова по обращению к данным - вполне подойдет, cпасибо за идею. Upd: почитал про DWT (Data Watchpoint and Trace) - не пойдет, процессор именно останавливается, а не генерирует исключение. Таки остается только MPU.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|