曾經寫的一篇筆記,偶爾翻出來了,放在這裡做個紀念
這裡記錄的方法是在使用者態訪問io
port,不涉及驅動程式的編寫。
首先要包括標頭檔案 /usr/include/asm/io.h
在 unistd.h
中宣告。用來開啟對
ioport的訪問許可權,要求程式執行時必須有
root
許可權。僅僅能夠開啟
0x00
到0x3ff
這一位址段的
ioport。
ioperm( from, num, turn_on)
比方:
#include#includeioperm( 0x300, 5, 1);
表示從0x300
位址起的連續5個
io位址的訪問許可權被開啟。假設須要訪問比0x3ff
更高的位址段,須要用
iopl()
函式。
iopl(3) 表示開啟對所有
ioport的訪問許可權。
inb(port);
inw(port);
outb(value, port);
outw(value, port);
對io埠的讀寫大約用時
1us。須要注意的是outb 函式與 turbo c 中的 outportb 函式的引數的順序是反的,不要搞錯。
inb_p(port);
inw_p(port);
outb_p(value, port);
outw_p(value, port);
這四個函式和上面四個函式的功能基本類似,可是在訪問完io
port後會新增乙個
1us左右的延時。假設定義了
really_slow_io
這個巨集,則延時約
4us。
#define really_slow_io 1
#includeinb_p(port);
第二種訪問io
埠的方法是通過對
/dev/port
裝置檔案來訪問。
這樣的方法不須要有root
許可權,僅僅有有對
/dev/port
的訪問許可權即可。
訪問起來就像普通的檔案訪問一樣, 先 lseek(),
然後read()
、 write()
函式。
可是不能使用 select()
函式和
poll()
函式,由於
ioport不支援這些功能。
iopl(3) 開啟訪問許可權後能夠通過插入彙編語句的方式開關中斷。
asm(「cli」); //關中斷
asm(「sti」); //開中斷
linux裝置驅動 IO Port
1.i o port 和硬體打交道離不開i o port 老的isa 裝置經常是占用實際的 i o埠,在 linux 下,作業系統沒有對 i o口遮蔽,也就是說,任何驅動程式都可對任意的 i o口操作,這樣就很容易引起混亂。每個驅動程式應該自己避免誤用埠。有兩個重要的kernel 函式可以保證驅動程...
Linux下程式設計
windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...
Linux下程式設計
linux用不慣的很大乙個原因是終端下編譯。主要是平時win下也不怎麼用終端。最近剛剛發現gedit可以新增外部工具,執行shell命令。這不就行了,我tm之前怎麼沒想到呢。從終端中狂按up down解脫了。然後win下notepad linux下gedit 基本一樣嘛。gedit工具 一鍵編譯執行...