Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR-проект
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
TigerSHARC
Необходимо чтобы в проекте была доступна вся 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 ... и висит...

а должон выдавать в консоль сообщение об удачном старте....

а проект-то по сути простой (мигалка), но запустить что-то никак не получается...
DpInRock
Причин не запуска намного больше, чем вы предполагаете.

Кто-то должен еще вызывать настройку SDRAM. Вероятно, это делается в самом первом загрузчике, который у вас bootstrap...

Далее. Если в мигалке идет настройка периферии, а bootstrap ее до этого настраивал - могут быть неприятности. К примеру, повторная настройка SDRAM как самый тяжелый случай.

А вообще, по жизни, существенно быстрее написать свой загрузчик (чуть сложнее, чем диодами помигать).
TigerSHARC
Цитата(DpInRock @ Oct 20 2010, 10:35) *
Причин не запуска намного больше, чем вы предполагаете.

Кто-то должен еще вызывать настройку SDRAM. Вероятно, это делается в самом первом загрузчике, который у вас bootstrap...

Далее. Если в мигалке идет настройка периферии, а bootstrap ее до этого настраивал - могут быть неприятности. К примеру, повторная настройка SDRAM как самый тяжелый случай.

А вообще, по жизни, существенно быстрее написать свой загрузчик (чуть сложнее, чем диодами помигать).


Что же тогда должна содержать программа, если U-boot всё проинициализировал?
Получается программа должна состаять из дефайнов, определяющих пины и из функции main?
DpInRock
А это определяет тот, кто пишет загрузчик. У меня он все гасит. От греха. Ибо загрузчик должен использовать самые безопасные настройки оборудования. А вот в основной программе, я к примеру, разгон делаю...

Большие программы,типа Линукса, видимо плохо СИЛЬНО уж привязывать к оборудованию. Посему настройку делает bootstrap. По крайней мере тут иного выхода нет. Если грузишь в SDRAM - значит больше ее не трогаешь никогда.

Там кстати, еще PLL настраивается. И его тоже очень плохо перенастраивать. Ибо SDRAM и от него питается.

Таким образом, если что-то делаешь - должен знать - что именно ты делаешь и зачем. И посему я лично не предпочитаю в темную использовать чужой код.
Поверьте, вам хватит дня, чтоб сообразить простенький загрузчик. Без затей. К примеру, по 232 заполнять SDRAM всегда с начального адреса.
Типа такого:
Команда загрузки указателя (0x20000000).
Команда записи байта по указателю с инкрементом указателя.
Команда JMP 20000000.

Вот и весь загрузчик. Токо на PC это все поддержать требуется.

А вот с его помощью вы уже сделаете загрузчик из последовательной памяти, к примеру...
В принципе, самба примерно тоже самое делает. Токо там читать долго надо, чтобы понять...
TigerSHARC
Цитата(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)

может в этом проблема?

(ещё денёк поковыряюсь и попробую написать сам загрузчик)...
DpInRock
Если он что-то грузит в SDRAM и уходя гасит свет, то он заодно и содержимое SDRAM погасит. И нахрена козе баян.

Ваши варнинги никому не помешают. Они означают, что вы где нибудь unsigned int сравниваете с отрицательным числом. Корочь, совместно используете знаковое и беззнаковое в одном выражении. Что есть нормально, но только если понимаешь что делаешь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.