#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//定义设备名称为test-dev
#define DEV_NAME"test-dev"
//定义并初始化一个类
struct class cla = {
.name = "test-cla", //将类的名字设置为test-cla
.owner = THIS_MODULE,//该类的拥有者为这个模块
};
int test_open(struct inode *node, struct file *filp)
{
printk("test open\n");
return 0;
}
int test_close(struct inode *node, struct file *filp)
{
printk("test close\n");
return 0;
}
//填充并初始化file_operations结构体
struct file_operations fops = {
.owner = THIS_MODULE,
.open = test_open,
.release = test_close,
};
//定义设备
struct device dev = {
.init_name = DEV_NAME,
.class = &cla,//设备归类cla;
.release = test_release,
};
//定义主设备号和次设备号
int major = 0;
int minor = 0;
int test_init(void)
{
int ret;
printk("test init\n");
//将类进行注册
ret = class_register(&cla);
//如果返回值不为0,返回错误值
if(IS_ERR_VALUE(ret))
{
return ret;
}
//注册一个字符设备驱动
ret = register_chrdev(major, DEV_NAME, &fops);
//如果注册不成功返回错误值并撤销类的实现
if(IS_ERR_VALUE(ret))
{
class_unregister(&cla);
return ret;
}
major = ret;
//printk("major = %d\n", major);
//申请主设备号与次设备号
dev.devt = MKDEV(major, minor);
//将设备进行注册
ret = device_register(&dev);
//如果设备注册不成功,撤销类设备注册并解除字符设备驱动的注册
if(IS_ERR_VALUE(ret))
{
class_unregister(&cla);
unregister_chrdev(major, DEV_NAME);
return ret;
}
return 0;
}
void test_exit(void)
{
printk("test exit\n");
//解除字符设备的注册
unregister_chrdev(major, DEV_NAME);
//解决类设备注册
device_unregister(&dev);
class_unregister(&cla);
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("yangyx");
MODULE_VERSION("1.1");
本文同步分享在 博客“Engineer-Bruce_Yang”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。