嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:實(shí)驗(yàn)內(nèi)容——test驅(qū)動(dòng)
/*虛擬設(shè)備的file_operations結(jié)構(gòu)*/
staticstructfile_operationstest_fops=
{
.owner=THIS_MODULE,
.read=test_read,
.write=test_write,
.open=test_open,
.release=test_release,
};
/*模塊注冊(cè)入口*/
intinit_module(void)
{
intresult;
dev_tdev=MKDEV(major,0);
if(major)
{/*靜態(tài)注冊(cè)一個(gè)設(shè)備,設(shè)備號(hào)先前指定好,并設(shè)定設(shè)備名,用cat/proc/devices來(lái)查看*/
result=register_chrdev_region(dev,1,TEST_DEVICE_NAME);
}
else
{
result=alloc_chrdev_region(dev,0,1,TEST_DEVICE_NAME);
}
if(result0)
{
printk(KERN_WARNINGTestdevice:unabletogetmajor%dn,major);
returnresult;
}
test_setup_cdev(test_dev,0,test_fops);
printk(Themajorofthetestdeviceis%dn,major);
return0;
}
/*卸載模塊*/
voidcleanup_module(void)
{
cdev_del(test_dev);
unregister_chrdev_region(MKDEV(major,0),1);
printk(Testdeviceuninstalledn);
}
(2)編譯代碼。
虛擬設(shè)備的驅(qū)動(dòng)程序的Makefile如下所示:
ifeq($(KERNELRELEASE),)
KERNELDIR?=/lib/modules/$(shelluname-r)/build/*內(nèi)核代碼編譯路徑*/
PWD:=$(shellpwd)
modules:
$(MAKE)-C$(KERNELDIR)M=$(PWD)modules
modules_install:
$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_install
clean:
rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions
.PHONY:modulesmodules_installclean
else
obj-m:=test_drv.o/*將生成的模塊為test_drv.ko*/
endif
(3)加載和卸載模塊。
通過下面兩個(gè)腳本代碼分別實(shí)現(xiàn)驅(qū)動(dòng)模塊的加載和卸載。
加載腳本test_drv_load如下所示:
#!/bin/sh
#驅(qū)動(dòng)模塊名稱
module=test_drv
#設(shè)備名稱。在/proc/devices中出現(xiàn)
device=test_dev
#設(shè)備文件的屬性
mode=664
group=david
#刪除已存在的設(shè)備節(jié)點(diǎn)
rm-f/dev/${device}
#加載驅(qū)動(dòng)模塊
/sbin/insmod-f./$module.ko$*||exit1
#查到創(chuàng)建設(shè)備的主設(shè)備號(hào)
major=`cat/proc/devices|awk\$2==$device{print\$1}`
#創(chuàng)建設(shè)備文件節(jié)點(diǎn)
mknod/dev/${device}c$major0
#設(shè)置設(shè)備文件屬性
chgrp$group/dev/${device}
chmod$mode/dev/${device}
卸載腳本test_drv_unload如下所示:
#!/bin/sh
module=test_drv
device=test_dev
#卸載驅(qū)動(dòng)模塊
/sbin/rmmod$module$*||exit1
#刪除設(shè)備文件
rm-f/dev/${device}
exit0
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論