嵌入式Linux設備驅動開發之:實驗內容——test驅動
/*虛擬設備的file_operations結構*/
staticstructfile_operationstest_fops=
{
.owner=THIS_MODULE,
.read=test_read,
.write=test_write,
.open=test_open,
.release=test_release,
};
/*模塊注冊入口*/
intinit_module(void)
{
intresult;
dev_tdev=MKDEV(major,0);
if(major)
{/*靜態注冊一個設備,設備號先前指定好,并設定設備名,用cat/proc/devices來查看*/
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)編譯代碼。
虛擬設備的驅動程序的Makefile如下所示:
ifeq($(KERNELRELEASE),)
KERNELDIR?=/lib/modules/$(shelluname-r)/build/*內核代碼編譯路徑*/
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)加載和卸載模塊。
通過下面兩個腳本代碼分別實現驅動模塊的加載和卸載。
加載腳本test_drv_load如下所示:
#!/bin/sh
#驅動模塊名稱
module=test_drv
#設備名稱。在/proc/devices中出現
device=test_dev
#設備文件的屬性
mode=664
group=david
#刪除已存在的設備節點
rm-f/dev/${device}
#加載驅動模塊
/sbin/insmod-f./$module.ko$*||exit1
#查到創建設備的主設備號
major=`cat/proc/devices|awk\$2==$device{print\$1}`
#創建設備文件節點
mknod/dev/${device}c$major0
#設置設備文件屬性
chgrp$group/dev/${device}
chmod$mode/dev/${device}
卸載腳本test_drv_unload如下所示:
#!/bin/sh
module=test_drv
device=test_dev
#卸載驅動模塊
/sbin/rmmod$module$*||exit1
#刪除設備文件
rm-f/dev/${device}
exit0
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)linux相關文章:linux教程
評論