2_Linux驱动开发理解

关于驱动该如何理解的内容

Posted by Jerry Chen on June 18, 2019

可以理解为三层结构

上层:文件系统和应用。

中层: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