linux内核定义注册设备,linux字符型设备驱动 一.注册设备并创建设备文件
1.字符设备
字符设备、字符设备驱动与用户空间访问该设备的程序三者之间的关系
Linux内核中:
a -- 使用cdev结构体来描述字符设备;
b -- 通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;
c -- 通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等;
在Linux字符设备驱动中:
a -- 模块加载函数通过 register_chrdev_region( ) 或 alloc_chrdev_region( )来静态或者动态获取设备号;
b -- 通过 cdev_init( ) 建立cdev与 file_operations之间的连接,通过 cdev_add( ) 向系统添加一个cdev以完成注册;
c -- 模块卸载函数通过cdev_del( )来注销cdev,通过 unregister_chrdev_region( )来释放设备号;
用户空间访问该设备的程序:
a -- 通过Linux系统调用,如open( )、read( )、write( ),来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数;
2.例子
hello.c
#include #include#include#include
static int major = 99; //主设备号(用于区分设备类)
static int minor = 0; //次设备号(用于区分哪个设备)
staticdev_t devno;static structcdev cdev1;struct class *hello_class;static int hello_open(struct inode *inodep, struct file *filep)
{
printk(KERN_ALERT"hello are opened \r\n");return 0;
}static struct file_operations hello_ops ={
.open=hello_open,
};static int hello_init(void)
{intret;
printk(KERN_ALERT"hello_init\r\n");//第一步:将主设备号、次设备号转化成dev_t类型
devno =MKDEV(major, minor);
ret= register_chrdev_region(devno, 1, "hello");if (ret < 0)
{
printk(KERN_ERR"my register_chrdev_region fail \r\n");returnret;
}
printk(KERN_INFO"register_chrdev_region success\n");//第二步:注册字符设备驱动
cdev_init(&cdev1, &hello_ops);
ret= cdev_add(&cdev1, devno, 1);if (ret < 0)
{
printk(KERN_ERR"Uable to add dev\n");returnret;
}
printk(KERN_INFO"cdev_add success\n");//第三步:2.6内核之后要向sys文件系统中添加设备
hello_class = class_create(THIS_MODULE, "hello");
device_create(hello_class, NULL, devno, NULL,"hello");
printk(KERN_INFO"device created success\n");return 0;
}static void hello_exit(void)
{
cdev_del(&cdev1);
unregister_chrdev_region(devno,1);
printk(KERN_ALERT"hell_exit\r\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
test.c
#include #include#include#includemain()
{intfd;
fd= open("/dev/hello",O_RDWR);if(fd<0)
{
perror("open fail \n");return;
}else{
printf("open /dev/hello success! \n");
}
close(fd);
}
makefile
#General Purpose Makefile forcross compile Linux Kernel module
ifneq ($(KERNELRELEASE),)
obj-m := hello.o #+=是连接字符串elseARCH :=arm
CROSS_COMPILE := arm-linux-gnueabihf-KERN_DIR := /home/zqh/lichee/linux-zero-4.14.y #选择内核路径
PWD :=$(shell pwd) #当前路径
all:
$(info "1st")make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERN_DIR) M=$(PWD) modules
clean:rm -f *.ko *.o *.symvers *.mod.c *.mod.o *.order .*.o.ko.cmd .*.ko.cmd .*.mod.o.cmd .*.o.cmd
endif
linux内核定义注册设备,linux字符型设备驱动 一.注册设备并创建设备文件相关推荐
- Linux内核网络数据发送(六)——网络设备驱动
Linux内核网络数据发送(六)--网络设备驱动 1. 前言 2. 驱动回调函数注册 3. `ndo_start_xmit` 发送数据 4. `igb_tx_map` 1. 前言 本文主要介绍设备通过 ...
- 一文了解linux内核,一文了解Linux的系统结构
什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...
- Linux内核入门-如何获取Linux内核源代码、生成配置内核
如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...
- 查看linux内核的编译时间,linux内核编译步骤
linux内核编译步骤 对于linux新手来说,编译内核相对有一些难度,甚至不知道如何入手,我通过在网上收集这方面的资料,最终编译成功.现在我归纳了一下,写出这一篇还算比较详细的步骤,希望能对各位新手 ...
- linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心
课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...
- linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程
贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...
- linux内核 lts长期演进,Linux Kernel 4.19 将成为下一个LTS(长期支持)系列
最近Linux内核开发人员和维护人员Greg Kroah-Hartman透露,Linux Kernel 4.19将下一个长期支持的Linux内核系列. 现在Linux Kernel 4.17已经达到使 ...
- Linux内核开发_1_编译LInux内核
目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...
- 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...
- 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )
文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...
最新文章
- 清华大学计算机网络研究中心,清华大学信息网络工程研究中心简介
- 使用Hibernate操作数据库
- python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)
- ORA-07445 [kxsxsi()+450] [SIGSEGV]
- 多点测试:while的写法
- 《Spring技术内幕》——2.3节IoC容器的初始化过程
- FLASH、SDRAM
- BOSON cisco设备模拟器6.0+注册机
- 在ubuntu中安装DroidCam
- android手机连不上wifi,手机连不上wifi怎么办
- linux 删除中文文件夹,解析Linux文件夹文件创建、删除
- 抢答器c语言程序设计,基于单片机的智能抢答器设计与实现
- 这样可以几分钟快速对接支付宝APP支付和手机网站支付
- 自制一个简单的音乐播放器
- C#怎样解析.CSV文件同时把类转换成JSON
- Shamir 门限方案|秘密共享|拉格朗日插值|密码学
- CAS原理——乐观锁机制
- 算法系列—低位优先的字符串排序(基于键索引计数法)
- 复试线388分!中科大软院公布考研分数线!
- 千万别在有WiFi的房间里摆这种姿势,只因…