Alex_akn
-
Постов
14 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Alex_akn
-
-
Вобщем нужен ARM от NXP с приведенными в названии ветки периферией с флешкой не менее 32 КБайт. Этим требованиям полностью удовлетворяет AT91SAM7S64 от Atmel. Хотелось бы что-то подобрать от NXP и сравнить, но мне удалось найти только толстые чипы как LPC2368 например, надо бы что-то скромнее.
Всмысле толстые? Габариты не устраивают? Что касается цены:
123,6 руб lpc2141 32kB Flash
131,7 руб lpc2364 128kB Flash
Обе цены розничные.
-
Можно с помощью ассемблера, посмотрев листинг. А обратно - где-то в интернете видел. Можно использовать дизассемблер, или почитать документацию от ARM.
Спасибо! :)
-
Опубликовано · Изменено пользователем Alex_akn · Пожаловаться
Спасибо за ответы. Кое-что стало понятно.
Как команду "ldr pc, [pc, #24]" перевели в число "0xE59FF018"?
И наоборот из числа в команду?
-
ldr pc, [pc, #24] - это не увеличить PC, а загрузить его из ячейки по адресу PC+24+8.
Вот код этого дела.
//---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; E3A03161 mov r3, #0x40000018 E50B3014 str r3, [r11, #-0x014] *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] E51B2014 ldr r2, [r11, #-0x014] E3E03EFE mvn r3, #0x00000FE0 E2433271 sub r3, r3, #0x10000007 E24336A6 sub r3, r3, #0x0A600000 E5823000 str r3, [r2] ptr = (unsigned int *)FIQ_RAM_ADDR; E3A03171 mov r3, #0x4000001C E50B3014 str r3, [r11, #-0x014] *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] E51B2014 ldr r2, [r11, #-0x014] E3E03EFE mvn r3, #0x00000FE0 E2433271 sub r3, r3, #0x10000007 E24336A6 sub r3, r3, #0x0A600000 E5823000 str r3, [r2]
Может поможете увидеть где здесь загрузка из ячейки по адресу PC+24+8?
-
Там же в коментариях написано: это код команды ldr pc, [pc, #24]
Смысл какой? Просто увеличить PC? Или же, всё-таки, разместить по адресу IRQ_RAM_ADDR число 0xe59ff018? Если же просто увеличить PC, то я смысл этого действия вообще не вижу.
Может сможет кто объяснить?
Это инициализация векторов прерываний (таблица в RAM), делается перед remap (MEMMAP =0x2).int main() { unsigned int * ptr; int state; MEMMAP = 0x1; //tn_arm_disable_interrupts(); ctl_global_interrupts_disable(); Init_CRC32_Table(); //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] ptr = (unsigned int *)FIQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] //--- Put IRQ & FIQ vectors in RAM ptr = (unsigned int *)IRQ_RAM_FUNC_ADDR; *ptr = (unsigned int)&cpu_irq_isr; ptr = (unsigned int *)FIQ_RAM_FUNC_ADDR; *ptr = (unsigned int)&cpu_fiq_isr; #ifndef RUN_FW_ALWAYS //--- Check 'Run as Loader' mark ptr =(unsigned int *)RAM_START_ADDR; if(!(*ptr == 0x12345678 && *(ptr+1) == 0x43211234)) { do_switch_to_firmware(); //-- Never returns } #else start_firmware(); //-- Never returns #endif //------ Clear FW loader marks ptr =(unsigned int *)RAM_START_ADDR; *ptr = 0; ptr++; *ptr = 0; HardwareInit(); и т.д. и т.п.........
(В курсе: MEMMAP =0x2 -> User RAM Mode. Interrupt vectors are re-mapped to Static RAM).
Вектора IRQ, FIQ он явно кладет по нужным адресам.
MEMMAP же нигде в программе больше не трогается.
???
-
Там же в коментариях написано: это код команды ldr pc, [pc, #24]
Сергей. Я прекрасно вижу, что написано в коментариях. Лучше скажите зачем это нужно!
-
Вопрос по TNK-loader:
... //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] ptr = (unsigned int *)FIQ_RAM_ADDR; *ptr = 0xE59FF018; ...
Зачем по адресу IRQ_RAM_ADDR(FIQ_RAM_ADDR) кладется число 0xE59FF018?
И попутный вопрос:
void tn_usb_lpc_cmd_write(int cmd, int data) { E1A0C00D mov r12, sp E92DD800 stmfd sp!, {r11-r12, lr-pc} E24CB004 sub r11, r12, #0x00000004 E24DD008 sub sp, sp, #0x00000008 E50B0010 str r0, [r11, #-0x010] E50B1014 str r1, [r11, #-0x014] USBDevIntClr = CDFULL | CCEMTY; // clear CDFULL/CCEMTY E3A0328F mov r3, #0xF0000008 E28336FE add r3, r3, #0x0FE00000 E2833CC2 add r3, r3, #0x0000C200 E3A02030 mov r2, #0x00000030 E5832000 str r2, [r3] USBCmdCode = 0x00000500 | (cmd << 16); // write command code E59F208C ldr r2, [pc, #+0x08C] E51B3010 ldr r3, [r11, #-0x010] E1A03803 mov r3, r3, lsl #0x10 E3833C05 orr r3, r3, #0x00000500 [color=#FF0000]===>>>E5823000 str r3, [r2] <<<<<<=============[/color] while(!(USBDevIntSt & CCEMTY)); E3A034FF mov r3, #0xFF000000 E283360E add r3, r3, #0x00E00000 E2833CC2 add r3, r3, #0x0000C200 E5933000 ldr r3, [r3] E2033010 and r3, r3, #0x00000010 E3530000 cmp r3, #0x00000000 0AFFFFF8 beq 0x000032E0 ...
До выполнения указанной строчки регистры:
r0 = 0xfe
r1 = 0x00
r2 = 0xffe0c210
r3 = 0x00fe0500
c r4 по r10 = 0x00
r11 = 0x4000209c
r12 = 0x400020a0
r13(sp) = 0x40002088
r14 = 0x00000db0
r15 = 0x000032dc
cpsr = 0xa00000df
данные:
data = 0x00
cmd = 0x000000fe
После выполнения указанной строчки проваливаемся в dabort_handler.
Может кто-то сможет пояснить?
-
Выставятся, когда уже из работающей программы будет запрошен загрузчик, после чего будет через watchdog изображен reset...
Не запускал ни под чем, посто читал в свое время для общего развития и работал с обеими контроллерами.
И не сочтите за труд, для исходников пользоваться опциями форматирования.
Всё! Разобрался! Спасибо огромное за ответы :)
-
Выставятся, когда уже из работающей программы будет запрошен загрузчик, после чего будет через watcdog изображен reset...
Не запускал ни под чем, посто читал в свое время для общего развития и работал с обеими контроллерами.
И не сочтите за труд, для исходников пользоваться опциями форматирования.
"И не сочтите за труд, для исходников пользоваться опциями форматирования." - ОК :)
Что значит "после чего будет через watcdog изображен reset..."?
-
USB хидеры править (или не использовать от TN вообще ) - адреса поменялисть, и имена немного.
Всё. Понял.
Еще вопрос. Кусок кода из модуля fwu.c:
int main()
{
unsigned int * ptr;
int state;
rMEMMAP = 0x1;
tn_arm_disable_interrupts();
Init_CRC32_Table();
state = flash_pcell; //-- For IAR linker only
//---- Set interrupts vectors
ptr = (unsigned int *)IRQ_RAM_ADDR;
*ptr = 0xE59FF018; //-- ldr pc, [pc, #24]
ptr = (unsigned int *)FIQ_RAM_ADDR;
*ptr = 0xE59FF018; //-- ldr pc, [pc, #24]
//--- Put IRQ & FIQ vectors in RAM
ptr = (unsigned int *)IRQ_RAM_FUNC_ADDR;
*ptr = (unsigned int)&cpu_irq_isr;
ptr = (unsigned int *)FIQ_RAM_FUNC_ADDR;
*ptr = (unsigned int)&cpu_fiq_isr;
#ifndef RUN_FW_ALWAYS
//--- Check 'Run as Loader' mark
ptr =(unsigned int *)RAM_START_ADDR;
if(!(*ptr == 0x12345678 && *(ptr+1) == 0x43211234))
{
do_switch_to_firmware(); //-- Never returns
}
#else
start_firmware(); //-- Never returns
#endif
...
...
}
Откуда в раме появляется два числа 0x12345678 и 0x43211234 если программа еще не использовала вообще эти адреса?
Или я не туда смотрю?
USB хидеры править (или не использовать от TN вообще ) - адреса поменялисть, и имена немного.Еще есть один наглый вопрос. Если вы запускали это дело под lpc23xx можете выложить? Поменять всё и сам могу, но хочу сэкономить время хоть чуток.
-
В первом приближении контроллер прерываний другой.
Это понятно. Сделано. А в остальных приближениях?
-
Вот это вещь - http://www.tnkernel.com/usb_fw_upgrader.html!
Кто-то уже может запускал это для LPC23xx? Если запускали, опишите какие изменения требуются.
-
Доброго времени суток.
Возникла потребность в USB загрузчике для LPC.
Может есть аналог SAM-BA для NXP-ых продуктов?
Подскажите пожалуйста в какую сторону смотреть.
USB загрузчик для LPC2368
в ARM
Опубликовано · Пожаловаться
Загрузчик заработал, но выяснилась такая вещь:
в главной функции завел статическую переменную
И эта переменная располагается по адресу 0x40000000.
В этой же ячейке у меня хранится информация для загрузчика, которая туда записывается принудительно.
Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?