1. 程式人生 > >linux驅動開發10之misc及蜂鳴器驅動

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 miscproc下的展現

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怎麼用

硬體操作有關的程式碼