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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> USB загрузчик для LPC2368, Может у кого была необходимость в загрузчике для LPC-ек. Просьба под
zltigo
сообщение Jul 12 2008, 18:08
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DmitryV @ Jul 4 2008, 21:02) *
На данный момент такой загрузчик существует (по крайней мере, для LPC2148)
и находится в стадии тестирования. Скоро появится в доступе...

Доступен уже с 20 мая - AN10711 USB Secondary ISP Bootloader with Source Files
Прикрепленные файлы
Прикрепленный файл  an10711.zip ( 759.85 килобайт ) Кол-во скачиваний: 153
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 14 2008, 22:27
Сообщение #17





Группа: Новичок
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 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, 07:46
Сообщение #19





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



Цитата(Сергей Борщ @ Jul 15 2008, 12:51) *
Там же в коментариях написано: это код команды ldr pc, [pc, #24]

Сергей. Я прекрасно вижу, что написано в коментариях. Лучше скажите зачем это нужно!
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jul 15 2008, 08:20
Сообщение #20


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

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



Цитата(Alex_akn @ Jul 15 2008, 10:46) *
Сергей. Я прекрасно вижу, что написано в коментариях. Лучше скажите зачем это нужно!

Это инициализация векторов прерываний (таблица в RAM), делается перед remap (MEMMAP =0x2).
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 15 2008, 08:31
Сообщение #21





Группа: Новичок
Сообщений: 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
aaarrr
сообщение Jul 15 2008, 08:53
Сообщение #22


Гуру
******

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



Цитата(Alex_akn @ Jul 15 2008, 12:31) *
Смысл какой? Просто увеличить PC? Или же, всё-таки, разместить по адресу IRQ_RAM_ADDR число 0xe59ff018? Если же просто увеличить PC, то я смысл этого действия вообще не вижу.
Может сможет кто объяснить?

ldr pc, [pc, #24] - это не увеличить PC, а загрузить его из ячейки по адресу PC+24+8.
Go to the top of the page
 
+Quote Post
Alex_akn
сообщение Jul 15 2008, 09:19
Сообщение #23





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



Цитата(aaarrr @ Jul 15 2008, 14:53) *
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?
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 15 2008, 09:56
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



после выполнения вышеприведенного кода пресловутая команда загрузки будет лежать в ОЗУ по адресу вектора IRQ.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jul 15 2008, 10:17
Сообщение #25


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

Группа: Свой
Сообщений: 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
Сообщение #26





Группа: Новичок
Сообщений: 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
Сообщение #27


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

Группа: Свой
Сообщений: 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
Сообщение #28





Группа: Новичок
Сообщений: 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
Сообщение #29





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



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


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 5-09-06
Из: Nsk
Пользователь №: 20 094



А нет ли загрузчика, чтобы грузил программу через usb в озу процессора?
Go to the top of the page
 
+Quote Post

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

 


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


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