【迅为iTop4412学习笔记】3. 编译最小linux,并修改Makefile取消LED编译进内核


声明

以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。

本节目标

如何把原本编译进linux内核的LEDS取消掉



首先编译一个最小的linux烧写试试

解压迅为提供过的源码包iTop4412_Kernel_3.0_20180604.tar.gz

tar -xvf iTop4412*.tar.gz
cd iTop4412*

因为我是 SCP 1G,我要的是最小linux,所以

cp config_for_linux_scp_elite .config

最后make打包成zImage,进行漫长的等待

make zImage

最后一行告知zImage的路径和编译完成通知,然后烧写进去就行了,烧写过程就跟着迅为的pdf就行,不多加叙述了,最后一行显示:

 Kernel: arch/arm/boot/zImage is ready

进入linux后,我们用shell命令看linux的驱动里面,会有leds的驱动。我们接下来要做的,就是要在linux编译前修改Makefile,目标是不让把leds编译进内核

[root@iTOP-4412]# ls /dev/l*
/dev/leds   /dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6
/dev/log    /dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7


下面进入正题

1. 修改编译器

首先打开linux根目录下的Makefile搜索CROSS_COMPILE,大致看到以下两行

CROSS_COMPILE   ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
#CROSS_COMPILE   ?= /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-

CROSS_COMPILE指交叉编译,我们编译出来的linux是要跑在ARM平台的,所以内核编译器需要使用arm的交叉编译器,之所以有两行,是迅为已经帮我们修改好了,被注释的是原本的linux的编译器,我们需要改为arm编译器,第一行就是迅为帮我们改好的arm编译器,有兴趣可以ls查看这个目录下有哪些编译器。

2. 了解强制编译(强制编译进内核的文件)

以 drivers/Makefile 为例

vim drivers/Makefile

打开之后以这俩为例

obj-y                           += gpio/
obj-$(CONFIG_PCI)               += pci/

对于pci来说,只有定义了宏变量CONFIG_PCI,才会编译pci
对于gpio来说,直接就yes了,不就是强制编译…

3. 了解配置编译

我们有了概念之后就继续往下看,发现了

obj-y                           += char/

char后面有个 / ,意味着强制编译了char目录下的内容,那我们就继续再往里层文件夹找,所以推断应该是查看 drivers/char/ 下的 Makefile 文件

vim drivers/char/Makefile

文件里搜索 leds就看到了

obj-$(CONFIG_LEDS_CTL)          += itop4412_leds.o

到这里其实就已经很眼熟了,CONFIG_LEDS_CTL就是仿写Kconfig的时候写的,而驱动文件名就是itop4412_leds.c

4. 了解依赖编译

这里就随便略过吧,有些驱动不是单个文件就编译完了,而是可能依赖其他的驱动。如果你要编译,当然不要你把需要的其他驱动都从头撸一遍,只需要在Kconfig中选中依赖的那些驱动就可以了。

我现在也只是听了个理论,具体还没有实践过,以后实践了看还记不记得来更新吧…

现在开始将LEDS不编译进内核

我们先直接打开.config文件看看LEDS被编译进内核是什么样子的

vim .config

搜索LEDS会发现

CONFIG_LEDS_CTL=y

y就是yes嘛,这就说明了LEDS目前是被编译进内核的,不编译进就要改成n吗?emmm,我们人还是看着工具,使用工具来修改吧

进入图形化界面

make menuconfig

找到 Devices Drivers/Character devices目录下的 Enable LEDS config,前面有个星号表示被选中,用空格让他显示空,就意味着被取消编译进内核了。
至于为什么路径是这个,因为LED是个字符设备,所以肯定是驱动/字符设备目录下找,为什么显示的是Enable LEDS config,仿写Kconfig中自己写的,应该回忆起来了吧!

配置完了,就可以make zImage类似最开始那样编译成zImage文件并烧写了。

进入Linux输入命令查看驱动,发现已经没有LED了

[root@iTOP-4412]# ls /dev/l*                                                    
/dev/log    /dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7
/dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6

Linux内核编译流程图

等待插图



本次总结

其实说简单也简单,就是make menuconfig中选中就编译,取消就不编译。
说简单好像也不简单,因为它把之前都综合起来了,首先要编写一个驱动LED的驱动,其次就是编写Kconfig添加宏定义,才能把这些都显示在图形界面上,再才是选择是否编译进linux中。
本节应该算是带我们在最浅显的地方初探Linux内核编译?



你可能感兴趣的:(iTop4412,Linux驱动篇)