|
USB загрузчик для LPC2368, Может у кого была необходимость в загрузчике для LPC-ек. Просьба под |
|
|
|
Jul 4 2008, 15:01
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Доброго времени суток. Возникла потребность в USB загрузчике для LPC. Может есть аналог SAM-BA для NXP-ых продуктов? Подскажите пожалуйста в какую сторону смотреть.
|
|
|
|
|
 |
Ответов
|
Jul 14 2008, 22:27
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Вопрос по 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. Может кто-то сможет пояснить?
|
|
|
|
|
Jul 15 2008, 08:31
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Цитата(Сергей Борщ @ Jul 15 2008, 12:51)  Там же в коментариях написано: это код команды ldr pc, [pc, #24] Смысл какой? Просто увеличить PC? Или же, всё-таки, разместить по адресу IRQ_RAM_ADDR число 0xe59ff018? Если же просто увеличить PC, то я смысл этого действия вообще не вижу. Может сможет кто объяснить? Цитата(HARMHARM @ Jul 15 2008, 14:20)  Это инициализация векторов прерываний (таблица в 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 же нигде в программе больше не трогается. ???
|
|
|
|
|
Jul 15 2008, 10:17
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(Alex_akn @ Jul 15 2008, 11:31)  (В курсе: MEMMAP =0x2 -> User RAM Mode. Interrupt vectors are re-mapped to Static RAM). Вектора IRQ, FIQ он явно кладет по нужным адресам. MEMMAP же нигде в программе больше не трогается. ??? Здесь MEMMAP не используется. Если вы посмотрите в fwu_startup_iar.s79 : Код reset ldr pc, ?vect_entry ldr pc, ?vect_entry + 4 ldr pc, ?vect_entry + 8 ldr pc, ?vect_entry + 12 ldr pc, ?vect_entry + 16 DC32 0xB8A06F58 /* 0 - (sum of other vectors instructions) */ ldr pc, ?vect_entry + 24 ldr pc, ?vect_entry + 28
?vect_entry: DC32 ?cstartup; RES ( 0) DC32 ?cstartup; UND ( +4) DC32 ?cstartup; SWI ( +8) DC32 ?cstartup; P_ABT (+12) DC32 ?cstartup; D_ABT (+16) DC32 0; ARM-reserved vector (+20) DC32 0x40000018; cpu_irq_isr; IRQ (+24) DC32 0x4000001C; cpu_fiq_isr; FRQ (+28) видно, что 0x40000018 и 0x4000001C - адреса, по которым будет передаваться управление при IRQ и FIQ. Фактически комбинация ldr pc,xxx и собственно ячейки xxx,например Код ldr pc, ?vect_entry ?vect_entry: DC32 ?cstartup; RES ( 0) это branch, то есть безусловный переход в любое место в пределах адресного пространства. В tnkernel таким образом сделаны векторы прерываний для того, чтобы проложение могло установить свой вектор (в flash-то лежат векторы загрузчика). Совершенно нормальный подход. Хотя я в своем загрузчике использую немного другой подход, по мотивам кода уважаемого Zltigo. Код __program_start: ldr pc,(?vect_entry + 4*0) // 00 ldr pc,(?vect_entry + 4*1) // 04 ldr pc,(?vect_entry + 4*2) // 08 ldr pc,(?vect_entry + 4*3) // 0C ldr pc,(?vect_entry + 4*4) // 10 dc32 0 // 14 Summ of other vectors instructions ldr pc,[pc,#-0x0120] // 18 Jump directly to the address given by the VIC // from [0xFFFFFF00] Curent 18h +8(conveyer)=20h ldr pc,(?vect_entry + 4*7) // 1C //--------------------------------------------------------------------------- ORG 0x20 // Constant table entries (for ldr pc) will be placed at 0x20 ?vect_entry: dc32 ?cstartup // Reset dc32 ?cstartup // UND dc32 Application_SWI // SWI dc32 PABT_handler // P_ABT dc32 DABT_handler // D_ABT dc32 0 // ARM-reserved vector dc32 0 // IRQ (Jump directly!) dc32 Application_FIQ // FIQ Здесь адрес обработчика IRQ берется непосредственно из VIC, reset в начало загрузчика, SWI и FIQ берутся из заголовка приложения по адресу, где приложение будет располагаться. Вот заголовок приложения: Код //== With Loader dc8 Hardware_Version // 00 Hardware revision dc8 Bootloader_Version // 01 dc8 Application_VersionL // 02 dc8 Application_VersionH // 03 dc32 SFB(CHECKSUM) // 04 End of code address ldr pc,[pc,#-0x4] // 08 Start Entry Point dc32 ?cstartup // 0C *Reset ldr pc,[pc,#-0x4] // 10 SWI dc32 ?cstartup //vPortYieldProcessor // 14 *SWI // Place for FIQ Handler ---------------------------------------------------- ldr pc,[pc,#-0x4] // 18 FIQ dc32 FIQ_ISR_handler // 1C *FIQ То есть при SWI будет сначала переход в заголовок загрузчика, потом уже в собственно обработчик. RAM при этом не используется вообще. Правда есть дополнительный переход. Единственное что, поскольку в загрузчике жестко прописан переход по SWI в приложение, при необходимости использования SWI (или FIQ) в загрузчике приходится использовать MEMMAP=2. Здесь ldr pc,[pc,#-0x4] грузит в pc на самом деле константу из следующих четырех байт, из-за конвеера тут -4(+8) а не +4. Уфф.
|
|
|
|
|
Jul 16 2008, 06:24
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Спасибо за ответы. Кое-что стало понятно. Как команду "ldr pc, [pc, #24]" перевели в число "0xE59FF018"? И наоборот из числа в команду?
Сообщение отредактировал Alex_akn - Jul 16 2008, 06:25
|
|
|
|
|
Jul 16 2008, 20:46
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Цитата(HARMHARM @ Jul 16 2008, 14:23)  Можно с помощью ассемблера, посмотрев листинг. А обратно - где-то в интернете видел. Можно использовать дизассемблер, или почитать документацию от ARM. Спасибо!
|
|
|
|
|
Jul 20 2008, 09:39
|
Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420

|
Загрузчик заработал, но выяснилась такая вещь: в главной функции завел статическую переменную И эта переменная располагается по адресу 0x40000000. В этой же ячейке у меня хранится информация для загрузчика, которая туда записывается принудительно. Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?
|
|
|
|
|
Jul 28 2008, 04:19
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(Alex_akn @ Jul 20 2008, 13:39)  Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100? У меня кроме как через создание отдельного сегмента не получалось.
|
|
|
|
Сообщений в этой теме
Alex_akn USB загрузчик для LPC2368 Jul 4 2008, 15:01 DmitryV Цитата(Alex_akn @ Jul 4 2008, 19:01) Добр... Jul 4 2008, 19:02 zltigo Цитата(DmitryV @ Jul 4 2008, 21:02) На да... Jul 12 2008, 18:08 gte А скоро это в месяцах, кварталах или годах? Jul 5 2008, 06:14 DmitryV Цитата(gte @ Jul 5 2008, 10:14) А скоро э... Jul 5 2008, 18:05 zltigo http://www.tnkernel.com/usb_fw_upgrader.html Jul 5 2008, 08:21 gte Спасибо. Мой вопрос был без подвоха, учитывая скор... Jul 6 2008, 06:47 Alex_akn Вот это вещь - http://www.tnkernel.com/usb_fw_upgr... Jul 6 2008, 09:45 zltigo Цитата(Alex_akn @ Jul 6 2008, 11:45) ..ка... Jul 6 2008, 09:54  Alex_akn Цитата(zltigo @ Jul 6 2008, 15:54) В перв... Jul 6 2008, 10:06   zltigo Цитата(Alex_akn @ Jul 6 2008, 12:06) Это ... Jul 6 2008, 10:18    Alex_akn Цитата(zltigo @ Jul 6 2008, 16:18) USB хи... Jul 6 2008, 10:44     zltigo Цитата(Alex_akn @ Jul 6 2008, 12:44) Отку... Jul 6 2008, 10:56      Alex_akn Цитата(zltigo @ Jul 6 2008, 16:56) Выстав... Jul 6 2008, 11:10       zltigo Цитата(Alex_akn @ Jul 6 2008, 13:10) Что ... Jul 6 2008, 11:25      Alex_akn Цитата(zltigo @ Jul 6 2008, 16:56) Выстав... Jul 6 2008, 11:31  Alex_akn Цитата(Сергей Борщ @ Jul 15 2008, 12:51) ... Jul 15 2008, 07:46   HARMHARM Цитата(Alex_akn @ Jul 15 2008, 10:46) Сер... Jul 15 2008, 08:20   aaarrr Цитата(Alex_akn @ Jul 15 2008, 12:31) Смы... Jul 15 2008, 08:53    Alex_akn Цитата(aaarrr @ Jul 15 2008, 14:53) ldr p... Jul 15 2008, 09:19 vet после выполнения вышеприведенного кода пресловутая... Jul 15 2008, 09:56 dmtr А нет ли загрузчика, чтобы грузил программу через ... Jul 26 2008, 07:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|