6 关闭/释放设备
static int chrdevbase_release (struct inode *inode, struct file *filp)
{
//printk("chrdevbase release!\r\n");
return 0;
}
chrdevbase_release函数是 Linux 字符设备驱动程序中的release操作,它通常与文件系统中的close()系统调用相关联,当用户空间的应用程序调用close()函数关闭设备文件时,内核会调用字符设备驱动中的release函数。
- struct inode *inode:指向文件系统中表示设备文件的 inode 结构体,inode包含了文件的元数据信息;
- struct file *filp:指向文件结构体,表示正在使用的设备文件,filp包含了与文件相关的状态信息。
7 设备操作函数结构体
static struct file_operations chrdevbase_fops = {
.owner = THIS_MODULE,
.open = chrdevbase_open,
.read = chrdevbase_read,
.write = chrdevbase_write,
.release = chrdevbase_release,
};
该结构体实例将一组函数指针与其成员关联起来,这些函数指针用于处理字符设备的各种操作,如打开设备文件、读取数据、写入数据、以及关闭设备文件。
其中owner是struct file_operations的一个成员,用于表示该文件操作的所有者模块。
8 驱动入口函数
static int __init chrdevbase_init(void)
{
int retvalue = 0;
/* 注册字符设备驱动 */
retvalue = register_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME, &chrdevbase_fops);
if(retvalue < 0){
printk("chrdevbase driver register failed\r\n");
}
printk("chrdevbase_init()\r\n");
return 0;
}
完成字符设备驱动的初始化,主要目的是注册一个字符设备驱动程序,使得内核能够识别并与之交互。register_chrdev用于注册字符设备驱动,其中&chrdevbase_fops是一个指向file_operations结构体的指针,通过这个指针,内核可以知道在用户访问该设备时应该调用哪些函数。
9 驱动出口函数
static void __exit chrdevbase_exit(void)
{
/* 注销字符设备驱动 */
unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
printk("chrdevbase_exit()\r\n");
}
使用unregister_chrdev()注销字符设备驱动程序,使内核不再管理和识别该设备。
10 指定驱动的入口和出口函数
module_init(chrdevbase_init);
module_exit(chrdevbase_exit);
11 LICENSE和作者信息
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LZQYT");