2014-05-20 104 views
0

我在Linux設備驅動的例子試圖short.c 3OUTB()不LDD3例如短模塊工作

我的電腦有並口與Ubuntu的開機後,我可以看到這些:

cat /proc/ioports 
0378-037a : parport0 
037b-037f : parport0 

outp 0x378 1 
(outp is another example in LDD3 which write data to ports) 
the LED on the port is ON. 

然後我運行這些命令以刪除模塊

rmmod lp 
rmmod parport_pc 
cat /proc/ioports 
(There is no module on 0378-037f any more.) 

我再次運行本但是LED不是該時間。

outp 0x378 1 

然後我安裝了short.ko和request_region()成功。

cat /proc/ioports 
0378-037f : short 

cat /proc/devices 
249 short 

outp 0x378 1 
the LED is not ON this time either. 

我想這些了,但是同樣的結果(LED不亮)

mknod /dev/short0 c 249 0 
echo -n "a" > /dev/short0 

「a」 是0x61,使最後一位爲1

我爲什麼不能寫數據了,雖然我有I/O區域?

感謝您的回答。

+0

你做了什麼,以確認您已經連線了LED是否正確? – sawdust

+0

是的,LED連線正確。我可以在模塊parport_pc被移動之前打開它。 – user1443721

+0

新發現。如果我刪除了request_region()函數調用並且不卸載parport模塊,我可以使代碼讀寫(也點亮LED)。由於parport模塊在那裏,irq 7被它使用。我必須將irq 5分配給「短」模塊。儘管我成功啓用了irq 5,但中斷永遠不會進入[通過連接引腳9和引腳10以及outb(0xff,0x378)]。檢查/ proc/interrupts,我注意到當調用outb(0xff,0x378)時,irq 7的計數器增加,但是irq 5始終爲0.有沒有解決它的建議? – user1443721

回答

0

最後,我找到了解決辦法。

確保「parport」模塊沒有加載或編譯到內核中。簡單地卸載端口模塊是不夠的,因爲它會使端口處於不一致的狀態。您必須重新啓動機器,並首先保持parport和所有相關模塊/代碼的加載。要做到這一點

一種方法是編輯/etc/modprobe.d/blacklist.conf文件,並添加以下行:

blacklist ppdev 
blacklist lp 
blacklist parport_pc 
blacklist parport 

看來partport有修改並行端口的模式。

而且如果安裝了杯子,你應該修改/etc/modules-load.d/cups-filters.conf:

#lp 
#ppdev 
#parport_pc