Перейти к содержанию
    

Вопрос к тем, кто использовал системный DMA

Имеется PCI устройство. Собственным DMA адаптером не обладает. Однако у данного устройства существует режим, когда оно по команде начинает "выдавать" на шину PCI посылки данных (по восемь 16-ти битных слов... всего около 100 МБ).

Вопрос: как я могу записать эти данные? Могу ли я применить в данном случае DMA материнской платы ? Если да, то просьба вкратце изложить последователность моих действий.

Должен ли я своему устройству сообщать что-то кроме собственно команды "выдавай очередной пакет"?

Должен ли я сообщать ему адрес куда копировать или это возмет на себя контроллер DMA материнской платы?

Должно ли мое устройство (сделано на FPGA) генерировать прерывание после окончания каждой посылки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер DMA на метеринской плате "в начале времен" предназначался для взаимодействия с контроллером флоппов, регенерации оперативной памяти и обслуживания устройств на шине ISA.

В данный момент из этих всех задач остался лишь флоп. ISA благополучно канула в лету, регенерация памяти решается на уровне контроллера памяти.

Оставшаяся часть контроллера DMA (работающая с флопом) в современных чипсетах обычно находится в южном мосту, и по внешнеинтерфейсной реализации сильно видоизменилась, и маловероятно что сможет обслуживать дополнительных клиентов.

Задачу внепроцессорной передачи данных, которая ранее выполнялась DMA на шине ISA, на шине PCI теперь выполняется самими PCI-устройствами - мастерами.

Вопрос: как я могу записать эти данные? Могу ли я применить в данном случае DMA материнской платы ? Если да, то просьба вкратце изложить последователность моих действий.

Итого - DMA материнки использовать нельзя

Должен ли я своему устройству сообщать что-то кроме собственно команды "выдавай очередной пакет"? Должен ли я сообщать ему адрес куда копировать или это возмет на себя контроллер DMA материнской платы?

Конечно, Вы должны дать устройству команду и все необходимые для ее выполнения параметры - в том числе _физический_ адрес назначения физически непрерываной области памяти и количество передаваемых слов. Создать и подготовить такую область памяти можно только в драйвере.

Хороший и несложный пример реализации бас-мастеринга - это стандартный PCI-IDE контроллер.

Должно ли мое устройство (сделано на FPGA) генерировать прерывание после окончания каждой посылки?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итого - DMA материнки использовать нельзя

 

Ну хорошо, в смысле не очень хорошо, но тем не менее...Как в таком случае мне нужно записать эти данные ? Как мы помним PCI девайс не обладает своим контролером DMA. Данные по каманде просто формируются на шине, по 8 16-битных пакетов. Программный I/O здесь ведь кажется тоже не подойдет, поскольку адресовать нечего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну хорошо, в смысле не очень хорошо, но тем не менее...Как в таком случае мне нужно записать эти данные ? Как мы помним PCI девайс не обладает своим контролером DMA. Данные по каманде просто формируются на шине, по 8 16-битных пакетов. Программный I/O здесь ведь кажется тоже не подойдет, поскольку адресовать нечего.

Угу, PCI-устройству DMA не нужен - иногда он сам себе DMA :)

PCI-мастер может производить любую транзакцию на своем сегменте (в том числе mem/io/config read/write) с любым устройством на этом же сегменте. А также ряд транзакций которые понимают-пропустят на другие сегменты/память мосты. Чтение-запись оперативной памяти системы - это обязательный поддерживаемый минимум на PC-материнках.

То есть, Ваш PCI-мастер может получить у арбитра шину, стать ведущим и самостоятельно выполнить запись (или чтение) в требуемую область системной памяти. Ессно, для этого ему надо знать физический адрес назначения (а то как он выполнит запись-чтение). Поэтому в Вашем устройстве должны быть соответствующие регистры, куда Вы запишете желаемые параметры транзакций. Посмотрите в приаттаченном файле как это сделано в простейшем PCI-IDE.

IDE_BusMaster.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...