Linux /dev 自动创建设备节点
- #include <linux/module.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/cdev.h>
- #include <linux/device.h>
- #include <asm/uaccess.h>
- #define HELLO_MAJOR 250
- #define HELLO_MINOR 0
- #define NUMBER_OF_DEVICES 2
- struct class *hello_class;
- static struct cdev cdev;
- dev_t devno;
- static ssize_t hello_read(struct file *file, char __user *buf, size_t count,
- loff_t *ppos)
- {
- char *str = "hello world";
- copy_to_user(buf,str,strlen(str));
- *(buf + strlen(str)) = '\n';
- return count;
- }
- static ssize_t hello_open(struct inode *inode,struct file *file)
- {
- return 0;
- }
- static const struct file_operations hello_fops = {
- .open = hello_open,
- .read = hello_read,
- .owner = THIS_MODULE,
- };
- static int __init hello_init(void)
- {
- int ret;
- devno = MKDEV(HELLO_MAJOR,HELLO_MINOR);
- if(HELLO_MAJOR){
- ret = register_chrdev_region(devno,NUMBER_OF_DEVICES,"chrdev");
- }else{
- ret = alloc_chrdev_region(&devno, 0, NUMBER_OF_DEVICES, "chrdev");
- }
- if(ret < 0){
- printk("%s register chrdev error\n",__func__);
- return ret;
- }
- hello_class = class_create(THIS_MODULE,"hello_char_calss");
- if(IS_ERR(hello_class)){
- printk("%s create class error\n",__func__);
- return -1;
- }
- device_create(hello_class, NULL, devno, NULL, "chrdev");
- cdev_init(&cdev, &hello_fops);
- cdev.owner = THIS_MODULE;
- cdev_add(&cdev, devno, NUMBER_OF_DEVICES);
- return 0;
- }
- static void __exit hello_exit(void)
- {
- printk("%s",__func__);
- cdev_del(&cdev);
- device_destroy(hello_class,devno);
- class_destroy(hello_class);
- unregister_chrdev_region(devno,NUMBER_OF_DEVICES);
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("oracleloyal@gmail.com");
- Makefile 内容
- 1 ifeq ($(KERNELRELEASE),)
2 #KERNEL_DIR:=/home/archermind/zhaoxi/bsw_ww02_2016/kernel/cht
3 KERNEL_DIR:=/usr/src/linux-headers-3.13.0-32-generic
4 PWD:=$(shell pwd)
5 modules:
6 $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
7 modules_install:
8 $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install
9 clean:
10 rm -rf .*.cmd *.ko *.o modules.order Module.symvers *mod.c
11 .PHONY: modules modules_install clean
12 else
13 modules-objs := my.o
14 obj-m := my.o
15 endif编译模块安装之后会在/sys/class/看到hello_char_class 以及目录内的chrdev,同时也会在/dev下看到udev为我们建立的节点chrdev.
测试程序
- #include <stdio.h>
- #include <fcntl.h>
- int main(void)
- {
- int fd;
- int i;
- char buf[50];
- fd = open("/dev/chrdev",O_RDWR);
- if(fd < 0){
- printf("can't open dev\n");
- return -1;
- }
- read(fd,buf,11);
- printf("%s",buf);
- return 0;
- }
- 测试程序执行后会输出hello world.,
Linux /dev 自动创建设备节点的更多相关文章
- linux驱动开发(四) 字符设备驱动框架(自动创建设备节点)
代码如下 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> # ...
- platform型设备在/dev目录下自动创建设备节点的分析【转】
转自:http://blog.csdn.net/rockrockwu/article/details/7357648 系统启动过程中platform设备.驱动注册完毕,为什么在/dev目录下就自动创建 ...
- I.MX6 linux eGalaxTouch 自动获取设备节点
I.MX6 linux eGalaxTouch 自动获取设备节点 \\\\\\\\\\\\\\-*- 目录 -*-///////////// | 一. 需求: | 二. /proc/bus/input ...
- linux下自动创建设备文件节点---class
在驱动模块初始化函数中实现设备节点的自动创建 我们在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的 ...
- Linux 内核驱动自动创建设备节点并挂载设备
*注:本文来自http://blog.csdn.net/lwj103862095/article/details/17470573 一.首先需要在最开始定义两个数据结构: static struct ...
- 使用class 自动创建设备节点
#include <linux/init.h>// __init __exit #include <linux/module.h> // module_init module_ ...
- Linux设备驱动实现自己主动创建设备节点
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #inclu ...
- linux driver ------ 字符设备驱动 之 “ 创建设备节点流程 ”
在字符设备驱动开发的入门教程中,最常见的就是用device_create()函数来创建设备节点了,但是在之后阅读内核源码的过程中却很少见device_create()的踪影了,取而代之的是device ...
- linux驱动之设备号与创建设备节点
设备号: 1.自己主动分配 major = register_chrdev(0,"first_drv",&first_sdv_fops);//注冊 注冊设备时给设备号写0, ...
随机推荐
- msql_DDL_创建table
• 语法: create table 表名(• 列名1 列类型 [<列的完整性约束>],• 列名2 列类型 [<列的完整性约束>],• ... ... ); • PRIMARY ...
- python 基础——运算符重载
方法 重载 调用 __init__ 构造函数 x = Class() __del__ 析构函数 del x __str__ 打印 print x __call__ 调用函数 x(*args) __ge ...
- 【转】windows 如何查看端口占用情况?
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- ASP.Net 验证控件 CompareValidator
CompareValidator 作用就是比较两个输入框所输入的值是否一致,常用来作为验证输入密码和确认密码的业务. 属性 描述 Operator 比较操作符,可选值DataTypeCheck.Equ ...
- 【NodeJS】---express配置ejs mongoose route等
express创建项目 命令行下: express prj_name cd prj_name && npm install ejs html var ejs = require('ej ...
- 【CSS3】---样式小技巧
水平居中设置-定宽块状元素 当被设置元素为块状元素时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素.这一小节我们先来讲一讲定宽块状元素. 满足定宽 ...
- django 学习-13 Django文件上传
1..vim blog/views.py from django import formsfrom django.http import HttpResponse 1 2 from dja ...
- miniui MVC datagrid数据绑定
数据绑定 Default.cshtml <div id="datagrid1" class="mini-datagrid" style="wid ...
- sql语句创建主键、外键、索引、绑定默认值
use Mengyou88_Wuliu --创建公司表 create table dbo.Company2 ( CompanyID ,) not null, CompanyName ) null, A ...
- 总结一下block的几种常用方法
一.block的简单介绍 block相当于一个参数,有参数的名,有参数的值,有参数的使用,当使用block的时候,它又相当于一个函数,会回调函数体. 声明:void (^block)(void); 实 ...