Linux驱动之----Linux2.6方式设备注册
Linux2.6方式设备注册API
杂项设备注册和经典设备注册方法可参考我前俩篇博客
Linux驱动之----杂项设备注册
Linux驱动之----经典方式注册
在linux2.6里面设备号的申请方式一共有2种
动态设备号申请:>头文件:
> #include <linux/fs.h>
> 函数原型:
> int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
> 参数:
> dev:存放分配到的第一个设备(包括主次设备号)
> baseminon:要分配起始次设备号(次设备号的起始值)
> count:连续的次设备号数量
> name:设备名,不需要和/dev的设备文件名相同,随便取
>返回值:
> 成功返回0 失败返回负数静态设备号申请> 头文件:
> #include <linux/fs.h>
> 函数原型:
> int register_chrdev_region(dev_t from, unsigned count, const char *name)
> 参数:
> from:起始设备号(主,次)
> count:连续的次设备号数量
> name:设备名,不需要和/dev的设备文件名相同,随便取
> 返回值:
> 成功返回0 失败返回负数设备号提取合成操作:
静态合成:MKDEV(ma,mi)//已知次设备号合成完整设备号
动态提取:MAJOR(dev)//从完整设备号提取主设备号MINOR(dev)//从完整设备号提取次设备号
核心初始化函数:
头文件:#include <linux/cdev.h>
函数原型:void cdev_init(struct cdev *cdev,const struct file_operations *fops)
功能:初始化核心结构,具体做的是清零核心结构,初始化核心结构的
list,kobj,ops成员。
参数:cdev:需要初始化的核心结构指针fops:文件操作方法结构指针集
返回值:无返回值
特别说明:写这种驱动模型的时候,不需要在定义struct cdev结构变量初始
化,因为调用cdev_init函数的时候会把它清零0,定义时候的初始无效。
设备注册函数:
头文件:#include <linux/cdev.h>
函数原型:int cdev_add(struct cdev *p,dev_t dev,unsigned count)
功能:功能注册一个cdev结构
参数:p:已经初始化的核心结构指针dev:起始设备号(包含主次设备号)count:连续次设备号的数量
返回值:成功: 返回 0, 失败:返回负数
设备注销函数:
头文件:#include <linux/cdev.h>
函数原型:void cdev_del(struct cdev *p)
函数功能:注销一个cdev结构
参数:前面注册的struct cdev结构指针
返回值:无返回值
设备号释放函数:
头文件:#include <linux/fs.h>
函数原型:void unregister_chrdev_region(dev_t from, unsigned int count)
函数功能:释放一个设备号范围
参数:from:起始设备号(主,次)(包含主次设备号)count:连续的次设备号数量
返回值:无返回值
示例:
内核设备模块
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/io.h>//内存映射
#include <linux/cdev.h>
#include <linux/miscdevice.h>
/*GPD0_0---beep0x114000A0 -- con0x114000A4 -- con
*/
unsigned int * base = NULL;
#define GPD0_CON (*((unsigned int * )(base)))
#define GPD0_DTA (*((unsigned int * )(base+1)))
struct file_operations my_ops;int beep_open(struct inode * inode, struct file * file)
{GPD0_DTA |=(0x01<<0);return 0;
}
int beep_close(struct inode * inode, struct file * file)
{GPD0_DTA &=~(0x01<<0);return 0;
}
dev_t my_dev;
struct cdev my_cdev;
static int __init beep_init(void)
{int rel;//1:2.6注册一个设备my_ops.owner = THIS_MODULE;my_ops.open = beep_open;my_ops.release = beep_close;//1.1:申请一个可以用的设备号rel = alloc_chrdev_region(&my_dev,0,1,"asdasdsa");printk("major == %d\r\n",MAJOR(my_dev));printk("minor == %d\r\n",MINOR(my_dev));//1.2:注册cdev_init(&my_cdev,&my_ops);cdev_add(&my_cdev,my_dev,1);base = ioremap(0x114000A0,8);GPD0_CON &=~(0xF<<0);GPD0_CON |=(0x01<<0);//输出return 0;
}
static void __exit beep_exit(void)
{cdev_del(&my_cdev);//解除设备的注册unregister_chrdev_region(my_dev,1);//释放设备号 iounmap(base);
}module_init(beep_init);
module_exit(beep_exit);
MODULE_LICENSE("GPL");
用户调用:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{int fd=0;while(1){fd = open("/dev/beep",O_RDWR);sleep(1);close(fd);sleep(1);} return 0;
}
Makefile
obj-m += beep.oKDIR:=/home/jason/my_drive/linux-3.5all:make -C $(KDIR) M=$(PWD) modulesarm-linux-gcc beep_app.c -o beep_appclean:rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.markers *.order
运行结果和上篇,经典模式一样,要注意设备号。
Linux驱动之----Linux2.6方式设备注册相关推荐
- 嵌入式Linux驱动笔记(五)------学习platform设备驱动
你好!这里是风筝的博客, 欢迎和我一起交流. 设备是设备,驱动是驱动. 如果把两个糅合写一起,当设备发生变化时,势必要改写整个文件,这是非常愚蠢的做法.如果把他们分开来,当设备发生变化时,只要改写设备 ...
- Linux驱动——mmc sd card 块设备读写流程(十三)
Linux驱动--mmc sd card 块设备读写流程(十三) 备注: 1. Kernel版本:5.4 2. 使用工具:Source Insight 4.0 3. 参考博客: (1) ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- Linux驱动框架之misc类设备驱动框架
1.何为misc设备 (1)misc中文名就是杂项设备\杂散设备,因为现在的硬件设备多种多样,有好些设备不好对他们进行一个单独的分类,所以就将这些设备全部归属于 杂散设备,也就是misc设备,例如像a ...
- Linux驱动框架与杂项字符设备框架介绍
1. Linux下驱动框架介绍 1.1 驱动框架分类 Linux下驱动框架分为3大类型: 字符设备 --------- 块设备 存储设备 SD 硬盘 网络设备 网卡 无线 有线 字符设备和块设备都会生 ...
- Linux 驱动开发 三:字符设备驱动框架
一.参考 (3条消息) Linux 字符设备驱动结构(一)-- cdev 结构体.设备号相关知识解析_知秋一叶-CSDN博客 (3条消息) linux设备驱动框架_不忘初心-CSDN博客_linux设 ...
- linux驱动开发5之字符设备驱动新接口
1.新接口与老接口 1)老接口:register_chrdev static inline int register_chrdev(unsigned int major, const char *na ...
- Linux驱动开发--写一个块设备驱动
原文地址:[原创] 写一个块设备驱动 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2017377&fromuid=288 ...
- linux驱动之i2c子系统mpu6050设备驱动
以下是mpu6050简单的驱动实现,mpu6050是I2C接口的6轴传感器,可以作为字符设备注册到内核,本代码运行环境是3.4.2内核,4.3.2版本的编译链,12.04版本的Ubuntu,硬件环境是 ...
最新文章
- 完美解决latex警告信息:Citation `Gusfield:97‘ on page 1 undefined.
- Linux 多线程同步机制:互斥量、信号量、条件变量
- Tomcat发布Maven项目遇到异常:java.lang.OutOfMemoryError: PermGen space
- 医疗影像网络PACS系统方案
- java 优先队列从小到大,优先队列(Java)
- 碰碰车司机教你Linux下使用nmon分析系统性能
- 数值方法:插值与多项式逼近
- extjs4.2 前端读取对象的方法
- 网络拓扑图画图工具_写了100多篇原创文章,我常用的在线工具网站推荐给大家!...
- 人生规划:20岁到60岁我该干什么
- sql优化常用的几种方法_Hive常用性能优化方法实践全面总结
- 简单工厂模式初步尝试
- aloha app android,Aloha软件最新版下载-Aloha安卓版下载 v5.2.0-都去下载
- python 解压zip rar 7z文件
- 计算机网络英语形容词,英语常用形容词有哪些
- kubectl 命令详解(三十一):rollout history
- Arcgis小技巧【3】——计算图斑的投影面积和椭球面积
- 矩阵乘法求解多项式递推问题
- 基于牛顿法的开平方实现
- python课程设计,学了python后你可以做的案例(词云,折线图,饼图…)
热门文章
- 无线充电组别国一队:浙江工业大学
- 回归方程的拟合优度检验_判定一元线性回归方程拟合优度的判定系数R的取值范围...
- 制作抖音卡点视频?Python来帮你~
- 已成功拿下字节、腾讯、脉脉offer,这原因我服了
- C++ MFC学习笔记(第三课)绘制统计直方图
- Java设计模式——模版方法模式
- html大段文本如何分页,打印大型HTML表时如何处理分页符
- 海思Hi3519A开发(3.烧录uboot、kernel、rootfs)
- 第五人格服务器维修中怎么进,第五人格怎么进不去_进不去游戏原因汇总及解决办法_软吧...
- 实习第一天——网宿报到日