1
目录
1
一、什么是linux驱动?
1、驱动的作用
2、
3、驱动的分类
4、linux源码
5、最简单的linux驱动
二、如何编译驱动程序
-- 有两种编译方法:
-- 什么是Linux内核模块?
-- Linux内核模块的编译
一、什么是linux驱动?
1、驱动的作用
- 从字面上解释,驱动就是“让硬件动起来”,所以驱动是直接和硬件打交道的,是底层硬件和上层软件的桥梁
2、
-- 无操作系统时的驱动(裸机)
- 有的时候并不一定需要操作系统,比如用单片机进行简单的通断控制,从编程角度来说,直接控制寄存器就可以了,也就是和硬件打交道。
-- 有操作系统时的驱动(linux系统)
- 从编程的角度看: 有了操作系统以后,编写驱动就变的比较复杂,要基于Linux的各种驱动框架进行编程。但是当驱动都按照系统给出的框架进行编程以后,就可以提供一个统一的接口给应用程序调用。(这里统一的接口指的时/dev下面的设备节点)
3、驱动的分类
-- linux将驱动分为字符设备、网络设备、块设备三类。
- 字符设备指哪些必须以串行顺序一次进行访问的设备,如鼠标。
- 块设备可以按照任意顺序进行访问,如硬盘。
- 网络设备是面向数据包的接收和发送
4、linux源码
-- linux源码目录结构
- linux内核源码包含多级目录,形成一个巨大的树状结构,进入源码所在的目录,就是linux源码的顶层目录。
5、最简单的linux驱动
-- 简单的helloworld驱动代码
#include <linux/module.h>
#include <linux/init.h>
static int helloworld_init(void)
{
printk("helloworld!\n");
return 0;
}
static int helloworld_exit(void)
{
printk("helloworld!\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODELU_LICENSE("GPL");
MODULE_AUTHOR("fashi");
MODULE_VERSION("v1.0");
二、如何编译驱动程序
-- 有两种编译方法:
-
第一种编译方法:将驱动放在linux内核里面,然后编译linux内核。将驱动编译到linux内核里面。
-
第二种编译方法:将驱动编译成内核模块,独立于linux内核以外。--用他的时候再把它加载到Linux内核
-- 什么是Linux内核模块?
-
内核模块是linux系统中一个特殊的机制,可以将一些使用频率很少或者暂时不用的功能编译成内核模块,在需要的时候再动态加载到内核里面。
-
使用内核模块可以减小内核的体积,加快启动速度。并且可以在系统运行的时候插入或者卸载驱动,无需重启系统。内核模块的后缀是.ko。
-
可以在系统运行的时候将ko文件插入,不用的时候将ko文件从linux系统中卸载掉,无需重启linux系统。
-- Linux内核模块的编译
-- 把驱动编译成linux内核模块需要编写一个简单的Makefile。
- 这个模板是通用的,无论用什么开发板,想把什么驱动编译成内核模块,都可以套用这个模板。
-
obj-m +=helloworld.o KDIR:=/home/topeet/linux-kernel PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko*.o*.mod.c*.symvers*.order