用一个实例来理解驱动程序编写流程 (自用)
2018-07-04 11:05
67 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35769746/article/details/80909359
阅读更多
#include <linux/module.h> #include <linux/kernel.h> #include <asm/io.h> #include <linux/miscdevice.h> #include <linux/fs.h> #include <asm/uaccess.h> //流水灯代码 #define GPM4CON 0x110002e0 #define GPM4DAT 0x110002e4 static unsigned long* ledcon = NULL; static unsigned long* leddat = NULL; //自定义write文件操作(不自定义的话,内核有默认的一套文件操作函数) static ssize_t test_write (struct file * filp, const char __user * buff, size_t count, loff_t * offset) { int value = 0; int ret = 0; ret = copy_from_user(&value, buff, 4);
//底层驱动只定义基本操作动作,不定义功能 if(value == 1){ *leddat |= 0x0f; *leddat &= 0xfe; } if(value == 2) { *leddat |= 0x0f; *leddat &= 0xfd; } if(value == 3) { *leddat |= 0x0f; *leddat &= 0xfb; } if(value == 4) { *leddat |= 0x0f; *leddat &= 0xf7; } return 0; }
//文件操作结构体初始化 static struct file_operations g_tfops = {.owner = THIS_MODULE, .write = test_write, };
//杂设备信息结构体初始化 static struct miscdevice g_tmisc = {.minor = MISC_DYNAMIC_MINOR, .name = "test_led", .fops = &g_tfops, }; //驱动入口函数 杂设备初始化 static int __init test_misc_init(void) { //IO地址空间映射到内核的虚拟地址空间 ledcon = ioremap(GPM4CON, 4);leddat = ioremap(GPM4DAT, 4);
//初始化led *ledcon &= 0xffff0000;*ledcon |= 0x00001111; *leddat |= 0x0f;
//杂设备注册函数 misc_register(&g_tmisc);return 0; }
//驱动出口函数 static void __exit test_misc_exit(void){ //释放地址映射 iounmap(ledcon); iounmap(leddat); }
//指定模块的出入口函数 module_init(test_misc_init);module_exit(test_misc_exit); MODULE_LICENSE("GPL"); |
相关文章推荐
- 如何编写Linux设备驱动程序以及测试详细流程(附实例)
- 编写一个死锁实例
- Mybatis 和 spring mvc 项目整合流程注解版实例(个人理解)
- Shark编程实例:启动一个流程,获得所有任务的列表,完成一个任务
- 以一个实例说明 CMakeLists.txt 文件的编写
- 一个实例让你透彻理解Android ViewGroupe的事件分发
- Shell 编程--本文结合大量实例阐述如何编写一个shell脚本
- 分享一个流程实例运行时出现异常的恢复方案
- 一个简单实例——快速理解前端web开发的MVC模式
- 如何理解一个实例在其生存期中最多只能装载和打开一个数据库
- Qt线程的简单使用(三)——通过一个实例理解QMutex的使用
- PHP实现AOP的雏形(通过一个简单的实例来理解PHP的AOP)
- 谈谈对于ajax的理解和ajax一个实例分析。
- [JAVA]使用Eclipse从下载到编写一个实例全过程
- JAVA--第12周实验--任务1--编写一个Panel的子类MyPanel,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器
- 本文结合大量实例阐述如何编写一个shell脚本
- --java-- 十二周 【任务一】编写一个Panel的子类MyPanel,MyPanel中有一个文本框和一个按钮,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器
- 普元 EOS Platform 7.6 集群,同一个流程实例,不同节点在workspace中显示的状态不一致
- 以一个实例说明 CMakeLists.txt 文件的编写
- struts2 入门实例原理与流程 过程理解