<Вопрос><Как читать память DMA> , atlanta, 30-Мрт-11, 15:04 [смотреть все]C DMA сталкиваюсь впервые. Маны причитаны самая толковая O'Relly (кажеться так его зовут). Недопонимаю как читать DMA. В drname_open вызываю pci_alloc_consistent, получаю виртуальный адрес rx_buf и физический dma_buf, те rx_buf = pci_alloc_consistent(ppci_dev, len_dma, &dma_buf); Потом записываю в регистры pci Ri...Ri+n физические адреса dma_buf с требуемым смещением. Запись/чтение регистров Ri...Ri+n в BARn все ок (проверяно). Дальше хочу просто хочу прочитать значение в dma. Делаю это в прерывании/или в ioctl. unsigneg char *pBuf = NULL; for (int i = 0; i < MAX_BYTE_I; i++) { pBuf = &rx_buf[i]; printk("<1> %x \n", *pBuf); } Может кто толковое скажет?
|
- во шариш а, Вова, 09:44 , 31-Мрт-11 (1)
от это шарит в кампах пацан а! О шарит!
- <Вопрос><Как читать память DMA> , C, 02:50 , 03-Апр-11 (2)
такому умному как вы врядли можно что то обьяснить! лучше откройте любой драйвер, к примеру сетевой карты и сами разберитесь как он работает тогда и поймете как работает DMA и сами сможете сделать то что вы там с ней хотите
- <Вопрос><Как читать память DMA> , Alex_S, 07:05 , 04-Апр-11 (3)
> C DMA сталкиваюсь впервые. Маны причитаны самая толковая O'Relly (кажеться так его > зовут). Недопонимаю как читать DMA. в чем собственно проблема ? DMA - это не память, а способ доступа. грубо говоря, ты устанавливаешь, сколько откуда и куда писать, пинаешь контроллер и он начинает тебе копировать, а ты можешь заниматься другими делами - процессор не участвует. Потом контроллер тебе прерывание выставит, например, когда закончится копирование. как выставил - все, можешь читать каким угодно образом. хоть в цикле побайтно. pci_alloc_consistent, насколко я помню, просто дает тебе буфер приема. Потом ты сообщаешь его контроллеру и программируешь пересылку - через pci регистры или еще как ...
|