Записи в HW регистрирующую через/DEV/MEM нуждается в дополнительной WRITEЗаписи в HW регистров через/DEV/MEM нуждается в дополнительной записи
Я хочу написать в какое-то HW регистров с использованием/DEV/MEM на Linux. Целевая плата - ZYBO (Zynq, ARM Cortex-A9), а HW - это AXI4 Lite Slave с 4 регистрами, которые автоматически генерируются Xilinx Vivado.
Вот код C для записи в регистры HW.
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#define MAP_BASE (0x43c30000)
#define MAP_RANGE (0x10000)
int main(int argc, char *argv[])
{
volatile unsigned int *p;
void *iomap_ptr;
int fd, i, v;
fd = open("/dev/mem", O_RDWR | O_SYNC);
iomap_ptr = mmap(0, MAP_RANGE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE);
p = (volatile unsigned int *)iomap_ptr;
for (i = 0; i < 4; i++)
p[i] = i;
for (i = 0; i < 4; i++)
printf("%04X: %08X\n", i, p[i]);
munmap(iomap_ptr, MAP_RANGE);
close(fd);
return 0;
}
При запуске кода C в первый раз, результат:
0000: 00000000
0001: 00000001
0002: 00000002
0003: 00000000
Кажется, что окончательное запись не применяется.
Затем, когда я запускаю код C еще раз, результат:
0000: 00000000
0001: 00000001
0002: 00000002
0003: 00000003
После расследования, я понял, что мне нужна дополнительная запись в HW для применения последней записи.
Как я могу записать в регистры HW без дополнительной записи?
Вам нужно очистить часть D-Cache? Xilinx должен иметь некоторые макросы/функции для недействительности/очистки кэша для определенных диапазонов адресов. – rjp
@rjp: Это адресное пространство не является «неотделимым/не-кэшабельным/строго упорядоченным» (надеюсь, что я ничего не пропустил), аппаратный дизайн нарушен. Проблемы с кэшем не должны возникать в периферийном регистровом пространстве. – Olaf
@ Олаф, я не согласен. Я не работал на стороне Vivado, поэтому я не знаю, нужно ли это указывать и/или если это то, что можно настроить неправильно. – rjp