#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/ioctl.h> #define DRIVERNAME "xxx"
#define DEV_MINOR 0
static dev_t xxx_devno = 0;
static struct class * xxx_class; struct xxx_dev
{
struct cdev cdev;
}xxxdev; /*-----------------------------------------------------------------------------------*/ static int xxx_open(struct inode *inode, struct file *filp)
{
return 0;
} static ssize_t xxx_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
return 0;
} static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
return 0;
} static int xxx_release(struct inode *inode, struct file *filp)
{
return 0;
} static int xxx_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int ret = 0; switch (cmd)
{
case CPLD_VERSION:
break;
case CPLD_RESET:
break;
case CPLD_RELAY:
break;
case CPLD_RJ45:
break;
case CPLD_INTERUPT:
break;
case CPLD_FAN:
break;
default:
printk("Error xxx cmd\n");
break;
} return 0;
} /*-----------------------------------------------------------------------------------*/ static struct file_operations xxx_fops = {
.owner = THIS_MODULE,
.open = xxx_open,
.read = xxx_read,
.write = xxx_write,
.ioctl = xxx_ioctl,
.close = xxx_release,
}; static int xxx_init(void)
{
int ret = 0; /*动态申请设备号*/
ret = alloc_chrdev_region(&xxx_devno, DEV_MINOR, 1, DRIVERNAME);
if (ret < 0)
{
printk("xxx register char dev failed\n");
goto out;
}
/*初始化cdev结构,注冊cdev*/
cdev_init(&(xxxdev.cdev), &xxx_fops);
xxxdev.cdev.owner = THIS_MODULE;
ret = cdev_add(&(xxxdev.cdev), xxx_devno, 1);
if (ret)
{
printk("Error adding xxx device\n");
goto add_err;
} /*创建设备节点/sys/class/xxx和/dev/xxx*/
xxx_class = class_create(THIS_MODULE, DRIVERNAME);
if (IS_ERR(xxx_class))
{
ret = PTR_ERR(xxx_class);
goto class_err;
}
device_create(xxx_class, NULL, xxx_devno, NULL, DRIVERNAME); printk("xxx init\n");
return 0; class_err:
cdev_del(&(xxxdev.cdev));
add_err:
unregister_chrdev_region(xxx_devno, 1);
out:
return ret;
} static void xxx_exit(void)
{
device_destroy(xxx_class, xxx_devno);
class_destroy(xxx_class);
cdev_del(&(xxxdev.cdev));
unregister_chrdev_region(xxx_devno, 1);
printk("module xxx exit\n");
} module_init(xxx_init);
module_exit(xxx_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuwei");
MODULE_DESCRIPTION("char driver");

Linux设备驱动实现自己主动创建设备节点的更多相关文章

  1. linux 块设备驱动 (三)块设备驱动开发

    一: 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为:int register_blkdev(unsigne ...

  2. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  3. Linux设备驱动编程---miscdevice杂类设备的使用方法

    miscdev简称杂类设备杂类设备就是对字符设备驱动做一个封装,方便简单使用杂类设备封装字符设备需要包含的头文件:#include <linux/miscdevice.h>(1)杂类设备的 ...

  4. linux块设备驱动(一)——块设备概念介绍

    本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://blog.chinaunix.net/uid-27 ...

  5. linux 块设备驱动(二)——块设备数据结构

    本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块设备相关的数据结构以及接口: 块设备接口则相对复 ...

  6. arm-linux字符设备驱动开发之---简单字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...

  7. RT-thread 设备驱动组件之IIC总线设备

    本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h):底层硬件驱 ...

  8. Linux设备驱动开发基础--阻塞型设备驱动

    1. 当一个设备无法立刻满足用户的读写请求时(例如调用read时,设备没有数据提供),驱动程序应当(缺省的)阻塞进程,使它进入等待(睡眠)状态,知道请求可以得到满足. 2. Linux内核等待队列:在 ...

  9. linux 块设备驱动(五)——块设备应用层的操作

    一: 加载好sbull驱动 root@CarRadio:/# ls /dev/sbull -l brw-r--r-- 1 root root 254, 16 Mar 25 08:25 /dev/sbu ...

随机推荐

  1. winzip15.0许可证

    username:Juzhaofeng 授权码:MPZRP-Y7LWW-K1DKG-FM92E-2C5F5-ZEKFF

  2. oracle 锁表、解锁的语句

     --1.以下的语句用来查询哪些对象被锁: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_object ...

  3. hdu-2814-Interesting Fibonacci-斐波那契周期节

    哇,其实我2A该....否1A纯脑损伤.. 乞讨:F(a^b)^(F(a^b) ^ (n-1))%c  既是求F(a^b)^(F(a^b) ^ (n-1)%phi[c]+phi[c])%c 先求x=F ...

  4. 【Android进阶】Android面试题目整理与讲解(一)

    这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的增加,如果答案有错误,希望大家可以指正 1.简述Activity的生命周期 当Activity开始启动的时候,首先调用onCre ...

  5. Maven导入eclipse缺少web-resources目录

    导入其它机器的maven项目会出现缺少target/m2e/下的web-resources目录,眼下详细原因不知道, 解决方法是,直接将缺少的web-resources目录复制到项目中,错误解决

  6. PDE_DATA 定义

    PDE_DATA 定义 Location: /fs/proc/internal.h static inline struct proc_dir_entry *PDE(const struct inod ...

  7. linux下一个oracle11G DG建立(一个):准备环境

    linux下一个oracle11G  DG建立(一个):准备环境 周围环境 名称 主库 备库 主机名 bjsrv shsrv 软件版本号 RedHat Enterprise5.5.Oracle 11g ...

  8. 【Android进阶】关于PagerAdapter的使用方法的总结

    PagerAdapter简介 PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdap ...

  9. JSplitPane demo

    package example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; imp ...

  10. Android网络图片显示在ImageView 上面

    在写这篇博文的时候,我參与了一个项目的开发,里面涉及了非常多网络调用相关的问题,我记得我在刚刚開始做android项目的时候,以前就遇到这个问题,当时在网上搜索了一下,发现了一篇博文,如今与大家分享一 ...