Linux驅(qū)動編程——misc設(shè)備驅(qū)動框架

Linux驅(qū)動編程——misc設(shè)備驅(qū)動框架

主要概念:

misc:雜項設(shè)備
雜項設(shè)備是字符設(shè)備的一種,雜項設(shè)備可以自動生成設(shè)備節(jié)點。
設(shè)備節(jié)點: dev 目錄下涂炎,全部都是生成的設(shè)備節(jié)點
cat /proc/misc 查看系統(tǒng)里的砸向設(shè)備
misc設(shè)備主設(shè)備號都是10
設(shè)備號:
主設(shè)備號 用來標(biāo)識一個類型的驅(qū)動
次設(shè)備號 用來標(biāo)識同一類型中不同的設(shè)備號
cat /proc/devices 查看設(shè)備號

實驗?zāi)康模?/h3>

熟悉雜項設(shè)備驅(qū)動編寫框架烂完,編寫一個簡易的雜項設(shè)備驅(qū)動,并編譯加載到系統(tǒng)上朴乖。

主要函數(shù)調(diào)用:

struct miscdevice {                     //misc設(shè)備結(jié)構(gòu)體
    int minor;                          //次設(shè)備號
    const char *name;                   //設(shè)備節(jié)點的名字
    const struct file_operations *fops; //文件操作集
    struct list_head list;
    struct device *parent;
    struct device *this_device;
    const struct attribute_group **groups;
    const char *nodename;
    umode_t mode;
};

int misc_register(struct miscdevice *misc);     //向系統(tǒng)中注冊一個 misc 設(shè)備
int misc_deregister(struct miscdevice *misc)    //注銷掉 misc 設(shè)備

代碼:

//misc.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
 
struct file_operations misc_fops = {
    .owner = THIS_MODULE,
};

struct miscdevice misc_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "hello_misc",
    .fops = &misc_fops,
};

static int misc_init(void)
{
    int ret;
    ret = misc_register(&misc_dev);
    if(ret < 0)
    {
        printk("register is error\r\n");
        return -1;
    }
    
    printk("misc register is succeed\r\n");
    
    return 0;
}

static void misc_exit(void) 
{
    misc_deregister(&misc_dev);
    printk("misc deregister!\r\n");
}

module_init(misc_init);
module_exit(misc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("SIXER");

Makefile

KERNELDIR := /home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga
CURRENT_PATH := $(shell pwd)

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

target := misc
obj-m := $(target).o
APP_NAME := $(target)_app

build: kernel_modules

kernel_modules:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
#   rm -rf $(APP_NAME)

dir_exist = $(shell if [ -d "/nfsroot/$(target)/" ]; then echo "exist"; else echo "noexist"; fi)
$(info $(dir_exist))

install:
ifeq ("$(dir_exist)", "noexist")
    $(shell mkdir /nfsroot/$(target))
    #"文件夾不存在祖屏,已重新創(chuàng)建文件夾"
endif
#   arm-linux-gnueabihf-gcc $(APP_NAME).c -o  $(APP_NAME)
    cp *.ko  /nfsroot/$(target)/

編譯運行:

make 編譯
make install 將目標(biāo)文件拷貝到 NFS 目錄中

sixer@ubuntu:~/imx_usr/driver/00_misc$ make
noexist
make -C /home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga M=/home/sixer/imx_usr/driver/00_misc modules
make[1]: Entering directory '/home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga'
noexist
  CC [M]  /home/sixer/imx_usr/driver/00_misc/misc.o
  Building modules, stage 2.
noexist
  MODPOST 1 modules
  CC      /home/sixer/imx_usr/driver/00_misc/misc.mod.o
  LD [M]  /home/sixer/imx_usr/driver/00_misc/misc.ko
make[1]: Leaving directory '/home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga'
sixer@ubuntu:~/imx_usr/driver/00_misc$ make install
noexist
#"文件夾不存在,已重新創(chuàng)建文件夾"
cp *.ko  /nfsroot/misc/
sixer@ubuntu:~/imx_usr/driver/00_misc$ 

實驗現(xiàn)象:

[root@iTOP-iMX6UL]# cd misc/
[root@iTOP-iMX6UL]# ls
misc.ko
[root@iTOP-iMX6UL]# insmod misc
insmod: can't insert 'misc': No such file or directory
[root@iTOP-iMX6UL]# insmod misc.ko 
misc register is succeed
[root@iTOP-iMX6UL]# ls /dev/hello_misc
/dev/hello_misc
[root@iTOP-iMX6UL]# rmmod misc
misc deregister!

驅(qū)動成功加載买羞,在/dev目錄中生成 hello_misc 設(shè)備節(jié)點文件袁勺。

總結(jié):

注冊 misc 設(shè)備在驅(qū)動框架的基礎(chǔ)上增加了miscdevice結(jié)構(gòu)體,另外多了注冊和注銷兩個操作畜普,加載驅(qū)動模塊 misc.ko 的過程中期丰,系統(tǒng)是自動在 /dev 目錄下生成了 hello_misc 節(jié)點文件,這樣應(yīng)用程序就可以通過設(shè)備節(jié)點文件訪問系統(tǒng)內(nèi)核資源了。

注冊misc 設(shè)備的三個步驟:
※ 填充 miscdevice 這個結(jié)構(gòu)體
※ 填充 file_operations 這個結(jié)構(gòu)體misc.c
※ 注冊雜項設(shè)備并生生成設(shè)備節(jié)點

公眾號:

InsertingAll

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钝荡,一起剝皮案震驚了整個濱河市街立,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠通,老刑警劉巖赎离,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異端辱,居然都是意外死亡梁剔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門舞蔽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荣病,“玉大人,你說我怎么就攤上這事渗柿「雠瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵朵栖,是天一觀的道長颊亮。 經(jīng)常有香客問我,道長混槐,這世上最難降的妖魔是什么编兄? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮声登,結(jié)果婚禮上狠鸳,老公的妹妹穿的比我還像新娘。我一直安慰自己悯嗓,他們只是感情好件舵,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脯厨,像睡著了一般铅祸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上合武,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天临梗,我揣著相機與錄音,去河邊找鬼稼跳。 笑死盟庞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汤善。 我是一名探鬼主播什猖,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼票彪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了不狮?” 一聲冷哼從身側(cè)響起降铸,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摇零,沒想到半個月后推掸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡遂黍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年终佛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雾家。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绍豁,靈堂內(nèi)的尸體忽然破棺而出芯咧,到底是詐尸還是另有隱情,我是刑警寧澤竹揍,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布敬飒,位于F島的核電站,受9級特大地震影響芬位,放射性物質(zhì)發(fā)生泄漏无拗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一昧碉、第九天 我趴在偏房一處隱蔽的房頂上張望英染。 院中可真熱鬧,春花似錦被饿、人聲如沸四康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闪金。三九已至,卻和暖如春论颅,著一層夾襖步出監(jiān)牢的瞬間哎垦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工恃疯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漏设,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓澡谭,卻偏偏與公主長得像愿题,于是被迫代替她去往敵國和親损俭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容