99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋(píng)果6袋
6
麥子學(xué)院

arm-linux開(kāi)發(fā)之驅(qū)動(dòng)模塊

發(fā)布時(shí)間:2016-10-16 23:41  回復(fù):0  查看:2220   最后回復(fù):2016-10-16 23:41  

內(nèi)核驅(qū)動(dòng)

linux操作系統(tǒng)支持多種硬件平臺(tái)和處理器平臺(tái),但是每個(gè)硬件平臺(tái)的其它外設(shè)是不完全相同的,外設(shè)芯片的性能也是在不斷提升的,要兼容這些外設(shè)硬件,就必須有一個(gè)靈活的設(shè)備驅(qū)動(dòng)層。

 

驅(qū)動(dòng)分類(lèi)

是指只能一個(gè)字節(jié)一個(gè)字節(jié)讀寫(xiě)的設(shè)備,不能隨機(jī)讀取設(shè)備內(nèi)存中的某一數(shù)據(jù),讀取數(shù)據(jù)需要按照先后數(shù)據(jù)。字符設(shè)備是面向流的設(shè)備,常見(jiàn)的字符設(shè)備有鼠標(biāo)、鍵盤(pán)、串口、控制臺(tái)和LED設(shè)備等。字符設(shè)備在 /dev/ 目錄下會(huì)有一個(gè)設(shè)備文件,例如串口: /dev/ttySAC0 ,應(yīng)用層使用打開(kāi)文件寫(xiě)入讀取文件等操作來(lái)控制外設(shè)。

是指可以從設(shè)備的任意位置讀取一定長(zhǎng)度數(shù)據(jù)的設(shè)備。塊設(shè)備包括硬盤(pán)、磁盤(pán)、U盤(pán)和SD卡等。實(shí)際上linux中自帶了nand flash驅(qū)動(dòng),所以我們塊設(shè)備驅(qū)動(dòng)不作為重點(diǎn)研究。 

arm-linux開(kāi)發(fā)之驅(qū)動(dòng)模塊


最簡(jiǎn)驅(qū)動(dòng)模塊

一個(gè)最簡(jiǎn)單的驅(qū)動(dòng)模塊要做以下幾件事情

向內(nèi)核注冊(cè)模塊初始化函數(shù)

實(shí)現(xiàn)文件操作file_operation結(jié)構(gòu)體,包含幾個(gè)函數(shù)指針 open(),read() 

向內(nèi)核注冊(cè)模塊的銷(xiāo)毀函數(shù)

下面是一個(gè)具體的代碼例子:

#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/device.h>static int first_drv_open(struct inode * inode,struct file * file)

{

        printk("open!");

        return 0;

}static int first_drv_write(struct file * file,const char __user *buf ,size_t count,loff_t * ppos)

{

        printk("close!");

        return 0;

}

 static struct file_operations first_drv_fops={

        .owner = THIS_MODULE,

        .open  = first_drv_open,

        .write = first_drv_write,

} ;int major;static int my_drv_init(void)

    {

        major=register_chrdev(0,"first_drv",&first_drv_fops);

        printk("module_init\\n");

        return 0;

}static void my_drv_exit(void)

{

        printk("module_exit\\n");

        unregister_chrdev(major,"first_drv");

}

module_init(my_drv_init);

module_exit(my_drv_exit);

MODULE_LICENSE("GPL");

驅(qū)動(dòng)模塊編譯后的格式為.ko,使用insmod命令將模塊插入

insmod my_first_drv.ko

之后在 /proc/devices 中就可以找到這個(gè)模塊了

cat /proc/devices

proc掛載在/proc目錄下,提供操作系統(tǒng)的一些信息如進(jìn)程信息和內(nèi)存參數(shù)管理等。左側(cè)是設(shè)備號(hào),右側(cè)是設(shè)備名

arm-linux開(kāi)發(fā)之驅(qū)動(dòng)模塊

但是這個(gè)模塊還沒(méi)有一個(gè)設(shè)備文件,不過(guò)可以手動(dòng)創(chuàng)建,設(shè)備文件的主設(shè)備號(hào)要和/proc/devices 分配的設(shè)備號(hào)一致

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/fs.h>

#include <linux/device.h>static struct class * firstdrv_class;static struct class_device *firstdrv_class_dev;static int first_drv_open(struct inode * inode,struct file * file)

{

    printk("open!");

    return 0;

}static int first_drv_write(struct file * file,const char __user *buf ,size_t count,loff_t * ppos)

{

    printk("close!");

    return 0;

}static struct file_operations first_drv_fops={

    .owner = THIS_MODULE,

    .open  = first_drv_open,

    .write = first_drv_write,

} ;int major;static int my_drv_init(void)

{

    major=register_chrdev(0,"first_drv",&first_drv_fops);

    firstdrv_class = class_create(THIS_MODULE,"firstdrv");

    firstdrv_class_dev =         class_device_create(firstdrv_class,NULL,MKDEV(major,0),NULL,"XYZ");

    printk("module_init\\n");

    return 0;

}static void my_drv_exit(void)

{

    printk("module_exit\\n");

    unregister_chrdev(major,"first_drv");

    class_device_unregister(firstdrv_class_dev);

    class_destroy(firstdrv_class);

}

module_init(my_drv_init);

module_exit(my_drv_exit);

MODULE_LICENSE("GPL");

重新insmod模塊,可以看到 /etc/XYZ 這個(gè)設(shè)備文件已經(jīng)被驅(qū)動(dòng)模塊注冊(cè)好了

arm-linux開(kāi)發(fā)之驅(qū)動(dòng)模塊

文章來(lái)源:Joy & Owl

您還未登錄,請(qǐng)先登錄

熱門(mén)帖子

最新帖子

?