当前位置: 首页 > news >正文

Linux驱动学习之点灯(四,linux2.6)

上篇最后的第二种点灯方法年代比较久远,register_chrdev()这个函数一下申请了255个设备号,不建议使用  如下图

下图的函数在linux2.6里是上图函数的升级版,不过他是静态分配,后续还得添加到cdev里

从上图函数不难发现,静态申请多个设备号,主设备号不变,次设备号++

一般我们会使用下图函数动态申请设备号,并添加到cdev里

第一个参数:无符号32位设备号的地址,申请成功后该地址空间里存放的就是设备号

第二个参数:次设备号起始地址,

第三个参数:申请设备号的数量(主设备号不变,次设备号++)

第四个参数:名字(随便给)

申请完设备号后,把它加入cdev链表里 

struct cdev cdev; //定义cdev
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
cdev_init(&cdev, &led_fops);  //用文件操作结构体初始化cdev
cdev_add(&cdev, dev, 1);     //添加设备号

也可以动态分配

struct cdev *cdev; //定义cdev
cdev=cdev_alloc();
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
cdev_init(cdev, &led_fops);  //用文件操作结构体初始化cdev
cdev_add(cdev, dev, 1);     //添加设备号

接下里就是创建/dev/led

    struct class *led;led = class_create(THIS_MODULE, "myled_class");device_create(led,NULL,dev,NULL,"led");

完整代码 

#include "linux/device.h"
#include "linux/export.h"
#include "linux/gpio.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/init.h"
#include "linux/fs.h"
#include "linux/cdev.h"
#include "linux/uaccess.h"dev_t dev;
struct cdev cdev;
struct class *led;
static int led_open (struct inode *a, struct file *b){return 0;
}
static int led_close (struct inode *a, struct file *b){return 0;
}
static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{char val;unsigned long a=copy_from_user(&val,buf,1);if(a){}else{}if(val=='1'){printk("开灯\r\n");gpio_set_value(21,1);gpio_set_value(22,1);printk("ok\r\n");}    else{printk("关灯\r\n");gpio_set_value(21,0);gpio_set_value(22, 0);printk("ok\r\n");}return 0;
}
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
static int __init led_init(void)
{//申请设备号int ret=  alloc_chrdev_region(&dev,0,1,"led_dev");if(ret<0){return -1;   //加载失败}printk(KERN_INFO "LED driver loaded successfully\n");//初始化LINUX2.6 cdev结构体cdev_init(&cdev, &led_fops);cdev_add(&cdev, dev, 1);gpio_request(21,"led");gpio_direction_output(21, 0);gpio_request(22,"led");gpio_direction_output(22, 0);led = class_create(THIS_MODULE, "myled_class");device_create(led,NULL,dev,NULL,"led");return 0;
}
static void __exit led_exit(void)
{device_destroy(led, dev);class_destroy(led);cdev_del(&cdev);printk(KERN_INFO "LED driver unloaded successfully\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电子电气架构 --- 软件定义汽车需要怎么样的EE架构
  • Excel“取消工作表保护”忘记密码并恢复原始密码
  • 【数学建模】优化模型——两辆平板车装货问题
  • linux应用编程--网络编程(socket编程基础)
  • 企业为什么需要安装加密软件
  • PostgreSQL的postgres主进程
  • 海外媒体投稿:怎样在法国媒体发稿宣传中获得成功
  • linux debian12 离线安装jdk1.8 (解决root和普通用户不能同时拥有java)
  • 【从Qwen2,Apple Intelligence Foundation,Gemma 2,Llama 3.1看大模型的性能提升之路】
  • Java中hashcode()和equals()关系
  • Python爬虫——简单网页抓取(实战案例)小白篇
  • 《Python requests 库详解》
  • [python][代码]Python删除文件方法
  • 嵌入式软件--PCB DAY 2
  • 基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Angular 响应式表单 基础例子
  • Fastjson的基本使用方法大全
  • HTTP中的ETag在移动客户端的应用
  • JavaScript新鲜事·第5期
  • Java方法详解
  • JS变量作用域
  • MySQL数据库运维之数据恢复
  • node入门
  • spring + angular 实现导出excel
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vim 折腾记
  • Yeoman_Bower_Grunt
  • 百度小程序遇到的问题
  • 复杂数据处理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 浅谈web中前端模板引擎的使用
  • 如何设计一个比特币钱包服务
  • 如何实现 font-size 的响应式
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我的面试准备过程--容器(更新中)
  • 走向全栈之MongoDB的使用
  • 我们雇佣了一只大猴子...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (zhuan) 一些RL的文献(及笔记)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十三)MipMap
  • (转)Linux下编译安装log4cxx
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Framework .NET Core与 .NET 的区别