Linux设备驱动实现自己主动创建设备节点
#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设备驱动实现自己主动创建设备节点的更多相关文章
- linux 块设备驱动 (三)块设备驱动开发
一: 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为:int register_blkdev(unsigne ...
- 乾坤合一~Linux设备驱动之USB主机和设备驱动
如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...
- Linux设备驱动编程---miscdevice杂类设备的使用方法
miscdev简称杂类设备杂类设备就是对字符设备驱动做一个封装,方便简单使用杂类设备封装字符设备需要包含的头文件:#include <linux/miscdevice.h>(1)杂类设备的 ...
- linux块设备驱动(一)——块设备概念介绍
本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://blog.chinaunix.net/uid-27 ...
- linux 块设备驱动(二)——块设备数据结构
本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块设备相关的数据结构以及接口: 块设备接口则相对复 ...
- arm-linux字符设备驱动开发之---简单字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...
- RT-thread 设备驱动组件之IIC总线设备
本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h):底层硬件驱 ...
- Linux设备驱动开发基础--阻塞型设备驱动
1. 当一个设备无法立刻满足用户的读写请求时(例如调用read时,设备没有数据提供),驱动程序应当(缺省的)阻塞进程,使它进入等待(睡眠)状态,知道请求可以得到满足. 2. Linux内核等待队列:在 ...
- linux 块设备驱动(五)——块设备应用层的操作
一: 加载好sbull驱动 root@CarRadio:/# ls /dev/sbull -l brw-r--r-- 1 root root 254, 16 Mar 25 08:25 /dev/sbu ...
随机推荐
- mysql重装后出现乱码解决办法
查看当前连接系统参数:SHOW VARIABLES LIKE '%char%'; mysql> show variables like 'char%'; +------------------- ...
- Firefox双击关闭标签
- bat脚本命令
注:本文转载地址 http://www.cnblogs.com/yefengmeander/archive/2011/12/01/2887978.html 1.Echo 命令 打开回显或关闭请求回显 ...
- 冒泡排序算法(Java)
冒泡排序即每次遍历.相邻数字间进行比較,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置:算法关键要点在于确定每次循环的边界. 后面两种算法则是对冒泡排序一定程度上的改良,但相对于其它排 ...
- Linux 0.12 内核管理存储器
Linux 0.12 内核管理存储器 其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出 ...
- ubuntu下安装wine
直接在终端里面输入“sudo apt-get install wine”不要引号,即可安装wine.至于使用它,终端命令就是“wine ....”举个例子,你现在要运行魔兽, 然后你的魔兽的文件夹的位 ...
- 玩转Web之Json(四)---json与(Object/List/Map)的相互转化
在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担.本文将给出json转化的一系列方法. ...
- 【原创】leetCodeOj --- Majority Element 解题报告(脍炙人口的找n个元素数组中最少重复n/2次的元素)
题目地址: https://oj.leetcode.com/problems/majority-element/ 题目内容: Given an array of size n, find the ma ...
- Java Web整合开发(附录1) - 安装配置环境
1. Install JDK http://blog.csdn.net/sonnet123/article/details/9169741 Download JDK http://www.oracle ...
- 使用 WPF 实现所见即所得HTML编辑器
Introduction In this tip, you will learn the use of WPF webbrowser control and the use of the librar ...