第乙個驅動程式

2021-10-01 05:18:40 字數 2625 閱讀 3177

從今天開始就要進入核心驅動程式部分了,在這一節裡就通過第乙個驅動程式來介紹一下核心驅動模組的編寫框架。

static

intfirst_drv_open

(struct inode *inode,

struct file *file)

static ssize_t first_drv_write

(struct file *file,

const

char __user *buf, size_t count, loff_t * ppos)

static

struct file_operations first_drv_fops =

;static

void

first_drv_init

(void

)static

void

first_drv_exit

(void

)mondlue_init

(first_drv_init)

;mondule_exit

(first_drv_exit)

;

上面的程式框架就是我們要介紹的,雖然**沒有多少,但是這裡面包含的只是要說起來也是不少

1、我們自己寫的程式為什麼能被核心識別,成為核心驅動模組呢?這裡邊主要是兩個巨集在起作用,module_init和module_exit,乙個是註冊入口,乙個是解除安裝的出口,使用這兩個巨集修飾之後,我們的函式就可以被核心所識別,接下來就要從入口函式"first_drv_init"看起

2、註冊入口:在之後會對這個介面進行更加深入的介紹,這裡只做簡單解釋,使用register_chrdev註冊字元裝置驅動,這個函式有3個引數,第乙個是字元裝置驅動的主裝置號,第二個是裝置驅動的名字,第三個引數是裝置操作函式集,對於這個函式我們可以這樣理解,它在核心中維護著乙個陣列,在註冊的時候找到主裝置號為索引的空間,然後將file_operations結構體放在裡面,這樣,應用程式就可以直接使用應用介面進行操作了,可以看到這個操作函式集合中的介面和應用層介面名字是一樣的,這樣的話使用起來就如同應用程式一般

3、open函式:這裡值得一提的是open函式的函式,第乙個引數inode表示乙個具體的檔案,inode中對於編寫驅動**有用的主要成員是dev_t i_rdev,struct cdev * i_cdev。對於代表裝置檔案的結點,dev_t i_rdev包含了實際的裝置編號。核心中提供了兩個巨集可以提取inode中的主次編號。

unsigned int iminor(struct inode * inode);

unsigned int imajor(struct inode * inode);

當結點inode指的是乙個字元裝置檔案時,成員struct cdev * i_cdev指標指向的就是這個字元裝置

第二個引數file表示乙個已經開啟的檔案描述符,它不是專門給驅動程式使用的,系統中每乙個開啟的檔案在核心中都有乙個關聯的struct file。它由核心在open時建立,並傳遞給在檔案上操作的任何函式,直到最後關閉,file結構體中包含著重要的檔案操作函式集和inode,所以在open的時候就會把inode和file進行關聯,

//makefile

kern_dir = /home/book/linux-2.6.22.6

all:

make -c $(kern_dir)

m=`pwd`

modules

clean:

make -c $(kern_dir)

m=`pwd`

modules clean

rm -rf modules.order

obj-m += first_drv.o

編譯成功之後生成.ko檔案,將驅動模組使用insmod命令插入核心中,就可以看到我們編譯的驅動程式,在/dev/device目錄下,主裝置號是111,和我們編寫的一樣

然後寫乙個簡單的測試程式

#include

#include

#include

#include

intmain

(int argc,

char

**ar**)

write

(fd,

&val,4)

;close

(fd)

;return0;

}

現在進行測試是不能成功的,因為之前只是插入了驅動模組,但是在/dev目錄下並沒有生成裝置節點,所以測試程式使用open開啟檔案會失敗,在這之前我手動建立乙個裝置節點

mknod /dev/first_drv c 111 0

//c表示字元裝置 111 表示主裝置號 0表示此裝置號

完成之後就可以發現在/dev目錄下生成了乙個裝置節點,然後執行測試程式

實驗結果和預期的一樣,好了,第乙個驅動程式就簡單記錄到這裡

第乙個驅動程式

原始出處 驅動程式的開發,向來是令人感到有所畏懼的,可能很多人像我一樣,看了很久卻還是一頭霧水,不得其門而入。我們今天就通過乙個簡單的程式來使讀者學會初步的驅動程式開發。在開發windows驅動程式之前,我們需要首先安裝ddk,win98及其以前的vxd我們就不要再考慮了 windows 2000 ...

我的第乙個驅動程式

arm編譯器版本 3.32 核心版本 2.6.28.7 arm號 s3c2440 驅動原始碼 include include include include include include include include define device name leds define led majo...

第乙個驅動程式點亮led

include include include include include include include include include include static struct class firstdrv class static struct class device firstdrv...