跳到主要内容位置

立创泰山派训练营-WSL2使用Docker编译泰山派tspi的SDK

本文是在使用WSL2编译立创泰山派SDK时的一些笔记,也整合了网上很多大佬解决WSL2安装Docker,以及repo等方法。

关于如何下载WSL2可以参考我的另一个博客:立创泰山派tspi-Windows11安装与配置WSL2用于Linux开发

系统为Windows11 - Microsoft Windows [版本 10.0.22621.3007]专业版

编译流程参考泰山派官方文档:https://lceda001.feishu.cn/wiki/Da5owUV4dipiqUkZycbcxckinvc

(1)创建Docker镜像#

  • 新建一个目录,并进入(名字自己起)

    mkdir dockerfile/
    cd dockerfile/
  • 创建一个文件,并编辑

    vim dockerfile
  • 插入以下内容:

    # 设置基础镜像为Ubuntu 18.04
    FROM ubuntu:18.04
    # 设置作者信息
    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
    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
    # 创建开发板用户
    RUN useradd -c 'lckfb user' -m -d /home/lckfb -s /bin/bash lckfb
    # sudo免密登录
    RUN sed -i -e '/\%sudo/ c \%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
    RUN usermod -a -G sudo lckfb
    USER lckfb
    #设置docker工作目录为/home/lckfb
    WORKDIR /home/lckfb
    #容器使用这个内核方法
    #docker run --privileged --mount type=bind,source=/home/LCKFB_RK3566/ROCKCHIP_ANDROID11.0_SDK_RELEASE/ROCKCHIP_ANDROID11.0_SDK_RELEASE,target=/home/lckfb/android11 --name="lckfb_android11_sdk" -h lckfb -it lckfb_android11_sdk_cmp
  • 同样在刚才的dockerfile/目录下,执行以下命令:

    docker build -t lckfb_xly .
    # lckfb_xly - 镜像名字

    此过程需要一段时间,请耐心等待

  • 查看建立的镜像

    docker images

(2)基于镜像创建容器#

先在自己的家目录创建一个存放SDK的空目录:

cd ~
mkdir tspi_linux_repo_sdk/

然后创建容器

docker run --privileged --mount type=bind,source=/home/cheng/tspi_linux_repo_sdk,target=/home/lckfb --name="lckfb_xly_container" -h lckfb -it lckfb_xly

注意:

source=是我们要挂载的路径,就是刚才创建用来存放SDK的目录,这里需要更换成你自己的路径

target=挂载到容器内用户目录的名称

这使得容器内的应用程序可以访问并操作宿主机上的该目录。

name=是我们指定的一个名字

-h lckfb容器主机名字

使用名为lckfb_xly的镜像来创建容器,之前docker build创建镜像时命名的

创建完成后,可以查看:

docker ps -a
docker start lckfb_xly_container #启动容器
docker attach lckfb_xly_container #附加到正在运行的名为lckfb_xly_container的容器的终端上,以便与容器进行交互

退出:

exit

(3)下载SDK并解压#

使用百度网盘或者夸克云盘在第05章.【立创·泰山派】系统SDK - 飞书云文档 (feishu.cn)下载tspi_linux_sdk_repo_20240131.tar.gzbuildroot_dl_4c7c9df616fb.tar.gz

前者是需要编译的SDK,后者是buildroot相关库(是防止你的网络比较差很有可能编译的时候自动下载失败报错,帮你下载好的库)。

  • 将这两个文件移动到我们刚才创建的文件夹tspi_linux_repo_sdk/,记得换成你自己下载的路径哦,这时候我们WSL2用户的便捷性就体现出来了,可以直接进入windows盘里面移动拷贝文件。(当然如果你是虚拟机也没关系,自己安装平时传文件的方式就好)

    mv /mnt/c/resource/JLC-lspi-Linux/tspi_linux_sdk_repo_20240131.tar.gz ~/tspi_linux_repo_sdk/
    mv /mnt/c/resource/JLC-lspi-Linux/buildroot_dl_4c7c9df616fb.tar.gz ~/tspi_linux_repo_sdk/
  • 校验与解压

    校验SDK:

    md5sum tspi_linux_sdk_repo_20240131.tar.gz

    得出的值应该是a30f1d0fdb97ca994a82689fa26ba429

    解压SDK:

    tar -xvzf tspi_linux_sdk_repo_20240131.tar.gz

    解压完成后只有.repo目录我们还需要把代码同步出来

    .repo/repo/repo sync -l -j88

    这里可能会缺少python,我们需要把python2和python3都装上 先检查一下:

    cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ python3 --version
    Python 3.10.12
    cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ python2 --version
    Command 'python2' not found, but can be installed with:
    sudo apt install python2

    我这里是没有python2,直接:

    sudo apt update
    sudo apt install python2

    并且,如果系统中同时安装有 Python 2 和 Python 3,需要确保 /usr/bin/python 指向正确的版本,python 应指向 Python 2,而 python3 应指向 Python 3。可以使用 update-alternatives 来管理不同版本的 Python:

    # 设置 python 变量
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2
    # 配置 python 指向 Python 2 或 Python 3
    sudo update-alternatives --config python

    具体设置如下:

    cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ sudo update-alternatives --config python
    There are 2 choices for the alternative python (providing /usr/bin/python).
    Selection Path Priority Status
    ------------------------------------------------------------
    * 0 /usr/bin/python3 2 auto mode
    1 /usr/bin/python2 1 manual mode
    2 /usr/bin/python3 2 manual mode
    Press <enter> to keep the current choice[*], or type selection number: 1
    update-alternatives: using /usr/bin/python2 to provide /usr/bin/python (python) in manual mode
    cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ sudo update-alternatives --config python
    There are 2 choices for the alternative python (providing /usr/bin/python).
    Selection Path Priority Status
    ------------------------------------------------------------
    0 /usr/bin/python3 2 auto mode
    * 1 /usr/bin/python2 1 manual mode
    2 /usr/bin/python3 2 manual mode

    这样就可以继续执行.repo/repo/repo sync -l -j88, 等待完成:

    cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ sudo .repo/repo/repo sync -l -j88
    Updating files: 100% (17139/17139), done.
    Updating files: 100% (779/779), done.
    Updating files: 100% (1172/1172), done.
    Updating files: 100% (248/248), done.
    Updating files: 100% (127/127), done.
    Updating files: 100% (118/118), done.
    Updating files: 100% (247/247), done.
    Updating files: 100% (54/54), done.
    Updating files: 100% (921/921), done.
    Updating files: 100% (1493/1493), done.
    Updating files: 100% (186/186), done.
    Updating files: 100% (72291/72291), done.isp2-ipcUpdating files: 7% (5301/72291)
    Updating files: 100% (17900/17900), done.
    Updating files: 100% (7165/7165), done.
    Updating files: 100% (236/236), done.
    Checking out: 100% (65/65), done in 3m16.472s
    repo sync has finished successfully.

    校验dl:

    md5sum buildroot_dl_4c7c9df616fb.tar.gz

    得出的值应该是3b3b023ef9122f518e1e5dd00fc0fa0a

    解压dl:

    tar -xvzf buildroot_dl_4c7c9df616fb.tar.gz

(4)启动Docker#

docker start lckfb_xly_container
docker attach lckfb_xly_container

我们可以查看一下,发现其实docker容器内的用户目录就是~/tspi_linux_repo_sdk/目录的内容

(5)选择泰山派配置#

可以进入下面的目录.mk文件查看编译配置:

lckfb@lckfb:~/device/rockchip/rk356x$ sudo vi BoardConfig-rk3566-tspi-v10.mk

第34行可以修改以 RK_JOBS 进程进行编译

33 # Build jobs
34 export RK_JOBS=12

回到家目录,选择配置文件位tspi的:

./build.sh lunch

补充:在docker中执行命令的时候可能会有权限问题,每次执行命令都需要使用sudo。下面我给出我问GPT解决方法:

可能您之前以 root 用户运行了构建脚本,然后再以非 root 用户运行,导致文件所有权或权限问题。尝试手动清理或确保总是以相同的用户身份运行构建脚本。

来自你的消息:

确实我这个文件有很多root用户的,应该怎么办?

cheng@DESKTOP-NEVMUGG:~/tspi_linux_repo_sdk$ ll
total 16511876
drwxrwxr-x 16 cheng docker 4096 Mar 21 12:41 ./
drwxr-x--- 6 cheng cheng 4096 Mar 21 11:45 ../
-rw------- 1 cheng cheng 538 Mar 21 12:54 .>bash_history
drwxr-xr-x 7 cheng docker 4096 Aug 8 2022 .repo/
drwxr-xr-x 3 root root 4096 Mar 21 12:41 .subversion/
-rw-r--r-- 1 cheng cheng 0 Mar 21 12:26 .sudo_as_admin_successful
-rw------- 1 cheng cheng 3326 Mar 21 12:38 .viminfo
lrwxrwxrwx 1 root root 24 Mar 21 12:11 Makefile -> buildroot/build/Makefile*
drwxr-xr-x 15 root root 4096 Mar 21 12:11 app/
lrwxrwxrwx 1 root root 31 Mar 21 12:12 build.sh -> device/rockchip/common/build.sh*
drwxr-xr-x 16 root root 4096 Mar 21 12:19 buildroot/
-rwxr-xr-x 1 cheng docker 472576874 Mar 21 11:36 buildroot_dl_4c7c9df616fb.tar.gz*
drwxr-xr-x 8 root root 4096 Mar 21 12:11 debian/
drwxr-xr-x 3 root root 4096 Mar 21 12:11 device/
drwxr-xr-x 6 root root 4096 Mar 21 12:12 docs/
lrwxrwxrwx 1 root root 27 Mar 21 12:11 envsetup.sh -> buildroot/build/envsetup.sh*
drwxr-xr-x 35 root root 4096 Mar 21 12:13 external/
drwxr-xr-x 27 root root 4096 Mar 21 12:41 kernel/
lrwxrwxrwx 1 root root 36 Mar 21 12:12 mkfirmware.sh -> device/rockchip/common/mkfirmware.sh*
drwxr-xr-x 3 root root 4096 Mar 21 12:13 prebuilts/
drwxr-xr-x 8 root root 4096 Mar 21 12:40 rkbin/
lrwxrwxrwx 1 root root 33 Mar 21 12:12 rkflash.sh -> device/rockchip/common/rkflash.sh*
drwxr-xr-x 5 root root 4096 Mar 21 12:14 tools/
-rwxr-xr-x 1 cheng docker 16435497971 Mar 21 11:40 tspi_linux_sdk_repo_20240131.tar.gz*
drwxr-xr-x 27 root root 4096 Mar 21 12:40 u-boot/
drwxr-xr-x 9 root root 4096 Mar 21 12:14 yocto/

来自AI的消息: 由于文件和目录是由 root 用户拥有的,而您是以普通用户(cheng)运行 build 脚本,因此遇到了权限不足的问题。解决这个问题,您需要将这些文件的所有权从 root 用户更改为您的用户账户(cheng)。

以下是您可以使用的命令:

sudo chown -R cheng:docker /path/to/your/files

请将 /path/to/your/files 替换为您需要更改所有权的具体文件或目录的路径。在您给出的例子中,如果您想更改 ~/tspi_linux_repo_sdk 目录下所有文件和子目录的所有权,您可以执行:

sudo chown -R cheng:docker ~/tspi_linux_repo_sdk

chown 命令会更改文件的所有者,-R 选项意味着执行递归操作,即对指定目录下所有的文件和子目录都进行所有者修改。

请注意,在使用 sudo 执行这些命令之前,确保您清楚这些命令的作用,并且您有足够的权限进行这些更改。更改文件所有权可以解决权限问题,但也要确保不会影响您的构建环境的有效性和安全性。

在更改所有权之后,您应该能够以您的用户身份再次运行 ./build.sh all 脚本,而不会遇到权限问题。

(6)编译#

参考:泰山派tspi-上手编译SDK连接WIFI

export RK_ROOTFS_SYSTEM=buildroot
./build.sh all # 只编译模块代码(将all可以换成u-Boot,kernel,Rootfs,Recovery)

编译过程中会让你电源选择,按照下面表格就行:

引脚PMUIO2VCCIO1VCCIO3VCCIO4VCCIO5VCCIO6VCCIO7
1.8 V(1800000)
3.3 V(3300000)

编译完成,还需在执行固件打包:

./mkfirmware.sh