以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。
如何把原本编译进linux内核的LEDS取消掉
解压迅为提供过的源码包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
首先打开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查看这个目录下有哪些编译器。
以 drivers/Makefile 为例
vim drivers/Makefile
打开之后以这俩为例
obj-y += gpio/
obj-$(CONFIG_PCI) += pci/
对于pci来说,只有定义了宏变量CONFIG_PCI,才会编译pci
对于gpio来说,直接就yes了,不就是强制编译…
我们有了概念之后就继续往下看,发现了
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
这里就随便略过吧,有些驱动不是单个文件就编译完了,而是可能依赖其他的驱动。如果你要编译,当然不要你把需要的其他驱动都从头撸一遍,只需要在Kconfig中选中依赖的那些驱动就可以了。
我现在也只是听了个理论,具体还没有实践过,以后实践了看还记不记得来更新吧…
我们先直接打开.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文件并烧写了。
[root@iTOP-4412]# ls /dev/l*
/dev/log /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop7
/dev/loop0 /dev/loop2 /dev/loop4 /dev/loop6
等待插图
其实说简单也简单,就是make menuconfig中选中就编译,取消就不编译。
说简单好像也不简单,因为它把之前都综合起来了,首先要编写一个驱动LED的驱动,其次就是编写Kconfig添加宏定义,才能把这些都显示在图形界面上,再才是选择是否编译进linux中。
本节应该算是带我们在最浅显的地方初探Linux内核编译?