Linux LED驱动源码简析
驱动的加载与卸载函数
驱动加载服务函数
int major;
static int first_drv_init(void)
{major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册驱动,其中第一个参数为0,则表示采用系统动态分配的主设备号//第二个参数是其注册的设备名//第三个很重要的参数,就是我们配置驱动函数的结构//(具体见上一篇对该函数的解析)firstdrv_class = class_create(THIS_MODULE, "firstdrv");//创建一个驱动类firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz *///用于自动的在系统的目录下创建一个字符设备的节点gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);//通过内存映射到真实地址gpfdat = gpfcon + 1;//配置GPIO为输出return 0;
}
驱动卸载服务函数
static void first_drv_exit(void)
{unregister_chrdev(major, "first_drv");//告诉内核,卸载该驱动//major是程序的主设备号class_device_unregister(firstdrv_class_dev);class_destroy(firstdrv_class);//这两句用于删除在文件系统中创建的节点iounmap(gpfcon);//取消GPIO的映射
}
最后别忘了,把这两个函数注册进去
module_init(first_drv_init);
module_exit(first_drv_exit);
重要的结构体
static struct file_operations first_drv_fops = {.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 *///说是与神秘高级特性有关,不懂,先这么写 .open = first_drv_open, .ioctl = first_drv_ioctl,
};
用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址
驱动函数
open()函数
static int first_drv_open(struct inode *inode, struct
file *file)
{printk("first_drv_open\n");/* 配置GPF4,5,6为输出 */......return 0;
}
ioctl()函数
这个函数比较重要,用于应用程序到驱动程序的参数传递
int ioctl(int fd, ind cmd, …);
//最多可以传递三个参数 static int first_dev_ioctl(struct inode *inode,
struct file *file, int cmd, int arg)
{printk("first_drv_ioctl\n");......
}
证书
因为Linux遵循GNU/GPL ,所以要在内核做出声明
(要不,内核会傲娇…)
MODULE_LICENSE("GPL");
就此,一个简单的led的驱动程序就是分析完了,下面开始说说,驱动是如何被使用的。
在应用层,和硬件层之间的中间层,就是驱动所在的位置那么我们的驱动程序,一定是要通过应用程序调用的
驱动测试程序
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main(int argc, char **argv)
{int fd;fd = open("/dev/xyz", O_RDWR);if (fd < 0) {printf("can't open!\n");}...ioctl(fd, strtol(argv[2]));return 0;
}
一套驱动就算完成了,
长路漫漫,这这只是最简单的第一步
Linux LED驱动源码简析相关推荐
- Linux Hugetlbfs内核源码简析-----(二)Hugetlbfs挂载
本文只讨论执行"mount none /mnt/huge -t hugetlbfs"命令后,mount系统调用的执行过程(基于Linux-3.4.51),不涉及进程相关的细节. m ...
- Spring Boot源码简析 @EnableTransactionManagement
相关阅读 Spring Boot源码简析 事务管理 Spring Boot源码简析 @EnableAspectJAutoProxy Spring Boot源码简析 @EnableAsync Sprin ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- django源码简析——后台程序入口
django源码简析--后台程序入口 这一年一直在用云笔记,平时记录一些tips或者问题很方便,所以也就不再用博客进行记录,还是想把最近学习到的一些东西和大家作以分享,也能够对自己做一个总结.工作中主 ...
- (Ajax)axios源码简析(三)——请求与取消请求
传送门: axios源码简析(一)--axios入口文件 axios源码简析(二)--Axios类与拦截器 axios源码简析(三)--请求与取消请求 请求过程 在Axios.prototype.re ...
- java ArrayList 概述 与源码简析
ArrayList 概述 与源码简析 1 ArrayList 创建 ArrayList<String> list = new ArrayList<>(); //构造一个初始容量 ...
- ffmpeg实战教程(十三)iJKPlayer源码简析
要使用封装优化ijk就必须先了解ffmpeg,然后看ijk对ffmpeg的C层封装! 这是我看ijk源码时候的笔记,比较散乱.不喜勿喷~ ijk源码简析: 1.ijkplayer_jni.c 封装的播 ...
- 【Android项目】本地FM收音机开发及源码简析
[Android项目]本地FM收音机开发及源码简析 目录 1.概述 2.收音机的基本原理 3.收音机其他信息 RDS功能 4.Android开发FM收音机源码解析 5.App层如何设计本地FM应用 6 ...
- Log-Pilot 源码简析
Log-Pilot 源码简析 简单介绍 源码简析 Pilot结构体 Piloter接口 main函数 Pilot.Run Pilot.New Pilot.watch Pilot.processEven ...
最新文章
- OpenCV error: Cannot load info library for OpenCV
- 从源码到实战:BERT模型训练营
- C#枚举类型和结构体
- OpenGL着色器创建一个星系由颗粒制成
- SpringMVC的运行原理
- Memcache 安装
- 做开发,这几种锁机制你不得不了解一下
- 2013应届毕业生“用友政务”校招应聘总结
- Kubernetes部署软件应用的步骤思路
- torrents.php怎么下载,PT站自动收藏免费种下载|PT Add Free Torrents To Bookmark脚本js插件_ - 极光下载站...
- css动画效果轮播图片
- 微信小程序PHP注册,微信小程序 教程之注册页面
- windows添加右键打开cmd命令窗口
- Gradle核心思想(三)Groovy快速入门指南
- 我的第二本译作《精通OpenStack》上架啦:书籍介绍和译者序
- php 可以编辑treegrid,TreeGrid(树形表格)
- matlab打开eps文件_如何在Windows上打开EPS图像文件
- dvwa靶场的简单练习
- 双侧检验Two-Tailed Test
- maemo sdk 搭建(官方转载)
热门文章
- 3dContactPointAnnotationTool开发日志(三三)
- 如何扩展 Azure 资源组中虚拟机的 OS 驱动器
- Log4j MDC Tomcat下报异常org.apache.log4j.helpers.ThreadLocalMap
- Apache服务器学习笔记
- php程序变量,PHP 变量
- HarmonyOS之搭建和配置开发环境的流程
- LeetCode 多线程 1117. H2O 生成
- 143. Reorder List 重排链表
- 2013\National _Java_A\3.埃及分数
- Nginx 虚拟主机