а разве rkp файлы не являются нативными?! прошивка изначально все это умеет, только структура файлов не elf а собственная rkp, что ни чуточки не мешает прошивке передавать приложению управление при загрузке. т.е.ты хочешь swi затачивать под конкретную прошивку, а не перекомпилировать программку с Platform.h принадлежащим прошивке?
, нет, мне нужно прошивку отлаживать... никак не могу вернуться из swi, даже без обработки. Возможно, у арм7 есть какие-то особенности, я раньше только с арм9 дело имел. да, можно сказать и так. В родной прошивке прерывания не используются вовсе, я хочу попытаться их использовать. Мне кажется, .ркп не так удобен, как .elf, тем более мой рк2705 в стандартной прошивке .ркп не тянет Сейчас пытаюсь собрать прошивку из исходников, имеющихся в сдк27 и восстановить недостающее по иде. На ritmix 8900 работает уже все, кроме тачпада. Как только заведу его - буду продолжать искания с swi, устал уже делать врезки и искать место под патч. Да, у меня одного CodeWarrior из комплекта ads1.2 постоянно падает? невозможно даже с первой попытки скомпилировать прошивку
Прошу прощения за столь длительное отсутствие, личная жизнь... Мне удалось сделать следующее: - на моем ritmix rf-8900 работает тачпад и экран, частично звук - пока больше и не нужно - доработан эмулятор, теперь в нем тоже работает "тачпад" (любая кнопка мыши) - интегрирован и доработан загрузчик эльфов, при выборе пункта меню "Секундомер" загружается эльф из файла С:/elf.elf - постарался адаптировать интерфейс к тачскрину, уже можно слушать музыку и радио В выходные постараюсь выложить свои наработки, в планах таки допилить swi-хук
Barracuda72 В смысле даже если прямо в таблицу векторов тыкнуть subs pc,lr,#4, всё равно не возвращается? (я тут проходом... ни один сабжевый экземпляр не то, что в руках не держал, даже не видел вживую никогда... не интересовался )
Почти что так, в таблице векторов просто ldr pc, =swi_addr и далее swi_addr: subs pc, lr, #4 Виснет намертво Компилируется верно... Единственное, что приходит в голову - это что swi явным или неявным образом запрещены
Barracuda72 А если всё таки в таблицу векторов запихать subs pc,lr,#4? Мало ли... может смещение swi_addr относительно адреса вектора неверно рассчитали? И ещё на всякий случай спрошу... там точно не flash или rom на месте таблицы векторов лежит? Может remap сделать забыли?
Попробую, но смещение рассчитывал не я, а компилятор Да и дизасм показывает, что все 0К Чип не имеет MMU, таблица векторов просто копируется в 0х00000000 при каждой загрузке
Barracuda72 Не совсем понимаю, причём здесь MMU. Remap'ом занимается не сопроцессор MMU, а контроллер памяти. Я ставил обработчик swi вот так: Код (Text): #define STRINGIFY_INTERNAL(X) #X #define STRINGIFY(X) STRINGIFY_INTERNAL((X)) void svc_vector(void) __attribute__ ((naked)); void svc_handler(void) __attribute__ ((naked)); #define SVC_BASE 0x08 #define SVC_VECT 0x20 void init_services(void) { *(uint32_t *)SVC_BASE = *(uint32_t *)&svc_vector; //store svc vector *(uint32_t *)SVC_VECT = (uint32_t)(&svc_handler); //store svc handler vector } void svc_vector(void) { __asm volatile ("LDR pc,[pc,#"STRINGIFY(SVC_VECT-(SVC_BASE+4*2))"]"); } void svc_handler(void) { __asm volatile ("ADD lr,lr,#4\n\t" //+4 emulates irq behavior "STMDB sp!,{R0-R12,lr}\n\t" "MOV R0,sp\n\t" "BL svc_handler_internal\n\t" "LDMIA sp!,{R0-R12,lr}\n\t" "SUBS pc,lr,#4"); } Как Вам удалось переложить рассчёт SVC_VECT-(SVC_BASE+4*2) на компилятор? Кстати... Насчёт subs pc,lr,#4. После SWI ведь сохраняется адрес следующей за swi инструкции. Поэтому, видимо, в Вашем случае нужно писать всё-таки movs pc,lr (насчёт subs pc,lr,#4 прямо в таблицу векторов — то мой прогон).
Я все пишу на ассемблере, чтобы не мучаться со всякими приведениями типов и кучей звездочек Выглядит сейчас оно так: swi_vector: mov pc, swi_addr swi_addr: dcd swi_handler swi_handler: stmfd sp!, {r0-r3, lr} ...здесь идет обработка, код выброшен... ldmfd sp!, {r0-r3, pc}^ виснет
Barracuda72 Лучше покажите, как Вы устанавливаете вектор, а не как он потом выглядит. Потому что Код (Text): swi_vector: mov pc, swi_addr swi_addr: dcd swi_handler тянет в лучшем случае на псевдокод. Реально для прыжка по произвольному адресу вектором должна быть инструкция ldr pc,[pc,#(swi_addr-(swi_vector+4*2))]. При этом swi_vector = 8, а по swi_addr лежит адрес обработчика (собственно, последнее у Вас, очевидно, соблюдено). Зато можно недолго думая написать одну строку, которая на асме будет занимать десять, над которыми ещё и посидеть придётся. И код обозримее становится. Ну да ладно. Это Ваше право.
Я не устанавливаю вектор, он жестко задается при компиляции и в дальнейшем не меняется. При запуске загрузчик копирует прошивку в rаm, копирует готовую таблицу векторов на адрес 0х00000000 и дергает Reset_Vector. Собственно, строки swi_vector: mov pc, swi_addr swi_addr: dcd swi_handler и есть часть таблицы векторов. Просто нравится мне АРМ ассемблер, очень мощный язык, можно сказать, почти магия на кончиках пальцев Основную кодовую массу конечно лучше писать на С, но критичные участки кода все же на асме надежнее и быстрее, процессор все же работает всего на 12 мгц
Barracuda72 Ну так тогда понятно, почему виснет: Вы прыгаете на swi_addr, а не на swi_handler. Во-первых, поставьте ту инструкцию, которую я указал в посте 413. Во-вторых, переставьте swi_addr куда подальше. А то затираете вектор prefetch abort.
Прошу прощения, пишу по памяти и с телефона, забыл квадратные скобки. Должно быть так: swi_vector: mov pc, [swi_addr] swi_addr: dcd swi_handler ида раскрывает это как swi_vector: ldr pc, =swi_hаndler swi_addr: dcd swi_handler Нет, prefetch не затирается, строка swi_addr: dcd swi_handler расположена внизу таблицы векторов, просто я не стал весь код перепечатывать, на самом деле все вектора на месте. Попробую вставить инструкцию, предложенную Вами, и отпишусь о результатах
Barracuda72 Если ида раскрывает, как Вы указали, тогда всё верно. Думаю, в Вашем случае имелось в виду даже не mov pc, [swi_addr], а ldr pc,[swi_addr]. Обычно для таких случаев поддерживается псевдоинструкция, указанная идой: ldr pc, =swi_hаndler. Но тогда нельзя указать, где именно будет размещено слово с адресом swi_hаndler. P.S. А чем компилируете-то?
До этого пробовал binedit'ом, сейчас взял в руки АDS (все равно в итоге писать под него, им собирается прошивка). Конструкция swi_vector: mov pc, [swi_addr] swi_addr: dcd swi_handler swi_handler: movs pc, lr работает, спасибо за помощь дописать обработчик (возможно, действительно на С?) уже не так сложно
Пожалуйста, подскажите: Есть у меня плеер Explay T10 (походу rk2706) Объем памяти:4 Гб Синхронизация с ПК: USB 2.0 Тип дисплея:LCD Размер:2.40" Кол-во цветов:260 тыс. Разрешение:240 x 320 Прошивается с помощью файлов *.rkw (T10.rkw) путем его копирования в корень и перезагрузки. Так вот, можно ли на этот плеер поставить кастомную прошивку, либо проги *.rkp? Заранее спасибо за ответ!
Извиняюсь за задержку, вот то, что я накропал: http://depositfiles.com/files/8f0r8nl8f да, наверняка возможно, сдк Вам в помощь