Как заставить устройство PCI инициировать операцию DMA?
Мне нужно найти способ легко запускать операции DMA по моей команде, чтобы облегчить аппаратную отладку. Можно ли инициализировать DMA read
на существующем устройстве PCI (например, звуковой карте или сетевой карте) в моем Linux, записывая напрямую в его регистры? Или мне нужно написать собственный драйвер и вызвать его insmod
?
1 ответ
Не существует стандартного способа начать операцию DMA. Как правило, вам нужно подготовить буфер DMA на хосте и настроить регистры DMA на вашем устройстве, загрузить адреса (адреса) DMA, размер (ы) и т. Д.
Однако не существует единого стандарта для регистров DMA для устройств PCI. Вам нужно найти документ с описанием спецификации вашего устройства PCI. В этой спецификации ищите главу DMA (это также называется PCI "основной доступ", а не "целевой доступ").
Там вы найдете: - Если поддерживается рассеяние или непрерывный прямой доступ к памяти. - Как настроить регистры DMA, один из них обычно называется DMA CSR - "Регистр команд / состояний DMA". - Если устройство поддерживает сложную схему DMA (один или несколько кольцевых буферов, цепочка дескрипторов DMA и т. Д.)
Но хорошо то, что многие PCI-устройства поддерживают DMA нулевого размера. Который не делает никакого доступа к памяти, но только вызывает прерывание "DMA complete". Это может быть очень удобным местом для вас.