Я использую 2 платы ARM для удаленной записи и чтения DMA.С включенным SMMU я столкнулся с проблемой при получении физического адреса, который требуется для сопоставления физического адреса с адресом ядра в пространстве пользователя.
В настоящее время я экспериментирую с отключенным SMMU.Вот поток:
ker_addr = (u64) dma_alloc_coherent (... dma_addr_t bus_addr);// ли приведение вызывает какие-либо проблемы?
phys_addr = bus_addr;
mmap (... phys_addr);
vma-> vm_page_prot = pgprot_noncached (vma> vm_page_prot);
remap_pfn_range (vma, vma-> vm_start, vma-> vm_pgoff, vma-> vm_end - vma-> vm_start, vma-> vm_page_prot));
Но это привело к ошибке нетранслируемой страницы,Когда прокомментировал pgprot_noncached в пользовательском драйвере, я не нашел ошибки.Пожалуйста, помогите мне узнать причину.
Кроме того, рекомендуется ли заменить remap_pfn_range () на dma_mmap_coherent ()?Насколько я знаю, remap_pfn_range () имеет дело с физическим адресом, где dma_mmap_coherent () имеет дело с адресом шины, заданным dma_alloc_coherent ().Пожалуйста, дайте мне знать, если это не так.
Заранее спасибо !!