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...  
						 | 
					 
				 
			 |  
		 
	 | 
	 |