История изменений
Исправление I-Love-Microsoft, (текущая версия) :
tailgunner Извините, снова я беспокою :)
Теперь встал вопрос непосредственно с SG-DMA. Кажется я понял суть этого метода, в LDD3 это хорошо описано. В документации есть такие строки:
int i, count = dma_map_sg(dev, sglist, nents, direction);
struct scatterlist *sg;
for_each_sg(sglist, sg, count, i) {
hw_address[i] = sg_dma_address(sg);
hw_len[i] = sg_dma_len(sg);
}
int n_sg = 10;
struct scatterlist sg[10];
n_sg = dma_map_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
for(i = 0; i < n_sg; i++)
{
printk(KERN_INFO "mypci: SG %d -> %d @ %d\n", i, sg_dma_address(&sg[i]), sg_dma_len(&sg[i]));
}
dma_unmap_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
Разобрался с прерываниями, генерировать MSI в корке оказалось очень просто, повесил обработчик - генерируется с нужной частотой. Правда каждое третье прерывание отлетает USB мышка и снова реконнектится - странно что есть влияние на не связанные устройства.
irqreturn_t mypci_isr(int irq, void *data)
{
printk(KERN_INFO "mypci: interrupt!\n");
return IRQ_HANDLED;
}
EXPORT_SYMBOL(mypci_isr);
...
pci_set_master(dev);
pci_enable_msi(dev);
devm_request_irq(&dev->dev, dev->irq, mypci_isr, 0, "mypci", NULL);
Исходная версия I-Love-Microsoft, :
tailgunner Извините, снова я беспокою :)
Теперь встал вопрос непосредственно с SG-DMA. Кажется я понял суть этого метода, в LDD3 это хорошо описано. В документации есть такие строки:
int i, count = dma_map_sg(dev, sglist, nents, direction);
struct scatterlist *sg;
for_each_sg(sglist, sg, count, i) {
hw_address[i] = sg_dma_address(sg);
hw_len[i] = sg_dma_len(sg);
}
int n_sg = 10;
struct scatterlist sg[10];
n_sg = dma_map_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
for(i = 0; i < n_sg; i++)
{
printk(KERN_INFO "mypci: SG %d -> %d @ %d\n", i, sg_dma_address(&sg[i]), sg_dma_len(&sg[i]));
}
dma_unmap_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
Разобрался с прерываниями, генерировать MSI в корке оказалось очень просто, повесил обработчик - генерируется с нужной частотой. Правда каждое третье прерывание отлетает USB мышка и снова реконнектится - странно что есть влияние на не связанные устройства.
irqreturn_t mypci_isr(int irq, void *data)
{
printk(KERN_INFO "mypci: interrupt!\n");
return IRQ_HANDLED;
}
EXPORT_SYMBOL(mypci_isr);
...
pci_set_master(dev);
pci_enable_msi(dev);
devm_request_irq(&dev->dev, dev->irq, mypci_isr, 0, "mypci", NULL);