Linux驅動開發雜記 0x07 I O埠

2021-08-31 15:49:54 字數 1435 閱讀 4916

在驅動還沒獨佔裝置之前,不應對端⼝進⾏操作。核心提供了⼀個註冊接⼝,以允許驅動宣告其需要的端⼝:

/* 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 是指乙個數學模型及定義在該模型上的一組操作。演算法 解決特定問題求...