|
Использование epcs_flash_controller, Не получается получить доступ к флеш |
|
|
|
Jul 21 2014, 08:41
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
Всем доброго дня. Хочу использовать лишнюю память во флешке для своих нужд. Для начала пытаюсь прочитать содержимое, записанное в процессе конфигурации. Добавил в программу следующее:
#define ALT_USE_EPCS_FLASH #include <altera_avalon_epcs_flash_controller.h>
ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INSTANCE ( EPCS_FLASH_CONTROLLER_0, epcs_flash_controller_0);
Далее, в main:
alt_epcs_flash_init(&epcs_flash_controller_0);
И пытаюсь прочитать область памяти:
alt_u8 buf_FL[32]; int offset = 0x019520; int length = 32; int var = 0; for(var=0; var<32; var++){buf_FL[var]=0;} alt_epcs_flash_read(&epcs_flash_controller_0.dev, offset, buf_FL, length);
В результате, у меня в буфере что-то появляется, но совсем не то, что лежит в .flash файле, которым была прошита конфигурационная флешка. В остальном весь проект работает, и из флэш, и в режиме отладки. Может, кто подскажет - что я делаю не так?
|
|
|
|
|
Jul 21 2014, 09:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(sdimann @ Jul 21 2014, 11:41)  Давно делал не помню всех нюансов, но если глянуть старый код, то для инициализации контроллера я использовал макрос ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INIT. Код ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INSTANCE(EPCS_FLASH_CONTROLLER_0, epcs_flash);
void epcs_loader_test() { char buf[8]; int offset = 0, i;
ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INIT(EPCS_FLASH_CONTROLLER_0, epcs_flash);
for(i = 0; i < 65536; i++) { alt_epcs_flash_read(&epcs_flash.dev, offset, (void *) buf, 8); offset += 8; } }
|
|
|
|
|
Jul 21 2014, 09:22
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
Цитата(doom13 @ Jul 21 2014, 16:06)  Давно делал не помню всех нюансов, но если глянуть старый код, то для инициализации контроллера я использовал макрос ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INIT. Спасибо за ответ, значит я по крайней мере на правильном пути. Это на самом деле одно и тоже, этот макрос определен в файле altera_avalon_epcs_flash_controller.h : #define ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INIT(name, dev) \ alt_epcs_flash_init(&dev) Может, я сам себя обманываю? Должно ли содержимое флешки соответствовать содержимому файлов .flash, генерируемых квартусом для программирования этой флешки?
|
|
|
|
|
Jul 21 2014, 09:47
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
Цитата(Swup @ Jul 21 2014, 16:32)  - заливать в память .bin - снять и подать питание
Это я к чему. Может вы не то проверяете? Не претендую на 100% достоверность.
ПС Да, при чтении из памяти получается в точности содержимое .bin файла Сгенерировал бин, проверил. Что .bin, что .hex, что .flash - во всех файлах одинаковые данные, только смотреть их надо по-разному. И не совпадает с тем, что я читаю из флеш. Пробовал по разным адресам, и с 0, и с конца.
|
|
|
|
|
Jul 21 2014, 21:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(sdimann @ Jul 21 2014, 12:47)  Сгенерировал бин, проверил. Что .bin, что .hex, что .flash - во всех файлах одинаковые данные, только смотреть их надо по-разному. И не совпадает с тем, что я читаю из флеш. Пробовал по разным адресам, и с 0, и с конца. Hex - это прошивка самого Nios, она лежит в EPCS с какого-то там адреса, правильно ли Вы его считываете? Возмите rbf, он уж точно лежит с нулевых адресов в EPCS, и пробуйте его прочитать.
|
|
|
|
|
Jul 22 2014, 04:16
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
Цитата(doom13 @ Jul 22 2014, 04:26)  Hex - это прошивка самого Nios, она лежит в EPCS с какого-то там адреса, правильно ли Вы его считываете? Возмите rbf, он уж точно лежит с нулевых адресов в EPCS, и пробуйте его прочитать. Я смотрел с учетом адреса, в hex и во flash в начале строки адрес стоит. Если файл сгенерен правильно, то по одинаковым адресам во всех файлах одинаковые данные. Единственное, там есть упоминание про компрессию какую-то, может, она влияет?
|
|
|
|
|
Jul 22 2014, 06:35
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
у ксалинкса, например, часть файлов в ASCII кодировке, то есть вместо 0xA5 в памяти лежит буква А и 5, также это все собрано строками и перед ними стоит сдвиг адреса, а в конце контрольная сумма строки, это какой-то стандартизованный формат, не помню чей. Естественно при прошивке отрезается начало со сдвигом адреса, отбрасывается контрольная сумма, и 2 символа преобразуются в правильный один. Вы эти нюансы учли?
Попробуйте внешними средствами считать флэшку с понятного адреса.
|
|
|
|
|
Jul 22 2014, 09:20
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
Цитата(Golikov A. @ Jul 22 2014, 13:35)  у ксалинкса, например, часть файлов в ASCII кодировке, то есть вместо 0xA5 в памяти лежит буква А и 5, также это все собрано строками и перед ними стоит сдвиг адреса, а в конце контрольная сумма строки, это какой-то стандартизованный формат, не помню чей. Естественно при прошивке отрезается начало со сдвигом адреса, отбрасывается контрольная сумма, и 2 символа преобразуются в правильный один. Вы эти нюансы учли?
Попробуйте внешними средствами считать флэшку с понятного адреса. Ну да, это hex формат так устроен. Конечно я это учел. Похоже, у меня какая-то проблема с реализацией BSP или QSYS. Сейчас пробую прочитать флешку на уровне SPI.
|
|
|
|
|
Jul 23 2014, 02:33
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 9-02-05
Пользователь №: 2 514

|
В общем, частично разобрался. Я программировал флеш квартусом через индирект (.jic), предварительно конвертируя файлы. Глянул в создаваемый .map файл, а в нем действительно начала и концы сегментов не совпадают с теми, что во .flash файлах, то есть при конвертации в .jic квартус как-то преобразует данные. А при программировании с помощью ниос программера все данные совпадают - проверил считав флеш по SPI. Но теперь у меня (после апгрейда ниос) флеш в ниосе не читается стандартными функциями. Буду сегодня разбираться. Цитата(doom13 @ Jul 22 2014, 18:39)  Сгенерте совместно с другими файлами конфигурации rbf, залейте прошивку в EPCS, посмотрите сходятся ли прочитанные данные с 0-х адресов с данными в rbf. Для V-х FPGA, такой способ не подойдёт, там есть какя-то проблема с генерацией rbf. Ну и компрессию пока убирайте. Подскажите, пожалуйста, каким образом rbf генерировать?
|
|
|
|
|
Apr 20 2015, 07:46
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(sdimann @ Jul 23 2014, 05:33)  В общем, частично разобрался. Я программировал флеш квартусом через индирект (.jic), предварительно конвертируя файлы. Скажите пожалуйста, если один и тот же .jic файл записывать в EPCS через JTAG в Квартусе с помощью USB Blaster и напрямую командами NIOS-а ( используя соответствующие команды драйвера epcs_commands.h ), то в EPCS получится один и тот же битстрим?
|
|
|
|
|
Apr 20 2015, 12:21
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Цитата Скажите пожалуйста, если один и тот же .jic файл записывать в EPCS через JTAG в Квартусе с помощью USB Blaster и напрямую командами NIOS-а ( используя соответствующие команды драйвера epcs_commands.h ), то в EPCS получится один и тот же битстрим? Если использовать Nios flash programmer, утилиту встроенную в Eclipse, то да. Логично предположить, что если писать "вручную", то тоже да.
|
|
|
|
|
Apr 20 2015, 12:31
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(serjj @ Apr 20 2015, 15:21)  Если использовать Nios flash programmer, утилиту встроенную в Eclipse, то да. Логично предположить, что если писать "вручную", то тоже да. Судя по Вашему ответу Вы меня не правильно поняли. Я просил сравнить 2 варианта записи одного и того же .jic файла в EPCS в 2-х вариантах: 1). в Квартусе через JTAG с помощью USB Blaster 2). командами NIOS-а используя соответствующие команды драйвера epcs_commands.h Вопрос: При условии корректной записи в обоих вариантах в EPCS получится один и тот же битстрим или будут отличаться? Другими словами, Квартус через JTAG с помощью USB Blaster-а записывает .jic файл в EPCS один в один или что-то в нём меняет перед записью?
|
|
|
|
|
Apr 20 2015, 13:49
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Цитата Вопрос: При условии корректной записи в обоих вариантах в EPCS получится один и тот же битстрим или будут отличаться? Другими словами, Квартус через JTAG с помощью USB Blaster-а записывает .jic файл в EPCS один в один или что-то в нём меняет перед записью? Нет, не меняет. Просто записывает его и всё. И если ниосом залить туже самую прошивку, то во флешке будет лежать тоже самое.
|
|
|
|
|
Apr 24 2015, 15:19
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(serjj @ Apr 20 2015, 16:49)  Нет, не меняет. Просто записывает его и всё. И если ниосом залить туже самую прошивку, то во флешке будет лежать тоже самое. Это Вы знаете на собственном опыте или из теории? Вот здесь я проверил - прочитанные из EPCS данные ( по крайней мере с нулевого смещения ) не совпадают с ранее туда записанным .jic файлом.
|
|
|
|
|
Apr 24 2015, 16:52
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(tvcam @ Apr 24 2015, 19:37)  Насчёт меняет или не меняет: посмотрел свои исходники замены прошивки посредством Ниоса, почему то переставлены биты в байтах зеркально и вырезано 92(+-1) байта с начала. В качестве файла используется .jic. Но у меня интерфейс SPI обмена с EPCS, что в Ниосе, что в FPGA написаны саморучно по той простой причине что нужно было сильно ужаться. Ещё раз: биты переставлены хотя команды управления EPCS идут не переставленные. Вот это сюрприз! А это где-то документировано у Альтеры? Мне нужно исходный .jic файл, записанный в EPCS по по адресу 0x00 заменить на другой .jic файл. Вырезано 92(+-1) байта с начала - в смысле заменено на 0xff ? Я вижу, что именно так, но поскольку у меня маленькое окошко просмотра - всего 16 байт ( всё под завязку в ПЛИС заполнено ) , то пока не могу всю прошивку прочитать ( для этого надо прогу соответствующую писать - это чуть позже ).
|
|
|
|
|
Apr 24 2015, 16:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Цитата прочитанные из EPCS данные ( по крайней мере с нулевого смещения ) не совпадают с ранее туда записанным .jic файлом. hint: jic это не просто sof + hex(elf? или ещё что у вас там) в нём ещё указана прошивка-загрузчик (из состава квартуса), обеспечивающая доступ к микросхеме EPCS через JTAG, и использующаяся на время прошивки этих самых (sof + hex) через JTAG при помощи quartus programmer. поэтому используйте смещение. либо откажитесь от jic.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
Apr 24 2015, 17:00
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(krux @ Apr 24 2015, 19:55)  поэтому используйте смещение. Мне нужно исходный .jic файл, записанный в EPCS по адресу 0x00 заменить на другой .jic файл командами epcs_write_buffer ( из драйвера epcs_commands.h ). Как использовать смещение, поясните пожалуйста?
|
|
|
|
|
Apr 24 2015, 17:39
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 10-12-04
Из: spb
Пользователь №: 1 435

|
Цитата(FLTI @ Apr 24 2015, 20:23)  В EPCS c 0x00 первые 16 байт - это 0xFF, остальные пока не смотрел. Прочитано командой epcs_read_buffer из драйвера epcs_commands.h. Посмотрел несколько файлов .jic hex редактором начиная с 92 байта практически у всех идёт 0xff. В некоторых вторые 16 байт после 92 уже не 0xff, а в некоторых и дальше 0xff. Это наверно зависит от прошивки. Там в hex редакторе чётко видно что до 92 байта идёт текстовая информация. А вот первые три байта с 0x00 в файле .jic похоже равны всегда 4A4943 по ним я и определяю что файл правильный для FPGA.
|
|
|
|
|
Apr 24 2015, 18:02
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 10-12-04
Из: spb
Пользователь №: 1 435

|
Непонятно, что вам непонятно. Сначала записать посредством JTAG файл .jic в EPCS, проект должен работать(насколько я понял вы это умеете). Считать не первые 16, а вторые или следующие байты из EPCS с помощью ниоса, байты должны отличаться от 0xff. Найти эти байты в .jic файле на компьютере с помощью HEX редактора. Сделать вывод о том нужно их переворачивать (менять местами биты) и сделать вывод где лежат эти байты в EPCS (смещение). На сколько я понимаю по исходникам они будут лежать со смещением +92. Затем Ниосом читать файл .jic на компьютере (какой у вас интерфейс обмена с компьютером я не знаю), записывать этот файл в EPCS стандартными командами, только первые 92 байта точно не записывать, и если нужно разворачивать биты. 92-й байт из файла .jic должен записаться в EPCS по нулевому адресу. Возможно я где то ошибаюсь, давно это было, но у меня вроде так.
|
|
|
|
|
Apr 24 2015, 18:39
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(doom13 @ Apr 24 2015, 21:02)  а проще сгенерить RPD-файл и его заливать epcs_flash_controller-ом ( сообщение #15). В RPD-файле - только полезные данные. Точно не поню, но, вероятно, придётся поменять порядок бит в каждом байте при записи RPD в EPCS. Да, всё точно так! В RPD-файле - только полезные данные. Благодарю Вас, doom13 и tvcam.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|