Вы не зашли.
Никто не встречал отладчик для платформы rk? Не эмулятор, а именно отладчик. Без него ой как тяжко
RKP Disassembler&Assembler
http://www.mediafire.com/?43myymh5zyz
Такой отладчик подойдёт?
Barracuda72
Все, что делает elfloader - размещает этот код в памяти и передает ему управление.
а разве rkp файлы не являются нативными?! прошивка изначально все это умеет, только структура файлов не elf а собственная rkp, что ни чуточки не мешает прошивке передавать приложению управление при загрузке.
SW I-хук же позволяет вызывать функции прошивки не так:
BL Rock0sSendMsg
а так:
SWI 35 ;
Так как на каждой конкретной прошивке адрес функции Rock0sSendMsg разный, вариант с простым бранчем не подходит.
т.е.ты хочешь swi затачивать под конкретную прошивку, а не перекомпилировать программку с Platform.h принадлежащим прошивке?
Возможно ли изменить уровень громкости каторая устонавливается по умалчиванию при перепрошиве плеера?
Возможно, изменив начальные установки громкости, перекомпилировав прошивку, и залив ее на плеер
MrRockchip написал:
, нет, мне нужно прошивку отлаживать... никак не могу вернуться из swi, даже без обработки. Возможно, у арм7 есть какие-то особенности, я раньше только с арм9 дело имел.
SWIRL написал:
да, можно сказать и так. В родной прошивке прерывания не используются вовсе, я хочу попытаться их использовать. Мне кажется, .ркп не так удобен, как .elf, тем более мой рк2705 в стандартной прошивке .ркп не тянет:)
Сейчас пытаюсь собрать прошивку из исходников, имеющихся в сдк27 и восстановить недостающее по иде. На ritmix 8900 работает уже все, кроме тачпада. Как только заведу его - буду продолжать искания с swi, устал уже делать врезки и искать место под патч.
Да, у меня одного CodeWarrior из комплекта ads1.2 постоянно падает? невозможно даже с первой попытки скомпилировать прошивку
Прошу прощения за столь длительное отсутствие, личная жизнь...
Мне удалось сделать следующее:
- на моем ritmix rf-8900 работает тачпад и экран, частично звук - пока больше и не нужно
- доработан эмулятор, теперь в нем тоже работает "тачпад" (любая кнопка мыши)
- интегрирован и доработан загрузчик эльфов, при выборе пункта меню "Секундомер" загружается эльф из файла С:/elf.elf
- постарался адаптировать интерфейс к тачскрину, уже можно слушать музыку и радио
В выходные постараюсь выложить свои наработки, в планах таки допилить swi-хук
Barracuda72
никак не могу вернуться из swi, даже без обработки.
В смысле даже если прямо в таблицу векторов тыкнуть subs pc,lr,#4, всё равно не возвращается?
(я тут проходом... ни один сабжевый экземпляр не то, что в руках не держал, даже не видел вживую никогда... не интересовался :-))
l_inc написал:
Barracuda72
никак не могу вернуться из swi, даже без обработки.
В смысле даже если прямо в таблицу векторов тыкнуть 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 вот так:
#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 прямо в таблицу векторов — то мой прогон).
Отредактировано l_inc (10-08-2010 14:17:26)
Я все пишу на ассемблере, чтобы не мучаться со всякими приведениями типов и кучей звездочек:) Выглядит сейчас оно так:
swi_vector:
mov pc, swi_addr
swi_addr:
dcd swi_handler
swi_handler:
stmfd sp!, {r0-r3, lr}
...здесь идет обработка, код выброшен...
ldmfd sp!, {r0-r3, pc}^
виснет:(
Barracuda72
Лучше покажите, как Вы устанавливаете вектор, а не как он потом выглядит. Потому что
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 лежит адрес обработчика (собственно, последнее у Вас, очевидно, соблюдено).
Я все пишу на ассемблере, чтобы не мучаться со всякими приведениями типов и кучей звездочек:)
Зато можно недолго думая написать одну строку, которая на асме будет занимать десять, над которыми ещё и посидеть придётся. И код обозримее становится.
Ну да ладно. Это Ваше право. :-)
Отредактировано l_inc (10-08-2010 15:35:32)
Я не устанавливаю вектор, он жестко задается при компиляции и в дальнейшем не меняется. При запуске загрузчик копирует прошивку в rаm, копирует готовую таблицу векторов на адрес 0х00000000 и дергает Reset_Vector. Собственно, строки
swi_vector: mov pc, swi_addr
swi_addr: dcd swi_handler
и есть часть таблицы векторов.
Просто нравится мне АРМ ассемблер, очень мощный язык, можно сказать, почти магия на кончиках пальцев:) Основную кодовую массу конечно лучше писать на С, но критичные участки кода все же на асме надежнее и быстрее, процессор все же работает всего на 12 мгц
Отредактировано Barracuda72 (10-08-2010 16:27:06)
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 (10-08-2010 16:47:55)
Barracuda72
Если ида раскрывает, как Вы указали, тогда всё верно. Думаю, в Вашем случае имелось в виду даже не
mov pc, [swi_addr], а ldr pc,[swi_addr]. Обычно для таких случаев поддерживается псевдоинструкция, указанная идой:
ldr pc, =swi_hаndler. Но тогда нельзя указать, где именно будет размещено слово с адресом swi_hаndler.
P.S. А чем компилируете-то?
Отредактировано l_inc (10-08-2010 17:08:14)
До этого пробовал 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?
Заранее спасибо за ответ!
Отредактировано drmsaih (16-08-2010 23:54:18)
Извиняюсь за задержку, вот то, что я накропал:
http://depositfiles.com/files/8f0r8nl8f
да, наверняка возможно, сдк Вам в помощь:)