Перейти к содержанию
    

AT91SAM9G45 и DDR2

Здравствуйте!

 

Собрали свою плату на AT91SAM9G45.

 

1. Изначально поставили на первую партию DDR2-667 Micron MT47H64M8CF-3, ту что использует и сам Atmel на своих китах. Итого 2 модуля, имеем 128MB ОЗУ и наслаждаемся линуксом..

 

2. На следующуюю партию поставили DDR2-800 NANYA NT5TU64M8DE-AC и линукс перестал грузится. Экспериментальным путем обнаружили, что если в инициализации DDR2 в бутстрапе

#ifdef CONFIG_DDR2
static SDdramConfig ddram_config;

/*------------------------------------------------------------------------------*/
/* \fn	ddramc_hw_init							*/
/* \brief This function performs DDRAMC HW initialization			*/
/*------------------------------------------------------------------------------*/
void ddramc_hw_init(void)
{
ddram_config.ddramc_mdr =
	(AT91C_DDRC2_DBW_16_BITS | AT91C_DDRC2_MD_DDR2_SDRAM);

ddram_config.ddramc_cr = (AT91C_DDRC2_NC_DDR10_SDR9 |	   // 10 column bits (1K)
				  AT91C_DDRC2_NR_14 |	   // 14 row bits	(8K)
				  AT91C_DDRC2_CAS_3 |	   // CAS Latency 3
				  AT91C_DDRC2_DLL_RESET_DISABLED);  // DLL not reset

//	ddram_config.ddramc_rtr = 0x24B;
ddram_config.ddramc_rtr = 0x4121;

ddram_config.ddramc_t0pr = (AT91C_DDRC2_TRAS_6 |	//  6 * 7.5 = 45   ns
				AT91C_DDRC2_TRCD_2 |	//  2 * 7.5 = 22.5 ns
				AT91C_DDRC2_TWR_2 |	 //  2 * 7.5 = 15   ns
				AT91C_DDRC2_TRC_8 |	 //  8 * 7.5 = 75   ns
				AT91C_DDRC2_TRP_2 |	 //  2 * 7.5 = 22.5 ns
				AT91C_DDRC2_TRRD_1 |	//  1 * 7.5 = 7.5   ns
				AT91C_DDRC2_TWTR_1 |	//  1 clock cycle
				AT91C_DDRC2_TMRD_2);	//  2 clock cycles

ddram_config.ddramc_t1pr = (AT91C_DDRC2_TXP_2 |	 //  2 * 7.5 = 15 ns
	200 << 16 |	 // 200 clock cycles, TXSRD: Exit self refresh delay to Read command
	16 << 8 |	   // 16 * 7.5 = 120 ns TXSNR: Exit self refresh delay to non read command
	AT91C_DDRC2_TRFC_14 << 0);	  // 14 * 7.5 = 142 ns (must be 140 ns for 1Gb DDR)

ddram_config.ddramc_t2pr = (AT91C_DDRC2_TRTP_1 |	//  1 * 7.5 = 7.5 ns
			AT91C_DDRC2_TRPA_0 |	//  0 * 7.5 = 0 ns
			AT91C_DDRC2_TXARDS_7 |  //  7 clock cycles
			AT91C_DDRC2_TXARD_2);   //  2 clock cycles

// ENABLE DDR2 clock 
writel(AT91C_PMC_DDR, AT91C_BASE_PMC + PMC_SCER);

/*
 * DDRAM2 controller 
 */
ddram_init(AT91C_BASE_DDR2C, AT91C_DDR2, &ddram_config);
sdram_init(16);
/*
 * Setup Smart Media, first enable the address range of CS3 in HMATRIX user interface 
 */
//	writel(readl(AT91C_BASE_CCFG + CCFG_EBICSA) | AT91C_EBI_CS1A_SDRAMC,
//		   AT91C_BASE_CCFG + CCFG_EBICSA);

/*
 * EBI IO in 1.8V mode 
 */
//	writel(readl(AT91C_BASE_CCFG + CCFG_EBICSA) & ~(1 << 16),
//		   AT91C_BASE_CCFG + CCFG_EBICSA);

/*
 * EBI DDRAM controller 
 */
//	ddram_init(AT91C_BASE_DDR2CP1, AT91C_EBI_CS1, &ddram_config);

}
#endif						  /* CONFIG_DDR2 */

убрать верхний адрес, т.е. поменять

                  AT91C_DDRC2_NR_14 |       // 14 row bits    (8K)

на

                  AT91C_DDRC2_NR_13 |       // 14 row bits    (8K)

то линукс грузится и все работает, но имеем только 64М ОЗУ. Сравнили даташиты Micron & Nanya, практически идентичны по параметрам.

 

Просьба, если кто знает тонкости инициализации DDR2, подскажите куда копать?

 

Заранее благодарю.

NANYA_NTC_DDR2_512M_D_R16_Consumer.pdf

Изменено пользователем IgorKossak
[codebox], форматирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так написано же:

 

The address bits registered coincident with the activate command are used to select the bank and row to be accesses (BA0 and BA1 select the banks, A0-A13 select the row for x8 components, A0-A12 select the row for x16 components).

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так написано же:

 

The address bits registered coincident with the activate command are used to select the bank and row to be accesses (BA0 and BA1 select the banks, A0-A13 select the row for x8 components, A0-A12 select the row for x16 components).

Так у ТС x8.

 

то линукс грузится и все работает, но имеем только 64М ОЗУ. Сравнили даташиты Micron & Nanya, практически идентичны по параметрам.

Может, она на самом деле 256Mb? Проверьте на новой микросхеме, имеет ли шар сигнала A13 физическое подключение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у ТС x8.

 

Точно - тормазнул. А вот то, что NANYA при инициализации требует A13=0, её случаем от Micron не отличает?

 

Например: Issue EMRS to enable DLL. (Provide Low to A0, HIGH to BA0 and LOW to BA1 and A13. And A9=A8=A7=LOW must be used when issuing this command.)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно - тормазнул. А вот то, что NANYA при инициализации требует A13=0, её случаем от Micron не отличает?

 

Например: Issue EMRS to enable DLL. (Provide Low to A0, HIGH to BA0 and LOW to BA1 and A13. And A9=A8=A7=LOW must be used when issuing this command.)

 

A13 в нуле. Проблема не ушла. Сейчас пробуем варьировать тайминги.

Еще идеи есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще идеи есть?

Наличие вывода A13 проверили?

В standalone не пробовали исследовать поведение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наличие вывода A13 проверили?

Вывод A13 физически присутствует.

 

В standalone не пробовали исследовать поведение?

Еще не пробовали.

 

Проблема до сих пор не решена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема решена!

 

Бутстрап 3.1 ftp://ftp.linux4sam.org/pub/Android4SAM/v...trap-3.1.tar.gz и "правильный" компилятор (ибо собирается без ошибок разными версиями, но не работает) сделали свое дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"правильный" компилятор (ибо собирается без ошибок разными версиями, но не работает)

Может, быть влияние компилятора проявляется из-за того что программа не выполняет в явно заданном виде определённые необходимые условия, и вопрос случая - выполнит их компилятор или нет, хотя он не обязан этого делать.

Это может быть:

- нет достаточных задержек где-то, или лишние задержки

- порядок обращение к нескольким регистрам контроллера не задан явно в тексте программы, но он важен, а компилятор ставит обращения как повезёт

- переменные не объявлены volatile

- нужно вставить ассемблерные команды DSB или ISB

 

То есть, чисто например, при выполнении такого

int x = ddram_config.ddramc_mdr + ddram_config.ddramc_rtr;

порядок обращения к ddram_config.ddramc_mdr и к ddram_config.ddramc_rtr произволен на усмотрение компилятора, но на самом деле он может быть важен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Резюме:

Для gcc 4.6.x и выше при ВЫКЛюченной опции «Build in thumb mode» все собирается и работает.

Для gcc 4.6.x и выше при ВКЛюченной опции «Build in thumb mode» все собирается и НЕ работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...