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

Всем привет, с наступающим!

У меня возникла необходимость общения с флешкой Micron MT28GU01GAAA1EGC-0SIT на плате vcu108. Раньше с bpi флешками не работал поэтому глупый вопрос. Для spi флешек все понятно - там стандартный spi и есть уже готовое решение от тех же ксайлинкс. Для работы с bpi flash я так понимаю нужно использовать axi emc в качестве готового решения? Или как вообще это делается? Поверхностный гуглеж дает много информации о прошивке флешки через джтаг, но пока не нашел информации как общаются с флешкой из ПЛИС внутри прошивки.

P.S. Задача - в адресном  пространстве под прошивкой хранить свои данные для микроблейза.

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


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

Я решил освоить emc, в качестве примера взял экзампл дизайн на это ядро и пробую его развести для своей платы. И тут сразу возникла проблема - Vivado не может разместить ноги dq0,1,2,3, clk и cen. Судя по раскладке это Config пины - их нельзя использовать внутри прошивки? Как тогда эту флешку использовать кроме как для выгрузки прошивки в ПЛИС?

image.png.32b2797c5c414842aed041249e1e7d6a.png

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


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

Приветствую!

12 minutes ago, Lutovid said:

Я решил освоить emc, в качестве примера взял экзампл дизайн на это ядро и пробую его развести для своей платы. И тут сразу возникла проблема - Vivado не может разместить ноги dq0,1,2,3, clk и cen. Судя по раскладке это Config пины - их нельзя использовать внутри прошивки? Как тогда эту флешку использовать кроме как для выгрузки прошивки в ПЛИС?

 

Естественно не может так как эти ноги  выделенные для конфигурации и напрямую user их пользовать не может. 

Для этого есть STARTUP примитив который работает прокладкой межу user логикой и этими ногами

STARTUPE3 #(
  .PROG_USR     ("FALSE"), // Activate program event security feature. Requires encrypted bitstreams.
  .SIM_CCLK_FREQ(0.0    )  // Set the Configuration Clock Frequency (ns) for simulation
) i_STARTUPE3 (
  .CFGCLK   (cfgclk          ), // 1-bit output: Configuration main clock output
  .CFGMCLK  (cfgmclk         ), // 1-bit output: Configuration internal oscillator clock output
  .EOS      (mcap_eos        ), // 1-bit output: Active-High output signal indicating the End Of Startup
  .PREQ     (                ), // 1-bit output: PROGRAM request to fabric output
  .PACK     (1'b0            ), // 1-bit input: PROGRAM acknowledge input
  .DI       (p_flash_d_i[3:0]), // 4-bit output: Allow receiving on the D input pin
  .DO       (p_flash_d_o[3:0]), // 4-bit input: Allows control of the D pin output
  .DTS      ({4{p_flash_dts}}), // 4-bit input: Allows tristate of the D pin
  .FCSBO    (p_flash_nce_o   ), // 1-bit input: Controls the FCS_B pin for flash access
  .FCSBTS   (1'b0            ), // 1-bit input: Tristate the FCS_B pin
  .GSR      (1'b0            ), // 1-bit input: Global Set/Reset input (GSR cannot be used for the port)
  .GTS      (1'b1            ), // 1-bit input: Global 3-state input (GTS cannot be used for the port name)
  .KEYCLEARB(1'b1            ), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
  .USRCCLKO (emcclk_gclk     ), // 1-bit input: User CCLK input
  .USRCCLKTS(~gpio05_o[2]    ), // 1-bit input: User CCLK 3-state enable input
  .USRDONEO (gpio05_o[0]     ), // 1-bit input: User DONE pin output control
  .USRDONETS(~gpio05_o[1]    )  // 1-bit input: User DONE 3-state enable output
);

Удачи! Rob

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


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

Нашел вот такой крутой пример

http://www.xilinx.com/support/documentation/application_notes/xapp1282-us-post-cnfg-nor-axi-emp-ip.pdf

Хочется с ним досконально разобраться, но возникла проблема - на вивадо 16.1(на которой написан пример) все работает, а при переходе к 17.1(на которой я работаю в основном) стандартная библиотечная функция XFlash_Initialize возвращает ошибку XFLASH_CFI_QUERY_ERROR. Я попробовал залить софт из sdk 17.1 в хард старой версии - все работает - то есть дело не в обновлении библиотек, как я понимаю.

 

Апгрейд лог вроде ничего критичного не выдает по части emc(прикрепил файл). Адреса после апгрейда все сохранились старые.

Поискал на форуме ксайлинкса проблему - не нашел.

Подскажите пожалуйста, сталкивался кто с такой проблемой?

 

ip_upgrade.log

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


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

On 1/11/2019 at 7:22 PM, Lutovid said:

Нашел вот такой крутой пример

http://www.xilinx.com/support/documentation/application_notes/xapp1282-us-post-cnfg-nor-axi-emp-ip.pdf

Хочется с ним досконально разобраться, но возникла проблема - на вивадо 16.1(на которой написан пример) все работает, а при переходе к 17.1(на которой я работаю в основном) стандартная библиотечная функция XFlash_Initialize возвращает ошибку XFLASH_CFI_QUERY_ERROR. Я попробовал залить софт из sdk 17.1 в хард старой версии - все работает - то есть дело не в обновлении библиотек, как я понимаю.

 

Апгрейд лог вроде ничего критичного не выдает по части emc(прикрепил файл). Адреса после апгрейда все сохранились старые.

Поискал на форуме ксайлинкса проблему - не нашел.

Подскажите пожалуйста, сталкивался кто с такой проблемой?

 

ip_upgrade.log

Проверьте ключи библиотеки XilFlash в BSP - совпадают лт они для BSP разных версий.

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


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

On 1/14/2019 at 7:39 AM, Bad0512 said:

Проверьте ключи библиотеки XilFlash в BSP - совпадают лт они для BSP разных версий.

Совпадают, я уже заметил такой момент - если добавить чипскоуп на emc в новой версии, то все начинает работать, с времянкой все ок... что-то видимо в примере недоконстрейнчено или оптимизируется без скоупа

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


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

Как-то была проблема с работой памяти на плате с Virtex 7, в SYNC mode не хотела работать, всё решалось переходом в ASYNC mode и работой в данном режиме.

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


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

4 hours ago, doom13 said:

Как-то была проблема с работой памяти на плате с Virtex 7, в SYNC mode не хотела работать, всё решалось переходом в ASYNC mode и работой в данном режиме.

Спасибо, это я уже на форуме ксайлинкса нашел - это решило другую проблемы

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


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

Возникла новая проблема с этой темой связанная, подскажите кто-нибудь, пожалуйста

Собрал проект по примеру https://www.xilinx.com/support/documentation/application_notes/xapp1282-us-post-cnfg-nor-axi-emp-ip.pdf

Запись/чтение работает, пишу по 1024 байта.

НО запись этого блока занимает 0.7 секунд

Вот код си

int bpi_program_flash_user_data(u32 StartAddr,u32 BytesNumber, u8* DataStart)
{
	u32 tic;


	XTmrCtr_Enable(XPAR_TMRCTR_0_BASEADDR, 1);
	tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1);
	xil_printf("timer INIT\n\r");
		int Status=XST_SUCCESS;
		int i;
		FileByteCount = BytesNumber;
		NoOfblockperPartition				=0;
		NoOf1024Packets						=0;
		for(i=0; i<BytesNumber; i++)
		{
			WriteBuffer[i] = *(DataStart+i);
		}

		if (NoOf1024Packets==0)
				{
					Status = bpi_flash_erase_1024(StartAddr, BytesNumber);
						if(Status != XST_SUCCESS) {
										return XST_FAILURE;
									}
						NoOfblockperPartition++;
			}
		Status = bpiFlashWrite_1024(StartAddr, BytesNumber);
			if(Status != XST_SUCCESS) {
				return XST_FAILURE;
				} else
				{
					NoOf1024Packets++;
					if (NoOf1024Packets ==256)
						{
							NoOf1024Packets=0;
						}
				}

		tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic;
		xil_printf("timer = %d", tic);
		XTmrCtr_Disable(XPAR_TMRCTR_0_BASEADDR, 1);

		return XST_SUCCESS;
}

В консоли:

timer INIT
timer = 478694timer INIT
timer = 95275505timer INIT
timer = 95351562timer INIT
timer = 87752350timer INIT
timer = 93063388timer INIT
timer = 87836049timer INIT
timer = 93870938timer INIT
timer = 90060920timer INIT
timer = 86285611timer INIT
timer = 93038591timer INIT
timer = 93885447timer INIT
timer = 87073618timer INIT
timer = 88577868

тактовая счетчика 125МГц. вот и получается, что каждые 1024 байта пишутся около секунды... Это уж очень дофига. Я полагаю< что можно подстроить скорость в emc, но пока не понял что менять можно, а что нет - так как от примера долеко не отходил. Подскажите пожалуйста как победить проблему? Может вообще дело в микроблейзе и emc не надо копать?

Я прикрепил скрин параметров emc - то же самое, что в примере.

image.png

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


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

Попробуйте отдельно измерить время стирания и записи. Но NOR в принципе стирается и пишется медленно.

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


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

int bpi_program_flash_user_data(u32 StartAddr,u32 BytesNumber, u8* DataStart)
{
	u32 tic;


	XTmrCtr_Enable(XPAR_TMRCTR_0_BASEADDR, 1);
		int Status=XST_SUCCESS;
		int i;
		FileByteCount = BytesNumber;
		NoOfblockperPartition				=0;
		NoOf1024Packets						=0;
		for(i=0; i<BytesNumber; i++)
		{
			WriteBuffer[i] = *(DataStart+i);
		}

		if (NoOf1024Packets==0)
				{
			tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1);
					Status = bpi_flash_erase_1024(StartAddr, BytesNumber);
						if(Status != XST_SUCCESS) {
										return XST_FAILURE;
									}
						NoOfblockperPartition++;
			tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic;
			xil_printf("erase time = %d\n\r", tic);
			}
		tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1);
		Status = bpiFlashWrite_1024(StartAddr, BytesNumber);
			if(Status != XST_SUCCESS) {
				return XST_FAILURE;
				} else
				{
					NoOf1024Packets++;
					if (NoOf1024Packets ==256)
						{
							NoOf1024Packets=0;
						}
				}
		tic = XTmrCtr_mGetTimerCounterReg(XPAR_TMRCTR_0_BASEADDR,1)-tic;
		xil_printf("write time = %d\n\r", tic);
		XTmrCtr_Disable(XPAR_TMRCTR_0_BASEADDR, 1);

		return XST_SUCCESS;
}
23 hours ago, aaarrr said:

Попробуйте отдельно измерить время стирания и записи.

модифицировал код. В итоге:

erase time = 84861670
write time = 150483
erase time = 87956353
write time = 150430
erase time = 87231692
write time = 150863
erase time = 88019450
write time = 148818
erase time = 87290593
write time = 149747
erase time = 92611360
write time = 149437
erase time = 88054675
write time = 154769
erase time = 88052405
write time = 148445


Иными словами очистка 0.7 секукнды, запись 1.2 микросекунды

Но на сколько я знаю перед записью нужно обязательно очищать. Я ошибаюсь?

Я понимаю, что скорость не будет высокой, но через джтаг пишется-то прошива во флеш быстрее, а учитывая что я хочу записывать 32 мегабайта - я поседею, пока это все писаться будет.

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


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

Вероятно надо очищать блоками большего размера, это надо инструкцию на флэшку изучать.

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


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

4 minutes ago, Lutovid said:

Но на сколько я знаю перед записью нужно обязательно очищать. Я ошибаюсь?

Нужно. Но ваша флеш стирается блоками по 256КБайт, а пишете Вы по одному. Отсюда и низкая скорость.

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


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

14 minutes ago, aaarrr said:

Но ваша флеш стирается блоками по 256КБайт, а пишете Вы по одному. Отсюда и низкая скорость.

Огромное спасибо! не углядел

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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