在最開始之前先來梳理一下點亮led程式的框架
1、通過對驅動程式的框架分析,我們知道第一步都要從入口函式開始,第乙個驅動裡我寫的入口函式很簡單,只是完成了必要操作
這裡的話就要進行改進。
2、要點亮led首先要對led使用的引腳進行配置,引腳的模式只用配置一次,所以該部分工作放在開啟裝置檔案時進行,
因為裝置檔案也只是開啟一次。
3、對led進行點亮或者熄滅處理,在寫應用程式時我們一般通過write函式進行寫檔案操作,所以,這一部分比較頻繁的操作同樣
放在了驅動程式的write函式裡。
內容就是這些,在簡單梳理之後就可以寫程式了
2、程式
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static
struct class *first_class;
static
struct class_device *fisrst_class_device;
volatile
unsigned
long
*gpfcon =
null
;volatile
unsigned
long
*gpfdat =
null
;static
intleddrv_open
(struct inode *inode,
struct file *file)
static ssize_t leddrv_write
(struct file *file,
const
char __user *buf, size_t count, loff_t * ppos)
else
return0;
}struct file_operations leddrv_fops =
;//入口函式
int major;
static
intleddrv_init
(void
)//出口函式
static
void
leddrv_exit
(void
)module_init
(leddrv_init)
;module_exit
(leddrv_exit)
;module_license
("gpl"
);
測試程式
#include
#include
#include
#include
intmain
(int argc,
char
**ar**)
if(argc !=2)
if(strcmp
(ar**[1]
,"on")==
0)else
write
(fd,
&val,4)
;return0;
}
3、總結
驅動程式改進的地方:
1、第一節中在註冊裝置驅動的時候,選擇的主裝置號是固定的,是通過我們查詢了乙個空閒的裝置號來確定的,
這樣的做法肯定是不方便的,那麼,在上面的程式中,在註冊裝置驅動的時候傳入的主裝置號為0的
時候,核心就會給我們自動分配乙個空閒的主裝置號,在解除安裝的時候使用該裝置號解除安裝驅動程式。
2、在上一節中只是完成了編寫、插入乙個驅動模組的工作,在開啟裝置檔案時發現並沒有裝置檔案,然後
我們通過手動執行mknod命令建立了乙個裝置檔案,才完成了後續操作,在這一節中我們使用
"class_create"和"class_device_create"建立了乙個類和類下的乙個裝置,
那麼什麼是類呢?我們插入的驅動模式核心都把他當做是乙個類來看待,在"/sys/class"目錄下就有使用
class_create函式建立的類檔案,在該資料夾裡有乙個裝置檔案,是以我們建立時候命名的裝置來命名的,
進入該裝置資料夾裡,使用"cat dev"命令,可以顯示該裝置驅動的主次裝置號,
實際上核心在自動建立/dev/目錄下的裝置節點時就是使用該資訊進行建立的。
3、硬體使用的位址都是實體地址,但是在核心中使用的位址是虛擬位址,所以在操作led裝置實體地址
的時候首先需要把該位址轉換為虛擬位址,這裡使用"ioremap"函式進行對映,在出口函式裡使用
"iounmap"函式把之前對映的位址取消
4、使用者空間的write函式呼叫的是驅動層的write函式,它們之間必須有引數的傳遞過程,在驅動函式write的引數中,
第二個和第三個引數就是使用者空間傳遞下來的緩衝區和資料的長度,使用"copy_from_user"函式把資料拷貝到
核心空間中供我們使用,同樣使用"copy_to_user"函式把資料從核心空間拷貝到使用者空間
5、一系列工作做完之後就可以像裸機那樣去操作led燈了,進行點亮或者熄滅
結果:
註冊的字元裝置,主裝置號是252
進入/sys/class目錄,發現註冊的類
進入led_drv目錄下,檢視類裡面的裝置
再進入資料夾,檢視裝置的主次編號
結果和我們註冊時候寫的是一樣的,到這裡,簡單的點亮led的驅動程式就已經完成
led驅動程式
led drv.c檔案如下 include include include include include include include include include include include include include include include include led opr....
點亮LED燈(一)
想當初都是用彙編來編寫微控制器的程式,那滋味現在想來都是滿滿的回憶,還是用c語言寫起來爽快啊!用c寫微控制器程式,只需要引入標頭檔案即可,實際上該標頭檔案只是定義了特殊功能暫存器位址。為了今後使用方便,我們封裝乙個函式,用來開關led燈,通過引數來控制操作的p埠,並且引入掩碼來操作單個和多個bit位...
第乙個驅動程式點亮led
include include include include include include include include include include static struct class firstdrv class static struct class device firstdrv...