字符驱动自动创建节点
来源:互联网 发布:mysql resultmap 编辑:程序博客网 时间:2024/05/17 01:00
//包含了很多装载模块需要的符号和函数的定义
//用于指定初始化函数和清除函数
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
struct class *char_dvr_class;
unsigned int major = 0;
unsigned int minor = 0;
dev_t devno;
struct cdev test_cdev;
int test_open(struct inode *node, struct file *filp)
{
printk("open device\n");
return 0;
}
int test_close(struct inode *node, struct file *filp)
{
printk("close device\n");
return 0;
}
struct file_operations test_fops=
{
.open = test_open,
.release = test_close,
};//定义文件操作的结构体
static int __init test_init(void) //内核初始化函数
{
struct device *dev;
if(major)
{
devno = MKDEV(major,minor);
register_chrdev_region(devno, 1, "test new driver");
}
else
{
alloc_chrdev_region(&devno, minor, 1, "test alloc diver");
}
cdev_init(&test_cdev, &test_fops);
test_cdev.owner = THIS_MODULE;
cdev_add(&test_cdev, devno, 1);
//----------------------------------------------------------自动创建节点部分
char_dvr_class = class_create(THIS_MODULE,"test auto create dev node");
if(IS_ERR(char_dvr_class))
{
printk("class_create err");
device_destroy(char_dvr_class, devno);
}
else
{
dev = device_create(char_dvr_class, NULL, devno, NULL, "char_drv0");
if(IS_ERR(dev))
{
printk("device create failed");
device_destroy(char_dvr_class, devno);
}
//if(ret < 0)
//{
// printk("register err");
//}
printk("<0>""char_dvr init!\n"); //打印函数,和prinft类似
return 0;
}
static void __exit test_exit(void)//内核清除函数
{
cdev_del(&test_cdev);
unregister_chrdev_region(devno, 1);
device_destroy(char_dvr_class, devno);
class_destroy(char_dvr_class);
//unregister_chrdev(major, "test_driver");
printk("<0>""char_dvr good bye!\n");
}
module_init(test_init); //指定初始化函数
module_exit(test_exit); //指定清除函数
MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("xiao bai"); //指定作者
//用于指定初始化函数和清除函数
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
struct class *char_dvr_class;
unsigned int major = 0;
unsigned int minor = 0;
dev_t devno;
struct cdev test_cdev;
int test_open(struct inode *node, struct file *filp)
{
printk("open device\n");
return 0;
}
int test_close(struct inode *node, struct file *filp)
{
printk("close device\n");
return 0;
}
struct file_operations test_fops=
{
.open = test_open,
.release = test_close,
};//定义文件操作的结构体
static int __init test_init(void) //内核初始化函数
{
struct device *dev;
if(major)
{
devno = MKDEV(major,minor);
register_chrdev_region(devno, 1, "test new driver");
}
else
{
alloc_chrdev_region(&devno, minor, 1, "test alloc diver");
}
cdev_init(&test_cdev, &test_fops);
test_cdev.owner = THIS_MODULE;
cdev_add(&test_cdev, devno, 1);
//----------------------------------------------------------自动创建节点部分
char_dvr_class = class_create(THIS_MODULE,"test auto create dev node");
if(IS_ERR(char_dvr_class))
{
printk("class_create err");
device_destroy(char_dvr_class, devno);
}
else
{
dev = device_create(char_dvr_class, NULL, devno, NULL, "char_drv0");
if(IS_ERR(dev))
{
printk("device create failed");
device_destroy(char_dvr_class, devno);
}
}
//------------------------------------------------------------自动创建节点部分
//int ret = register_chrdev(major, "test_driver", &test_fops);//if(ret < 0)
//{
// printk("register err");
//}
printk("<0>""char_dvr init!\n"); //打印函数,和prinft类似
return 0;
}
static void __exit test_exit(void)//内核清除函数
{
cdev_del(&test_cdev);
unregister_chrdev_region(devno, 1);
device_destroy(char_dvr_class, devno);
class_destroy(char_dvr_class);
//unregister_chrdev(major, "test_driver");
printk("<0>""char_dvr good bye!\n");
}
module_init(test_init); //指定初始化函数
module_exit(test_exit); //指定清除函数
MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("xiao bai"); //指定作者
MODULE_VERSION("v0.1"); //指定代码修订号
insmod 后 可以看到 /dev下有 char_dvr0
cat /pro/device |grep test
可以看到设备号.
在/sys/dev/char/目录下可以看到设备号
在/sys/class/可以看到对应的目录(est auto create dev node)和设备节点(char_drv0)
0 0
- 字符驱动自动创建节点
- linux字符驱动之自动创建设备节点
- linux驱动开发--字符设备:自动创建设备节点
- linux字符设备驱动中自动创建设备节点
- linux字符驱动之自动创建设备节点
- linux字符驱动之自动创建设备节点
- linux字符驱动之自动创建设备节点
- Linux字符设备驱动自动创建设备节点
- linux字符设备驱动中自动创建设备节点【转】
- linux驱动开发--字符设备:自动创建设备节点
- linux字符设备驱动之设备节点的自动创建
- linux驱动开发之字符设备--自动创建设备节点
- linux字符设备驱动:自动创建设备及其节点
- linux字符驱动之自动创建设备节点
- 设备驱动-----自动创建节点
- 设备驱动--自动创建节点
- android 字符设备驱动模块及在 /dev 下自动创建设备节点问题
- Linux 字符设备驱动结构(二)—— 自动创建设备节点
- UIProgressView进度条方法总结
- 如何搭建个人博客?
- sqlite3: tool for sqlite
- linux下查看静态库和动态库是32位还是64位
- 修改Ubuntu默认Shell
- 字符驱动自动创建节点
- 八皇后问题-回溯算法
- 匿名项目笔记第一篇
- 要成为全栈工程师,你需要掌握的
- 【SQL Server 2008】基础知识—数据库登录
- 适配ios6,ios7等注意问题
- 火狐浏览器爆内存溢出
- 理解TCP/IP,SOCKET,HTTP,FTP,RMI,RPC,webservice等的含义和关系
- leetcode 241:Different Ways to Add Parentheses