【前言】
昨天将 Android N 上的驱动代码移植到 Android O 上,xxxx_defconfig 文件是我手动修改的,但因为公司将内核版本切换到 4.9 之后开启了强制代码格式检查,所以 Patch 在提交到服务器之后无法通过格式检测,一直提示存在如下问题:
checkpatch found errors or warnings:
$ git log -1 | ./scripts/xxx/merge_pre_check.pl -; total 3 errors.
1: xxxx64_defconfig not generated by savedefconfig
2: xxxx32_defconfig not generated by savedefconfig
说来惭愧,在之前的项目开发过程中我没有使用过 checkpatch.pl
脚本对代码修改进行过格式检查,这个问题我搞了一整天才搞好。所以这里记录一下。
【检查 Kconfig 文件】
在最新的内核提交规范中,要求 Kconfig 文件中所有模块的默认配置都设置为 n
,并且不允许使用 select
语句。这是为了让使用者必须手动显示地去选择上驱动模块的配置。所以如果我们的老代码中将模块默认配置设置成的 y
或者使用的 select
语句隐式地打开了某些依赖模块的开关,我们都需要在移植过程中进行修改:将 y
改成 n
,将 select
改成 depends on
,不再使用的菜单或配置项则应该被去掉或注释掉。
比如我所负责模块里老的 Kconfig 文件写法如下:
menu "Audio Interface"
config XXX_AUDIO
bool "XXX Audio Interface"
default y
select SOUND
select SND_SOC
select SND
select XXX_AUDIO_DSP
select SND_XXX_SOC
select SWITCH
help
"XXX Audio Interface"
endmenu
将上方的内容按要求进行修改后则是像下方这样:
menu "Audio Interface"
config XXX_AMAUDIO
bool "XXX Audio Interface"
default n
depends on SOUND
depends on SND_SOC
depends on SND
depends on XXX_AUDIO_DSP
#depends on SND_XXX_SOC
#depends on SWITCH
help
"XXX Audio Interface"
endmenu
【修改 defconfig 文件】
我使用的平台分 32 位和 64位,我们要对这 2 个 defconfig 文件都进行修改。文件分别位于 arch/arm/configs/xxxx32_defconfig
和 arch/arm64/configs/xxxx64_defconfig
。
首先执行以下命令从老的 xxxx_defconfig
文件生成临时使用的 .config
文件:
$ make ARCH=arm xxxx32_defconfig
其中 ARCH=arm
用来指明当前修改的是 32 位配置,如果要修改的是 64 位配置就应该将这个参数指定为 ARCH=arm64
,后文均以 32 位为例。然后在 menuconfig 菜单中手动选择上我们需要添加的模块。执行以下命令打开配置菜单:
$ make ARCH=arm menuconfig
手动选择好要使用的模块,保存并退出后,我们的配置就写入到 .config
文件中了。然后我们再执行下方的命令将配置保存到 defconfig
文件中:
$ make ARCH=arm savedefconfig
上方这条命令在成功被执行之后,我们可以在内核的根目录下发现新增了一个名为 defconfig
的文件,这个文件里包含了所有模块的配置。我们只需要将要移植的模块配置添加到 xxxx32_defconfig
文件中就行了,可以使用下方的命令查看要添加的内容:
$ diff -u arch/arm/configs/xxxx32_defconfig defconfig
最后将上方命令打印出的那部分改动合入到 arch/arm/configs/xxxx32_defconfig
文件中就好了。
通过这种方式修改的 defconfig 文件在提交到服务器后就不会再被提示 xxxx32_defconfig not generated by savedefconfig
了。
关于代码格式的一些更详细的说明,感兴趣的朋友可以阅读《谈谈Linux内核驱动的coding style》