как получить физический адрес виртуального адреса V4L2 DMA? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть типичный драйвер V4L2, который я использую, настроенный для метода ввода-вывода с отображением в памяти.Этот драйвер передает виртуальный адрес моему приложению пользовательского пространства.Все это работает нормально.

У меня есть другой драйвер, который ожидает в качестве ввода физический адрес ядра.Я хочу подключить выход драйвера V4L2 к входу этого драйвера, но ему нужен физический адрес (этот драйвер управляет функциональностью FPGA).

Насколько я понимаю, подпрограмма ядра: подпрограмма virt_to_phys () НЕ БУДЕТработа с выделенными в памяти адресами DMA.Это правда?Если да, то как я могу получить физический адрес из виртуального адреса V4L2, отображенного в памяти DMA, который был передан в пространство пользователя?

Я просто собираю здесь подтверждение концепции, поэтому жесткое кодирование некоторых адресов не являетсявопрос.Это единственное приложение, работающее на выделенной встроенной платформе.

Спасибо, -Андрес

1 Ответ

0 голосов
/ 27 октября 2018

Это можно объяснить в 3 этапа:

  1. Приложение V4L2 вызовет VIDIOC_REQBUF для выделения буфера.Если тип памяти VB2_MEMORY_MMAP.Драйвер инфраструктуры V4l2 выделит буфер и упакует его как тип структуры vb2_dc_buf и сохранит указатель этой структуры в плоскостях [plane] .mem_priv.Эта структура будет иметь физический адрес DMA.

  2. Приложение должно вызвать VIDIOC_EXPBUF, передавая плоскости [plane] .mem_priv.Затем платформа v4l2 реализует vb2_core_expbuf (), где она вызывает специальные API DMA, такие как vb2_dc_get_dmabuf () и dma_buf_fd (), чтобы получить буфер DMA fd.

  3. Приложение может экспортировать это (передать этот fd) во 2-йдрайвер, в который второй драйвер импортирует fd и преобразует обратно в физический адрес DMA с помощью API DMA

...