可以理解为三层结构
上层:文件系统和应用。
中层:Linux内核。设备驱动嵌入在Linux内核上。
下层:硬件。
- 对上:Linux设备驱动要给上层提供调用的接口;
- 对中:Linux设备驱动要注册到Linux内核中(或者挂载在总线);
- 对下:操作硬件(GPIO,中断IO,PWM,I2C,SPI等);
以上三个,Linux内核均提供了接口函数。
最简Linux驱动
实现功能:加载驱动的时候打印“hello linux”
理解模块的makefile文件:驱动模块的编译分析
开发板实际操作:编译、加载、卸载模块
包含:
- 最简单的makefile
- 无配置文件
- 驱动的四部分
- 头文件
- 申明模块信息
- 模块驱动的入口出口
- 功能区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 这是最简单驱动的c文件
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); // 定义一个变量,初始值为一个字符串"Dual BSD/GPL"
MODULE_AUTHOR("Jerry"); // 定义一个变量,初始值为一个字符串"Jerry"
static int hello_init(void){
printk(KERN_EMERG "hello module init ok!\n");
return 0;
}
static void hello_exit(void){
printk(KERN_EMERG "hello module exit ok!\n");
}
module_init(hello_init); // 定义一个变量,初始值为hello_init函数指针
module_exit(hello_exit); // 定义一个变量,初始值为hello_exit函数指针
#!/bin/bash
# 最小驱动的Makefile文件,头部的#!...是执行路径。比如python脚本需要在源代码头部添加python的执行路径,像"#! /usr/bin/python"。其中,"#!"被称为"hash bang"。
# 下面*.o的文件需要和*.c的命名相同
obj-m += mini_linux_module.o
# 下面路径选择linux内核目录
KDIR := /home/jerry/Projects/iTop4412_Kernel_3.0
# 下面表示PWD值使用shell下pwd命令的输出结果(字符串)
PWD ?= $(shell pwd)
# 下面M=*(注意无空格)表示变量M赋值
# all和clear的分支后一定用table作为分隔符
# 在C文件和Makefile的同级目录下,执行make会默认执行第一个分支。如想进行清除可以执行make clean
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o