|
Пишем код для отладки платы + азы, RM9200 |
|
|
|
Aug 22 2006, 17:58
|

Частый гость
 
Группа: Свой
Сообщений: 144
Регистрация: 5-08-05
Пользователь №: 7 382

|
Вот сидел, читал форумы - at91, електроникс, йаха, телесиськи... . все спрашивают "а КАК". Отвечаем (иар подразумеваю, для других компилеров товарищи добавят описание) 1. Ставим процессор +обвязку+питание и по Жтагу заливаем минимальный код для проверки работоспособности ... 2. Ставим СДРАМ и минимальным кодом проверем работоспособность памяти. Код unsigned int volatile *pSDRAM; unsigned int wCount; unsigned int wRead, wWrite; printf ("CPU %d MHz\n",GetCPUFrequencyMhz() ); printf ("PCK %d MHz\n",GetPCKFrequencyMhz() ); while (1){ printf("-T WR- 0x00000000\n"); pSDRAM = (unsigned int *) BASE_EBI_CS1_ADDRESS; for ( wCount = 0,wWrite=0x0;wCount < 0x800000;wCount ++ ){ *pSDRAM = wWrite; wRead = *pSDRAM; if (wWrite != wRead ) printf ("[0x%08X] = 0x%08X ( 0x%08X,0x%08X)\n",wCount,wRead^wWrite,wRead,wWrite ); pSDRAM++; } } Здесь c помощью простого осцилографа можно определить - залипания и не пропай по линиям, конечно же, ставим сначала одну микросхему, потом другую, что бы проще отлаживать было. далее отладили ... теперь очень хочется залить что-нибудь в SDRAM и выполнить оттуда. НО 1. Контроллер SDRAM не инициализирован 2. Частоты ПЛЛ не выставлены. Вот здесь на помощь нам приходит инструмент Жлинка , а именно его mac файл привожу его Код //---- Инициализация PLLA = 200 MHz , PLLB = 48 MHz , PCK = 100MHz init_PLL() { __var tmp, var;
__message("Init Clock"); __writeMemory32(0x0000FF01,0xFFFFFC20,"Memory"); // PMC_MOR: MOSCEN = 1, enable main clock while( (( var =__readMemory32(0xFFFFFC24,"Memory")) & (0x1 << 16)) == 0 ) { }; // wait time out
// AT91C_BASE_CKGR->CKGR_PLLAR = PLLAR_Register; __writeMemory32(0x2030BF04,0xFFFFFC28,"Memory"); tmp = 0; while( !(( var=__readMemory32(0xFFFFFC68,"Memory")) & ( 0x1 << 1)) && (tmp++ < 100) ) {};
var = __readMemory32(0xFFFFFC28,"Memory"); __message "PLLAR=",var;
//AT91C_BASE_CKGR->CKGR_PLLBR = PLLBR_Register; __writeMemory32(0x10533F0E,0xFFFFFC2C,"Memory"); tmp = 0; while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & ( 0x1 << 2)) && (tmp++ < 100) ) {};
__writeMemory32( 0x1 ,0xFFFFFC30,"Memory");
tmp = 0; while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & (0x1 << 3)) && (tmp++ < 100) ) {};
// AT91C_BASE_PMC->PMC_MCKR = MCKR_Register; __writeMemory32(0x00000102,0xFFFFFC30,"Memory");
tmp = 0; while( !((var = __readMemory32(0xFFFFFC68,"Memory")) & (0x1 << 3)) && (tmp++ < 100) ) {};
}
//----------- Инициализация SDRAM 2х8х16 (2х MT48LC8M16A2-75) init_SDRAM () { __var i; __message("Init SDRAM");
__writeMemory32(0xFFFF0000,0xFFFFF800 +0x0070,"Memory"); __writeMemory32(0x0,0xFFFFF800 +0x0074,"Memory"); __writeMemory32(0xFFFF0000,0xFFFFF804,"Memory"); i = __readMemory32(0xFFFFFF60,"Memory"); __writeMemory32(i|(0x1 << 1),0xFFFFFF60,"Memory"); __writeMemory32( 0x0 ,0xFFFFFF64,"Memory");
__writeMemory32( 0x2A99C255,0xFFFFFF98,"Memory");
__writeMemory32(0x02,0xFFFFFF90,"Memory"); __writeMemory32(0x0,0x20000000,"Memory"); __writeMemory32(0x04,0xFFFFFF90,"Memory"); for(i=0;i<8;i++) __writeMemory32(0x0,0x20000000,"Memory"); __writeMemory32(0x3,0xFFFFFF90,"Memory"); __writeMemory32(0x0,0x20000000,"Memory");
__writeMemory32(0x610,0xFFFFFF94,"Memory"); __writeMemory32(0x00,0x20000000,"Memory"); __writeMemory32(0x0,0xFFFFFF90,"Memory"); __writeMemory32(0x0,0x20000000,"Memory"); }
execUserPreload() {
init_PLL(); __writeMemory32(0xAAAAAAAA,0x00000000,"Memory"); if(__readMemory32(0x00000000,"Memory") != 0xAAAAAAAA) { __writeMemory32(0x01,0xFFFFFF00,"Memory"); // MC_RCR: toggle remap bit } init_SDRAM (); __message("Target init macro complete"); } теперь можите компилить код с загрузкой в сдрам и выполнять его отуда. Замечу , что с адреса 0х0 распологается SRAM и в стартап коде надо перенести в область 0х0 - 0х38 вектора прерывания. пример стартапа at91_cstartup.s79 Код MODULE ?RESET ; COMMON INTVEC:CODE:NOROOT(2); Я убрал, линкер подразумевает эту секцию с 0 , но её мы будем копировать в SRAM RSEG ICODE:CODE:NOROOT(2) PUBLIC __program_start EXTERN ?cstartup ; EXTERN undef_handler, swi_handler, prefetch_handler ; EXTERN data_handler, irq_handler, fiq_handler CODE32; Always ARM mode after reset ADRSTART: org 0x00+ADRSTART __program_start ldr pc,=?cstartup; Absolute jump org 0x04+ADRSTART undef_handler: ldr pc,=undef_handler org 0x08+ADRSTART swi_handler: ldr pc,=swi_handler org 0x0c+ADRSTART prefetch_handler: ldr pc,=prefetch_handler org 0x10+ADRSTART data_handler: ldr pc,=data_handler org 0x18+ADRSTART ldr pc, [pc,#-0xF20] ; IRQ : read the AIC org 0x1c+ADRSTART fiq_handler: ldr pc,=fiq_handler
; Constant table entries (for ldr pc) will be placed at 0x20 org 0x20+ADRSTART LTORG ; ENDMOD __program_start ENDMOD
;--------------------------------------------------------------- ; ?CSTARTUP ;--------------------------------------------------------------- MODULE ?CSTARTUP
RSEG IRQ_STACK:DATA(2) RSEG SVC_STACK:DATA:NOROOT(2) RSEG CSTACK:DATA(2) RSEG ICODE:CODE:NOROOT(2) PUBLIC ?cstartup EXTERN ?main
; Execution starts here. ; After a reset, the mode is ARM, Supervisor, interrupts disabled.
CODE32 ?cstartup
; Add initialization nedded before setup of stackpointers here
; Initialize the stack pointers. ; The pattern below can be used for any of the exception stacks: ; FIQ, IRQ, SVC, ABT, UND, SYS. ; The USR mode uses the same stack as SYS. ; The stack segments must be defined in the linker command file, ; and be declared above. mrs r0,cpsr ; Original PSR value bic r0,r0,#MODE_BITS ; Clear the mode bits
.... дальше как было понятно , что в lowlevelinit пишите перемещение области памяти 0х2000000 - 0х20000038 на 0 адрес или прямо в стартапном коде перемещение делаете. хотя можно и использовать TTB для ремпаирования, но это вы дальше будете делать...
--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее? Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
|
|
|
|
|
 |
Ответов
|
Jan 20 2007, 21:35
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Dron_Gus @ Jan 20 2007, 16:48)  Носом не ткнете? А то мне что-то не найти... Вот цитата из мануала: Код 4.18.2 Pseudo-random binary sequence generator It is often necessary to generate (pseudo-) random numbers and the most efficient algorithms are based on shift generators with exclusive-OR feedback rather like a cyclic redundancy check generator. Unfortunately the sequence of a 32 bit generator needs more than one feedback tap to be maximal length (i.e. 2^32-1 cycles before repetition), so this example uses a 33 bit register with taps at bits 33 and 20. The basic algorithm is newbit:=bit 33 eor bit 20, shift left the 33 bit number and put in newbit at the bottom; this operation is performed for all the newbits needed (i.e. 32 bits). The entire operation can be done in 5 S cycles: ; Enter with seed in Ra (32 bits), Rb (1 bit in Rb lsb), uses Rc. ; TST Rb,Rb,LSR#1; Top bit into carry MOVS Rc,Ra,RRX; 33 bit rotate right ADC Rb,Rb,Rb; carry into lsb of Rb EOR Rc,Rc,Ra,LSL#12; (involved!) EOR Ra,Rc,Rc,LSR#20; (similarly involved!) ; new seed in Ra, Rb as before И пример использования C + Asm: Код extern randtest(u_int *start_addr, u_int word_count, u_int *seed);
void ramtest(u_int address, u_int word_count) { static u_int addr; static u_int seed[0x02] = {0xdeadbeef, 0xcafedeca}; u_int pass = 0x00, fcount = 0x00;
addr = address; while(0x01) { printf("%d:%d Testing RAM...", pass, fcount); if(randtest(&addr, word_count, seed) == 0x00) { pass++; printf ("Passed.\n\r"); } else { fcount++; printf("Failed at 0x%08x, Exp: 0x%08x; Rcv: 0x%08x\n\r", addr, seed[0x00], *(volatile u_int *)addr); addr = address; } } } + Код EXPORT randtest
AREA code0, CODE, READONLY
randtest stmfd sp!, {r4-r6, lr} ldmia r2, {r4, r5} ldr r6, [r0] mov r7, r1 0 tst r5, r5, lsr #0x01 ; to bit into carry movs r12, r4, rrx ; 33-bit rotate right adc r5, r5, r5 ; carry into LSB of a2 eor r12, r12, r4, lsl #0x0c; (involved!) eor r4, r12, r12, lsr #0x14; (similarly involved!)
str r4, [r6], #0x04 subs r7, r7, #0x01 bne %B0
ldmia r2, {r4, r5} ldr r6, [r0] 1 tst r5, r5, lsr #0x01 ; to bit into carry movs r12, r4, rrx ; 33-bit rotate right adc r5, r5, r5 ; carry into LSB of a2 eor r12, r12, r4, lsl #0x0c; (involved!) eor r4, r12, r12, lsr #0x14; (similarly involved!)
ldr r12, [r6], #0x04 cmp r12, r4 bne %F2 subs r1, r1, #0x01 bne %B1 stmia r2, {r4, r5} mov r0, #0x00 ldmfd sp!, {r4-r6, pc} 2 sub r6, r6, #0x04 str r6, [r0] stmia r2, {r4, r5} mov r0, #0x01 ldmfd sp!, {r4-r6, pc}
END Только нужно учитывать, что диагностика в этом тесте может не сработать: ошибка будет зафиксирована в любом случае, но при повторном чтении *(volatile u_int *)addr может вернуть правильный результат.
|
|
|
|
Сообщений в этой теме
Ken@t Пишем код для отладки платы + азы Aug 22 2006, 17:58 Ruslan1 Спасибо! Интересно почитать. Ты рассказал как ... Aug 25 2006, 10:50 Ken@t О , добрался до Москвы. здесь холодно и не уютно.... Sep 13 2006, 17:04  Ruslan1 Цитата(Ken@t @ Sep 13 2006, 20:04) О , д... Sep 14 2006, 06:52  Ruslan1 Цитата(Ken@t @ Sep 13 2006, 20:04) О , д... Sep 27 2006, 18:08  AlexMad Цитата(Ken@t @ Sep 13 2006, 17:04) Сначал... Jan 14 2007, 23:57 LeonY Если мы пишим программы, так же как и сообщения,... Sep 13 2006, 18:52 Playnet Цитата(Ken@t @ Aug 22 2006, 17:58) printf... Jan 11 2007, 15:43 AlexMad ЦитатаВот сидел, читал форумы - at91, електроникс,... Jan 14 2007, 01:06 Dron_Gus ЦитатаВопрос чисто дурацкий, где копать, житагом с... Jan 14 2007, 14:57 AlexMad И ещё дурацкий вопрос: как, имея МТ-линк залить в ... Jan 15 2007, 09:35 Dron_Gus Предлагаю пообщаться на предмет проверки памяти.
... Jan 16 2007, 20:55 aaarrr Цитата(Dron_Gus @ Jan 16 2007, 20:55) Воз... Jan 16 2007, 21:34 Dron_Gus Почитал описание ядра - все кэши отключены после с... Jan 16 2007, 21:51 Dron_Gus Да. И зачем что-то изобретать. rand() + srand() Jan 16 2007, 22:06 Dron_Gus Эм... А rand() дает ту же последовательность, если... Jan 16 2007, 22:19 makc Цитата(Dron_Gus @ Jan 16 2007, 22:19) Эм.... Jan 16 2007, 22:22 aaarrr Цитата(Dron_Gus @ Jan 16 2007, 22:19) Эм.... Jan 16 2007, 22:28 Playnet Какой смысл тестить рандом? Лучше всего посмотреть... Jan 17 2007, 23:59 aaarrr Цитата(Playnet @ Jan 17 2007, 23:59) Како... Jan 18 2007, 03:12  Newegor Цитата(aaarrr @ Jan 18 2007, 02:12) Цитат... Jan 18 2007, 12:27  Playnet Цитата(aaarrr @ Jan 18 2007, 03:12) Цитат... Jan 18 2007, 13:01   aaarrr Цитата(Playnet @ Jan 18 2007, 13:01) Это ... Jan 18 2007, 13:37 Dron_Gus Вот тут вымучил. Явно бажное. Но все мои извраты с... Jan 18 2007, 17:39 AlexMad Извините за тупость, ноЦитатаВот отсюда и вниз
ht... Jan 24 2007, 00:42 Dron_Gus А вы перекинули А12 и А14? У Вас же память с 13 би... Jan 24 2007, 22:23
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|