Tommyknocker 0 3 декабря, 2005 Опубликовано 3 декабря, 2005 · Жалоба Имеется PCI устройство. Собственным DMA адаптером не обладает. Однако у данного устройства существует режим, когда оно по команде начинает "выдавать" на шину PCI посылки данных (по восемь 16-ти битных слов... всего около 100 МБ). Вопрос: как я могу записать эти данные? Могу ли я применить в данном случае DMA материнской платы ? Если да, то просьба вкратце изложить последователность моих действий. Должен ли я своему устройству сообщать что-то кроме собственно команды "выдавай очередной пакет"? Должен ли я сообщать ему адрес куда копировать или это возмет на себя контроллер DMA материнской платы? Должно ли мое устройство (сделано на FPGA) генерировать прерывание после окончания каждой посылки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 4 декабря, 2005 Опубликовано 4 декабря, 2005 · Жалоба Контроллер DMA на метеринской плате "в начале времен" предназначался для взаимодействия с контроллером флоппов, регенерации оперативной памяти и обслуживания устройств на шине ISA. В данный момент из этих всех задач остался лишь флоп. ISA благополучно канула в лету, регенерация памяти решается на уровне контроллера памяти. Оставшаяся часть контроллера DMA (работающая с флопом) в современных чипсетах обычно находится в южном мосту, и по внешнеинтерфейсной реализации сильно видоизменилась, и маловероятно что сможет обслуживать дополнительных клиентов. Задачу внепроцессорной передачи данных, которая ранее выполнялась DMA на шине ISA, на шине PCI теперь выполняется самими PCI-устройствами - мастерами. Вопрос: как я могу записать эти данные? Могу ли я применить в данном случае DMA материнской платы ? Если да, то просьба вкратце изложить последователность моих действий. Итого - DMA материнки использовать нельзя Должен ли я своему устройству сообщать что-то кроме собственно команды "выдавай очередной пакет"? Должен ли я сообщать ему адрес куда копировать или это возмет на себя контроллер DMA материнской платы? Конечно, Вы должны дать устройству команду и все необходимые для ее выполнения параметры - в том числе _физический_ адрес назначения физически непрерываной области памяти и количество передаваемых слов. Создать и подготовить такую область памяти можно только в драйвере. Хороший и несложный пример реализации бас-мастеринга - это стандартный PCI-IDE контроллер. Должно ли мое устройство (сделано на FPGA) генерировать прерывание после окончания каждой посылки? Это - по желанию. Если по каким-то причинам не хочеться возиться с прерываниями и не нужна быстрая реакция , то можно просто сделать ленивый поллинг в малоприоритетном потоке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tommyknocker 0 4 декабря, 2005 Опубликовано 4 декабря, 2005 · Жалоба Итого - DMA материнки использовать нельзя Ну хорошо, в смысле не очень хорошо, но тем не менее...Как в таком случае мне нужно записать эти данные ? Как мы помним PCI девайс не обладает своим контролером DMA. Данные по каманде просто формируются на шине, по 8 16-битных пакетов. Программный I/O здесь ведь кажется тоже не подойдет, поскольку адресовать нечего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 4 декабря, 2005 Опубликовано 4 декабря, 2005 · Жалоба Ну хорошо, в смысле не очень хорошо, но тем не менее...Как в таком случае мне нужно записать эти данные ? Как мы помним PCI девайс не обладает своим контролером DMA. Данные по каманде просто формируются на шине, по 8 16-битных пакетов. Программный I/O здесь ведь кажется тоже не подойдет, поскольку адресовать нечего. Угу, PCI-устройству DMA не нужен - иногда он сам себе DMA :) PCI-мастер может производить любую транзакцию на своем сегменте (в том числе mem/io/config read/write) с любым устройством на этом же сегменте. А также ряд транзакций которые понимают-пропустят на другие сегменты/память мосты. Чтение-запись оперативной памяти системы - это обязательный поддерживаемый минимум на PC-материнках. То есть, Ваш PCI-мастер может получить у арбитра шину, стать ведущим и самостоятельно выполнить запись (или чтение) в требуемую область системной памяти. Ессно, для этого ему надо знать физический адрес назначения (а то как он выполнит запись-чтение). Поэтому в Вашем устройстве должны быть соответствующие регистры, куда Вы запишете желаемые параметры транзакций. Посмотрите в приаттаченном файле как это сделано в простейшем PCI-IDE. IDE_BusMaster.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться