nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба 39 minutes ago, Arlleex said: Это еще как? То есть слинковали программу так, как будто она без загрузчика? И на что тогда надеетесь? Видимо я плохо описал ситуацию. Программа без загручика. Загрузчик - https://github.com/szemzoa/awboot модифицирован для загрузки бинарника из SPI NOR, содержит EGON header, залит в SPI NOR, и успешно стартует в RAM, инициализирует DDR, SPI etc... Затем awboot анализирует содержимое SPI NOR с адреса 0х10000 на наличие там хидера уже пользовательского бинарника, не EGON а самопального, содержащего Magic Code = 0х5555AAAA, а также адрес начала и конца бинарника, а затем собствено сам бинарник, и обнаружив его, загружает бинарник в DDR. Это был изначальный подход. Я же изменил этот подход: Заранее зная длину своего бинарника и его адрес в SPI NOR я убрал из своего бинарника самопальный хидер и залил его в чистом виде. И соответственно изменил подход в awboot. Теперь он просто загружает бинарник в DDR из SPI NOR с фиксированного адреса и фиксированной длины и затем стартует его. Таким образом я освободился от проблем со смещением векторов в своем бинарнике, заливаю его в исходном, рабочем виде, в чем и убедился, выводя его дамп в уарт. Но оно всеравно не работает. Сегодня попробовал подключиться на лету с помощью JLink и обнаружил,что исполнение зацикленно ходит в районе startup RTThread .. Изменено 5 сентября, 2023 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 1 час назад, nanorobot сказал: заливаю его в исходном, рабочем виде, в чем и убедился, выводя его дамп в уарт. Но оно всеравно не работает. Т.е. то, что вы заливаете, если загрузить xfel с адреса 0х40000000 и запустить с него же, работает исправно? Проверяли? Теперь, то, что загружается с флешки соответствует тому, что нужно, т.е. целостность файла и корректность считывания? 1 час назад, nanorobot сказал: что исполнение зацикленно ходит в районе startup RTThread .. Не знаю, что у вас там за ртос, но вполне возможно, если все вышеуказанное проверено, то возможно некорректный инит таймера или уарта, который уже был проинициализирован в буте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба 7 hours ago, mantech said: Т.е. то, что вы заливаете, если загрузить xfel с адреса 0х40000000 и запустить с него же, работает исправно? Проверяли? Теперь, то, что загружается с флешки соответствует тому, что нужно, т.е. целостность файла и корректность считывания? Не знаю, что у вас там за ртос, но вполне возможно, если все вышеуказанное проверено, то возможно некорректный инит таймера или уарта, который уже был проинициализирован в буте... 1. Да, работает исправно, только заливаю JLink'ом. 2. Полной верификации пока не делал, делал как выше описнано, считаю что можно быть вполне уверенным, что считывание корректно. Чуть позже проверю полностью. 3. возможно. PS. Не догоняю, как залить бинарник размером 800К с помощью xfel, ведь DDR то не инициализрована? Специальная прошивка awboot(как вариант), модифицированная таким образом, чтобы после инициализаци DDR возвращалась в режим FEL? Изменено 5 сентября, 2023 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба Так у xfel.exe есть возможность инициализировать для последующей загрузки DDR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 9 hours ago, mantech said: Т.е. то, что вы заливаете, если загрузить xfel с адреса 0х40000000 и запустить с него же, работает исправно? Проверяли? Нет, не работает, при загрузке и старте при помощи xfel ... Только при загрузке через JLink. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 2 минуты назад, nanorobot сказал: Нет, не работает, при загрузке и старте при помощи xfel .. Инит ДДР перед заливкой запускаете? Тогда чего вы ждете от загрузчика?? Добивайтесь, чтоб работала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба 4 minutes ago, mantech said: Инит ДДР перед заливкой запускаете? Тогда чего вы ждете от загрузчика?? Добивайтесь, чтоб работала. да, запускаю, само собой. Спасибо GenaSPB, просветил .. Если не инитить DDR получаю usb bulk send error Изменено 5 сентября, 2023 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 14 минут назад, nanorobot сказал: да, запускаю, само собой. Таким образом - xfel ddr t113-s3 xfel write 0x40000000 main.bin xfel exec 0x40000000 main.bin - ваш бинарник Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба да, именно так. Удивило, что после инита DDR на плате загорается лед подключенный к PE.2 До выполнения xfel exec ... Изменено 5 сентября, 2023 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба 6 минут назад, nanorobot сказал: да, именно так. По адресу 0x40000000 примерно так идет- void __attribute__((section(".start"))) __attribute__((naked)) start(void) { asm volatile ( "b Entry \n" //Jump to Entry (init.S) ".long 0x4E4F4765\n" //eGON ".long 0x3054422E\n" //.BT0 ".long 0x00000000\n" //checksum for boot0 (must be calculated !!!) ".long 0x00008000\n" //length for boot0 (32 kB) ".long 0x00000000\n" ".long 0x00000000\n" ".long 0x00000000\n" ); } ".long 0x4E4F4765\n" //eGON ".long 0x3054422E\n" //.BT0 ".long 0x00000000\n" //checksum for boot0 (must be calculated !!!) ".long 0x00008000\n" //length for boot0 (32 kB) Это не обязательно, главное 1я строчка.. Entry: MRC p15, 0, r0, c1, c0, 0 @ Read CP15 System Control register BIC r0, r0, #(0x1 << 12) @ Clear I bit 12 to disable I Cache BIC r0, r0, #(0x1 << 2) @ Clear C bit 2 to disable D Cache BIC r0, r0, #0x1 @ Clear M bit 0 to disable MMU BIC r0, r0, #(0x1 << 11) @ Clear Z bit 11 to disable branch prediction MCR p15, 0, r0, c1, c0, 0 @ Write value back to CP15 System Control register MOV r0,#0 MCR p15, 0, r0, c8, c7, 0 @ I-TLB and D-TLB invalidation MCR p15, 0, r0, c7, c5, 6 @ BPIALL - Invalidate entire branch predictor array LDR r0, =_stack @ Read the stack address MSR cpsr_c, #MODE_UND|I_F_BIT @ switch to undef mode MOV sp,r0 @ write the stack pointer SUB r0, r0, #UND_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_ABT|I_F_BIT @ Change to abort mode MOV sp, r0 @ write the stack pointer SUB r0,r0, #ABT_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_FIQ|I_F_BIT @ change to FIQ mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #FIQ_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_IRQ|I_F_BIT @ change to IRQ mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #IRQ_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_SVC|I_F_BIT @ change to SVC mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #SVC_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_SYS|I_F_BIT @ change to system mode MOV sp,r0 @ write the stack pointer MOV r0, #0 @ Invalidate and Enable Branch Prediction MCR p15, #0, r0, c7, c5, #6 ISB MRC p15, #0, r0, c1, c0, #0 ORR r0, r0, #0x00000800 MCR p15, #0, r0, c1, c0, #0 MRC p15, #0, r1, c1, c0, #2 @ r1 = Access Control Register ORR r1, r1, #(0xf << 20) @ enable full access for p10,11 MCR p15, #0, r1, c1, c0, #2 @ Access Control Register = r1 MOV r1, #0 MCR p15, #0, r1, c7, c5, #4 @flush prefetch buffer MOV r0,#0x40000000 FMXR FPEXC, r0 @ Set Neon/VFP Enable bit LDR r10,=libc_init MOV lr,pc @ Dummy return from start_boot BX r10 @ Branch to start_boot SUB pc, pc, #0x08 @ looping Изменено 5 сентября, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба Не решаюсь продолжать дальше, ибо почувствовал что не понимаю ... Я полагал, что eGON хидер требуется при заливке бинарника в SPI NOR или NAND что бы BROM смог опознать наличие бинарника и считать его параметры для корректной заливки в RAM, и применяется, как правило, при написании вторичного загрузчика. Мы обсуждаем заливку бинарника непосредственно в DDR, зачем там егон хидер? Все мои представления в корне неверны? 22 minutes ago, mantech said: Entry: MRC p15, 0, r0, c1, c0, 0 @ Read CP15 System Control register BIC r0, r0, #(0x1 << 12) @ Clear I bit 12 to disable I Cache BIC r0, r0, #(0x1 << 2) @ Clear C bit 2 to disable D Cache BIC r0, r0, #0x1 @ Clear M bit 0 to disable MMU BIC r0, r0, #(0x1 << 11) @ Clear Z bit 11 to disable branch prediction MCR p15, 0, r0, c1, c0, 0 @ Write value back to CP15 System Control register MOV r0,#0 MCR p15, 0, r0, c8, c7, 0 @ I-TLB and D-TLB invalidation MCR p15, 0, r0, c7, c5, 6 @ BPIALL - Invalidate entire branch predictor array LDR r0, =_stack @ Read the stack address MSR cpsr_c, #MODE_UND|I_F_BIT @ switch to undef mode MOV sp,r0 @ write the stack pointer SUB r0, r0, #UND_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_ABT|I_F_BIT @ Change to abort mode MOV sp, r0 @ write the stack pointer SUB r0,r0, #ABT_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_FIQ|I_F_BIT @ change to FIQ mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #FIQ_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_IRQ|I_F_BIT @ change to IRQ mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #IRQ_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_SVC|I_F_BIT @ change to SVC mode MOV sp,r0 @ write the stack pointer SUB r0,r0, #SVC_STACK_SIZE @ give stack space MSR cpsr_c, #MODE_SYS|I_F_BIT @ change to system mode MOV sp,r0 @ write the stack pointer MOV r0, #0 @ Invalidate and Enable Branch Prediction MCR p15, #0, r0, c7, c5, #6 ISB MRC p15, #0, r0, c1, c0, #0 ORR r0, r0, #0x00000800 MCR p15, #0, r0, c1, c0, #0 MRC p15, #0, r1, c1, c0, #2 @ r1 = Access Control Register ORR r1, r1, #(0xf << 20) @ enable full access for p10,11 MCR p15, #0, r1, c1, c0, #2 @ Access Control Register = r1 MOV r1, #0 MCR p15, #0, r1, c7, c5, #4 @flush prefetch buffer MOV r0,#0x40000000 FMXR FPEXC, r0 @ Set Neon/VFP Enable bit LDR r10,=libc_init MOV lr,pc @ Dummy return from start_boot BX r10 @ Branch to start_boot SUB pc, pc, #0x08 @ looping это надо обдумать .. Изменено 5 сентября, 2023 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 5 сентября, 2023 Опубликовано 5 сентября, 2023 (изменено) · Жалоба xfel exec не требует никаких хедеров. Просто вызывает функци. по указанному в параметре адресу. Например, если у вас какой-то header знимект первый килобайт, а за ним код - делаем так xfel write 0x40000000 tc1_t113s3_app.alw32 xfel exec 0x40000400 Изменено 5 сентября, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 24 минуты назад, nanorobot сказал: зачем там егон хидер? 38 минут назад, mantech сказал: Это не обязательно, главное 1я строчка.. Это ни о чем не говорит? Просто использовал универсальный стартовый модуль... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 1 minute ago, GenaSPB said: xfel exec не требует никаких хедеров. Просто выхывает функци. по укаханному в параметре адресу. Напримекр если у вас какой-то header знимект первый килобайт, а за нрим код - длаем так xfel write 0x40000000 tc1_t113s3_app.alw32xfel exec 0x40000400 Это то понятно, спасибо. Потому выше и высказал недоумение по поводу eGON..Главное неясность текущего момента, в чем может быть разница между двумя методами запуска одного и того же бинарника, через XFEL JLink. Ну JLink использует другой файл - ELF, который суть то же самое плюс отладочная информация .. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 5 сентября, 2023 Опубликовано 5 сентября, 2023 · Жалоба 26 минут назад, nanorobot сказал: Все мои представления в корне неверны? Надо просто потренировать матчасть, вы что-то где-то услышали и решили, что все легко и просто, ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться