#include <linux/module.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/atomic.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/kthread.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/dma-mapping.h>

//定义设备名称为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");

linux设备驱动程序--类class的实现的更多相关文章

  1. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  2. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  3. linux设备驱动程序-i2c(1):i2c总线的添加与实现

    linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...

  4. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  5. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  6. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  7. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  8. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  9. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

随机推荐

  1. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  2. (一二〇)CALayer的一些特性

    1.每个View都自带一个CALayer,称为rootLayer,layer可以和实现与View一样的显示功能,但是它不继承UIResponse,也就是说它无法处理事件,所以为了处理事件还是要用Vie ...

  3. Android初级教程:屏幕分辨率

    在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便. 不便一:下面代码中的getWidth和getHeight在adt上提示deprecated ...

  4. 如何在mac OS X中查看Emoji表情的含义

    使用ctrl+空格,在搜索框中搜索 TextEdit程序,其实中文是 文本编辑 程序, 运行,在菜单中选择 编辑->特殊字符 然后可以看到每个图标的说明啦

  5. ExpandableListView简单应用及listview模拟ExpandableListView

    首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛.           看这个效果挺棒吧,其实实现起来也不难,我 ...

  6. java常用IO流集合用法模板

    package com.fmy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import jav ...

  7. Android进阶(二十七)Android原生扰人烦的布局

    Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...

  8. 【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码

    原文:Using Both Shared and View-Specific Code in an Ext JS 6 Universal App 在本文,在展示如何编写Ext JS 6通用应用程序代码 ...

  9. 调试bootmgr&winload vista&win7 x86&x64

    设置调试bootmgr 1.以管理员权限运行cmd.exe 2.执行以下命令 3.  参照我的另一篇文章<win8 + vmware + windbg 双机调试 >中的第1.3步,建立wi ...

  10. iOS数据解析UI_14

    数据解析:就是按照约定(假象)好的格式提取数据的过程就叫解析:  提供数据方(后台):工作就是把数据按照一定的格式存储起来  提取数据方(前台):工作就是把数据按照一定的格式读取出来  主流的格式:X ...