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

Alex_akn

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

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

  • Посещение

Сообщения, опубликованные Alex_akn


  1. Загрузчик заработал, но выяснилась такая вещь:

    в главной функции завел статическую переменную

    И эта переменная располагается по адресу 0x40000000.

    В этой же ячейке у меня хранится информация для загрузчика, которая туда записывается принудительно.

    Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?

  2. Вобщем нужен ARM от NXP с приведенными в названии ветки периферией с флешкой не менее 32 КБайт. Этим требованиям полностью удовлетворяет AT91SAM7S64 от Atmel. Хотелось бы что-то подобрать от NXP и сравнить, но мне удалось найти только толстые чипы как LPC2368 например, надо бы что-то скромнее.

    Всмысле толстые? Габариты не устраивают? Что касается цены:

    123,6 руб lpc2141 32kB Flash

    131,7 руб lpc2364 128kB Flash

    Обе цены розничные.

  3. 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?

  4. Там же в коментариях написано: это код команды 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 же нигде в программе больше не трогается.

    ???

  5. Вопрос по 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.

    Может кто-то сможет пояснить?

  6. Выставятся, когда уже из работающей программы будет запрошен загрузчик, после чего будет через watchdog изображен reset...

     

    Не запускал ни под чем, посто читал в свое время для общего развития и работал с обеими контроллерами.

    И не сочтите за труд, для исходников пользоваться опциями форматирования.

    Всё! Разобрался! Спасибо огромное за ответы :)

  7. Выставятся, когда уже из работающей программы будет запрошен загрузчик, после чего будет через watcdog изображен reset...

     

    Не запускал ни под чем, посто читал в свое время для общего развития и работал с обеими контроллерами.

    И не сочтите за труд, для исходников пользоваться опциями форматирования.

    "И не сочтите за труд, для исходников пользоваться опциями форматирования." - ОК :)

    Что значит "после чего будет через watcdog изображен reset..."?

  8. 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 можете выложить? Поменять всё и сам могу, но хочу сэкономить время хоть чуток.

×
×
  • Создать...