要对一个SDK进行定制化二次开发,首先得理解它的编译逻辑,配置参数如何影响编译行为,各模块是如何配合工作的。
声明:本文件后期会不定时的修改和完善,它旨在梳理RK356X-SDK编译过程,了解如何如何根据我们电路板进行二次开发RK356X-SDK。
目录
1.文件的路径
1.1 在SDK目录下执行make命令,对应的文件是SDK目录下的Makefile,里面开头确定了编译所需的文件路径以及产出文件的路径。
1.2 打开Makefile,开头的变量COMMON_DIR其实就是获取当前Makefile的实际路径,Makefile实际是一个链接文件,它实体文件是SDK/device/rockchip/common/Makefile,而COMMON_DIR即为SDK/device/rockchip/common/,下面很多环境变量都是基于这个路径来获取路径的。从COMMON_DIR进而获取DEVICE_DIR,SDK_DIR,CHIP_DIR,CONFIG_DIR,OUTDIR:
DEVICE_DIR:SDK/device/rockchip/
SDK_DIR:SDK/
CHIP_DIR:SDK/device/rockchip/.chip/
CONFIG_DIR:SDK/device/rockchip/common/configs/
OUTDIR:SDK/output/
2. 配置生成及引用
2.1 配置界面
在编译开始前,需要进行配置,通过命令:make menuconfig,呼出配置菜单进行配置。菜单的各个选项是基于CONFIG_DIR文件夹下的配置文件Config.in*,它们与kconfig文件是一样的,提供了配置菜单的各个选项。通过选择这些选项,save后最终生成含有全局变量的文件.config。然后执行make savedefconfig以使配置得以应用。
注意,所有模块(例如u-boot,kernel等)的make menuconfig修改的内容,实际上修改的是它对应的板级文件,板级文件通过kconfig里面的关联定义,引申出其它变量的定义,进而集合生成到.config文件里,脚本展开.config后,就可以定制固件的编译。
可以直接编辑板级文件也可以通过make menuconfig修改,只不过menuconfig加载了kconfig中的其它关联定义,方便选择和编辑,直接写板级文件还得去查相关kconfig文件。
2.2 全局板级文件(defconfig)
全局make menuconfig,即在SDK/目录下执行的menuconfig,对应的板级文件就是全局板级文件,它保存在SDK/device/rockchip/.chip中,menuconfig第一页第一条要确认的是保存本次配置的全局板级文件的名称(对应变量名:RK_DEFCONFIG),后面编译时,可以使用make xxxx_defconfig,或者build.sh lunch选择这个defconfig,套用配置,就不用再配置一遍了。
- 一般情况下,无论是配置文件,还是源代码,新增时,选一个旧的相似的文件来改,这样犯错的几率就会小很多,所以,保存的defconfig文件,也可以选一个已有的文件来改。默认是rockchip_defconfig,它是一个链接文件,如上图,它实际链接到rockchip_rk3568_evb1_ddr4_v10_defconfig。
- 选择哪个defconfig来改,需要对照自己主板的原理图,重点查看用哪种芯片,然后到SDK/device/rockchip/.chips中,找到对应的芯片文件夹,再查看用哪个DDR,一般现在多采用LPDDR4或DDR4,再到文件夹中找到对应DDR的defconfig,或者有特定系统要求的,比如rtos等,找到相应的defconfig,复制一份到SDK/device/rockchip/.chip中。
- 重命名复制的defconfig文件,这里名字是有要求的(因为有build.sh会解析这个defconfig名,以提取RK_CHIP等的默认值),一般以自定义名开头,第2个位置是芯片名,第3个位置及后面是其它信息,如ddr类型,芯片是32还是64位,带有的比较特用的系统,如rtos等,最后以defconfig结尾,中间都用下划线隔开,如test_rk3566_ddr4_v01_defconfig。
- 执行make test_rk3566_ddr4_v01_defconfig,使defconfig生效,再执行make menuconfig,就可以看到界面上的一些选项与defconfig内容相关了,不