第一步 找驱动厂家要到源码。
第二步 设置交叉编译环境。
第三步 解决编译过程中源码的报错。
第一步 略过。
第二步 设置编译环境,在sdk中,我们一般使用 build.sh kernel来编译内核。build.sh这个脚本会一键配置编译环境。现在要单独编译驱动,就得从这个脚本中抽取编译环境的脚本。简单的说就是找souce的部分代码。
经过研究发现,脚本主要集中在 ~/Linux/rk3568_linux_5.10/device/rockchip/common/scripts这个目录下。
设置环境变量的脚本主要是 general.sh,打开这个脚本看到。
export LC_ALL=C # 设置本地化环境为C
export SCRIPTS_DIR="$(dirname "$(realpath "$BASH_SOURCE")")" # build.sh脚本路径
export COMMON_DIR="$(realpath "$SCRIPTS_DIR/..")" # common目录路径
export SDK_DIR="$(realpath "$COMMON_DIR/../../..")" # SDK源码根目录路径
export DEVICE_DIR="$SDK_DIR/device/rockchip" # 脚本和板级别配置文件路径
export CHIPS_DIR="$DEVICE_DIR/.chips" # .chips路径,里面其实也只有一个rk3566_rk3568
export CHIP_DIR="$DEVICE_DIR/.chip" # .chip路径也就是rk3566_rk3568
export RK_DATA_DIR="$COMMON_DIR/data" # 存放了一些调试工具和开发板可执行脚本
export RK_IMAGE_DIR="$COMMON_DIR/images" # 存放了ome userdata PCBA等镜像或者分区文件
export RK_CONFIG_IN="$COMMON_DIR/configs/Config.in" # 存放了一些配置文件,推测根目录的menuconfig就是来自这里
export RK_BUILD_HOOK_DIR="$COMMON_DIR/build-hooks" # 存放编译钩子脚本的目录
export BUILD_HELPER="$RK_BUILD_HOOK_DIR/build-helper" # 编译时钩子的帮助函数
export RK_POST_HOOK_DIR="$COMMON_DIR/post-hooks" # 存放编译完成后的钩子脚本目录
export POST_HELPER="$RK_POST_HOOK_DIR/post-helper" # 编译完成后的钩子帮助函数
export PARTITION_HELPER="$SCRIPTS_DIR/partition-helper" # 文件分区函数
export RK_OUTDIR="$SDK_DIR/output" # 文件输出保存目录
export RK_LOG_BASE_DIR="$RK_OUTDIR/log" #log日志保存总目录
export RK_SESSION="${RK_SESSION:-$(date +%F_%H-%M-%S)}" #日志时间定义
export RK_LOG_DIR="$RK_LOG_BASE_DIR/$RK_SESSION" # 根据时间保存的日志目录
export RK_FIRMWARE_DIR="$RK_OUTDIR/firmware" # 固件存放目录
export RK_INITIAL_ENV="$RK_OUTDIR/initial.env" # 保存的最初环境
export RK_CUSTOM_ENV="$RK_OUTDIR/custom.env"
export RK_FINAL_ENV="$RK_OUTDIR/final.env" #最终的环境变量
export RK_CONFIG="$RK_OUTDIR/.config" # 保存的Menuconfig配置
export RK_DEFCONFIG_LINK="$RK_OUTDIR/defconfig" # 默认配置
export PYTHON3=/usr/bin/python3 # 导出环境变量 PYTHON3,指定为 /usr/bin/python3
export CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1) # 获取最大CPU核心数
需要推导出这一系列的变量,而第一个变量是build.sh脚本的路径。
build.sh 的路径为 /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/scripts/build.sh
推导环境变量的绝对路径如下:
SCRIPTS_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/scripts
(build.sh 所在目录)
COMMON_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common
(SCRIPTS_DIR 的上一级目录)
SDK_DIR: /home/topeet/Linux/rk3568_linux_5.10
(COMMON_DIR 的上三级目录)
DEVICE_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip
(板级配置文件路径)
CHIPS_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/.chips
CHIP_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/.chip
RK_DATA_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/data
RK_IMAGE_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/images
RK_CONFIG_IN: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/configs/Config.in
RK_BUILD_HOOK_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/build-hooks
BUILD_HELPER: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/build-hooks/build-helper
RK_POST_HOOK_DIR: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/post-hooks
POST_HELPER: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/post-hooks/post-helper
PARTITION_HELPER: /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/scripts/partition-helper
RK_OUTDIR: /home/topeet/Linux/rk3568_linux_5.10/output
RK_LOG_BASE_DIR: /home/topeet/Linux/rk3568_linux_5.10/output/log
RK_SESSION: 动态生成的时间戳,例如 2024-12-22_14-30-45
RK_LOG_DIR: /home/topeet/Linux/rk3568_linux_5.10/output/log/<RK_SESSION>
(其中 <RK_SESSION> 是上面的动态时间戳)
RK_FIRMWARE_DIR: /home/topeet/Linux/rk3568_linux_5.10/output/firmware
RK_INITIAL_ENV: /home/topeet/Linux/rk3568_linux_5.10/output/initial.env
RK_CUSTOM_ENV: /home/topeet/Linux/rk3568_linux_5.10/output/custom.env
RK_FINAL_ENV: /home/topeet/Linux/rk3568_linux_5.10/output/final.env
RK_CONFIG: /home/topeet/Linux/rk3568_linux_5.10/output/.config
RK_DEFCONFIG_LINK: /home/topeet/Linux/rk3568_linux_5.10/output/defconfig
PYTHON3: /usr/bin/python3
CPUS: 动态计算的 CPU 核心数,执行时根据系统配置确定
结合脚本分析,解决第二步编译环境问题:
source /home/topeet/Linux/rk3568_linux_5.10/device/rockchip/common/scripts/general.sh
source /home/topeet/Linux/rk3568_linux_5.10/output/.config
以及
export CROSS_COMPILE=/home/topeet/Linux/rk3568_linux_5.10/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
然后make,顺利进行编译。
编译过程中报错。
这个问题主要是头文件包含问题。
修改 8189cd_security.c,在开头加上
#include <linux/sched.h>
#include <linux/pgtable.h>
再次编译顺利生成内核模块