一、准备

ubuntu

docker

二、Docker环境部署

2.1 先使用dockerfile造出镜像

dockerfile

# 设置基础镜像为Ubuntu 18.04
FROM ubuntu:18.04

# 设置作者信息
MAINTAINER lckfb "service@lckfb.com"
#LABEL maintainer="lckfb <service@lckfb.com>"

# 设置环境变量,用于非交互式安装
ENV DEBIAN_FRONTEND=noninteractive

# 备份源列表文件
RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak

# 将源列表中的 http://.*ubuntu.com 替换为 http://repo.huaweicloud.com
RUN sed -i 's@http://.*ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list

# 更新包列表
RUN apt update

# 安装基本的编译工具和依赖
RUN apt install -y build-essential crossbuild-essential-arm64 \
bash-completion vim sudo locales time rsync bc python

# 安装其他依赖包,这里编译android11sdk需要的环境
RUN apt install -y repo git ssh libssl-dev liblz4-tool lib32stdc++6 \
expect patchelf chrpath gawk texinfo diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake \
unzip device-tree-compiler python-pip ncurses-dev python-pyelftools \
subversion asciidoc w3m dblatex graphviz python-matplotlib cpio \
libparse-yapp-perl default-jre patchutils swig expect-dev u-boot-tools \
whiptail
RUN apt install -y bear

# 再次更新包列表并安装任何未安装的依赖
RUN apt update && apt install -y -f

# 生成本地化语言支持
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
#ENV LANG=en_US.UTF-8

# 创建开发板用户
RUN useradd -c 'Docker User Lckfb' -m -d /home/docker_lckfb_linux_sdk_user -s /bin/bash docker_lckfb_linux_sdk_user

# sudo免密登录
RUN sed -i -e '/\%sudo/ c \%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
RUN usermod -a -G sudo docker_lckfb_linux_sdk_user
USER docker_lckfb_linux_sdk_user

#设置docker工作目录为/home/docker_lckfb_linux_sdk_user
WORKDIR /home/docker_lckfb_linux_sdk_user

#容器使用这个内核方法 仅供参考
#docker run --privileged --mount
#type=bind,source=/home/zky/ProjectsHub/Linux_Projects/tspi/docker_lckfb_android_sdk/workspace
#,target=/home/docker_lckfb_android_sdk_user --name="docker_lckfb_android_sdk_con" -h
#lckfb_machine -it docker_lckfb_android_sdk_img

使用这个执行dockerfile创建镜像

docker build -t docker_lckfb_linux_sdk_img ./dockerfile

2.2 使用笔者写的shell脚本,基于这个镜像运行出容器,并进入容器内部命令行,设定X11界面相关的权限是方便后续创建移植qt的程序

run_dockerfile.sh

#!/bin/bash

# docker build -t docker_lckfb_linux_sdk_img .

# 固定宿主机物理路径
HOST_PATH="/home/zky/ProjectsHub/Linux_Projects/tspi/docker_lckfb_linux_sdk/workspace"
# 镜像、容器、容器内挂载目录
IMG_NAME="docker_lckfb_linux_sdk_img"
CON_NAME="docker_lckfb_linux_sdk_con"
CON_WORK="/home/docker_lckfb_linux_sdk_user/workspace"

# 清理旧容器
docker rm -f ${CON_NAME} 2>/dev/null

# 启动容器,绑定指定物理目录
# docker run --privileged \
# --mount type=bind,source="${HOST_PATH}",target="${CON_WORK}" \
# --name ${CON_NAME} -h lckfb_machine -it ${IMG_NAME}



# 1. 放行X权限
xhost +local:
trap 'xhost -local:' EXIT

# 2. 构建镜像(指定Dockerfile路径,解决no such file)
# 替换为你的Dockerfile所在目录
# DOCKERFILE_DIR="/home/zky/ProjectsHub/Linux\_Projects/tspi/docker\_lckfb\_linux\_sdk/docker"
# docker build -t ${IMG\_NAME} -f ${DOCKERFILE\_DIR}/Dockerfile ${DOCKERFILE\_DIR}

# 3. 删除旧容器
# docker rm -f ${CON_NAME}

# 4. 创建容器:每行末尾带 \ 续行,末尾带上镜像名
docker run --privileged \
--mount type=bind,source="${HOST_PATH}",target="${CON_WORK}" \
--mount type=bind,source="/tmp/.X11-unix",target="/tmp/.X11-unix" \
-e DISPLAY=$DISPLAY \
--name ${CON_NAME} -h lckfb_machine -it ${IMG_NAME}

2.3 后续日常使用这个shell脚本快速进入容器内部

go_to_con.sh

#!/bin/bash
# 固定宿主机物理路径
HOST_PATH="/home/zky/ProjectsHub/Linux_Projects/tspi/docker_lckfb_linux_sdk/workspace"
# 镜像、容器、容器内挂载目录
IMG_NAME="docker_lckfb_linux_sdk_img"
CON_NAME="docker_lckfb_linux_sdk_con"
CON_WORK="/home/docker_lckfb_linux_sdk_user/workspace"

#docker start ${CON_NAME}
#docker exec -it ${CON_NAME} /bin/bash




# 退出脚本时回收X权限
trap 'xhost -local:' EXIT
# 放行本地X访问
xhost +local:

docker start ${CON_NAME}
docker exec -it \
  -e DISPLAY=$DISPLAY \
  ${CON_NAME} /bin/bash




# 一键启动 + 直接进入(容器已停止时)
# docker start -ai docker_lckfb_android_sdk_con

三、编译

zky@zky-virtual-machine:~/ProjectsHub/Linux_Projects/tspi/docker_lckfb_linux_sdk/docker$ ./go_to_con.sh
non-network local connections being added to access control list
docker_lckfb_linux_sdk_con
docker_lckfb_linux_sdk_user@lckfb_machine:~$ ls
workspace
docker_lckfb_linux_sdk_user@lckfb_machine:~$ cd workspace
docker_lckfb_linux_sdk_user@lckfb_machine:~/workspace$ ls
app     buildroot  debian  docs         external  kernel    mkfirmware.sh  rkbin       rockdev  tools   yocto
br.log  build.sh   device  envsetup.sh  IMAGE     Makefile  prebuilts      rkflash.sh  test1    u-boot
docker_lckfb_linux_sdk_user@lckfb_machine:~/workspace$ 
# 整理出来的全编译完整过程

./build.sh lunch && export RK_ROOTFS_SYSTEM=buildroot && source buildroot/build/envsetup.sh && make menuconfig

make savedefconfig && ./build.sh all


# 制作整个镜像
./mkfirmware.sh && ./build.sh updateimg

四、补充命令合集(未整理版本)(可暂时忽略)

source buildroot/build/envsetup.sh

./build.sh lunch && export RK_ROOTFS_SYSTEM=buildroot && source buildroot/build/envsetup.sh && make menuconfig 

make savedefconfig && ./build.sh all


./mkfirmware.sh && ./build.sh updateimg



./build.sh lunch  or  ./build.sh device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk
./build.sh -h kernel
export RK_ROOTFS_SYSTEM=buildroot
./build.sh all


./mkfirmware.sh && ./build.sh updateimg


单独编译 
u-boot编译 
# U-Boot编译命令
./build.sh uboot
# 查看U-Boot详细编译命令
./build.sh -h uboot


kernel编译 
# Kernel编译命令
./build.sh kernel
# 查看Kernel详细编译命令
./build.sh -h kernel


Recovery编译命令 
# Recovery编译命令
./build.sh recovery
#查看Recovery详细编译命令
./build.sh -h recovery
注:Recovery是⾮必需的功能,有些板级配置不会设置



buildroot编译 
Rootfs 编译
进⼊⼯程⽬录根⽬录执⾏以下命令⾃动完成 Rootfs 的编译及打包:
./build.sh rootfs
编译后在 Buildroot ⽬录 output/rockchip_rk3566/images下⽣成 rootfs.ext4。


模块编译
⽐如 qplayer 模块,常⽤相关编译命令如下:
编译 qplayer
SDK$make qplayer
重编 qplayer
SDK$make qplayer-rebuild
删除 qplayer
SDK$make qplayer-dirclean
或者
SDK$rm -rf /buildroot/output/rockchip_rk3566/build/qlayer-1.0







cd kernel
# 1. 加载RK3566原厂默认内核配置,生成标准.config
make ARCH=arm64 rockchip_defconfig
# 2. 重新进入menuconfig,再次确认DW9714=y并保存
make ARCH=arm64 menuconfig
# 3. 彻底清理旧编译产物,避免缓存干扰
make ARCH=arm64 clean
# 4. 带架构参数编译,不会弹出交互式选项
make ARCH=arm64 -j$(nproc)



Debian 编译 
选择debian操作系统
export RK_ROOTFS_SYSTEM=debian 
运行自动全编译命令
./build.sh all  # 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 需要再执⾏./mkfirmware.sh 进⾏固件打包

虽然编译完成了但是我们还需在执行固件打包
./mkfirmware.sh



media-ctl -p -d /dev/media0










全编译
./build.sh lunch
export RK_ROOTFS_SYSTEM=buildroot
./build.sh all
烧录编译
./mkfirmware.sh #打包
./build.sh updateimg #生成整个镜像
编译kernel
./build.sh kernel
进入kernel根目录
make ARCH=arm64 rockchip_linux_defconfig # 加载默认配置文件
make ARCH=arm64 menuconfig #打开配置ui
make ARCH=arm64 savedefconfig #保存配置
cp defconfig arch/arm64/configs/rockchip_linux_defconfig # 替换defconfig
cd …/ && ./build.sh kernel #回到sdk根目录并编译整个kernel
编译buildroot
./build.sh lunch && export RK_ROOTFS_SYSTEM=buildroot
source buildroot/build/envsetup.sh
make menuconfig
make savedefconfig







# 设置menuconfig
make ARCH=arm64 menuconfig
# 使能Focaltech_touchScreen 
Device_Drivers > Input_device_support > Touchscreens > Focaltech Touchscreen
# 保存
make ARCH=arm64 savedefconfig
# 覆盖
mv defconfig arch/arm64/configs/rockchip_linux_defconfig
# 单独编译kernel
./build.sh kernel
# 生成分散镜像
./mkfirmware.sh
# 生成独立镜像
./build.sh updateimgs











#heng pin
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! waylandsink fullscreen=true
#shu pin
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! videoflip method=clockwise ! waylandsink fullscreen=true







// 核心:90度旋转窗口画面,适配横屏
    QTransform transform;
    transform.rotate(90);
    w.setTransform(transform);





// linuxfb基础配置
    qputenv("QT_QPA_PLATFORM", "linuxfb:fb=/dev/fb0");
    qputenv("QT_QPA_FB_NO_CURSOR", "1");
    // 强制Qt渲染90度横屏
    qputenv("QT_QPA_ROTATE", "90");
    // 横屏分辨率
    qputenv("QT_QPA_FB_WIDTH", "800");
    qputenv("QT_QPA_FB_HEIGHT", "480");

更多推荐