DMA из пространства ядра Linux на карту PCIe

Я пытаюсь написать драйвер linux для устройства PCIe - высокоскоростной цифровой карты ввода-вывода Adlink PCIe 7300A.

Драйвер отлично работает для нормальной передачи данных в память, но попытка использовать возможности управления шиной карты для инициирования передачи DMA буфера из памяти ЦП в выходной буфер FIFO устройства просто не работает.

Я пытался решить эту проблему порядка недель, а не дней.

Любое понимание вообще будет действительно оценено.

Код драйвера - https://github.com/sbrookes/timing_driver_sdarn/blob/master/kernel_land/timing.c

Технические данные устройства - http://www.acceed.com/manuals/adlink/P7300A%20Manual.PDF

Техническое описание микросхемы интерфейса PLX 9080 PCI - http://www.der-ingo.de/bin/milanhelp/PLX9080.pdf

Я не могу объяснить, насколько я был бы признателен за любое понимание.

Спасибо,

Скотт


person s.brookes    schedule 05.07.2013    source источник
comment
Этот драйвер ужасно глючит, но SO не тот сайт для обзоров кода. В любом случае, каково значение dma_bus_addr?   -  person CL.    schedule 07.07.2013
comment
@CL. - Извините, если я засыпаю ТАК плохими вопросами. Я не знаю, куда еще обратиться.   -  person s.brookes    schedule 07.07.2013
comment
@CL. - Не хотел отправлять это так скоро ... в любом случае dma_virt_addr = pci_alloc_consistent(dev, 20*1024, &dma_bus_addr); printk(KERN_DEBUG "dma_bus_addr is 0x%x\n", dma_bus_addr); сообщает, что dma_bus_addr is 0x2c538000, но я не знаю, что это то же самое каждый раз, когда я загружаю модуль ... Я хочу поиграть приятно на этом сайте, подскажите, что я могу сделать, чтобы в этом убедиться? Не могу объяснить, насколько я ценю вашу помощь. Интересуюсь всеми ошибками, а также лучшими практиками, кстати. Спасибо.   -  person s.brookes    schedule 07.07.2013
comment
Разве dma_addr_t не 64-битное значение?   -  person CL.    schedule 08.07.2013
comment
@CL. Моя карта имеет только 32-битный регистр для адреса назначения. Я думаю, что даже если это 64 бита, printk обрезает ведущие нули.   -  person s.brookes    schedule 08.07.2013
comment
Какое значение выдает с %llx?   -  person CL.    schedule 08.07.2013
comment
@CL. Из нового запуска - dma_bus_addr - 0x47b98000, dma_bus_addr с описателем нового формата - 0x 47b98000 (три пробела между 0x и 47 ...)   -  person s.brookes    schedule 08.07.2013
comment
Вы используете 32-битное ядро?   -  person CL.    schedule 08.07.2013
comment
uname -m выводит x86_64, так что похоже, что я работаю над 64-битным ядром.   -  person s.brookes    schedule 08.07.2013
comment
@CL. забыл связаться с вами по этому ответу ... Я очень признателен за помощь.   -  person s.brookes    schedule 08.07.2013
comment
Вы не должны пытаться установить 64-битную маску DMA, если ваше устройство не может выполнять 64-битную передачу DMA. (Вам повезло, что ваш код для установки 64-битной маски содержит ошибки.)   -  person CL.    schedule 08.07.2013
comment
Что касается вашей проблемы, не работает довольно расплывчато. Код для распределения когерентной памяти DMA выглядит правильным; проблема может быть в программировании одного из используемых вами чипов. Вы должны проверить регистр PLX9080, чтобы увидеть, действительно ли выполнялась передача DMA.   -  person CL.    schedule 08.07.2013
comment
@CL. Хорошо, я посмотрю на маски DMA. Я неправильно понял документацию. Еще раз спасибо за ваше время. Но где искать ошибки?   -  person s.brookes    schedule 08.07.2013
comment
@CL. Причина, по которой я в таком отчаянии, заключается в том, что у меня нет возможности получить дополнительную информацию о проблеме! Я приказываю начать передачу по DMA (записывая в regs на 9080), а затем ничего не происходит. Регистр состояния PLX9080 никогда не говорит, что он занят или что-то в этом роде ... Я не знаю, как понять, что происходит.   -  person s.brookes    schedule 08.07.2013
comment
Попробуйте посмотреть другой драйвер PLX9080 (например драйвер staging comedi).   -  person CL.    schedule 08.07.2013


Ответы (1)


Вроде решил проблему. Похоже, что в обработчике прерывания было некорректное условие, которое прерывало передачу DMA в неподходящее время, не позволяя даже начать передачу.

Серьезный момент, но потребовались серьезные усилия, чтобы его найти.

Согласно комментариям, извините, если я загрязнил SO своим отчаянием. Все еще учусь быть хорошим гражданином.

Не уверен, что указанный выше код останется статичным при изменении моего проекта или эта ссылка будет отражать самую последнюю версию. По сути, просто будьте осторожны, чтобы не прервать передачу в неподходящее время.

person s.brookes    schedule 09.07.2013