1. 程式人生 > >itop4412生成裝置節點

itop4412生成裝置節點

在註冊驅動成功之後,若要與應用層進行通訊,則需要生成裝置節點。上層應用通過呼叫標準的介面函式呼叫裝置節點來實現與底層驅動之間的通訊。本節將介紹生成雜項裝置的裝置節點的操作流程

1. 雜項設備註冊函式及結構體

  • 所需標頭檔案路徑:include/linux/miscdevice.h

  • 註冊和解除安裝函式:

        extern int misc_deregister(struct miscdevice *misc);
  • 兩個函式中使用到的結構體:struct miscdevice 結構為:
struct miscdevice  {
        int minor;
        const
char *name; const struct file_operations *fops; struct list_head list; struct device *parent; struct device *this_device; const char *nodename; mode_t mode; };

常用引數說明:
minor:裝置號,賦值為MISC_DYNAMIC_MINOR
name:裝置名
struct file_operations :該結構體的成員函式是驅動設計的主體內容,裡面的函式和linux系統給應用程式提供的系統介面一一對應,是實現與應用層通訊的關鍵;該結構體的標頭檔案為:include/linux/fs.h

;其中包含引數眾多,這裡介紹幾個常用的引數:

struct file_operations {
        struct module *owner;
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        int (*open) (struct inode *, struct file *);
        int (*release) (struct
inode *, struct file *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); …… };

struct module * owner:一般設定為THIS_MODULE
read函式:讀函式,拷貝資料到應用程式空間,即應用層從低層讀取資料
write函式:寫函式,從應用程式空間拷貝資料,即應用層向底層傳輸資料
open函式:對應上層的open函式,開啟檔案
release函式:對應應用層的close()函式,開啟檔案操作之後一般需要關閉
unlocked_ioctl函式:這個函式功能和寫函式功能稍微有點重合,但是這個函式佔用的記憶體非常小,主要針對IO口的控制。

2.雜項裝置生成裝置節點實現操作

  • 在驅動註冊中的probe函式中新增雜項設備註冊函式:misc_register
  • 配置結構體”struct miscdevice”:
struct miscdevice led_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = DEVICE_NAME,
        .fops = &led_ops,
};
  • 配置結構體”struct file_operations”:
struct file_operations led_ops = {
        .owner = THIS_MODULE,
        .open = led_open,
        .release = led_release,
        .unlocked_ioctl = led_ioctl,

};
  • 建立函式led_open、led_release、led_ioctl:
/*開啟檔案操作*/
static int led_open(struct inode * inode,struct file * file){

        printk(KERN_EMERG "led open\n");
        return 0;
}

/*對應應用層的close()函式,關閉檔案*/
static int led_release(struct inode * inode,struct file * file){

        printk(KERN_EMERG "led release\n");

        return 0;
}

/*對IO口進行控制,cmd 是控制命令,arg是控制哪個引數*/
static long led_ioctl(struct file * file,unsigned int cmd,unsigned long arg){

        printk(KERN_EMERG "cmd is%d,arg is %d\n",cmd,arg);

        return 0;
}
  • 在驅動註冊中的remove函式中新增雜項裝置解除安裝函式:misc_deregister

3. 測試驅動程式

  • 在開發板中載入測試編譯好驅動程式,檢視裝置節點

這裡寫圖片描述

參考

《linux裝置驅動程式》
itop4412驅動實驗手冊