urock
Участник
Offline
|
|
« : 03-12-2008 15:25 » |
|
Какой минимальной длины может быть DMA передача? Может ли она равняться 4 байтам, соответствующим 1 фазе данных на PCI шине? Меня в данном случае интересует не целесообразность такого действия, а его принципиальная возможность. В литературе я не нашел никаких ограничений, а на практике надо проверить.
|
|
|
Записан
|
|
|
|
PredatorAlpha
Помогающий
Offline
|
|
« Ответ #1 : 03-12-2008 16:01 » |
|
На шине PCI нет такого понятия как DMA. Хотя, конечно, переслать 4 байта можно (как одним 32-битным словом, так и четырьмя байтными пересылками).
|
|
« Последнее редактирование: 03-12-2008 16:03 от PredatorAlpha »
|
Записан
|
|
|
|
urock
Участник
Offline
|
|
« Ответ #2 : 03-12-2008 16:15 » |
|
Видимо я опять неточно выразился.. Вопрос был не про PCI шину. Можно ли настроить DMA передачу в драйвере равную 4 байтам? Конкретизирую: при вызове функции MapTransfer нет ли ограничения снизу на значение Length (количество байтов для пересылки)?
|
|
|
Записан
|
|
|
|
PredatorAlpha
Помогающий
Offline
|
|
« Ответ #3 : 03-12-2008 16:28 » |
|
Уточни, про какой контроллер ДМА ты говоришь?
|
|
|
Записан
|
|
|
|
urock
Участник
Offline
|
|
« Ответ #4 : 03-12-2008 16:46 » |
|
Даже не знаю что сказать. Я пишу драйвер для PCI устройства, которое может само управлять шиной. Для него в драйвере я указываю возможность использовать прямой доступ к памяти. Все как по книжке Уолтера Они: сначала создается DMA адаптер с помощью IoGetDmaAdapter, потом в функции StartIO вызывается AllocateAdapterChannel для подготовки системы для DMA операции (согласно DDK), которая в свою очередь вызывает мою функцию AdapterControl, где я уже сам вызываю MapTransfer и указываю ей длину передачи. А потом уже программирую свое устройство посылая ему начальный адрес для обращения в память и длину обращения. Вот что я хочу сделать. Просто иногда может потребоваться использовать этот механизм для передачи совсем небольших объемов данных.
Извини, если излишне подробно написано, я просто делаю это все первый раз и пишу скорее для себя, чтобы уяснить логику. И как я понимаю, у меня нету никакого ДМА контроллера (я не использую системный контроллер), у меня устройство само управляет шиной, я ему только задаю начальный адрес и длину.
|
|
|
Записан
|
|
|
|
PredatorAlpha
Помогающий
Offline
|
|
« Ответ #5 : 03-12-2008 16:57 » |
|
Естественно, PCI контроллер может писать так, как сам хочет. Хоть побайтно, хоть пословно, хоть 64-х битными словами (за 2 цикла - фактически двойной барст). Может барстами, может без них. Никаких ограничений нет. Я сам с драйверами поскольку-постольку, я пишу для ДСП - т.е. на другом конце PCI шины. Возможно, так правильней - создавать виртуальный ДМА адаптер, с поддержкой всех функций, но по-моему гораздо проще и быстрей просто оговорить протокол обмена, без надстройки майкрософт над обменом. Если конечно не нужно реализации обмена драйвера со сторонним ПО, через этот стандартный интерфейс.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 03-12-2008 18:53 » |
|
все зависит от устройства. длинна DMA передачи может быть любой. хоть одно слово хоть десять мегабайт. в последнем случае такая передача разобъется на кучу мелких транзакций по шине(устройством). длинна каждой такой транзакции зависит от устройства и занятости шины PCI.
у меня буфер выделяется до 32-64МБ. больше - не всегда возможно получить такой кусок непрерывной памяти в адресном пространстве. поэтому приходится захватывать эту память при старте win. ЗЫ и если не ошибаюсь меньше страницы 4к выделить нельзя. но это не означает что минмальный пакет такой же длинны!
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|