2013-02-28 84 views
1

我有一個PCI設備,我想要的是通過/ dev/pcidevice中的「cat」讀取它的內存。我對字符設備的讀取功能的第一次嘗試是這樣的:在char設備中,我可以在哪裏放置ioread?

ssize_t cdev_read(struct file *filp, char __user *buffer, size_t count, loff_t *f_pos) { 

    ssize_t retval = 0; 
    struct mypci_dev *device = filp->private_data; 

/* reading data from pci device */ 
    device->values.fst = ioread16(device->bar[0]+OFFSET_FST); 
    device->values.snd = ioread16(device->bar[0]+OFFSET_SND); 
    ... 
    device->values.lst = ioread16(device->bar[0]+OFFSET_LST); 

    retval = copy_to_user(buffer, &device->values.fst, count); 
    return retval; 
} 

而且它沒有工作:/我改變了copy_to_user線進入

retval = copy_to_user(buffer, "dummy", strlen("dummy")+1); 

但貓的/ dev/pcidevice仍然什麼也沒有返回。

接下來,我將所有ioread16調用轉換爲cdev_open(),並且我得到了我想要的。但現在我很好奇爲什麼它只能這樣工作。我怎樣才能使它以另一種方式工作? 自動櫃員機我認爲定時器開始複製等,但某種等待,直到ioreads已經完成就足夠了。 任何想法?

回答

1

copy_to_user()函數返回無法複製的字節數。成功時,返回0。現在想象一下,當用戶空間讀取0個字節時會有多驚訝。

真正的問題是如何在cdev_open()內實際工作?我希望你閱讀那個函數中的I/O欄,而不是向用戶空間發送任何東西。在這種情況下,請在讀取之前嘗試添加rmb();,然後致電copy_to_user()以確保每次讀取都已完成(rmb()是讀取內存屏障)。

此外,如果您還沒有這樣做,請檢查LDD chapter 3chapter 5

希望它有幫助。快樂黑客!

+1

非常感謝!人民幣()缺失。 – schotter 2013-03-01 10:16:09

相關問題