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