2017-01-03 5 views
1

Je suis ce cadre https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/10693/1/Linux%20DMA%20from%20User%20Space-public.pdf pour effectuer une transmission de données à l'aide d'un DMA. J'utilise AXI DMA sans rassemblement de diffusion, avec le flux de transmission en boucle sur le flux de réception . Les codes que j'utilise sont les suivants: dma_proxy.c, dma_proxy.h, dma_proxy_test.c. J'ai essayé de changer le u32 pour u64 pendant que je travaille dans un système 64bits. Le module du noyau dma_proxy fonctionne correctement et effectue le INTERNAL_TEST correctement, mais lorsque je tente de lecture/écriture sur les tampons de dma après les mappant sur l'application utilisateur i obtenir cette erreur:Linux DMA à partir de l'erreur User Space Bus

DMA proxy test 
[ 397.889331] Unhandled fault: level 3 address size fault (0x92000043) at 0x0000007f94d4b004 
Bus error 

Dans addtition selon le cadre je devrais regarder les tampons DMA sur le noyau cartographie des zones quand j'exporter PageTable noyau, mais je l'obtenir sur vmalloc() Superficie:

0xffffff80012c5000-0xffffff80012cd000   32K  RW NX SHD AF   UXN MEM/NORMAL-NC 
0xffffff80012ce000-0xffffff80015cf000  3076K  RW NX SHD AF   UXN MEM/NORMAL-NC 
0xffffff80015d0000-0xffffff80015d8000   32K  RW NX SHD AF   UXN MEM/NORMAL-NC 
0xffffff80015d9000-0xffffff80018da000  3076K  RW NX SHD AF   UXN MEM/NORMAL-NC 

les fichiers sont de ce poste: https://forums.xilinx.com/t5/Embedded-Linux/BRAM-DMA-transfer-limitation/m-p/555953#M11603 Je suis en cours d'exécution sur une évaluation de zcu102 Conseil de Xilinx (Zynq Ultrascale +).

Une idée?

+0

Avez-vous essayé une application autonome (avec SDK) juste pour vérifier que le HW fonctionne correctement? (Quelque chose de simple comme le tableau de lecture/écriture) – Leos313

+0

Comme je l'ai dit, le test interne de dma_proxy fonctionne correctement, donc le HW fonctionne correctement. peut effectuer des transferts sur l'espace noyau. Le problème se produit lorsque j'essaie d'effectuer le transfert mappant les tampons sur l'espace utilisateur. –

Répondre

0

J'ai résolu mon problème avec l'aide de Xilinx Suppornt. C'est la fonction mmap du code du pilote qui utilise dma_common_mmap plutôt que dma_mmap_coherent, qui est celle qui devrait être utilisée pour convertir les zones de mémoire allouées par le dmam_alloc_coherent.