Я использую Zynq SoC с Petalinux 2016.2. Первоначально я получил доступ к своему AXIS Fifo, открыв его с помощью
open("/dev/mem", O_RDWR | O_SYNC)
и используя mmap для доступа к нему. Я мог получить доступ к регистрам устройства AXIS и успешно взаимодействовать с устройством через мое приложение C.
Затем я создал драйвер устройства платформы и узел устройства Misc для доступа к устройству. Устройство успешно распознается драйвером, и я затем
fd = open("/dev/devname, O_RDWR | O_SYNC)
а затем снова mmap устройство с помощью:
info->mapped_base = mmap(0, AXIFIFO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)
Я могу прочитать регистры, и это, кажется, правильная область памяти. Но когда я начинаю писать в некоторые из регистров, я получаю следующую ошибку:
Unhandled fault: imprecise external abort (0x1406) at 0x36e42000
pgd = 40ab4000
[36e42000] *pgd=3bff0831, *pte=43c0075f, *ppte=43c00c7f
Bus error
Сначала казалось, что это только когда я пишу в регистр сброса SRR, но есть еще несколько других мест.
Есть ли что-то очевидное, что я упускаю? Я подозреваю, что это связано с конкретными флагами, относящимися к тому, как память отображается и к ней можно получить доступ.
В настоящее время у меня есть собственная функция mmap в драйвере устройства, где я выполняю следующую операцию, где начало и длина обозначают размер отображаемой области регистров AXIS FIFO.
vm_iomap_memory(vma, start, length)