реклама на сайте
подробности

 
 
> USB загрузчик для LPC2368, Может у кого была необходимость в загрузчике для LPC-ек. Просьба под
Alex_akn
сообщение Jul 4 2008, 15:01
Сообщение #1





Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420



Доброго времени суток.
Возникла потребность в USB загрузчике для LPC.
Может есть аналог SAM-BA для NXP-ых продуктов?
Подскажите пожалуйста в какую сторону смотреть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex_akn
сообщение Jul 14 2008, 22:27
Сообщение #2





Группа: Новичок
Сообщений: 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.
Может кто-то сможет пояснить?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 15 2008, 06:51
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alex_akn @ Jul 15 2008, 01:27) *
Зачем по адресу IRQ_RAM_ADDR(FIQ_RAM_ADDR) кладется число 0xE59FF018?
Там же в коментариях написано: это код команды ldr pc, [pc, #24]


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 15 2008, 08:31
Сообщение #4





Группа: Новичок
Сообщений: 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 же нигде в программе больше не трогается.
???
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jul 15 2008, 10:17
Сообщение #5


читатель даташитов
****

Группа: Свой
Сообщений: 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.
Уфф.
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 16 2008, 06:24
Сообщение #6





Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420



Спасибо за ответы. Кое-что стало понятно.
Как команду "ldr pc, [pc, #24]" перевели в число "0xE59FF018"?
И наоборот из числа в команду?

Сообщение отредактировал Alex_akn - Jul 16 2008, 06:25
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jul 16 2008, 08:23
Сообщение #7


читатель даташитов
****

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



Цитата(Alex_akn @ Jul 16 2008, 09:24) *
Спасибо за ответы. Кое-что стало понятно.
Как команду "ldr pc, [pc, #24]" перевели в число "0xE59FF018"?
И наоборот из числа в команду?

Можно с помощью ассемблера, посмотрев листинг. А обратно - где-то в интернете видел. Можно использовать дизассемблер, или почитать документацию от ARM.
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 16 2008, 20:46
Сообщение #8





Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420



Цитата(HARMHARM @ Jul 16 2008, 14:23) *
Можно с помощью ассемблера, посмотрев листинг. А обратно - где-то в интернете видел. Можно использовать дизассемблер, или почитать документацию от ARM.

Спасибо! smile.gif
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 20 2008, 09:39
Сообщение #9





Группа: Новичок
Сообщений: 14
Регистрация: 9-08-06
Пользователь №: 19 420



Загрузчик заработал, но выяснилась такая вещь:
в главной функции завел статическую переменную
И эта переменная располагается по адресу 0x40000000.
В этой же ячейке у меня хранится информация для загрузчика, которая туда записывается принудительно.
Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?
Go to the top of the page
 
+Quote Post
Axel
сообщение Jul 28 2008, 04:19
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(Alex_akn @ Jul 20 2008, 13:39) *
Как в кросс ворксе сделать так, чтобы эта статическая переменная лежала за адресом, допустим, 0x40000100?


У меня кроме как через создание отдельного сегмента не получалось.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016