Linux_网蜂ARM Cortex-A8学习笔记_Linux驱动篇

第七部分:Linux驱动篇

7.1 初识Linux驱动

Linux 驱动类型主要包括字符设备驱动、块设备驱动、网络驱动。
仔细数来有: LED 驱动、按键驱动、 鼠标驱动、 ADC 驱动、 RTC 驱动、 PCI 驱动、触摸屏驱动、 LCD 驱动、 FLASH 驱动、 SD 卡驱动、网卡驱动、 I2C 驱动、音频驱动、 USB 设备驱动、 WIFI 驱动……等等
Linux操作系统从上到下,可以分为:用户应用程序、库、内核、驱动程序。
Linux驱动系统框架图如下:
Linux_网蜂ARM Cortex-A8学习笔记_Linux驱动篇_第1张图片

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命令进行配置。
保存配置后,如保存为,即以模块方式加载进内核,如果保存 为<*>,表示编译进内核。

后面几个章节的内容,等我打好C语言,数据结构, Makefile语法等嵌入式软件基础知识后再来看。

7.4 Linux字符设备驱动之LED驱动
7.5 Linux字符设备驱动之按键驱动
7.6 Linux高级字符设备驱动
7.7 Linux输入子系统
7.8 Linux平台总线驱动设备模型
7.9 Linux LCD设备驱动
7.10 Linux USB主机控制器和设备驱动
7.11 Linux NAND FLASH驱动
7.12 Linux网络设备驱动
7.13 Linux电容式触摸屏驱动
7.14 Linux USB摄像头驱动

你可能感兴趣的:(Linux,编程,Linux,驱动)