4412 最简Linux驱动
最简Linux驱动
必备的头文件
• Linux头文件位置
– 类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
• #include <linux/module.h>头文件
– 所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查一下资料
– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的
– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!
– MODULE_AUTHOR(_author)代码作者
• #include <linux/init.h>
– 包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此文件中
– 入口函数module_init(x)
– 出口函数module_exit(x)
• 新建.c文件
– mini_linux_module.c
模块的入口和出口
• module_init(hello_init);
– /*初始化函数*/
• module_exit(hello_exit);
– /*卸载函数*/
声明区
• 声明区
– MODULE_LICENSE("Dual BSD/GPL");
– /*声明是开源的,没有内核版本限制*/
– 必须有
– MODULE_AUTHOR("TOPEET");
– /*声明作者*/
– 可有可无
驱动模块的编译
• Linux的驱动可以和Linux源码放在一起编译,也可以单独拿出来编译。
– 为了理解整个Linux内核编译过程,可以从学习Linux模块的编译入手
• Makefile文件
– 单独编译驱动需要写一个Makefile文件
• 编写Makefile文件的最好方式是“依葫芦画瓢”
– 以后可能会碰到各种脚本,脚本的语法是学不完的
编译流程分析
编译文件
• 拷贝两个文件到虚拟机,执行Make命令,编译生成KO文件
– 在window下写的Makefile文件拷贝到Linux中可能会有点小问题需要修改
– 主要是Tab问题
– all和clean参数后面的必须添加Tab键,否则会报错“*** missing separator.Stop”
• 编译会生成KO文件,KO就是驱动模块
加载模块和卸载模块
• 开发板运行最小Linux系统
• 使用U盘(或者TF卡),将KO文件拷贝到Linux最小系统
– 最小系统给大家提供,直接烧写即可
• 加载U盘
– 参考使用手册
• 加载模块、查看模块、卸载模块
– insmod加载模块命令
– lsmod查看模块命令
– rmmod卸载模块命令
#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET"); static int hello_init(void)
{
printk(KERN_EMERG "HELLO WORLD enter!\n");
return ;
} static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n"); } module_init(hello_init);
module_exit(hello_exit);
makefile
#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += mini_linux_module.o #源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/android4./iTop4412_Kernel_3. #当前目录变量
PWD ?= $(shell pwd) #make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4./iTop4412_Kernel_3.
#$(PWD)当前目录变量
#modules要执行的操作
all:
make -C $(KDIR) M=$(PWD) modules #make clean执行的操作是删除后缀为o的文件
clean:
rm -rf *.o *.order Module.symvers *.mod.c
最新文章
- Servlet 单例多线程
- iOS实现简书的账号识别方式(正则表达式)
- [moka同学笔记]window下redis的安装以及php-redis详细配置(摘录)
- 修改MyEclipse默认的Servlet和jsp代码模板
- 游戏开发设计模式之命令模式(unity3d 示例实现)
- Js监控回车事件
- jqGrid一些操作
- 第二章 IoC Setter注入
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
- installshield学习笔记
- 为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G
- Struts2中的JSON问题——后台返回JSON字符串到前台
- css设置兼容的透明样式
- Windows中通过命令行新建文件夹、新建文件,和一些常用命令
- learning gcc args
- python中的update
- 将秒数转为HH:MM:SS格式的时间
- 谈谈Java引用和Threadlocal的那些事
- iOS开发-消息通知机制(NSNotification和NSNotificationCenter)
- JAVA-SpringMVC开发第一个应用
热门文章
- 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏
- Python笔记(十七)_面向对象编程
- 理解jquery的$.extend()、$.fn.extend()【jQuery插件机制】
- PTA 1154 Vertex Coloring
- debian7下安装eclipse
- hibernate validator参数校验&;自定义校验注解
- 数据溢出-varchar类型
- seaborn教程1——风格选择
- IEnumerable和IEnumerator 详解 分类: C# 2014-12-05 11:47 18人阅读 评论(0) 收藏
- 【学习总结】Eclipse常用快捷键