要进行嵌入式Linux产品的内核驱动开发,须要先了解内核目录的各文件夹下源码的作用,本文介绍Linux内核源码目录树下的各目录文件的作用。
目录树概览
解压Linux内核源码压缩包,将得到内核源码。内核源码很复杂,包含多级目录,产生一个庞大的树形结构,一般称为Linux源码目录树。步入源码所在目录,可以看见目录树顶楼一般包含如下目录和文件:
arch/crypto/fs/
KbuildMAINTAINERSREADME
security/virt/block/
Documentation/include/
KconfigMakefileREPORTING-BUGS
sound/COPYINGdrivers/init/
kernel/mm/samples/tools/
CREDITSfirmware/ipc/lib/
net/scripts/usr/
各个目录文件的简略说明如表1所列。
表1Linux源码顶楼目录简略说明
目录
内容
arch/
包含各体系结构特定的代码,如arm、x86、ia64、mips等,在每位体系结构目录下一般都有:
-boot内核须要的特定平台代码
-kernel体系结构特有的代码
-lib通用函数在特定体系结构的实现
-math-emu模拟FPU的代码,在ARM中,使用mach-xxx取代
-mm特定体系结构的显存管理实现
-include特定体系的头文件
block/
储存块设备相关代码
crypto/
储存加密、压缩、CRC校准等算法相关代码
Documentation/
储存相关说明文档,好多实用文档,包括驱动编撰等
drivers/
储存Linux内核设备驱动程序源码。驱动源码在Linux内核源码中站了很大比列,常见外设几乎都有可参考源码,对驱动开发而言,该目录十分重要。该目录包含诸多驱动,目录根据设备类别进行分类,如char、block、input、i2c、spi、pci、usb等
firmware/
储存处理器相关的一些特殊固件
fs/
储存所有文件系统代码,如fat、ext2、ext3、ext4、ubifs、nfs、sysfs等
include/
储存内核所需、与平台无关的头文件,与平台相关的头文件早已被联通到arch平台的include目录,如ARM的头文件目录
init/
包含内核初始化代码
ipc/
储存进程间通讯代码
kernel/
包含Linux内核管理代码
lib/
库文件代码实现
mm/
储存显存管理代码
net/
储存网路相关代码
samples/
储存提供的一些内核编程范例,如kfifo;前者相关用户态编程范例,如hidraw
srcipts/
储存一些脚本文件,如menuconfig脚本
security/
储存系统安全性相关代码
sound
储存声音、声卡相关驱动
tools/
编译过程中一些主机必要工具
usr
cpio相关实现
virt/
内核虚拟机KVM
Linux内核源码数目很庞大,解压后大概好几千兆字节,要能在这么庞大的源码中找到有效代码,熟悉Linux源码目录树的结构是基本要求。每位目录所包含的代码量差别也很大,下边是从下载的一份源码解压后的统计结果,其中drivers目录几乎占了源码总数的一半,arch目录也差不多有1/4:
chenxibing@linux-compiler:~/linux-3.4.107$du--max-depth=1–h
2.0M./lib
160K./init
2.0M./crypto
252M./drivers
6.3M./firmware
24M./sound
232K./ipc
5.3M./kernel
3.7M./tools
33M./fs
192K./virt
2.1M./security
22M./net
168K./samples
119M./arch
40K./usr
2.4M./mm
3.1M./scripts
23M./include
20M./Documentation
888K./block
519M.
快速确定显卡关联代码
领到一份源码和一块评估板,怎么快速找到与这块板相关的源码,是好多研制人员都曾遇见过的问题。假如对内核源码结构有大约了解linux内核与驱动,要完成这种事情也不难,一般可根据基础代码、驱动代码和其它代码等方面来梳理。
1、基础代码
Linux移植一般分为体系结构级别移植、处理器级别移植和板级移植,各级别移植难易程度差别很大linux内核与驱动,工作量和调试方法也各不相同。通常的产品开发人员所进行的内核移植,一般都是板级移植,这是几个级别中最简单的。
从代码层面来看,一般把能让一个显卡最小系统能运行的代码称为基础代码,这部份代码一般包含体系结构移植代码、处理器核心代码以及板级支持包的部份代码。理清了这部份代码,对于了解和把握整个显卡相关代码具有重要意义。
确定显卡名称和默认配置文件。比如,对于EPC-28x工控板,其对应的默认内核配置文件为。一般来说,一个评估板的内核默认配置文件名称与评估板的名称相同或则有关联。确定了配置文件后,可用任何文本编辑器打开该配置文件,可以对配置的选项进行查看;或则进行makemenuconfig配置,步入配置界面查看。
确定对应的显卡文件。在ARMLinux移植代码中,每位评估板一般都有一个对应的显卡文件,在目录下。大多数显卡文件都以“board-”开头,采用“board-xxx.c”这样的文件名,比如;也有以“mach-”开头的,如。一般来说,一个评估板的显卡文件名称与评估板的名称相同或则有关联。
假如遇见名称特点不是很显著,不能确定的情况,则建议打开默认配置文件,找到“CONFIG_MACH_XXX=y”这一行,确定显卡对应的配置开关变量。之后打开文件,依照配置开关变量来确定显卡文件。比如文件中有如下内容:
可以看见,这几个显卡文件命名都既不是以“board-”开头,也不是以“mach-”开头node.js安装linux,对于这些情况,通过Makefile文件来确定一下是比较好的做法。非常是对于显卡开关变量对应非单一文件的,更须要查看Makefile来确定关联文件,否则有可能遗漏某个文件,导致代码阅读理解上的障碍。如CONFIG_MACH_ZYLONITE300对应着zylonite.c和zylonite_pxa300.c两个C文件。
2、驱动代码
Linux内核源码中接近一半的代码量是驱动,对某一个特定显卡的系统而言,驱动也抢占很大的比列,底层开发的很大一部份是驱动相关工作。把握从诸多驱动中找到正确的驱动源码文件,并依照产品的实际需求进行更改调整的方式,能有效推动产品开发的进度。
Linux内核源码树drivers目录很复杂,包含了各类外设的驱动。对嵌入式Linux开发而言,一般须要关注的目录如表2所列。
表2常见驱动目录
目录
说明
drivers/gpio
系统GPIO子系统和驱动目录,包括处理器内部GPIO以及外扩GPIO驱动。遵守GPIO子系统的驱动,可通过/sys/class/gpio进行访问
drivers/hwmon
硬件检测相关驱动,如气温传感、风扇检测等
drivers/i2c
I2C子系统驱动。各I2C控制器的驱动在i2c/busses目录下
drivers/input
输入子系统驱动目录
drivers/input/keyboard
非HID按键驱动,如GPIO按键、矩阵鼠标等
drivers/input/touchscreen
触摸屏驱动,如处理器的触摸屏控制器驱动、外扩串行触摸屏控制器驱动、串口触摸屏控制器驱动等
drivers/leds
LED子系统和驱动,如GPIO驱动的LED。遵守LED子系统的驱动,可通过/sys/class/leds进行访问
drivers/mfd
多功能元件驱动。假如一个元件能做空种用途,一般须要利用MFD来完成。诸如am3352的adc插口,可同时做adc和触摸屏控制器,所以须要实现MFD插口驱动
drivers/misc
杂项驱动。非常须要关注目录,提供了i2c和spi插口的EEPROM驱动范例,所驱动的设备可通过/sys系统访问
drivers/mmc
sd/mmc卡驱动目录
drivers/mtd
MTD子系统和驱动,包括NAND、oneNAND等。注意,UBI的实现也在MTD中
drivers/mtd/nand
NANDFALSH的MTD驱动目录,包括NAND的基础驱动和控制器插口驱动
drivers/net
网路设备驱动,包括MAC、PHY、CAN、USB网卡、无线、PPP合同等
drivers/net/can
CAN设备驱动。Linux早已将CAN归类到网路中,采用socket_CAN插口
drivers/net/ethernet
所支持的MAC驱动。常见厂家的MAC驱动都能找到,如broadcom、davicom、marvell、micrel、smsc等厂家的MAC,处理器自带MAC的驱动也在该目录下
drivers/net/phy
PHY驱动,像marvell、micrel和smsc的一些PHY驱动
drivers/rtc
RTC子系统和RTC芯片驱动
drivers/spi
SPI子系统和SPI控制器驱动,含GPIO模拟SPI的驱动
drivers/tty
TTY驱动
drivers/tty/serial
并口驱动,包括8250并口以及各处理器内部并口驱动实现
drivers/uio
用户空间IO驱动
drivers/usb
USB驱动linux内存管理,包括USBHOST、Gadget、USB转并口以及OTG等支持
drivers/video
Video驱动,包括Framebuffer驱动、显示控制器驱动和背光驱动等。有的移植代码会将液晶屏配置通置于主板控制器驱动目录下,比如omap2系列的LCD配置代码在目录下
drivers/video/backlight
背光控制驱动
drivers/video/logo
Linux内核启动LOGO图片目录
drivers/watchdog
看门狗驱动,包括软件看门狗和各类硬件看门狗驱动实现
熟悉各种驱动在源码树中的大约位置,能帮助在开发过程中快速进行驱动源码查找和定位。一个系统究竟用了什么代码,与系统本身外设相关,也与显卡配置文件相关。
3、其它代码
还有一些代码是系统必须的代码,但在实际开发过程中一般甚少须要进行关注,比如文件系统的实现代码、网络子系统的实现代码等。对这部份代码和显卡的关联性,建议按照配置文件来确认。
假如想和教程一起实践学习,可以使用致远电子IoT-3960L工控板。
公众号介绍
致远电子官方陌陌公众号,一个凝聚500名工程师的研制测试分享平台,为您提供电子行业领先的产品技术与解决方案。
文章评论