Перейти к содержанию
    

Alex_akn

Участник*
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Загрузчик заработал, но выяснилась такая вещь: в главной функции завел статическую переменную И эта переменная располагается по адресу 0x40000000. В этой же ячейке у меня хранится информация для загрузчика, которая туда записывается принудительно. Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?
  2. Всмысле толстые? Габариты не устраивают? Что касается цены: 123,6 руб lpc2141 32kB Flash 131,7 руб lpc2364 128kB Flash Обе цены розничные.
  3. Спасибо за ответы. Кое-что стало понятно. Как команду "ldr pc, [pc, #24]" перевели в число "0xE59FF018"? И наоборот из числа в команду?
  4. Вот код этого дела. //---- 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?
  5. Смысл какой? Просто увеличить PC? Или же, всё-таки, разместить по адресу IRQ_RAM_ADDR число 0xe59ff018? Если же просто увеличить PC, то я смысл этого действия вообще не вижу. Может сможет кто объяснить? 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 же нигде в программе больше не трогается. ???
  6. Сергей. Я прекрасно вижу, что написано в коментариях. Лучше скажите зачем это нужно!
  7. Вопрос по 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. Может кто-то сможет пояснить?
  8. Всё! Разобрался! Спасибо огромное за ответы :)
  9. "И не сочтите за труд, для исходников пользоваться опциями форматирования." - ОК :) Что значит "после чего будет через watcdog изображен reset..."?
  10. Всё. Понял. Еще вопрос. Кусок кода из модуля 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 если программа еще не использовала вообще эти адреса? Или я не туда смотрю? Еще есть один наглый вопрос. Если вы запускали это дело под lpc23xx можете выложить? Поменять всё и сам могу, но хочу сэкономить время хоть чуток.
  11. Это понятно. Сделано. А в остальных приближениях?
  12. Вот это вещь - http://www.tnkernel.com/usb_fw_upgrader.html! Кто-то уже может запускал это для LPC23xx? Если запускали, опишите какие изменения требуются.
  13. USB загрузчик для LPC2368

    Доброго времени суток. Возникла потребность в USB загрузчике для LPC. Может есть аналог SAM-BA для NXP-ых продуктов? Подскажите пожалуйста в какую сторону смотреть.
×
×
  • Создать...