|
|
  |
IAR-проект, инициализация SD-RAM |
|
|
|
Oct 19 2010, 19:43
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Необходимо чтобы в проекте была доступна вся SD-RAM начиная с адреса 0x20000000. Проект грузится изпод U-boot в адрес 0x20000000 и ему передаётся управление.
Единственнаое место где упоминается SD-RAM в проекте:
//------------------------------------------------------------------------------ /// Initialize and configure the SDRAM //------------------------------------------------------------------------------ void BOARD_ConfigureSdram(unsigned char busWidth) { volatile unsigned int i; static const Pin pinsSdram = PINS_SDRAM; volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM; unsigned short sdrc_dbw = AT91C_SDRAMC_DBW_16_BITS;; unsigned int tmp = 0;
busWidth = 16;
// Enable corresponding PIOs PIO_Configure(&pinsSdram, 1); // Enable EBI chip select for the SDRAM, VDDIOMSEL set: memories are 3.3V powered tmp = READ(AT91C_BASE_MATRIX, MATRIX_EBI) | AT91C_MATRIX_CS1A_SDRAMC; WRITE(AT91C_BASE_MATRIX, MATRIX_EBI, tmp); // CFG Control Register WRITE(AT91C_BASE_SDRAMC, SDRAMC_CR, AT91C_SDRAMC_NC_9 | AT91C_SDRAMC_NR_13 | AT91C_SDRAMC_CAS_2 | AT91C_SDRAMC_NB_4_BANKS | sdrc_dbw | AT91C_SDRAMC_TWR_2 | AT91C_SDRAMC_TRC_7 | AT91C_SDRAMC_TRP_2 | AT91C_SDRAMC_TRCD_2 | AT91C_SDRAMC_TRAS_5 | AT91C_SDRAMC_TXSR_8);
for (i = 0; i < 1000; i++);
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NOP_CMD); // Perform NOP pSdram[0] = 0x00000000;
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD); // Set PRCHG AL pSdram[0] = 0x00000000; // Perform PRCHG
for (i = 0; i < 10000; i++);
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 1st CBR pSdram[1] = 0x00000001; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 2 CBR pSdram[2] = 0x00000002; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 3 CBR pSdram[3] = 0x00000003; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 4 CBR pSdram[4] = 0x00000004; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 5 CBR pSdram[5] = 0x00000005; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 6 CBR pSdram[6] = 0x00000006; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 7 CBR pSdram[7] = 0x00000007; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 8 CBR pSdram[8] = 0x00000008; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD); // Set LMR operation pSdram[9] = 0xcafedede; // Perform LMR burst=1, lat=2
WRITE(AT91C_BASE_SDRAMC, SDRAMC_TR, (BOARD_MCK * 7) / 1000000); // Set Refresh Timer
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL_CMD); // Set Normal mode pSdram[0] = 0x00000000; // Perform Normal mode }
Эта функция определена в файле board memory.c и больше нигде не упоминается...
Я чайник полный, пока что. Но когда гружу проект через U-boot в SD-Ram, то мне пишет Zero length ??? ## Starting application at 0x20000000 ... и висит...
а должон выдавать в консоль сообщение об удачном старте....
а проект-то по сути простой (мигалка), но запустить что-то никак не получается...
|
|
|
|
|
Oct 20 2010, 08:50
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(DpInRock @ Oct 20 2010, 10:35)  Причин не запуска намного больше, чем вы предполагаете.
Кто-то должен еще вызывать настройку SDRAM. Вероятно, это делается в самом первом загрузчике, который у вас bootstrap...
Далее. Если в мигалке идет настройка периферии, а bootstrap ее до этого настраивал - могут быть неприятности. К примеру, повторная настройка SDRAM как самый тяжелый случай.
А вообще, по жизни, существенно быстрее написать свой загрузчик (чуть сложнее, чем диодами помигать). Что же тогда должна содержать программа, если U-boot всё проинициализировал? Получается программа должна состаять из дефайнов, определяющих пины и из функции main?
|
|
|
|
|
Oct 20 2010, 09:06
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
А это определяет тот, кто пишет загрузчик. У меня он все гасит. От греха. Ибо загрузчик должен использовать самые безопасные настройки оборудования. А вот в основной программе, я к примеру, разгон делаю...
Большие программы,типа Линукса, видимо плохо СИЛЬНО уж привязывать к оборудованию. Посему настройку делает bootstrap. По крайней мере тут иного выхода нет. Если грузишь в SDRAM - значит больше ее не трогаешь никогда.
Там кстати, еще PLL настраивается. И его тоже очень плохо перенастраивать. Ибо SDRAM и от него питается.
Таким образом, если что-то делаешь - должен знать - что именно ты делаешь и зачем. И посему я лично не предпочитаю в темную использовать чужой код. Поверьте, вам хватит дня, чтоб сообразить простенький загрузчик. Без затей. К примеру, по 232 заполнять SDRAM всегда с начального адреса. Типа такого: Команда загрузки указателя (0x20000000). Команда записи байта по указателю с инкрементом указателя. Команда JMP 20000000.
Вот и весь загрузчик. Токо на PC это все поддержать требуется.
А вот с его помощью вы уже сделаете загрузчик из последовательной памяти, к примеру... В принципе, самба примерно тоже самое делает. Токо там читать долго надо, чтобы понять...
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Oct 20 2010, 10:22
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(DpInRock @ Oct 20 2010, 13:06)  А это определяет тот, кто пишет загрузчик. У меня он все гасит. От греха. Ибо загрузчик должен использовать самые безопасные настройки оборудования. А вот в основной программе, я к примеру, разгон делаю...
Большие программы,типа Линукса, видимо плохо СИЛЬНО уж привязывать к оборудованию. Посему настройку делает bootstrap. По крайней мере тут иного выхода нет. Если грузишь в SDRAM - значит больше ее не трогаешь никогда.
Там кстати, еще PLL настраивается. И его тоже очень плохо перенастраивать. Ибо SDRAM и от него питается.
Таким образом, если что-то делаешь - должен знать - что именно ты делаешь и зачем. И посему я лично не предпочитаю в темную использовать чужой код. Поверьте, вам хватит дня, чтоб сообразить простенький загрузчик. Без затей. К примеру, по 232 заполнять SDRAM всегда с начального адреса. Типа такого: Команда загрузки указателя (0x20000000). Команда записи байта по указателю с инкрементом указателя. Команда JMP 20000000.
Вот и весь загрузчик. Токо на PC это все поддержать требуется.
А вот с его помощью вы уже сделаете загрузчик из последовательной памяти, к примеру... В принципе, самба примерно тоже самое делает. Токо там читать долго надо, чтобы понять... Хочется как можно быстрее запустить проект - чтобы хоть что-то работало... Мне на сайте поддержки сообщили что загрузчик (по крайней мере bootstrap) "уходя гасит свет"... и возможно проблема в компиляции (тем более что этим же Юбутом знакомые разработчики якобы загружали такой проект без доработок) при компиляции в IAR 5.50 выходит 10 варнингов 8 такимх: Remark[Pe068]: integer conversion resulted in a change of sign (путь к файлу ***.с) и 2 таких: Warning[Pe068]: integer conversion resulted in a change of sign (путь к файлу ***.c) может в этом проблема? (ещё денёк поковыряюсь и попробую написать сам загрузчик)...
Сообщение отредактировал TigerSHARC - Oct 20 2010, 10:26
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|