2013-04-19 3 views
7

Я работаю над подпрограммой DMA для передачи данных с ПК на FPGA на PCIe-карте. Я читаю DMA-API.txt и LDD3 ch. 15 для деталей. Однако я не мог понять, как сделать передачу DMA с ПК на последовательный блок iomem на плате PCIe. Образец папы для PCI в LDD3 отображает буфер, а затем сообщает карточке для передачи DMA, но для этого мне нужен ПК.Драйвер Linux DMA на карту PCIe с ПК как ведущий

То, что я уже узнал:

  1. Запрос шины мастер

    pci_set_master(pdev); 
    
  2. Установите DMA маскировать

    if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) { 
        dev_err(&pdev->dev,"No suitable DMA available.\n"); 
        goto cleanup; 
    } 
    
  3. запрос канала DMA

    if (request_dma(dmachannel, DRIVER_NAME)) { 
        dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel); 
        goto cleanup; 
    } 
    
  4. Карта буфер для передачи DMA

    dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE); 
    

Вопрос:

Что я должен сделать для того, чтобы позволить ПК выполнять передачу DMA вместо карта?

Благодарим за помощь!


Прежде всего, спасибо за ваши ответы. Может быть, я поставил бы свои вопросы более точно:

  1. В моем понимании ПК должен иметь контроллер DMA. Как мне получить доступ к этому контроллеру DMA, чтобы начать передачу в область IO с отображением карты памяти на плате PCIe?
  2. В нашей спецификации требуется, чтобы контроллер DMA ПК начал передачу. Тем не менее, я мог найти примеры, когда устройство будет выполнять задание DMA (DMA_mapping.txt, LDD3 ch.15). Есть ли причина, почему никто не использует контроллер DMA ПК (у него все еще есть каналы DMA)? Было бы лучше запросить изменение спецификации для нашего проекта?

Благодарим за ваше терпение.

+1

* «Передача данных с ПК» * имеет значение для внешних периферийных устройств, например. «от ПК к принтеру». Для внутренних передач это бессмысленно. Вероятно, вы имеете в виду ** основную память **. * «пусть ПК выполняет передачу DMA» * также не имеет смысла. Вероятно, вы имеете в виду контроллер ** DMA. Ответ: установите DMAC вместо мастера шины PCI. – sawdust

ответ

4

Посмотрите DMA_mapping.txt.Там есть длинный раздел, в котором рассказывается, как установить направление («направление DMA», строка 408).

EDIT

Хорошо, так как вы изменяли вопрос ... ваше задание неправильно. Вы могли настроить системный контроллер DMA, но это было бы бессмысленно, потому что это слишком медленно, как я сказал в комментариях. Прочитано this thread.

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

+0

Да, я это читал. В этом коде указывается, как настроить буфер для передачи DMA. Такая же конструкция (pci_map/pci_unmap) используется в LDD3 ch. 15, но есть также инструкции по активации контроллера DMA на плате PCI. Поэтому я предполагаю, что это только отмечает буфер как «DMA ready» и позволяет устройству передавать DMA. Направление только говорит о том, что контроллер DMA должен читать или записывать буфер (или оба). Он не говорит мне (или, по крайней мере, не понял), как активировать контроллер DMA ПК. – kohpe

+1

Вы не активируете контроллер DMA ПК. Существует два способа сделать DMA на PCIe: (1) «система» DMA и (2) «Мастер шины» DMA. (1) - история; это не вариант. «Системный» контроллер DMA все еще находится на вашем ПК, но он находится в неправильном месте и работает слишком медленно. Вместо этого ваша FPGA должна стать ведущим устройством шины и вывести требуемые данные либо в или из. Таким образом, вы настраиваете направление DMA в соответствии с 'DMA_mapping.txt', а затем записываете в регистр на своей карте, чтобы инициировать чтение главной шины шины (выход из ПК в FPGA). Проверьте записи приложений поставщика FPGA; начните с XAPP1052. Также обратите внимание, что LDD3 довольно бесполезен. – EML

+0

Недостаточно места наверху ... кто закодировал вашу ПЛИС? Они понимают работу ведущего устройства шины? У вас есть бит управления, чтобы включить мастеринг шины? Если нет, то ваш FPGA * не может * «DMA» в любом направлении. – EML

1

Что вы говорите, это не DMA. DMA - это когда ваше устройство получает доступ к памяти, а сам процессор не задействован (за исключением контроллера памяти ПК, который в наши дни встроен в процессор ПК). Не все устройства могут это сделать, и если вы используете FPGA, то вам наверняка понадобится какой-то контроллер DMA в вашем дизайне (т. Е. Expresso DMA Core или аналогичный). В вашем случае вам просто нужно записать в область отображаемой памяти (т. Е. Полученную с помощью ioremap_nocache) с использованием вызовов iowrite (т. Е. iowrite32), за которыми следуют барьеры записи wmb(). Что панель ввода-вывода и адрес, который вы должны полностью писать, зависит от вашего устройства.

Надеюсь, это поможет. Удачи!

+2

* «То, о чем вы говорите, на самом деле не является DMA» * ... * «тогда вам наверняка понадобится какой-то контроллер DMA в вашем дизайне» * - вы, кажется, ссылаетесь на плату (PCI/PCIe), выполняющую ** автобус мастеринг **. Периферийное устройство (разработанное с дополнительными сигналами управления/рукопожатием DMA) может использовать DMA (а не запрограммированный ввод-вывод) с использованием контроллера системы DMA (который был включен в дизайн IBM PC). – sawdust

+0

@sawdust да, вы правы, это мастерство в автобусе. Иногда я плохо отношусь к правильной символике. Я не думаю, что сегодняшние товарные ПК имеют эти контроллеры DMA, или они? – 2013-04-20 08:00:35

+0

ПК должны иметь DMAC для «совместимости с IBM PC». Контроллер DMA не так дорог. Если вы можете поставить процессор с тактовой частотой> 350 раз быстрее, чем исходный i8088 (и включить числовой сопроцессор) и иметь более чем в 1000 раз больше памяти, тогда DMAC доступен на * товарном ПК *. – sawdust