代码如下

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/device.h> int demo_major = ;
int demo_minor = ;
int demo_count = ; struct cdev cdev; static struct class *demo_class;
static struct device *demo_device; int demo_open(struct inode *inodep, struct file * filep) // 打开设备
{
printk("%s,%d\n", __func__, __LINE__);
return ;
} int demo_release(struct inode * inodep, struct file * filep) // 关闭设备
{
printk("%s,%d\n", __func__, __LINE__);
return ;
} struct file_operations fops =
{
.owner = THIS_MODULE,
.open = demo_open,
.release = demo_release,
}; static int __init demo_init(void)
{
int ret = ;
dev_t devno; printk("%s,%d\n", __func__, __LINE__); //使用下列宏则可以通过主设备号和次设备号生成 dev_t
devno = MKDEV(demo_major, demo_minor); printk("devno:%d\n", devno);
printk("demo_major:%d\n", demo_major); /**在调用 cdev_add()函数向系统注册字符设备之前,
*应首先调用 register_chrdev_region()或alloc_chrdev_region()函数向系统申请设备号
**/
if (demo_major)
{
     //使用cat /proc/devices | grep demo 来查询
ret = register_chrdev_region(devno, , "demo");
}
else
{
ret = alloc_chrdev_region(&devno, demo_minor, , "demo");
} if(ret)
{
printk("Failed to register_chrdev_region.\n");
return ret;
} //cdev_init()函数用于初始化 cdev 的成员,并建立 cdev 和 file_operations 之间的连接
cdev_init(&cdev, &fops);
cdev.owner = THIS_MODULE; //系统添加一个 cdev,完成字符设备的注册。
ret = cdev_add(&cdev, devno, demo_count);
if(ret)
{
printk(KERN_NOTICE " Failed to cdev_add [Error] %d adding demo%d", ret, demo_minor); goto failure_cdev_add; } /*自动创建设备节点文件*/ //1.注册设备类 /sys/class/demo的文件夹
  //使用 ls /sys/class/demo
demo_class = class_create(THIS_MODULE, "demo");
if( IS_ERR(demo_class))
{
printk("class_create failed!\n");
ret = PTR_ERR("demo_class");
goto failure_class_create;
} //2.注册设备 /sys/class/demo/demo0 /dev/demo0
demo_device = device_create(demo_class, NULL, MKDEV(demo_major, demo_minor), NULL, "demo%d", demo_minor);
if(IS_ERR(demo_device)){
printk("device_create failed!\n");
ret = PTR_ERR("demo_device");
goto failure_device_create;
}
return ; failure_device_create:
class_destroy(demo_class);
failure_class_create:
cdev_del(&cdev);
failure_cdev_add:
unregister_chrdev_region(devno, demo_count);
failure_register_chrdev:
return ret;
} static void __exit demo_exit(void)
{
printk("%s,%d\n", __func__, __LINE__); /*逆序消除*/
//从内核中删除设备
device_destroy(demo_class,MKDEV(demo_major, demo_minor));
//从内核中删除设备类
class_destroy(demo_class);
//删除一个 cdev,完成字符设备的注销。
cdev_del(&cdev);
//在调用cdev_del()函数从系统注销字符设备之后,unregister_chrdev_region()应该被调用以释放原先申请的设备号
unregister_chrdev_region( MKDEV(demo_major, demo_minor), demo_count );
} module_init(demo_init);
module_exit(demo_exit); MODULE_AUTHOR(" libra13179 ");
MODULE_LICENSE("GPL v2");
KVERS = $(shell uname -r)

# Kernel modules
obj-m += demo.o # Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
# @echo $(KVERS) clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

int main(int argc, const char *argv[])

{

    int fd;

    int val = ;

    fd = open("/dev/demo0", O_RDWR);

    if (fd < )

    {

        printf("can't open!\n");

        return -;

    }

    else

    {

        printf("open success.\n");

    }

    getchar();

    close(fd);

    return ;

}

主要使用到函数

class_create
device_create
device_destroy

class_destroy

小技巧:
类似
http://lxr.free-electrons.com/
http://lxr.oss.org.cn/
这样的网站提供了Linux内核源代码的交叉索引,
在其中输入Linux内核中的函数、数据结构或变量的名称就可以直接得到以超链接形式给出的定义和引用它的所有位置。
还有一些网站也提供了Linux内核中函数、变量和数据结构的搜索功能,
在google中搜索“linux identifier search”可得。
 

linux驱动开发(四) 字符设备驱动框架(自动创建设备节点)的更多相关文章

  1. class_create(),device_create自动创建设备文件结点

    class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优 ...

  2. GPIO硬件资源的申请,内核空间和用户空间的数据交换,ioctl(.....),设备文件的自动创建

    1.通过GPIO库函数控制LED   open("/dev/myleds",...)       close(fd)   ----------------------------- ...

  3. platform型设备在/dev目录下自动创建设备节点的分析【转】

    转自:http://blog.csdn.net/rockrockwu/article/details/7357648 系统启动过程中platform设备.驱动注册完毕,为什么在/dev目录下就自动创建 ...

  4. Linux驱动开发2——字符设备驱动

    1.申请设备号 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char ...

  5. 初入android驱动开发之字符设备(四-中断)

    上一篇讲到android驱动开发中,应用是怎样去操作底层硬件的整个流程,实现了按键控制led的亮灭.当然,这是一个非常easy的实例,只是略微演变一下,就能够得到广泛的应用. 如开发扫描头,应用透过监 ...

  6. 初入android驱动开发之字符设备(一)

    大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...

  7. 驱动开发--【字符设备、块设备简介】【sky原创】

    驱动开发   字符设备,块设备,网络设备   字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问   EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...

  8. linux设备驱动第四篇:驱动调试方法

    http://www.cnblogs.com/donghuizaixian/archive/2015/04/02/4387083.html 上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神, ...

  9. linux设备驱动----利用mdev(udev)自动创建设备文件节点

    1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...

随机推荐

  1. TCP/IP学习20180625-DNS

    1 DNS:domain name system域名系統把域名,轉換成IP2 最開始是一個hosts.txt,後來是數據庫,最後是分佈式數據庫3 每個名字服務器存儲一部分名字.如果有不知道的名字,就轉 ...

  2. Java HashMap的死循环 以及 LRUCache的正确实现

    今天RP爆发,16核服务器load飙到30多,cpu使用情况全部99%以上. 从jstack中分析发现全部线程都堵在map.transfer处,如下: "pool-10-thread-23& ...

  3. 信息安全-加密:RSA 算法

    ylbtech-信息安全-加密:RSA 算法 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 1.返 ...

  4. 解决wordpress文章归档和分类目录小工具标题重复问题

    最近更新了wordpress,发现更新后小工具中的文章归档和分类目录出现了标题重复,经检查,是部分主题下,主题的代码已经输出了标题,而wordpress的代码又再次输出了一次.于是我们需要删除word ...

  5. 免费通配符SSL证书

    https://www.freehao123.com/lets-encrypt-wildcard-ssl-ssl/ 第一步:要安装 curl https://get.acme.sh | sh 或者 w ...

  6. python打包--pyinstaller打包报错

    先来一段报错信息  目前打包主要涉及socket模块出现的报错 missing module named resource - imported by posix, C:\Users\Administ ...

  7. Linux下静态库和动态库

    函数库分为静态库和动态库 动态库(格式为libname.so[.主版本号.次版本号.发行号]).在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入. 静态库是目标文件.a的归档文件(格式为 ...

  8. 1122 Hamiltonian Cycle (25 分)

    1122 Hamiltonian Cycle (25 分) The "Hamilton cycle problem" is to find a simple cycle that ...

  9. tesseract 训练

    下载chi_sim.traindata字库下载tesseract-ocr-setup-3.02.02.exe 下载地址:http://code.google.com/p/tesseract-ocr/d ...

  10. [UE4]end快捷键,落地

    actor的根节点需要是实体模型才可以,end快捷键着地是让actor的根节点着地.