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方式设备注册相关推荐

  1. 嵌入式Linux驱动笔记(五)------学习platform设备驱动

    你好!这里是风筝的博客, 欢迎和我一起交流. 设备是设备,驱动是驱动. 如果把两个糅合写一起,当设备发生变化时,势必要改写整个文件,这是非常愚蠢的做法.如果把他们分开来,当设备发生变化时,只要改写设备 ...

  2. Linux驱动——mmc sd card 块设备读写流程(十三)

    Linux驱动--mmc sd card 块设备读写流程(十三) 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1) ...

  3. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  4. Linux驱动框架之misc类设备驱动框架

    1.何为misc设备 (1)misc中文名就是杂项设备\杂散设备,因为现在的硬件设备多种多样,有好些设备不好对他们进行一个单独的分类,所以就将这些设备全部归属于 杂散设备,也就是misc设备,例如像a ...

  5. Linux驱动框架与杂项字符设备框架介绍

    1. Linux下驱动框架介绍 1.1 驱动框架分类 Linux下驱动框架分为3大类型: 字符设备 --------- 块设备 存储设备 SD 硬盘 网络设备 网卡 无线 有线 字符设备和块设备都会生 ...

  6. Linux 驱动开发 三:字符设备驱动框架

    一.参考 (3条消息) Linux 字符设备驱动结构(一)-- cdev 结构体.设备号相关知识解析_知秋一叶-CSDN博客 (3条消息) linux设备驱动框架_不忘初心-CSDN博客_linux设 ...

  7. linux驱动开发5之字符设备驱动新接口

    1.新接口与老接口 1)老接口:register_chrdev static inline int register_chrdev(unsigned int major, const char *na ...

  8. Linux驱动开发--写一个块设备驱动

    原文地址:[原创] 写一个块设备驱动 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2017377&fromuid=288 ...

  9. linux驱动之i2c子系统mpu6050设备驱动

    以下是mpu6050简单的驱动实现,mpu6050是I2C接口的6轴传感器,可以作为字符设备注册到内核,本代码运行环境是3.4.2内核,4.3.2版本的编译链,12.04版本的Ubuntu,硬件环境是 ...

最新文章

  1. 完美解决latex警告信息:Citation `Gusfield:97‘ on page 1 undefined.
  2. Linux 多线程同步机制:互斥量、信号量、条件变量
  3. Tomcat发布Maven项目遇到异常:java.lang.OutOfMemoryError: PermGen space
  4. 医疗影像网络PACS系统方案
  5. java 优先队列从小到大,优先队列(Java)
  6. 碰碰车司机教你Linux下使用nmon分析系统性能
  7. 数值方法:插值与多项式逼近
  8. extjs4.2 前端读取对象的方法
  9. 网络拓扑图画图工具_写了100多篇原创文章,我常用的在线工具网站推荐给大家!...
  10. 人生规划:20岁到60岁我该干什么
  11. sql优化常用的几种方法_Hive常用性能优化方法实践全面总结
  12. 简单工厂模式初步尝试
  13. aloha app android,Aloha软件最新版下载-Aloha安卓版下载 v5.2.0-都去下载
  14. python 解压zip rar 7z文件
  15. 计算机网络英语形容词,英语常用形容词有哪些
  16. kubectl 命令详解(三十一):rollout history
  17. Arcgis小技巧【3】——计算图斑的投影面积和椭球面积
  18. 矩阵乘法求解多项式递推问题
  19. 基于牛顿法的开平方实现
  20. python课程设计,学了python后你可以做的案例(词云,折线图,饼图…)

热门文章

  1. 无线充电组别国一队:浙江工业大学
  2. 回归方程的拟合优度检验_判定一元线性回归方程拟合优度的判定系数R的取值范围...
  3. 制作抖音卡点视频?Python来帮你~
  4. 已成功拿下字节、腾讯、脉脉offer,这原因我服了
  5. C++ MFC学习笔记(第三课)绘制统计直方图
  6. Java设计模式——模版方法模式
  7. html大段文本如何分页,打印大型HTML表时如何处理分页符
  8. 海思Hi3519A开发(3.烧录uboot、kernel、rootfs)
  9. 第五人格服务器维修中怎么进,第五人格怎么进不去_进不去游戏原因汇总及解决办法_软吧...
  10. 实习第一天——网宿报到日