在驅動還沒獨佔裝置之前,不應對端⼝進⾏操作。核心提供了⼀個註冊接⼝,以允許驅動宣告其需要的端⼝:
/* request_region告訴核心:要使⽤first開始的n個端⼝。引數name為裝置名。
如果分配成功返回值是⾮null;否則無法使用需要的埠(/proc/ioports包含了系統當前所有埠的分配資訊,
若request_region分配失敗時,可以檢視該檔案,看誰先用了你要的埠) */
struct resource *
request_region
(unsigned
long first,
unsigned
long n,
const
char
*name)
;
在驅動成功請求到i/o 端⼝後,就可以讀寫這些端⼝了。⼤部分硬體會將8位、16位和32位端⼝區分開,⽆法像訪問記憶體那樣混淆使⽤。驅動程式必須調⽤不同的函式來訪問不同⼤⼩的端⼝。
linux 核心頭⽂件(體系依賴的頭⽂件) 定義了下列內聯函式來訪問i/o端⼝:
/* inb/outb:讀/寫位元組端⼝(8位寬)。有些體系將port引數定義為unsigned long;
⽽有些平台則將它定義為unsigned short。inb的返回型別也是依賴體系的 */
unsigned
inb(
unsigned port)
;void
outb
(unsigned
char byte,
unsigned port)
;/* inw/outw:讀/寫字端⼝(16位寬) */
unsigned
inw(
unsigned port)
;void
outw
(unsigned
short word,
unsigned port)
;/* inl/outl:讀/寫32位端⼝。longword也是依賴體系的,有的體系為unsigned long;⽽有的為unsigned int */
unsigned
inl(
unsigned port)
;void
outl
(unsigned longword,
unsigned port)
;
/* ⽤完i/o端⼝後(可能在模組解除安裝時),應當調⽤release_region將i/o端⼝返還給系統。
引數start和n應與之前傳遞給request_region⼀致 */
void
release_region
(unsigned
long start,
unsigned
long n)
;
Linux下接收串列埠資料0x0d變0X0a問題
許多流行的linux串列埠程式設計的版本中都沒對c iflag termios成員變數 這個變數進行有效的設定,這樣傳送ascii碼時沒什麼問題,但傳送二進位制資料時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字元,被用作特殊控制了。關掉icrnl和ixon選項即可解決...
語言雜記 0x0A
今天寫乙個字串反轉練練手,涉及到手動輸入字串時出現了一些問題 char s scanf s s 採用字元陣列的方式輸入的時候完全沒有問題,但是採用下面的方式的時候就會報錯 核心以轉儲 char s scanf s s 什麼是核心已轉儲呢?通俗的理解就是訪問了不能訪問的內容,如下 所以我們的char ...
資料結構複習 0x0 基礎
邏輯結構與物理結構 邏輯結構 集合結構 線性結構 樹形結構 圖形結構 物理結構 順序儲存結構 鏈式儲存結構 資料型別 一組性質相同的值的集合及定義在此集合上的一些操作的總稱。抽象資料型別 adt,abstract data type 是指乙個數學模型及定義在該模型上的一組操作。演算法 解決特定問題求...