Включенный мост SDRAM Cyclone V заблокирован

У меня есть плата разработки DE10-Nano Cyclone V с 1 ГБ внешней оперативной памяти DDR3 от Terasic, и я хочу реализовать драйвер, который может управлять связью между Linux, работающим на процессоре ARM Cortex-A9, и матрицей FPGA Циклон В.
С dma_alloc_coherent Я выделяю определенный объем памяти и записываю аппаратный адрес в модуль FPGA, который я запрограммировал.
Затем я перехожу к записи произвольного числа через интерфейс SDRAM AXI по заданному адресу, но, очевидно, ни сигнал AWREADY, ни сигнал WREADY никогда не утверждаются ведомым SDRAM AXI.
Я настроил интерфейс SDRAM AXI для работы на частоте 325 МГц, шириной 256 бит (длина данных), длиной адресации 32 бита и должен быть подчиненным AXI3. Интерфейс SDRAM настроен как устройство с поддержкой TrustZone (параметр ARM TrustZone)
Я также подключил некоторые другие строки конфигурации к ведомому AXI, которые я сейчас перечислю:

assign axm_m0_arburst = 'd0;
assign axm_m0_arcache = 'd0;
assign axm_m0_arid = 'd0;
assign axm_m0_arlen = 'd0;
assign axm_m0_arlock = 'd0;
assign axm_m0_arprot = 'd0;
assign axm_m0_arsize = 'b101;

assign axm_m0_awburst = 'd0;
assign axm_m0_awcache = 'd0;
assign axm_m0_awid = 'd0;
assign axm_m0_awlen = 'd0;
assign axm_m0_awlock = 'd0;
assign axm_m0_awprot = 'd0;
assign axm_m0_awsize = 'b101;
assign axm_m0_wid = 'd0;
assign axm_m0_wstrb = 'hFFFFFFFF;

При взгляде на драйвер моста FPGA в Linux (/sys/class/fpga-bridge/br4) состояние показывается как "включено".
Что может быть причиной того, что мост все еще блокирует связь?
Спасибо за любую помощь.

1 ответ

Решение

Задача решена:
Очевидно, хотя Linux сказал, что мосты включены, они не были. Нужно записать определенные биты конфигурации в конфигурационную структуру HPS, иначе модуль не будет работать.
1. Создайте папку передачи обслуживания с помощью шага сборки Quartus. Это генерирует описание конфигурации для всех мостов, среди прочего.
2. С помощью bsp-editor создайте и скомпилируйте загрузчик первого этапа, который будет иметь некоторые глобальные переменные, которые хранят значения конфигурации и делают их доступными для загрузочных скриптов.
3. Создайте загрузочный скрипт с этим содержанием:

echo -- Programming FPGA --
fatload mmc 0:1 $fpgadata soc_system.rbf;
fpga load 0 $fpgadata $filesize;

run bridge_enable_handoff;
mw $fpgaintf $fpgaintf_handoff;
mw $fpga2sdram $fpga2sdram_handoff;
go $fpga2sdram_apply;
mw $axibridge $axibridge_handoff;
mw $l3remap $l3remap_handoff;
#md $fpgaintf;
#md $fpga2sdram;
#md $axibridge;

setenv fdtimage soc_system.dtb;
setenv mmcroot /dev/mmcblk0p2;
setenv mmcload 'mmc rescan;${mmcloadcmd} mmc 0:${mmcloadpart} ${loadaddr} ${bootimage};${mmcloadcmd} mmc 0:${mmcloadpart} ${fdtaddr} ${fdtimage};';
setenv mmcboot 'setenv bootargs console=ttyS0,115200 root=${mmcroot} rw rootwait; bootz ${loadaddr} - ${fdtaddr}';

run mmcload;
run mmcboot;

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

Для дальнейшего чтения по этим темам я рекомендую эти страницы:
Карта памяти Циклона V HPS (Альтера)
Учебник по программированию ПЛИС (Rocketboards)
Как включить мосты HPS (Altera)

Другие вопросы по тегам