学习使用 Linux 的  字符型设备驱动 来 进行 . 学习地址:http://edu.51cto.com/lesson/id-25710.html

第一步: 首先写 三个函数 ,2017年5月17日15:59:06

#include<stdio.h>

#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h> uint32_t first_Led_Open( void )
{ printf("first Led Open!\r\n"); return ;
} uint32_t first_Led_Write( void )
{ printf("first Led Write!\r\n"); return ;
} uint32_t first_Led_Read( void )
{ printf("first Led Read!\r\n"); return ;
}

第二步:告诉 linux 内核 有这样三个函数 的 存在。2017年5月17日16:59:01

//第二步:告诉Linux内核上面三个函数的存在,定义一个 struct file_operations, 并且赋初值,就是上面的三个函数

static struct file_operations first_Led_Fops;

first_Led_Fops.owner = THIS_MODULE;
first_Led_Fops.open = first_Led_Open;
first_Led_Fops.Write = first_Led_Write;
first_Led_Fops.Read = first_Led_Read; //编写驱动的入口函数 ,调用上面的 结构体,向内核注册上面三个函数的 存在 int first_Led_Init( void )
{
//调用 register_chrdev
register_chrdev(major,"first_Led",&first_Led_Fops);
return ;
}

第三步:在Linux上电初始化的时候 调用这个函数。2017年5月17日18:45:24,所长

//第三步:谁去调用上面这个函数?用一个宏来修饰一下上面这个函数。
//我的理解:下面这个宏就是在给Linux系统上电初始化的时候 ,调用 会first_Led_Init函数。
//一个 Linux设备中 肯定有很多需要初始化的函数,那每次都要 修改初始化的代码才能要把初始化加进去,所以Linux就
//写了一个宏,在编译 的时候,把要初始化的函数编译进去(不知道先后顺序是怎么样的),2017年5月17日18:42:22,所长 module_init(first_Led_Init); //前三步的笔记: APP 在利用open("/dev/xxx")中的xxx包含一个字符设备属性,一个major,一个mior
//内核根据APP 提供的 字符设备属性+major(主设备号)就能找到我们注册进去first_Led_Fops这个结构体包含的三个函数。
//APP 会根据 提供的是 字符设备属性 因此去 字符设备属性的数组中 查找 major 的位置 ,根据这个位置 first_Led_Fops
//提供的 函数指针运行相应的函数。2017年5月17日18:44:10,所长。

第四步:有入口函数 就有出口函数,即把注册的函数从内核中 删除掉。根据前三步的笔记得知 这一步实际操作就是 删除 字符设备数组 中 major 这一项。

//第四步:编写驱动的出口函数 ,调用上面的 结构体,向内核申请删除 上面三个函数的 存在,在内核中。

int first_Led_Exit( void )
{
//调用 unregister_chrdev
//参数1:major 表示主设备号
//参数2:name //我的理解是:
//unregister_chrdev这个函数作用把 file_operations 结构 类型 从 字符设备数组中删除掉,数组位置是 major unregister_chrdev(major,"first_Led");
return ;
}

第五步:和入口函数一样 用宏来修饰 出口函数

//第五步:和入口函数一样 用宏来修饰 出口函数

module_exit(first_Led_Exit);

//第五步总结:module_exit会定义一个结构体,会把first_Led_Exit赋值给这个结构体中的一员,当要卸载驱动程序的时候
//即运行出口函数的时候,Linux内核就会自动调用结构体中的 first_Led_Exit这个函数。。暂时不理解,2017年5月17日19:03:30,所长

第六步: 编写 Makefile ,在Linux下编译此文件。。2017年5月17日19:11:12

最新文章

  1. 【转】Hive 基础之:分区、桶、Sort Merge Bucket Join
  2. Swift基础语法(五)枚举、结构体与类的区别
  3. [转]C# dataGridview 报“索引-1没有值”的解决办法
  4. OA Framework - How to Find the Correct Version of JDeveloper to Use with E-Business Suite 11i or Release 12.x (Doc ID 416708.1)
  5. android开发中提示:requires permission android.permission write_settings解决方法
  6. 页面加载时,页面中DIV随之滑动出来;去掉页面滚动条
  7. [bzoj2288][POJ Challenge]生日礼物
  8. LODOP不同电脑打印效果不同排查
  9. jdbc连接oracle时报错 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableC
  10. jQuery-爱奇艺图片切换
  11. Python——Radiobutton,Checkbutton参数说明
  12. 转载 WebService 的CXF框架 WS方式Spring开发
  13. 按行读取.txt文件,并按行写入到新文件中
  14. npm 用 淘宝代理
  15. CSS背景图像的简单响应
  16. Struts标签库详解,非常好的Struts标签详解
  17. UVALive - 5963 ad-hoc
  18. webservice soapheader验证方法
  19. es6- Generator函数实现长轮询
  20. js 读本地文件

热门文章

  1. OpenStack IceHouse 部署 - 3 - 控制节点部署
  2. WC前的颓废——带花树
  3. sublime3下载安装及常用插件、浏览器预览设置
  4. WinForm实现Rabbitmq官网6个案例-Topics
  5. Unable to update index for central http://repo1.maven.org/maven2/ 解决方法
  6. 一键清理 Nexus 中无用的 Docker 镜像
  7. Angular1.x 基础总结
  8. Python实例---抽屉后台框架分析
  9. nohup使用相关知识
  10. 栋哥你好,让我们回顾最初认识C++的时候(课堂作业)