Запись в аппаратные регистры через /dev/mem требует дополнительной записи
Я хочу записать в некоторые аппаратные регистры, используя /dev/mem в Linux. Целевая плата — ZYBO (Zynq, ARM Cortex-A9), а аппаратное обеспечение — 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 без дополнительной записи?
stdint.h
типы. Также рекомендуется инкапсулировать полное определение указателя регистра в макрос. Это позволяет избежать ручного приведения каждый раз, когда вы используете этот указатель, который подвержен ошибкам. - person too honest for this site   schedule 19.09.2016