嵌入式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教程
评论