基于linux内核的驱动开发
Day1:驱动 模块 模块传参 符号导出
驱动
定义:驱使硬件动起来的程序
裸机驱动:需求分析—》查看原理图—》查芯片手册—》code
系统驱动:需求分析--》查原理图—》查新品手册—》设备树—》code—》安装到内核中
裸机开发&系统开发的优缺点?
裸机开发:成本低 运行速率高 安全性低 单任务
系统开发:成本高 信息效率低 安全性低 多任务
应用程序和驱动程序的区别
应用程序 驱动程序
1、加载方式 主动加载 被动加载
2、运行空间 用户空间 kernel空间
3、执行权限 低 高
4、影响力 局部 全局
5、函数来源 自定义/库/系统调用 内核函数/自定义
内核函数:纯内核函数 系统调用函数
模块—》驱动模块
模块:能够单独命名并且独立完成一定功能的程序语句的集合(C程序代码和数据结构)
驱动模块:能够单独命名并且独立完成特定外设功能的程序语句的集合。
注:一个驱动模块就是一个完整的外设驱动程序,驱动程序被安装到操作系统的内核。
当该驱动程序对应的外设要工作时,该驱动模块被调用。
2、1 如何写一个驱动模块
1、模块初始化函数 int 函数名1(void)
2、模块清除函数 void 函数名2(void)
3、模块加载函数 module_init(函数名1)
4、模块卸载函数 module_exit(函数名2)
5、声明该驱动遵守GPL----》宏 MODULE_LICENSE(“GPL”)
《include/linux/init.h》 模块初始化函数
#define module_init(initfn)
Static inline initcall_t_intitest(void)
{return initfn;}
#define module_exit(exitfn) 模块卸载函数
Static inline exitcall_t_exittest(void)
{return exitfn}
2.2如何编译驱动模块
hello.c-->hello.ko
test.c-->a.out
需要实现一个Makefile:
Makefile:
ifeq($(KERNELRELEASE),)
KERNELDIR?= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)
modules:
$(MAKE)-C $(KERNELDIR) M=$(PWD) modules
//进入/lib/modules/3.5.0-23-generic/buil