驱动学习1

一、字符设备驱动

1.添加驱动入口和出口
module_init();
module_exit();
MODULE_LICENSE("GPL");
MODULE_AUTHOR("*****");
2.实现函数入口和出口
/函数入口/
static int __init chrdevbase_init(void)
{
int ret;
printk("chrdevbase init!\r\n");

/*注册字符设备*/
ret = register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
return ret;

}

/函数出口/
static void __exit chrdevbase_exit(void)
{
printk("chrdevbase exit!\r\n");
unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
/注销字符是被/

}

3.实现设备操作函数结构体

static struct file_operations chrdevbase_fops = {
.owner = THIS_MODULE,
.open = chrdevbase_open,
.read = chrdevbase_read,
.write = chrdevbase_write,
.release = chrdevbase_release,
};
4.实现对应的函数

/*
*打开设备
*/
static int chrdevbase_open(struct inode *inode, struct file *filp)
{
printk("open_chrdevbase!\r\n");
return 0;
}

/*
*从设备中读取数据
*/
static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{
printk("Read_chrdevbase!\r\n");
return 0;
}

/*
*写数据到设备
*/
static ssize_t chrdevbase_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{
printk("Write_chrdevbase!\r\n");
return 0;
}

/*
*关闭设备
*/
static int chrdevbase_release(struct inode *inode, struct file *filp)
{
printk("release_chrdevbase!\r\n");
return 0;
}

注:

1.在使用modprobe加载模块之前,一定要使用depmod.
2.如果使用了depmod,并且.ko文件也在/lib/module/内核版本 下但还是提示.ko not found in directory。则需要修改指令去掉.ko
3.如果打印失败,则设置编译内核源码时默认的打印级数。
echo 8 4 1 7 > /proc/sys/kernel/printk

你可能感兴趣的:(驱动学习1)