Необработанная ошибка при доступе к регистрам AXIS FIFO через драйвер устройства

Я использую 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)

person gavenant    schedule 06.09.2016    source источник
comment
Вы сопоставляете уже сопоставленное адресное пространство?!   -  person 0andriy    schedule 06.09.2016
comment
Нет - просто сопоставление регистров AXIS FIFO для использования из приложения пользовательского пространства.   -  person gavenant    schedule 06.09.2016


Ответы (1)


Кажется, память была помечена как кэшированная в vma_area_struct:

Так просто:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

до

vm_iomap_memory(vma, start, length)

сделал трюк.

person gavenant    schedule 06.09.2016