第七部分:Linux驱动篇
7.1 初识Linux驱动
Linux 驱动类型主要包括字符设备驱动、块设备驱动、网络驱动。
仔细数来有: LED 驱动、按键驱动、 鼠标驱动、 ADC 驱动、 RTC 驱动、
PCI 驱动、触摸屏驱动、 LCD 驱动、 FLASH 驱动、 SD 卡驱动、网卡驱动、 I2C
驱动、音频驱动、 USB 设备驱动、 WIFI 驱动……等等
Linux操作系统从上到下,可以分为:用户应用程序、库、内核、驱动程序。
Linux驱动系统框架图如下:
7.2 搭建Linux驱动编写环境
开发驱动的过程中,最常用
的就是 NFS 文件系统,也就是网络文件系统,通过网络来实现文件在 PC 和开
发板端互访。
7.3 第一个Linux驱动
7.3.2如何加载Linux驱动到内核
1. 手工加载, 驱动作为模块使用 insmod 命令加载到内核。
2. 配置某个目录下的 Kconfig 和 Makefile,然后 make menuconfig 来配置。
一般来说,开发过程中经常使用的是方法 1,对于方法 2 是出厂的时候用的
比较多。
7.3.3
Linux驱动哪些部分是必须的
1、模块入口函数
举例:static int __init Webee210_hello_init(void)
__init 表示用__init 修饰过的函数仅仅在初始化期间内有效,在模块被加载之
后,即 insmod 之后,模块装器就会将初始化函数丢弃,之后任何函数也没有办
法调用初始化函数,因为该函数已经从内存中释放出来。 __exit 同理。
2、模块出口函数
举例:static void __exit Webee210_hello_exit(void)
3、模块许可证说明
4、模块参数,模块作者(可选)
在驱动的世界里,大部分函数都会冠以static关键字,它表示该函数只能在本文件内使用,其他文件的函数不能调用它。
如果其他文件需要调用,那就使用下面的两种方法来导出函数:
EXPORT_SYMBOL(name)
或者
EXPORT_SYMBOL_GPL(name)
7.3.4.2 通用的Makefile
ifneq ($(KERNELRELEASE),)
obj-m := webee210_hello.o
else
KDIR := /home/webee210v2/linux-3.8_webee210v2
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm
CROSS_COMPILE=arm-linuxclean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
/*
需要补充Makefile的语法知识
*/
7.3.4.3 Hello驱动的编译
7.3.4.4 Hello驱动测试
7.3.5 内核配置驱动
驱动模块也能像配置菜单那样,将驱动配置到内核,通过修改Konfig和Makefile即可。
1)拷贝hello.c到Linux源码的drivers/char目录下
2)修改drivers/char目录下的Konfig。
config Webee210_HELLO
tristate "Webee210 Hello Driver"
depends on ARCH_S5PV210
help
This is Webee210 first driver for hello.
3)
修改drivers/char目录下的Makefile
obj-$(CONFIG_ATARI_DSP56K) += hello.o
4)回到Linux源码的根目录,使用make menuconfig命令进行配置。
保存配置后,如保存为<M>,即以模块方式加载进内核,如果保存
为<*>,表示编译进内核。
后面几个章节的内容,等我打好C语言,数据结构,
Makefile语法等嵌入式软件基础知识后再来看。