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

 
 
> Пишем код для отладки платы + азы, RM9200
Ken@t
сообщение Aug 22 2006, 17:58
Сообщение #1


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

Группа: Свой
Сообщений: 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 для ремпаирования, но это вы дальше будете делать...


--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее?
Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexMad
сообщение Jan 14 2007, 01:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата
Вот сидел, читал форумы - at91, електроникс, йаха, телесиськи... . все спрашивают "а КАК".
Отвечаем (иар подразумеваю, для других компилеров товарищи добавят описание)
1. Ставим процессор +обвязку+питание и по Жтагу заливаем минимальный код для проверки работоспособности ...
2. Ставим СДРАМ и минимальным кодом проверем работоспособность памяти.

....

Здесь c помощью простого осцилографа можно определить - залипания и не пропай по линиям, конечно же, ставим сначала одну микросхему, потом другую, что бы проще отлаживать было.


Вот сидел, ждал, когда же кто нибудь вопросы задаст... видать, кроме меня все разобрались sad.gif
А теперь мне приперло разбираться с АРМами, потому, наверно, в ближайшее время буду сыпать дурные вопросы.
По этому коду ситуация такая - заливается, "работает", залипаний на ногах нет, но и соответствия нет тоже.

Цитата
wRead = *pSDRAM;
if (wWrite != wRead )
printf ("[0x%08X] = 0x%08X ( 0x%08X,0x%08X)\n",wCount,wRead^wWrite,wRead,wWrite );


Вопрос чисто дурацкий, где копать, житагом смотрю переменную wRead, она всегда равна нулю, хотя я пробовал туда писать различные значения, константы, пробовал инкрементировать... Вобщем, непонятно, на этой стадии должно ли это работать, или без инициализации ПЛЛ и СДРАМ и не надо туда смотреть?

И еще вопрос
Цитата
и сам проект первичного загрузчика , который инициализирует sdram, pll пытается считать из флэша заголовок образа, если заголовок правильный , то загружает, иначе активно моргает светодиодом.
вторичный лодырь
Сначала компилите fBoot , смотрите JTAG как идёт процесс. Затем собираете релиз. Бинарник релиза в дальнейшем будет записан во флэш.

Я так понимаю, что в дебагере этот код тоже должен работать. У меня же он с ошибкой вылетает
Цитата
do {
AT91F_DataFlashGetStatus(pDataFlashDesc);
timeout--;
// dummy waiting time
for(i=0;i<10;i++);
} while( ((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) && (timeout>0) );

pDataFlashDesc->DataFlash_state у меня равно 0x27, при чем осциллографом я не вижу НИКАКОЙ активности на выводах SPI.

Ну, на сегодня пока дурацких вопросов хватит smile.gif, буду пока сам копаться, потом еще вопросов наберу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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
- - Dron_Gus   Цитата(aaarrr @ Jan 16 2007, 22:28) В TRM...   Jan 20 2007, 16:48
|- - aaarrr   Цитата(Dron_Gus @ Jan 20 2007, 16:48) Нос...   Jan 20 2007, 21:35
- - AlexMad   Извините за тупость, ноЦитатаВот отсюда и вниз ht...   Jan 24 2007, 00:42
- - Dron_Gus   А вы перекинули А12 и А14? У Вас же память с 13 би...   Jan 24 2007, 22:23


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:32
Рейтинг@Mail.ru


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