LINUX.ORG.RU

Прием данных через DMA


0

0

Встала такая проблема. Настраиваю DMA, запускаю на прием данных из устройства. Все делал по книге Linux Device Drivers. Все работает, данные передаются. Проблема в том ,что я не могу их получить! делаю так:

char *buffer2; buffer2=bus_to_virt(buffer_bus); /*преобразую адрес на шине в виртуальный*/ for(i=0; i<6;i++) printk("%x", buffer2[i]); /*принимается всего 160 байт, но выводим для примера 6*/

В результате выходит какая-то лажа, одна и та же неправильная последовательность чисел. Что я делаю неправильно, подскажите, пожалуйста.

anonymous

Пожалуйста приведите весь код, как выделяли память под буффер, как получали шинный адрес, настраивали устройство (для PCI) или dma-контроллер (для ISA).

bus_to_virt и virt_to_bus устарели, лучше воспользоваться новыми удобными dma_* функциями

Dr_ZLO
()
Ответ на: комментарий от Dr_ZLO

Ядро 2.4, шина ISA, поэтому, я думаю, функции еще актуальны.

В функции device_open выделяю память под буфер:

char *buffer = kmalloc (size, GFP_KERNEL | GFP_DMA) unsigned long buffer_bus = virt_to_bus (buffer);

Создаю функцию dma_prepare(unsigned long buffer_bus) { ... set_dma_addr(DMA_NUM, buffer_bus) ... } Вызываю функию dma_prepare в device_open Далее как писал до этого. Пытаюсь при получени прерывания считать массив в нижней половине:

buffer2=bus_to_virt(buffer_bus);

for(i=0; i<6; i++) printk("%x ", buffer2[i]);

В результате получается одна и та же последовательность чисел, что-то типа: 1 0 0 0 ffffff4e 4с

anonymous
()
Ответ на: комментарий от anonymous

Вашу dma_prepare надо вызывать не при открытии устройства, а когда оно готово передать данные. После каждой передачи dma-контроллер программируется заново.

Dr_ZLO
()
Ответ на: комментарий от Dr_ZLO

Не помогло. Пришел к выводу, что в строчке:

for(i=0; i<6; i++) printk("%x ", buffer2[i]);

у меня выводится адрес порта, а не сами данные. Что делать? брать указатель не получается...если объявляю двойной указатель вначале, система нехорошо ругается

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.