Mr_Progger 0 30 октября, 2019 Опубликовано 30 октября, 2019 · Жалоба Доброго дня. Процессор BF537. Стоит задача грузить разные LDRы в зависимости от некоторых условий. Флеш память подключена на прямую к шине. Во флеш записан LDR, который должна грузить программа. LDR формирую с параметрами Binary, 16-bit. Во флеш LDR попадает, проверенно вычитыванием из флеша. Распарсил LDR в соответствие с его структурой. Происходит выброс исключения при попытке записи блока LDR в адрес 0xffa00000. unsigned char *flashP; flashP = (unsigned char *)0x20000000; unsigned int targetAddress; unsigned int count; unsigned short flag; do { memcpy(&targetAddress, flashP, sizeof(targetAddress)); memcpy(&count, flashP + sizeof(targetAddress), sizeof(count)); memcpy(&flag, flashP + sizeof(targetAddress) + sizeof(count), sizeof(flag)); if (flag & BFLAG_53X_IGNORE) { flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag) + count; continue; } if ( !(flag & BFLAG_53X_ZEROFILL)) { if (targetAddress >= 0xFFA00000) asm("nop;"); memcpy((void *)targetAddress, flashP + sizeof(targetAddress) + sizeof(count) + sizeof(flag), count); flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag) + count; } else { memset((void *)targetAddress, 0x00, count); flashP += sizeof(targetAddress) + sizeof(count) + sizeof(flag); } } while ( !(flag & BFLAG_53X_FINAL)); asm("nop;"); asm("P5.H = 0xffa0;"); asm("P5.L = 0x0000;"); asm("jump(p5);"); asm("nop;"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 30 октября, 2019 Опубликовано 30 октября, 2019 · Жалоба Я это делаю средствами встроенного загрузчика в BF533. Может быть в каком-то месте ошибусь, делал это лет 5 назад. Мне нужно переключаться между двумя LDR-ами. Один из них это бут, второй основная программа. Вроде ничего не мешает по тому же принципу сделать множество LDR. Программы у меня хранятся в SPI флешке. Когда нужно перейти из одной программы в другую я формирую ресет. Перед этим записываю в регистр UART scratch (вроде так называется регистр) номер программы которую нужно загрузить. Этот регистр не меняет содержимое после сброса. После сброса проц начинает грузить бут написанный на ассемблере, там проверяется содержимое регистра UART и исходы из этого подсовывается адрес откуда грузить LDR. Этот адрес уже передается во встроенный в процессор бут и он занимается загрузкой LDR. Если нужны детали поищу исходники. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kv193 0 30 октября, 2019 Опубликовано 30 октября, 2019 (изменено) · Жалоба uriy дело говорит. Сам таким занимался на ADSP-21xx, теперь и на BF. Используйте встроенный в BF загрузчик. Изменено 30 октября, 2019 пользователем kv193 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mr_Progger 0 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Спасибо. Действительно у блекфина есть встроенный загрузчик в постоянной памяти. Вроде разобрался, но появилась другая проблема. делаю так. asm("P0.H = HI(0xEF000008 );"); asm("P0.L = LO(0xEF000008 ) ;"); asm("R7.H = HI(0x20000000) ; "); asm("R7.L = LO(0x20000000) ;"); asm("JUMP (P0);"); Когда гружу основную программу через jtag, все ок, основная программа грузит LDR с адреса 0x20000000. Проблема возникает когда работаю без программатора. U-Boot грузить основную программу . Основная программа в свою очередь должна загрузить нужный LDR, но этого не происходит. Я предполагаю, что для загрузки LDR нужно быть в режиме супервизера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Ну тогда раз у вас u-boot я бы перед перезагрузкой менял переменную окружения bootcmd в которой указано откуда грузить программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться