15年5月嵌入式學習筆記之驅動程式

2021-07-02 16:27:26 字數 2187 閱讀 3171

poll機制(查詢機制),隔一段時間查詢—下有沒有中斷。

第四個驅動程式增加poll機制。

應用程式裡面open() 函式,read() 函式,write ()函式,poll() 函式分別對應drv_open(),drv_read(),drv_write(),drv_poll()函式。

讀取按鍵的多種方式,

1.查詢方式,耗資源。

2.中斷方式,如果沒有按鍵按下,read()函式一直等待,永遠不會返回。

3.poll機制,指定—段時間後返回。

這三種方法有—個共同的特點,都是應用程式主動去查詢。

有沒有另外一種方法,驅動程式主動提醒應用程式,然後應用程式來讀鍵值。這種方法叫做非同步通知。通過訊號single來實現。具體操作,1.應用程式裡註冊訊號處理函式。2.誰發,驅動程式岌。3.發給誰,發給應用程式(應用程式要把自己的pid告訴驅動程式)。4. 怎麼發,驅動程式呼叫kill_fasync()函式。

……………………………………

同—時刻,只能有乙個應用程式開啟裝置/dev/buttons

………………………

阻塞操作,當讀—個按鍵值,如果沒有按鍵按下,就—直等待。

非阻塞操作,當讀乙個按鍵值,如果沒有按鍵按下,就返回。

sram,sdram,網絡卡有位址匯流排,由cpu統一編址。 nand flash沒有位址匯流排。 因 此有這兩者定址方式不同。

字元裝置驅動程式的框架。

驅動程式 1.有led.read,led.write,led.open 這些函式,2.定義了—個結構體fileoperation,這個結構體包含指向led.read的.read 函式,包含指向led.write的.write函式,包含指向led.open 的.open函式。3.入口函式(把fileoperation結構體告訴核心的函式),通過register_chedev(main,name,fileoperation)。

編譯驅動程式要依賴核心。

ioremap把物理位址對映為虛擬位址。

本來主裝置號可以手動分配,但驅動程式也可以自動分配主裝置號。

應用程式開啟乙個裝置open("/dev/***"),這個裝置**來的。

1.手工建立, 

mknod   /dev/***   c  主  次  

此時需要知道主裝置號

2.自動建立,mdev(mdev是udev的—個簡化版本)根據系統資訊建立裝置節點。所以驅動程式要提前提供上面所需的系統資訊,這樣才能自動建立。

寫乙個驅動程式。(用查詢方式點亮led燈)

1.寫出框架,

a.寫出fileoperation結構體,裡面有.open,.read,.write 等成員。

b.該結構體通過入口函式註冊到核心。同時需要出口函式,修飾入口函式,修飾出口函式。

c.給核心提供系統資訊,這樣udev機制可以自動建立裝置節點。祥細步驟,在入口函式建立class,並建立clasd device 。同時要在出口函式將這些東西解除安裝掉。

d.最後加上乙個lisence。

2.硬體操作,

a.看原理圖,確定是哪些引腳接到按鍵上。

b.看2440手冊,確定怎麼操作這些引腳,以及操作什麼暫存器。

c.程式設計。

上面三步在微控制器裡面基本相同,不同之處是微控制器直接操作實體地址,而此時驅動程式採用虛擬位址。va=ioremap(pa,size)。

……………………………………………

寫乙個驅動程式(用中斷方式點亮led燈)

1.在open函式將引腳配置為中斷引腳,即request_irq()。

2.右fileoperation結構體裡增加成員.release()函式 ( 用來釋放中斷引腳)。

即. .release()=second_drv_close();

3.實現函式second_drv_close()

4.實現request_irq()函式中的—個引數buttons_irq()。

5.增加標頭檔案irq.h等。

在open函式配置引腳,在read函式讀引腳狀態(通過copy_to_user()函式將引腳狀態傳給使用者)。在入口函式進行位址對映。在出口函式解除映關係。

top命令相當於任務管理器。

共享中斷,中斷**有很多種,共享同乙個引腳。

中斷是異常的—種。微控制器下的中斷處理過程:

1.分辨中斷源,

2.呼叫相應的處理程式,

3.清中斷。

在linux核心中,這三項由asm_do_irq()函式實現。

嵌入式學習筆記5 庫

庫檔案是用來儲存函式和變數的倉庫,使用者只能使用庫檔案裡的函式或者變數,但是並沒有辦法看到這些函式是如何實現的。在linux系統中,庫檔案有兩個存放位置,一種是系統啟動和執行需要的庫,放在 lib目錄中,另一種是應用程式啟動或執行需要載入的庫,放在usr lib中。庫分為兩種,靜態庫和動態庫。兩者名...

嵌入式學習筆記(五) 驅動註冊

defind driver name hello ctl include include 驅動註冊的標頭檔案和裝置註冊的標頭檔案和解除安裝函式 include module license dual bsd gpl module author xubaipei struct platform dri...

嵌入式學習筆記(十二) lEDS 驅動

三星平台的gpio標頭檔案 三星平台exynose 系列標頭檔案 include include 三星4412平台標頭檔案 include linux 申請標頭檔案 include defind driver name hello ctl include include 驅動註冊的標頭檔案和裝置註冊...