linux驅動開發10之misc及蜂鳴器驅動
1.板載蜂鳴器驅動測試
1.1驅動部分
1)九鼎移植核心已經提供了蜂鳴器驅動原始碼
2)make menuconfig
3)bug排查。修改Makefile中的巨集名,最終可以在系統中看到 /dev/buzzer
由於makefile檔案與Kconfig檔案中的巨集定義不一致,修改makefile巨集為:
然後編譯,下載,結果看到:
我們看到在fileoperations結構體中的open和close原始碼都是空的:
那麼怎樣對裝置檔案進行操作呢?結果就是使用ioctl。
2.應用部分
1)應用編寫:開啟檔案+ioctl
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEVNAME "/dev/buzzer"
#define PWM_IOCTL_SET_FREQ 1
#define PWM_IOCTL_STOP 0
int main(void)
{
int fd = -1;
fd = open(DEVNAME, O_RDWR);
if(fd < 0)
{
perror("open");
return -1;
}
ioctl(fd, PWM_IOCTL_SET_FREQ, 1000);
sleep(3);
ioctl(fd, PWM_IOCTL_STOP);
sleep(3);
ioctl(fd, PWM_IOCTL_SET_FREQ, 10000);
sleep(3);
ioctl(fd, PWM_IOCTL_STOP);
return 0;
}
2)測試實踐
2.misc類裝置介紹
2.1何為misc
1)中文名:雜項裝置\雜散類裝置。是一類裝置,這些裝置不好分類,所以放在misc類裝置裡面,比如蜂鳴器、鬧鐘、led等。
2)/sys/class/misc
3)是典型的字元裝置
4)有一套驅動框架,核心實現一部分(misc.c),驅動實現一部分(x210-buzzer.c)。
5)misc是對原始的字元設備註冊介面的一個類層次的封裝,很多典型字元裝置都可以歸類到misc類中,使用misc驅動框架來管理。
2.2misc類裝置驅動架構
1)核心開發者實現部分,關鍵點有2個:一個是類的建立,另一個是開放給驅動開發者的介面
2)具體裝置驅動工程師實現部分
2.3本部分學習方法
1)蜂器驅動原始碼已有,分析為主
2)複習並驗證前面講的驅動框架的思維
3)有餘力的不妨開始注意一些細節
3.Misc驅動框架
3.1. misc原始碼框架基礎
1)misc原始碼框架本身也是一個模組,核心啟動時自動載入
2)原始碼框架的主要工作:註冊misc類,使用老介面註冊字元裝置驅動(主裝置號10),開放device註冊的介面misc_register給驅動工程師
3.2.misc類裝置的註冊
1)驅動工程師需要藉助misc來載入自己的驅動時,只需要呼叫misc_register介面註冊自己的裝置即可,其餘均不用管。
2)misc_list連結串列的作用。核心定義了一個misc_list連結串列用來記錄所有核心中註冊了的雜散類裝置。當我們向核心註冊一個misc類裝置時,核心就會向misc_list連結串列中insert一個節點。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
原式子:static LIST_HEAD(misc_list);
展開後:static struct list_head misc_list = { &(misc_list), &(misc_list) }
1)主裝置號和次裝置號的作用和區分
使用的是點陣圖的資料結構方法。Find_first_zero_bit在點陣圖中找到第一個為0的位置。
3.3 open函式分析
Inod是硬盤裡的裝置節點,file是裝置檔案路徑。
3.4 misc在proc下的展現
3.5 核心互斥鎖
1)何為互斥鎖
2)定義:DEFINE_MUTEX
3)上鎖mutex_lock和解鎖mutex_unlock
4)核心防止競爭狀態的手段:原子訪問、自旋鎖、互斥鎖、訊號量
5)原子訪問主要用來做計數、自旋鎖後面講中斷會詳細講、互斥鎖和訊號量很相似(其實就是計數值為1的訊號量),互斥鎖的出現比訊號量晚,實現上比訊號量優秀,儘量使用互斥鎖。
4.蜂鳴器驅動
4.1.dev_init
Init_MUTEX:訊號量。用於保證蜂鳴器不能被兩個程序進行訪問。
1)訊號量
2)miscdevice
/* GPD0_2 (PWMTOUT2) */
ret = gpio_request(S5PV210_GPD0(2), "GPD0");
3)gpio_request
4)printk
4.2.ioctl
1)為什麼需要ioctl(input output control,輸入輸出控制)。
輸入輸出控制,read和write有缺陷的,在於驅動和硬體之間的互動。
2)ioctl怎麼用
硬體操作有關的程式碼