龙芯2k0300 - 久久派核心板开发环境搭建

最近,打算参加第21届全国智能汽车竞赛走马观碑组,在《21届智能汽车竞赛走马观碑》我们介绍了竞赛规则、以及硬件、软件设计方案,在硬件设计方案中我们选用了久久派2K0300核心板WiFI版本

本节主要针对核心板硬件资源以及开发环境搭建进行详细介绍。

一、介绍

1.1 硬件特性

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33》,相关产品手册:

1.1.1 龙芯2K0300

LS2K0300芯片是基于LA264处理器核的多功能SOC芯片,可广泛适用于工业控制、通信设备、信息家电和物联网等应用领域。

龙芯LS2K0300采用高集成度设计,提供丰富的功能接口,可满足多场景应用需求,同时支持低功耗技术,能够在低能耗表现下提供高效处理性能。

LS2K0300芯片片内集成16DDR4内存控制器,并集成了丰富的外设接口:USB2.0接口,GMAC接口,DVO显示接口,I2S音频接口,SPI/QSPIADCSDIOeMMC和其他工控领域常用接口。

龙芯2K03012K0300的内存合封版,两者CPU内核、主频、外设完全一致,唯一核心区别在于:2K0301内部直接封装了4GB DDR4内存,而2K0300需要外置内存

1.1.1.1 CPU

2个 龙芯LA264处理器核,主频1.0GHz

32KB一级指令缓存和32KB一级数据缓存,支持ECC校验;512KB二级共享缓存,支持ECC校验。

1.1.1.2 Memory

16DDR4-1600控制器,支持ECC校验,典型速率1600Mbps

1.1.1.3 AI支持

没有像瑞芯微RK3588那样内置独立的NPU,但它仍然具备一定的AI处理能力。

参数 规格 解读
向量加速 内置128位向量单元 这是它处理AI任务的关键。向量单元可以加速SIMD(单指令多数据流)运算,对于卷积神经网络中的矩阵乘法等操作,比纯CPU快很多。
AI框架支持 支持 NCNN、Tengine、ONNX Runtime 官方和社区正在将主流的端侧推理引擎移植到LoongArch架构上。 这意味着你可以先在电脑上训练好模型(如NanoDet),然后通过NCNN等工具转换,部署到2K0300上,利用它的向量单元进行加速推理。
实际推理能力 预计能实时运行轻量级模型 参考类似规格的芯片(如Cortex-A53 1.0GHz),2K0300处理 320x320 输入的 NanoDet 模型,帧率预计可以达到 10-20 FPS 左右。对于车模控制来说,这个速度基本够用,但需要做好代码优化。
1.1.1.4 外设接口
接口类型 数量/规格 描述
DVO 1 1 路DVO显示输出,分辨率可支持 320×240~1920×1080@60Hz/24bit
USB控制器 2 1个USB2.0 HOST接口,1个OTG接口支持HOST/DEVICE 模式HOST 接USB摄像头;OTG 可配置为HOST接调试设备,或配置为Device用于烧录系统(Type-C口)。
GMAC 控制器 2 2路10M/100M/1000M 自适应 GMAC控制器,支持RGMII/MII
I2S 1 1路I2S接口、支持单声道和立体声道音频数据、支持DMA传输模式
SPI 4 1 路支持系统启动(SPI0),2 路支持QSPI 模式(SPI0/1)
UART 10 集成10个UART控制器
I2C 4 集成4路I2C控制器,支持主从模式
ADC 8通道,12位 集成1个8通道12位AD接口
CAN 4 支持 4路CAN接口,支持CAN-FD,支持DMA传输模式
TIMER 3 集成3组定时器 A/G/B-TIMER
PWM 4 集成4路PWM控制器,支持输入/输出
GPIO 106 集成106路复用GPIO,支持位操作,支持输入/输出,支持外部中断输入
SDIO 2 集成2个SDIO控制器,均支持SDIO/eMMC
1.1.1.5 指令集

LoongArch:龙芯自主指令集架构,这意味着它不是ARM,也不是x86

1.1.2 核心板

下面是我购买的2K0300久久派核心板的正面外形,从PCB上我们可以看到这个板子上的电气元件的密度是非常大的:

配置清单:

  • RAM: 512MB DDR4-2666

  • Nor Flash8MB

  • eMMC: 8G

  • 显示:1LCD,支持触屏;

  • WiFi/BT:板载WiFi/BT模块,支持单天线;

  • 千兆网口:1个千兆网口;

  • USB-A: 两个USB 2.0 Type-A接口;

  • AD插针:812ADC

  • IO插针:

    • 2SPI,其中1路支持slave模式;

    • 可服用为PWM

    • 2I2C,可复用为GPIO

    • 3UART,可复用为GPIO

    • 2CAN,可复用为GPIO

    • 2PWM,可复用为GPIO

  • 复位:1个板载复位按键;

  • 指示灯:3个电源/复位/状态指示灯;

  • LA_JTAG:1LA_JTAG连接器;

  • 供电: DC 5V/2A Type-C供电、2 PRTC电池;

  • 尺寸:88MM X 56MM

1.2 接口布局

核心板接口图:

我们可以通过《 Loongson-2K0300-99PAI》下载相关资料。在开发板上有两排引脚,左边是单排排针(10个),右边是双排排针(30个)。

1.2.1 ADC

左侧排针电路原理图,这里有8ADC采样;

1.2.2 其他引脚

右侧排针电路原理图:

久久派引脚图表(在《龙芯2k0300处理器用户手册.pdf》中有所有引脚复用关系表):

在使用诸如按键、蜂鸣器、编码器、无线模块、TFT屏幕、ADC 采集以及电机驱动等外设时,首要步骤是明确这些设备与单片机之间连接的具体引脚配置。

二、开发环境搭建

2.1 VMware安装

对于VMware安装可以参考《嵌入式Linux开发环境搭建》,该博客中提供的VMware 已经过期,新版本的下载地址:VMware Pro 17

2.2 ubuntu安装以及配置

对于ubuntu安装可以参考《嵌入式Linux开发环境搭建》,这里可以安装Ubuntu 22.04.5 LTS,安装完成后进入虚拟机查看版本信息;

shell 复制代码
hengyang@ubuntu:~/桌面$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
2.2.1 网咯设置

WMware网络设置支持三种模式:

  • bridged(桥接模式):虚拟机能得到一个独立IP地址,网络能提供多个IP地址;虚拟机可以访问外部网络,外部网络也可以访问虚拟机;
  • NAT(网络地址转换模式) : 如果网络中只提供一个IP地址,虚拟机和主机使用一个IP地址;虚拟机可以外部网络,但是外部网络访问不了虚拟机;
  • 主机模式 (主机没有联网):相当于把主机和虚拟机通过一根网线连接在一起;

之前我们在安装ubuntu的时候选择了桥接模式,需要确保如下配置正确:

  • 打开VMware → 点击菜单栏编辑 → 虚拟网络编辑器;
  • 在弹出的窗口中,找到VMnet0,确保它设置为桥接模式;
  • 在桥接到下拉框中,手动选择你正在使用的物理网卡(根据你之前的 ipconfig,应该选择有线网卡,如 Realtek PCIe GbE Family Controller);
  • 如果VMnet0不在列表中,可以点击右下角的 "更改设置"(需要管理员权限),然后点击"还原默认设置"来恢复。

我们需要设置ubuntu和主机在同一网段内,由于我的windows操作系统的IP172.23.34.186

shell 复制代码
C:\Users\zhengyang>ipconfig

Windows IP 配置


以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::43b3:b450:a09b:8c8d%16
   IPv4 地址 . . . . . . . . . . . . : 172.23.34.186
   子网掩码  . . . . . . . . . . . . : 255.255.128.0
   默认网关. . . . . . . . . . . . . : 172.23.0.1

查看ubuntu的网络配置:

shell 复制代码
zhengyang@ubuntu:~/桌面$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.100  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::eb89:d648:fbc9:91b0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:79:69:69  txqueuelen 1000  (以太网)
        RX packets 3460  bytes 563979 (563.9 KB)
        RX errors 0  dropped 21  overruns 0  frame 0
        TX packets 210  bytes 15145 (15.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 19  base 0x2000  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (本地环回)
        RX packets 274  bytes 27156 (27.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 274  bytes 27156 (27.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到,本例中的网卡为ens33,同时可以看到相应的IP信息等。

可以看到虚拟机和宿主机不在一个网段,这里我们直接进入ubuntu桌面,点击左下角设置,选中网络,修改IpV4信息确保在一个网段;

此时宿主机(172.23.34.186)和虚拟机(172.23.34.187)网络应该是可以互相ping

如果网络宿主机和虚拟机网络不通,请检查防火墙是否关闭。

此时我们就可以通过MobaXterm工具远程SSH登录ubuntu虚拟机;

2.2.2 安装依赖

首先更新软件源:

shell 复制代码
zhengyang@ubuntu:~$ sudo apt update

安装一些依赖库,编译内核时可能会用到:

shell 复制代码
zhengyang@ubuntu:~$ sudo apt install make gcc flex bison libssl-dev bc libncurses-dev
2.2.3 安装cmake

CMake是一个跨平台的构建工具,其支持程度要好于qmakeCMake的配置更加灵活、强大,也更容易维护。CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。

如果编译安装可以参考:《CMake安装》,但是这种方式一般比较复杂。这里直接使用apt命令安装;

shell 复制代码
zhengyang@ubuntu:~$ sudo apt install cmake
zhengyang@ubuntu:~$ cmake -version
cmake version 3.22.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
2.2.4 安装git

安装git

shell 复制代码
zhengyang@ubuntu:~$ sudo apt install git

zhengyang@ubuntu:/opt/2k0300$ git --version
git version 2.34.1
2.3 安装VS Code

Visual Studio code,简称VS Code,是微软在2015年推出的一个轻量但功能强大的源代码编辑器,支持 windowsLinuxmac os操作系统,扩展组件非常丰富,可以快速搭建成为项目开发的神兵利器。

2.3.1 下载安装

我们从官方网站下载deb安装包,注意这里我下载的是X86架构,我们创建一个目录并将其拷贝进来:

shell 复制代码
zhengyang@ubuntu:/opt$ sudo mkdir 2K0300
zhengyang@ubuntu:/opt$ sudo chmod -R 777 ./2k0300/
# 下载完成,拷贝到这个目录
zhengyang@ubuntu:/opt$ ll ./2k0300/
-rw-rw-r-- 1 zhengyang zhengyang 121978886  3月 18 21:42 code_1.111.0-1772846623_amd64.deb

运行如下命令安装:

shell 复制代码
zhengyang@ubuntu:/opt$ cd ./2k0300/
zhengyang@ubuntu:/opt/2k0300$ sudo dpkg -i code_1.111.0-1772846623_amd64.deb

安装完成后我们可以通过左下角的菜单找到Visual Studio code,双击打开;

2.3.2 插件配置

为了便于后续的开发与调试,我们安装一系列插件,无限扩展VS Code的功能。

shell 复制代码
C/C++                   # 运行编译C/C++程序
C/C++ Snippets          # C/C++重用代码块 
C/C++ Advanced Lint     # C/C++静态检测
Code Runner             # 代码运行
Include AutoComplete    # 自动头文件包含
Markdown All in One     # 提供增强的Markdown支持
GitHub Copilot          # 安装AI编程助手
CMake                   # 支持CMake语法,完整的构建、调试、项目管理;

Rainbow Brackets        # 彩虹花括号,有助于阅读代码
GBKtoUTF8               # 将 GBK 转换为 UTF8#
C/C++ Project Generator # 工程相关
Chinese(Simplified)     # 中文环境
vscode-icons            # Vscode图标插件,主要是资源管理器下各个文件夹的图标
compareit               # 比较插件,可以用于比较两个文件的差异
DeviceTree              # 设备树语法插件
2.4 安装交叉编译环境

由于x86LoongArch架构最底层的指令集不同,所以两个平台的程序不能通用,需要分开编译,编译的工具链是不一样。

由于我们日常的开发习惯,LoongArch架构的计算机资源等等因素,我们通常会在x86架构的平台上编写代码并编译然后放到ARM上运行。 所以就需要搭建交叉编译环境。

什么是交叉编译环境呢?简单点说就是在一个架构的处理器上能编译在另一个架构上运行的程序的环境。 再简单点来说,就是在x86架构下安装LoongArch的编译工具。

交叉编译工具下载地址:《https://www.loongnix.cn/zh/toolchain/GNU/》,这里我们下载1.3-1版本,将下载的编译工具拷贝到/opt/2k0300目录;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ wget https://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz

zhengyang@ubuntu:/opt/2k0300$ ls -l
-rw-rw-r-- 1 zhengyang zhengyang 121978886  3月 18 21:42 code_1.111.0-1772846623_amd64.deb
-rw-rw-r-- 1 zhengyang zhengyang  31880964  3月 18 21:53 loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz
2.4.1 解压

解压交叉编译工具链,放置到/opt目录下,也可自己指定解压目录;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ sudo tar -xvf loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz -C /opt

zhengyang@ubuntu:/opt/2k0300$ ll /opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/
drwxr-xr-x 2 root root 4096  4月 25  2024 bin/
drwxr-xr-x 3 root root 4096  4月 25  2024 include/
drwxr-xr-x 3 root root 4096  4月 25  2024 lib/
drwxr-xr-x 3 root root 4096  4月 25  2024 libexec/
drwxr-xr-x 6 root root 4096  4月 25  2024 loongarch64-linux-gnu/
drwxr-xr-x 5 root root 4096  4月 25  2024 share/
-rw-r--r-- 1 root root  332  4月 25  2024 versions
2.4.2 配置环境变量

配置环境变量:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ sudo vim /etc/profile

打开profile文件后,在最后添加:

shell 复制代码
#设置交叉编译工具链
export PATH=$PATH:/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/bin/

执行如下命令使配置生效:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ source /etc/profile

验证安装:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ loongarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=loongarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/bin/../libexec/gcc/loongarch64-linux-gnu/8.3.0/lto-wrapper
Target: loongarch64-linux-gnu
Configured with: /dev/shm/build-loongarch64-linux-gnu-x86_64-gcc8-rc1.3-1-20240425/src/gcc/configure 
......
Thread model: posix
gcc version 8.3.0 (LoongArch GNU toolchain rc1.3-1 (20240425))
2.5 编译移植OpenCV

参考《opencv安装及配置》安装opencv 4.9版本。

2.5.1 安装依赖
shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran libgtk2.0-dev libjpeg-dev libpng-dev ffmpeg
2.5.2 下载源码

下载安装包:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ wget -O opencv-4.10.0.tar.gz https://github.com/opencv/opencv/archive/4.10.0.tar.gz

zhengyang@ubuntu:/opt/2k0300$ ls -l opencv-4.10.0.tar.gz
-rw-rw-r-- 1 zhengyang zhengyang 94993429  3月 19 10:46 opencv-4.10.0.tar.gz

解压:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ tar -zxvf opencv-4.10.0.tar.gz
zhengyang@ubuntu:/opt/2k0300$ cd opencv-4.10.0/

# 创建build和install目录
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0$ mkdir build install
2.5.3 编译配置

配置OpenCV,启用/禁用某个配置:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0$ cd build/

zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/build$ CC=loongarch64-linux-gnu-gcc \
CXX=loongarch64-linux-gnu-g++ \
cmake .. \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=../install \
    -D CMAKE_EXE_LINKER_FLAGS="-lpthread -lrt -ldl" \
    -D BUILD_TESTS=OFF \
    -D BUILD_PERF_TESTS=OFF \
    -D BUILD_EXAMPLES=OFF \
    -D WITH_GTK=OFF \
    -D WITH_OPENMP=ON \
    -D WITH_V4L=ON \
    -D WITH_IPP=OFF \
    -D WITH_ITT=OFF \
    -D WITH_TBB=OFF

其中:

  • CMAKE_INSTALL_PREFIX:安装路径;
  • CMAKE_EXE_LINKER_FLAGS:链接线程库;
  • BUILD_TESTS:不编译测试;
  • BUILD_PERF_TESTS:不编译性能测试;
  • BUILD_EXAMPLES:不编译示例;
  • WITH_GTK:不需要GUI
  • WITH_OPENMP:开启并行优化;
  • WITH_V4L:支持摄像头;
  • WITH_IPPWITH_ITTWITH_TBB:仅对x86平台有意义。在ARM、龙芯等非Intel平台上禁用它是标准做法。

更多配置可以参考:《OpenCV 配置选项参考文档》。cmake ..之后会输出:

shell 复制代码
......
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      NO
--       avcodec:                   YES (58.134.100)
--       avformat:                  YES (58.76.100)
--       avutil:                    YES (56.70.100)
--       swscale:                   YES (5.9.100)
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            OpenMP
--
......
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /opt/2k0300/opencv-4.10.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
......
2.5.4 编译安装

编译安装:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/build$ make -j7	  
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/build$ make install

默认安装到/opt/2k0300/opencv-4.10.0/install路径下,

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/build$ ll /opt/2k0300/opencv-4.10.0/install
drwxrwxr-x  2 zhengyang zhengyang 4096  3月 19 14:12 bin/
drwxrwxr-x  3 zhengyang zhengyang 4096  3月 19 14:12 include/
drwxrwxr-x  3 zhengyang zhengyang 4096  3月 19 14:12 lib/
drwxrwxr-x  4 zhengyang zhengyang 4096  3月 19 14:12 share/

zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/build$ cd ../install

比如:

  • /opt/2k0300/opencv-4.10.0/install/include/opencv4:头文件安装目录;
  • /opt/2k0300/opencv-4.10.0/install/lib:库文件安装目录;
shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/install$ ls lib/
cmake                        libopencv_features2d.so         libopencv_highgui.so.410       libopencv_ml.so.4.10.0         libopencv_videoio.so
libopencv_calib3d.so         libopencv_features2d.so.410     libopencv_highgui.so.4.10.0    libopencv_objdetect.so         libopencv_videoio.so.410
libopencv_calib3d.so.410     libopencv_features2d.so.4.10.0  libopencv_imgcodecs.so         libopencv_objdetect.so.410     libopencv_videoio.so.4.10.0
libopencv_calib3d.so.4.10.0  libopencv_flann.so              libopencv_imgcodecs.so.410     libopencv_objdetect.so.4.10.0  libopencv_video.so
libopencv_core.so            libopencv_flann.so.410          libopencv_imgcodecs.so.4.10.0  libopencv_photo.so             libopencv_video.so.410
libopencv_core.so.410        libopencv_flann.so.4.10.0       libopencv_imgproc.so           libopencv_photo.so.410         libopencv_video.so.4.10.0
libopencv_core.so.4.10.0     libopencv_gapi.so               libopencv_imgproc.so.410       libopencv_photo.so.4.10.0
libopencv_dnn.so             libopencv_gapi.so.410           libopencv_imgproc.so.4.10.0    libopencv_stitching.so
libopencv_dnn.so.410         libopencv_gapi.so.4.10.0        libopencv_ml.so                libopencv_stitching.so.410
libopencv_dnn.so.4.10.0      libopencv_highgui.so            libopencv_ml.so.410            libopencv_stitching.so.4.10.0

zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/install$ ll include/opencv4/opencv2/
drwxrwxr-x  2 zhengyang zhengyang   4096  3月 19 14:12 calib3d/
-rw-r--r--  1 zhengyang zhengyang 225103  6月  2  2024 calib3d.hpp
drwxrwxr-x  8 zhengyang zhengyang   4096  3月 19 14:12 core/
-rw-r--r--  1 zhengyang zhengyang 157253  6月  2  2024 core.hpp
-rw-r--r--  1 zhengyang zhengyang   3200  3月 19 11:20 cvconfig.h
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 dnn/
-rw-r--r--  1 zhengyang zhengyang   3347  6月  2  2024 dnn.hpp
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 features2d/
-rw-r--r--  1 zhengyang zhengyang  73046  6月  2  2024 features2d.hpp
drwxrwxr-x  2 zhengyang zhengyang   4096  3月 19 14:12 flann/
-rw-r--r--  1 zhengyang zhengyang  28076  6月  2  2024 flann.hpp
drwxrwxr-x 15 zhengyang zhengyang   4096  3月 19 14:12 gapi/
-rw-r--r--  1 zhengyang zhengyang   1324  6月  2  2024 gapi.hpp
drwxrwxr-x  2 zhengyang zhengyang   4096  3月 19 14:12 highgui/
-rw-r--r--  1 zhengyang zhengyang  37533  6月  2  2024 highgui.hpp
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 imgcodecs/
-rw-r--r--  1 zhengyang zhengyang  28502  6月  2  2024 imgcodecs.hpp
drwxrwxr-x  4 zhengyang zhengyang   4096  3月 19 14:12 imgproc/
-rw-r--r--  1 zhengyang zhengyang 257230  6月  2  2024 imgproc.hpp
drwxrwxr-x  2 zhengyang zhengyang   4096  3月 19 14:12 ml/
-rw-r--r--  1 zhengyang zhengyang  92634  6月  2  2024 ml.hpp
drwxrwxr-x  2 zhengyang zhengyang   4096  3月 19 14:12 objdetect/
-rw-r--r--  1 zhengyang zhengyang  43093  6月  2  2024 objdetect.hpp
-rw-r--r--  1 zhengyang zhengyang   3463  6月  2  2024 opencv.hpp
-rw-r--r--  1 zhengyang zhengyang    752  3月 19 11:20 opencv_modules.hpp
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 photo/
-rw-r--r--  1 zhengyang zhengyang  38134  6月  2  2024 photo.hpp
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 stitching/
-rw-r--r--  1 zhengyang zhengyang  14712  6月  2  2024 stitching.hpp
drwxrwxr-x  4 zhengyang zhengyang   4096  3月 19 14:12 video/
-rw-r--r--  1 zhengyang zhengyang   2516  6月  2  2024 video.hpp
drwxrwxr-x  3 zhengyang zhengyang   4096  3月 19 14:12 videoio/
-rw-r--r--  1 zhengyang zhengyang  69457  6月  2  2024 videoio.hpp

接着我们随便找一个库文件,查看一下其架构信息;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/install$ file lib/libopencv_core.so.4.10.0
lib/libopencv_core.so.4.10.0: ELF 64-bit LSB shared object, LoongArch, version 1 (GNU/Linux), dynamically linked, not stripped

恭喜!这个输出说明编译成功了。file 命令显示的信息非常关键:

  • ELF 64-bit LSB shared object:这是一个标准的64位动态链接库;
  • LoongArch:明确表明该库是为龙芯LoongArch架构编译的,可以在你的2K0300上直接运行。
  • not stripped:表示调试符号未被去除,不影响使用,只是文件稍大。如果你想减小体积,之后可以用 loongarch64-linux-gnu-strip 工具去除符号。
2.5.5 在龙芯板子上部署OpenCV

打包编译结果:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/install$ ll
drwxrwxr-x  2 zhengyang zhengyang     4096  3月 19 14:12 bin/
drwxrwxr-x  3 zhengyang zhengyang     4096  3月 19 14:12 include/
drwxrwxr-x  3 zhengyang zhengyang     4096  3月 19 14:12 lib/
-rw-rw-r--  1 zhengyang zhengyang 15454239  3月 19 14:21 opencv-4.10.0-loongarch64.tar.gz
drwxrwxr-x  4 zhengyang zhengyang     4096  3月 19 14:12 share/

确保龙芯核心板和ubuntu虚拟机在同一个局域网,并且网络已通,然后传输文件到龙芯核心板;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv-4.10.0/install$ scp opencv-4.10.0-loongarch64.tar.gz root@龙芯IP:/home/root/

同样通过MobaXterm工具远程SSH登录龙芯核心板,在龙芯板子上解压安装;

shell 复制代码
zhengyang@ubuntu:~$ ssh root@龙芯IP

创建opencv目录并解压:

shell 复制代码
root@LoongOS:~$ mkdir -p /usr/local/opencv
root@LoongOS:~$ cd /usr/local/opencv
root@LoongOS:/usr/local/opencv$ tar -zxvf /home/root/opencv-4.10.0-loongarch64.tar.gz

配置动态链接库,编辑/etc/ld.so.conf,文末加入/usr/local/lib

shell 复制代码
root@LoongOS:~$ sudo vim /etc/ld.so.conf
......
/usr/local/opencv/lib

更新动态链接库缓存:

shell 复制代码
root@LoongOS:~$ sudo /sbin/ldconfig -v

验证库是否被识别:

shell 复制代码
root@LoongOS:~$ ldconfig -p | grep opencv
2.5.6 编写测试程序验证OpenCV

ubuntu虚拟机中编写测试代码,在2K0300目录下创建子目录:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ mkdir opencv_test
zhengyang@ubuntu:/opt/2k0300$ cd opencv_test/

创建一个测试文件test_opencv.cpp

c 复制代码
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

int main() {
    // 打印OpenCV版本
    std::cout << "OpenCV version: " << CV_VERSION << std::endl;
    
    // 创建一个100x100的绿色图像
    cv::Mat testMat(100, 100, CV_8UC3, cv::Scalar(0, 255, 0));
    std::cout << "Test matrix created, size: " << testMat.size() << std::endl;
    
    // 如果有摄像头,尝试打开
    cv::VideoCapture cap(0);
    if(cap.isOpened()) {
        std::cout << "Camera opened successfully" << std::endl;
        cap.release();
    } else {
        std::cout << "No camera detected" << std::endl;
    }
    
    return 0;
}

交叉编译测试程序:

shell 复制代码
# 使用交叉编译器编译
zhengyang@ubuntu:/opt/2k0300/opencv_test$ loongarch64-linux-gnu-g++ test_opencv.cpp -o test_opencv \
    -I/opt/2k0300/opencv-4.10.0/install/include/opencv4 \
    -L/opt/2k0300/opencv-4.10.0/install/lib \
    -lopencv_videoio \
    -lopencv_highgui \
    -lopencv_imgproc \
    -lopencv_imgcodecs \
    -lopencv_core \
    -lpthread -lrt -ldl

zhengyang@ubuntu:/opt/2k0300/opencv_test$ ll
-rwxrwxr-x 1 zhengyang zhengyang 22520  3月 19 14:48 test_opencv*
-rw-rw-r-- 1 zhengyang zhengyang   686  3月 19 14:43 test_opencv.cpp

# 查看编译出的文件信息
zhengyang@ubuntu:/opt/2k0300/opencv_test$ file test_opencv
test_opencv: ELF 64-bit LSB executable, LoongArch, version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 4.15.0, not stripped

传输测试程序到龙芯核心板:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/opencv_test$ scp test_opencv root@你的龙芯IP:/home/root/

在龙芯板子上运行测试:

shell 复制代码
# SSH登录龙芯板子
zhengyang@ubuntu:/opt/2k0300/opencv_test$ ssh root@你的龙芯IP

# 运行测试程序
root@LoongOS:~$ ./test_opencv

如果看到类似下面的输出,说明OpenCV已经成功运行在龙芯平台上:

shell 复制代码
OpenCV version: 4.10.0
Test matrix created, size: [100 x 100]
Camera opened successfully

三、镜像制作

3.1 新世界

龙芯系统有两套不兼容的LoongArch生态,核心差异在底层标准、内核、软件兼容、发行版、使用场景 。

龙芯的旧世界(ABI 1.0)和新世界(ABI 2.0)是两套不兼容的软件生态体系。简单来说,旧世界是龙芯早期仓促推出的、未能完全融入开源主线的"过渡方案";而新世界则是龙芯与开源社区合力打造的、代表现在与未来的"标准方案"。

3.1.1 新旧世界对比
对比维度 旧世界 (ABI 1.0) 新世界 (ABI 2.0)
内核版本 4.19 及更早版本 较新版本内核,主流为 6.x
固件 (固件) 基于旧版UEFI,使用BPI结构体传递信息 基于标准UEFI,使用系统表传递信息
内核镜像格式 ELF格式,需旧版GRUB引导 EFI Stub (PE格式),可直接由UEFI固件引导
代表性系统 麒麟、UOS V20、Loongnix 20 Arch Linux、Debian、deepin v25、OpenEuler
开源程度 部分底层代码未开放,难以二次开发 完全开源,可完整融入上游社区
生态与软件 有现成商业软件(如微信、QQ旧版),但版本老旧 软件正在适配,可通过 libLoL 兼容运行旧世界软件
3.1.2 BSP 2.0

久久派2K0300核心板默认配套的是PMON固件以及linux 4.19的内核,在后面我们会将其升级为新世纪版本,升级的源码来源官方仓库《 Docs-2K0300》。该仓库有两个BSP

软件 BSP1.0 BSP2.0
u-boot u-boot 2022.04 u-boot 2022.04
linux linux 5.10 linux 6.12
rootfs buildroot 2021.02、openwrt 22.03、openharmony 4.1/5.1 buildroot 2024.08、alpine linux 3.21、openwrt 24.10、openeuler embedded 24.03、openharmony 6.0
cross-toolchain gcc-8.3 gcc-13.3
开发环境(推荐) ubuntu 18.04 or ubuntu 20.04 ubuntu 22.04 or ubuntu 24.04

这里我们使用BSP2.0,相关资料如下:

3.2 build-2k0300

build-2k030仓库可以快速搭建龙芯2k0300开发环境,下载源码:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300$ git clone https://gitee.com/open-loongarch/build-2k0300.git
zhengyang@ubuntu:/opt/2k0300$ cd build-2k0300/
zhengyang@ubuntu:/opt/2k0300/build-2k0300$ ll
-rw-rw-r-- 1 zhengyang zhengyang  847  3月 19 19:42 README.en.md
-rw-rw-r-- 1 zhengyang zhengyang  374  3月 19 19:42 README.md
-rwxrwxr-x 1 zhengyang zhengyang  404  3月 19 19:42 set_env.sh*
-rwxrwxr-x 1 zhengyang zhengyang 1568  3月 19 19:42 start.sh*

运行以下命令拉取u-bootkernelbuildroot源码与交叉工具链:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300$ ./start.sh
+ '[' '!' -e workspace ']'
+ mkdir workspace
+ cd workspace
+ echo '===================install some packages=================='
===================install some packages==================
+ sudo apt update
......

下载完成后查看workspace目录:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300$ ll workspace/
drwxrwxr-x 19 zhengyang zhengyang 4096  3月 19 19:49 buildroot-2024.08/
drwxrwxr-x  5 zhengyang zhengyang 4096  3月 19 19:50 cross-toolchain/
drwxrwxr-x 27 zhengyang zhengyang 4096  3月 19 19:49 linux-6.12/
-rw-rw-r--  1 zhengyang zhengyang  404  3月 19 19:50 set_env.sh
drwxrwxr-x 25 zhengyang zhengyang 4096  3月 19 19:46 u-boot/
3.2.1 start.sh源码

start.sh脚本用于快速获取并配置交叉编译工具链、u-boot、内核源码以及Buildroot

shell 复制代码
#!/bin/bash

set -ex

if [ ! -e workspace ]; then
	mkdir workspace
fi

cd workspace

echo "===================install some packages=================="
sudo apt update
sudo apt install -y git vim openssh-server
sudo apt install -y build-essential make gcc g++ bison flex libssl-dev libelf-dev cmake pigz 

echo "===================get u-boot==============================="
if [ ! -e u-boot ]; then
	git clone https://gitee.com/open-loongarch/u-boot.git
fi
echo "===================get kernel==============================="
if [ ! -e linux-6.12 ]; then
	git clone https://gitee.com/open-loongarch/linux-6.12.git
fi
echo "===================get buildroot==============================="
if [ ! -e buildroot-2024.08 ]; then
	git clone https://gitee.com/open-loongarch/buildroot-2024.08.git
fi
echo "===================get cross toolchain==============================="
if [ ! -e cross-toolchain ]; then
	git clone https://gitee.com/open-loongarch/cross-toolchain.git
fi
#wget https://gitee.com/open-loongarch/cross-toolchain/raw/master/gcc-13/loongarch64-linux-gnu-gcc13.3.tar.xz
#wget https://gitee.com/open-loongarch/cross-toolchain/raw/master/gcc-13/loongarch64-linux-gnu-gcc13.3.tar.xz.md5

pushd cross-toolchain/gcc-13

md5sum -c loongarch64-linux-gnu-gcc13.3.tar.xz.md5
if [ $? -eq 0 ] ; then
	sudo tar xf loongarch64-linux-gnu-gcc13.3.tar.xz -C /opt
	echo "toolchain decompress success."
else
	echo "toolchain not incomplete, please try again."
fi

popd

if [ ! -e set_env.sh ]; then
	wget https://gitee.com/open-loongarch/build-2k0300/raw/master/set_env.sh
fi
3.2.2 start.sh分析
步骤 操作 说明
1. 准备工作区 创建 workspace目录并进入 所有下载的源码都会放在这个目录下,保持整洁。
2. 安装系统依赖 apt install 一系列包 包括编译工具(build-essential)、版本控制(git)、编辑器(vim)、SSH 服务、SSL 开发库、CMake 等。这些是编译内核、U-Boot 和 Buildroot 所必需的。
3. 获取 U-Boot 源码 克隆 open-loongarch/u-boot.git 这是龙芯平台的 U-Boot 引导程序源码。
4. 获取内核源码 克隆 open-loongarch/linux-6.12.git 内核版本为 6.12
5. 获取 Buildroot 克隆 open-loongarch/buildroot-2024.08.git Buildroot 是一个用来构建嵌入式 Linux 系统的工具,可以自动生成交叉编译工具链、根文件系统、内核和 bootloader。
6. 下载交叉编译工具链 从 Loongnix 下载 gcc13 工具链(13版本) 工具链是 x86 主机上编译 LoongArch 程序的关键。脚本会下载 .tar.xz 包及其 MD5 校验文件,验证完整性后解压到 /opt,并创建一个符号链接 /opt/loongarch64-linux-gnu-gcc13.3 指向具体版本目录,方便 Buildroot 等工具引用。
7. 下载环境设置脚本 获取 set_env.sh 用于设置交叉编译所需的环境变量(如 PATHCROSS_COMPILE 等),方便后续手动编译。
3.2.3 set_env.sh
shell 复制代码
#!/bin/bash

set -ex

function setup_loongarch_env()
{
        echo "====>setup env for LoongArch..."
        CC_PREFIX=/opt/loongarch64-linux-gnu-gcc13.3

        export PATH=$CC_PREFIX/bin:$PATH
        export LD_LIBRARY_PATH=$CC_PREFIX/lib:$LD_LIBRARY_PATH
        export LD_LIBRARY_PATH=$CC_PREFIX/loongarch64-linux-gnu/lib64:$LD_LIBRARY_PATH

        export ARCH=loongarch
        export CROSS_COMPILE=loongarch64-linux-gnu-
}

setup_loongarch_env
3.3 编译uboot
3.3.1 下载源码

源码位于《https://gitee.com/open-loongarch/u-boot.git》,版本为u-boot 2022.04,前面我们已经下载了;

shell 复制代码
zhengyang@ubuntu:/optcfbuild-2k0300$ ll workspace/u-boot/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 api/
drwxrwxr-x  16 zhengyang zhengyang   4096  3月 19 19:46 arch/
drwxrwxr-x 172 zhengyang zhengyang   4096  3月 19 19:46 board/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 boot/
-rwxrwxr-x   1 zhengyang zhengyang    622  3月 19 19:46 buildenv.sh*
drwxrwxr-x   9 zhengyang zhengyang   4096  3月 19 19:46 cmd/
drwxrwxr-x   5 zhengyang zhengyang   4096  3月 19 19:46 common/
-rw-rw-r--   1 zhengyang zhengyang   2198  3月 19 19:46 config.mk
drwxrwxr-x   2 zhengyang zhengyang  65536  3月 19 19:46 configs/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 disk/
drwxrwxr-x  19 zhengyang zhengyang   4096  3月 19 19:46 doc/
drwxrwxr-x  71 zhengyang zhengyang   4096  3月 19 19:46 drivers/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 dts/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 env/
drwxrwxr-x   4 zhengyang zhengyang   4096  3月 19 19:46 examples/
drwxrwxr-x  15 zhengyang zhengyang   4096  3月 19 19:46 fs/
drwxrwxr-x   8 zhengyang zhengyang   4096  3月 19 19:46 .git/
drwxrwxr-x  35 zhengyang zhengyang  20480  3月 19 19:46 include/
-rw-rw-r--   1 zhengyang zhengyang    783  3月 19 19:46 Kbuild
-rw-rw-r--   1 zhengyang zhengyang  16610  3月 19 19:46 Kconfig
drwxrwxr-x  24 zhengyang zhengyang   4096  3月 19 19:46 lib/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 Licenses/
-rw-rw-r--   1 zhengyang zhengyang  36667  3月 19 19:46 MAINTAINERS
-rw-rw-r--   1 zhengyang zhengyang  83272  3月 19 19:46 Makefile
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:46 net/
drwxrwxr-x   5 zhengyang zhengyang   4096  3月 19 19:46 post/
-rw-rw-r--   1 zhengyang zhengyang 135222  3月 19 19:46 README
drwxrwxr-x   6 zhengyang zhengyang   4096  3月 19 19:46 scripts/
-rwxrwxr-x   1 zhengyang zhengyang   1420  3月 19 19:46 set_env.sh*
drwxrwxr-x  15 zhengyang zhengyang   4096  3月 19 19:46 test/
drwxrwxr-x  15 zhengyang zhengyang   4096  3月 19 19:46 tools/
3.3.2 配置

uboot的编译分为两步:配置、编译。单板的默认配置在configs目录下,这里根据我们实际使用的板子进行选择;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ ll configs/*2k*
-rw-rw-r-- 1 zhengyang zhengyang 4727  3月 19 19:46 configs/loongson_2k1000_dp_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4495  3月 19 19:46 configs/loongson_2k300_99pi_tf_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4499  3月 19 19:46 configs/loongson_2k300_99pi_wifi_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4483  3月 19 19:46 configs/loongson_2k300_atk_dl2k0300b_v01_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4586  3月 19 19:46 configs/loongson_2k300_gongkong_gbkpgk0_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4495  3月 19 19:46 configs/loongson_2k300_mini_dp_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4621  3月 19 19:46 configs/loongson_2k300_pai_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 4435  3月 19 19:46 configs/loongson_2k500_mini_dp_defconfig

比如:

shell 复制代码
先锋派        configs/loongson_2k300_pai_defconfig
蜂鸟板        configs/loongson_2k300_mini_dp_defconfig 
久久派(tf)   configs/loongson_2k300_99pi_tf_defconfig

这里我们使用久久派的核心板,选择configs/loongson_2k300_99pi_wifi_defconfig;执行如下命令,生成.config文件:

shell 复制代码
# 彻底清理所有配置和编译产物
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ make distclean 
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ source ../set_env.sh && make loongson_2k300_99pi_wifi_defconfig V=1

如果我们想做一些配置的修改,可以参考《Rockchip RK3399 - TPL/SPL方式加载uboot》。

3.3.3 编译

执行make命令,生成u-boot文件:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ source ../set_env.sh && make 
......
  LD      spl/u-boot-spl
  OBJCOPY spl/u-boot-spl-nodtb.bin
mkdir -p spl/dts/
  FDTGREP spl/dts/dt-spl.dtb
  COPY    spl/u-boot-spl.dtb
  CAT     spl/u-boot-spl-dtb.bin
  COPY    spl/u-boot-spl.bin
  SYM     spl/u-boot-spl.sym
  MKIMAGE u-boot.img
  COPY    u-boot.dtb
  MKIMAGE u-boot-dtb.img
  CAT     u-boot-with-spl.bin
  CFGCHK  u-boot.cfg
  OFCHK   .config

uboot根录下生成文件有:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ ll u-boot*   Sys*
+ ls --color=auto -alF u-boot u-boot.bin u-boot.cfg u-boot.cfg.configs u-boot.dtb u-boot-dtb.bin u-boot-dtb.img u-boot.img u-boot.lds u-boot.map u-boot-nodtb.bin u-boot.srec u-boot.sym u-boot-with-spl.bin System.map
-rw-rw-r-- 1 zhengyang zhengyang  105909  3月 19 20:31 System.map
-rwxrwxr-x 1 zhengyang zhengyang 1029832  3月 19 20:31 u-boot*
-rw-rw-r-- 1 zhengyang zhengyang  762423  3月 19 20:31 u-boot.bin
-rw-rw-r-- 1 zhengyang zhengyang   15540  3月 19 20:28 u-boot.cfg
-rw-rw-r-- 1 zhengyang zhengyang    9438  3月 19 20:31 u-boot.cfg.configs
-rw-rw-r-- 1 zhengyang zhengyang    8647  3月 19 20:31 u-boot.dtb
-rw-rw-r-- 1 zhengyang zhengyang  762423  3月 19 20:31 u-boot-dtb.bin
-rw-rw-r-- 1 zhengyang zhengyang  762487  3月 19 20:31 u-boot-dtb.img
-rw-rw-r-- 1 zhengyang zhengyang  762487  3月 19 20:31 u-boot.img
-rw-rw-r-- 1 zhengyang zhengyang    1044  3月 19 20:31 u-boot.lds
-rw-rw-r-- 1 zhengyang zhengyang  868565  3月 19 20:31 u-boot.map
-rwxrwxr-x 1 zhengyang zhengyang  753776  3月 19 20:31 u-boot-nodtb.bin*
-rwxrwxr-x 1 zhengyang zhengyang 2261458  3月 19 20:31 u-boot.srec*
-rw-rw-r-- 1 zhengyang zhengyang  208415  3月 19 20:31 u-boot.sym
-rw-rw-r-- 1 zhengyang zhengyang  940876  3月 19 20:31 u-boot-with-spl.bin

由于开启了SPL,因此,在编译uboot时会额外单独编译SPL,编译产生的镜像文件就存放在./spl下。这下面的镜像生成方式与uboot基本是一模一样的。

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ ls spl
arch   boot  common  drivers  env  include  u-boot.cfg  u-boot-spl.bin  u-boot-spl-dtb.bin  u-boot-spl.map        u-boot-spl-pad.bin
board  cmd   disk    dts      fs   lib      u-boot-spl  u-boot-spl.dtb  u-boot-spl.lds      u-boot-spl-nodtb.bin  u-boot-spl.sym

这里我们稍微提一下TPL SPLTPLSPLuboot中为了应对复杂启动环境而设计的多级引导加载程序 。可以把整个启动过程想象成一场接力赛,每个Loader都是其中一棒,负责完成特定的初始化任务,然后将"接力棒"(执行权)交给下一棒。

启动阶段 通俗比喻 核心任务 运行环境限制 对应产物
BootROM 发令枪 芯片出厂固化的程序,上电即运行。它会进行最基本的检查,并从预定义的介质(如SD卡、eMMC、SPI Flash)中加载并执行下一段代码(通常是 SPL 或 TPL)。 容量极小(KB级别),不可修改。 固化在芯片内部
TPL (Tertiary Program Loader) 侦察兵 极早期初始化。它存在的唯一原因是,在某些复杂的芯片上,连SPL都显得太大了 。TPL的任务极其精简,例如仅初始化基本的时钟和一小部分内存,为加载稍大一些的SPL铺平道路。 容量要求比BootROM稍大,但仍然非常小(例如16KB以内),通常运行在芯片内部 SRAM中。 u-boot-tpl.bin
SPL (Secondary Program Loader) 工兵 关键初始化与加载 。这是最常见的一级loader。它的主要任务是初始化系统主内存(如DDR) ,然后从存储设备(如eMMC、SD卡)中将完整功能的 U-Boot proper加载到内存中。 容量有严格限制(例如 64KB 左右),运行在内部SRAM或刚初始化好的内存中。 u-boot-spl.bin
U-Boot proper 主力部队 完整引导与管理。这就是我们通常说的uboot,拥有完整的命令行、文件系统驱动、网络协议栈等丰富功能。它负责加载并启动操作系统内核(如 Linux)。 容量较大(几百KB甚至更大),运行在完整的主内存(DDR)中。 u-boot.binu-boot.img

芯片刚上电时,内部资源非常有限(只有一小块SRAM可用),无法直接运行功能复杂的uboot。因此,必须通过一个或两个"轻量级"的加载程序,先把最基本的环境(尤其是内存)搭建好,才能把"大部队"请进来。

3.3.4 u-boot-with-spl.bin

u-boot-with-spl.bin是我们后续烧录要用到的二进制文件,其生

成命令位于.u-boot-with-spl.bin.cmd文件:

shell 复制代码
loongarch64-linux-gnu-objcopy --gap-fill=0xff -O elf64-loongarch -I binary -O binary --pad-to=0 spl/u-boot-spl.bin u-boot-with-spl.bin
cat u-boot.img >> u-boot-with-spl.bin || { rm -f u-boot-with-spl.bin; false; }

其中:

  • 第一步使用objcopy 处理SPL,实际效果相当于 cp spl/u-boot-spl.bin u-boot-with-spl.bin,但通过 objcopy 保留了将来可能的填充需求;
  • 第二步将 u-boot.img 的内容追加到 u-boot-with-spl.bin 的末尾。

最终生成的 u-boot-with-spl.bin 就包含了SPL + 主uboot的完整内容。这样烧录到板子上后,启动流程就是:当芯片上电,内置的BootROM会从这个NOR Flash的固定位置读取 u-boot-spl.binTCM中执行,SPL初始化内存后,再从 NOR Flash的后续位置加载完整的u-boot.img到内存中,最后跳转到uboot执行。

更多细节可以参考:《U-Boot源码解析(龙芯版)_1.pdf》。

3.3.5 复制mkimage

复制mkimage 到/usr/bin, 后面编译内核时需要用到;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ cd tools/
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot/tools$ sudo cp mkimage /usr/bin/
3.4 编译内核
3.4.1 源码下载

源码位于《clone https://gitee.com/open-loongarch/linux-6.12.git》,版本为linux-6.12.git,前面我们已经下载了;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300$ ll workspace/linux-6.12/
drwxrwxr-x  23 zhengyang zhengyang   4096  3月 19 19:48 arch/
drwxrwxr-x   3 zhengyang zhengyang   4096  3月 19 19:48 block/
-rwxrwxr-x   1 zhengyang zhengyang    640  3月 19 19:48 buildenv.sh*
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:48 certs/
-rw-rw-r--   1 zhengyang zhengyang  22878  3月 19 19:48 .clang-format
-rw-rw-r--   1 zhengyang zhengyang     59  3月 19 19:48 .cocciconfig
-rw-rw-r--   1 zhengyang zhengyang    496  3月 19 19:48 COPYING
-rw-rw-r--   1 zhengyang zhengyang 105095  3月 19 19:48 CREDITS
drwxrwxr-x   4 zhengyang zhengyang   4096  3月 19 19:48 crypto/
drwxrwxr-x  75 zhengyang zhengyang   4096  3月 19 19:48 Documentation/
drwxrwxr-x 143 zhengyang zhengyang   4096  3月 19 19:48 drivers/
-rw-rw-r--   1 zhengyang zhengyang    575  3月 19 19:48 .editorconfig
drwxrwxr-x  81 zhengyang zhengyang   4096  3月 19 19:49 fs/
-rw-rw-r--   1 zhengyang zhengyang    194  3月 19 19:48 .get_maintainer.ignore
drwxrwxr-x   8 zhengyang zhengyang   4096  3月 19 19:49 .git/
-rw-rw-r--   1 zhengyang zhengyang    105  3月 19 19:48 .gitattributes
-rw-rw-r--   1 zhengyang zhengyang   2174  3月 19 19:48 .gitignore
drwxrwxr-x  32 zhengyang zhengyang   4096  3月 19 19:49 include/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:49 init/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:49 io_uring/
drwxrwxr-x   2 zhengyang zhengyang   4096  3月 19 19:49 ipc/
-rw-rw-r--   1 zhengyang zhengyang   2573  3月 19 19:48 Kbuild
-rw-rw-r--   1 zhengyang zhengyang    555  3月 19 19:48 Kconfig
drwxrwxr-x  22 zhengyang zhengyang   4096  3月 19 19:49 kernel/
drwxrwxr-x  20 zhengyang zhengyang  12288  3月 19 19:49 lib/
drwxrwxr-x   6 zhengyang zhengyang   4096  3月 19 19:48 LICENSES/
-rw-rw-r--   1 zhengyang zhengyang  42849  3月 19 19:48 .mailmap
-rw-rw-r--   1 zhengyang zhengyang 783429  3月 19 19:48 MAINTAINERS
-rw-rw-r--   1 zhengyang zhengyang  68756  3月 19 19:48 Makefile
drwxrwxr-x   6 zhengyang zhengyang   4096  3月 19 19:49 mm/
drwxrwxr-x  72 zhengyang zhengyang   4096  3月 19 19:49 net/
-rw-rw-r--   1 zhengyang zhengyang    726  3月 19 19:48 README
drwxrwxr-x   7 zhengyang zhengyang   4096  3月 19 19:49 rust/
-rw-rw-r--   1 zhengyang zhengyang    369  3月 19 19:48 .rustfmt.toml
drwxrwxr-x  42 zhengyang zhengyang   4096  3月 19 19:49 samples/
drwxrwxr-x  19 zhengyang zhengyang  12288  3月 19 19:49 scripts/
drwxrwxr-x  15 zhengyang zhengyang   4096  3月 19 19:49 security/
-rw-rw-r--   1 zhengyang zhengyang   1060  3月 19 19:49 set_env.sh
drwxrwxr-x  27 zhengyang zhengyang   4096  3月 19 19:49 sound/
drwxrwxr-x  45 zhengyang zhengyang   4096  3月 19 19:49 tools/
drwxrwxr-x   4 zhengyang zhengyang   4096  3月 19 19:49 usr/
drwxrwxr-x   4 zhengyang zhengyang   4096  3月 19 19:49 virt/
3.4.2 配置内核

内核的编译分为两步:配置、编译。单板的默认配置在arch/loongarch/configs目录下;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/linux-6.12$ ll arch/loongarch/configs/*2k*
-rw-rw-r-- 1 zhengyang zhengyang 21401  3月 19 19:48 arch/loongarch/configs/loongson_2k1000_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 21327  3月 19 19:48 arch/loongarch/configs/loongson_2k300_defconfig
-rw-rw-r-- 1 zhengyang zhengyang 21217  3月 19 19:48 arch/loongarch/configs/loongson_2k300_rt_defconfig

选择loongson_2k300_defconfig,执行如下命令,生成.config文件:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/u-boot$ source ../set_env.sh && make loongson_2k300_defconfig V=1

如果我们想做一些内核的裁切,可以参考《Rockchip RK3399 - 移植uboot 2023.04 & linux 6.3》。

3.4.3 编译内核

linux内核根目录下执行如下命令:

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/linux-6.12$ source ../set_env.sh && make uImage -j$(nproc)

......
mkdir -p /opt/2k0300/build-2k0300/workspace/linux-6.12/tools/objtool && make O=/opt/2k0300/build-2k0300/workspace/linux-6.12 subdir=tools/objtool --no-print-directory -C objtool
  CALL    scripts/checksyscalls.sh
  INSTALL libsubcmd_headers
  UIMAGE  arch/loongarch/boot/uImage.gz
Image Name:   Linux-6.12.0.lsgd+
Created:      Thu Mar 19 22:13:57 2026
Image Type:   LoongArch Linux Kernel Image (gzip compressed)
Data Size:    10361077 Bytes = 10118.24 KiB = 9.88 MiB
Load Address: 00200000
Entry Point:  00f33000
  Image arch/loongarch/boot/uImage is ready

编译规则定义在arch/loongarch/Makefile文件,在arch/loongarch/Makefile文件;

makefile 复制代码
vmlinux.elf vmlinux.efi vmlinuz.efi uImage: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@

其中:

  • 目标(targets)vmlinux.elf, vmlinux.efi, vmlinuz.efi, uImage 这四个文件都是需要生成的目标;
  • 依赖(prerequisite) :它们都依赖于 vmlinux(即必须先完成内核主体 vmlinux 的链接);
  • 命令(recipe)$(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@
    • $(Q) 通常是一个控制静默输出的变量(@ 或空);
    • $(MAKE) 调用make命令;
    • $(build)=$(boot) 是内核构建系统的一个惯用法,表示进入 $(boot) 目录(通常是 arch/$(ARCH)/boot)并执行那里的 Makefile
    • $(bootvars-y) 是一些传递给子make的变量(如架构相关的编译选项)。
    • $(boot)/$@ 指定子make的目标为当前目标在 $(boot) 目录下的对应文件(例如对于 uImage,会去构建 arch/$(ARCH)/boot/uImage);

编译成功之后在arch/loongarch/boot/下生成了uImage

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/linux-6.12$ ll arch/loongarch/boot/
drwxrwxr-x  2 zhengyang zhengyang     4096  3月 19 21:54 dts/
-rw-rw-r--  1 zhengyang zhengyang       58  3月 19 19:48 .gitignore
-rwxrwxr-x  1 zhengyang zhengyang     1244  3月 19 19:48 install.sh*
-rw-rw-r--  1 zhengyang zhengyang     2058  3月 19 19:48 Makefile
lrwxrwxrwx  1 zhengyang zhengyang        9  3月 19 22:13 uImage -> uImage.gz
-rw-rw-r--  1 zhengyang zhengyang 10361141  3月 19 22:13 uImage.gz
-rw-rw-r--  1 zhengyang zhengyang      245  3月 19 22:13 .uImage.gz.cmd
-rwxrwxr-x  1 zhengyang zhengyang 28246016  3月 19 22:07 vmlinux.bin*
-rw-rw-r--  1 zhengyang zhengyang      219  3月 19 22:07 .vmlinux.bin.cmd
-rw-rw-r--  1 zhengyang zhengyang 10361077  3月 19 22:07 vmlinux.bin.gz
-rw-rw-r--  1 zhengyang zhengyang      136  3月 19 22:07 .vmlinux.bin.gz.cmd
-rwxrwxr-x  1 zhengyang zhengyang 27213824  3月 19 22:07 vmlinux.efi*
-rw-rw-r--  1 zhengyang zhengyang      239  3月 19 22:07 .vmlinux.efi.cmd

有关内核镜像格式ImagezImageuImage可以参考《Mini2440uboot移植流程之linux内核启动分析(六)》。

3.5 编译Buildroot

更多有关Buildroot文件系统的内容参考《Rockchip RK3588 - Rockchip Linux SDK Buildroot文件系统构建》。

3.5.1 源码下载

源码位于《https://gitee.com/open-loongarch/buildroot-2024.08.git》,版本为buildroot-2024.08,前面我们已经下载了;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace$ ll buildroot-2024.08/
drwxrwxr-x    2 zhengyang zhengyang   4096  3月 19 19:49 arch/
-rw-rw-r--    1 zhengyang zhengyang    224  3月 19 19:49 .b4-config
drwxrwxr-x   83 zhengyang zhengyang   4096  3月 19 19:49 board/
drwxrwxr-x   22 zhengyang zhengyang   4096  3月 19 19:49 boot/
-rwxrwxr-x    1 zhengyang zhengyang    630  3月 19 19:49 buildenv.sh*
-rw-rw-r--    1 zhengyang zhengyang 573461  3月 19 19:49 CHANGES
-rw-rw-r--    1 zhengyang zhengyang 112456  3月 19 19:49 .checkpackageignore
-rw-rw-r--    1 zhengyang zhengyang  17276  3月 19 19:49 .clang-format
-rw-rw-r--    1 zhengyang zhengyang  31703  3月 19 19:49 Config.in
-rw-rw-r--    1 zhengyang zhengyang 175069  3月 19 19:49 Config.in.legacy
drwxrwxr-x    2 zhengyang zhengyang  20480  3月 19 19:49 configs/
-rw-rw-r--    1 zhengyang zhengyang  18767  3月 19 19:49 COPYING
-rw-rw-r--    1 zhengyang zhengyang   1198  3月 19 19:49 .defconfig
-rw-rw-r--    1 zhengyang zhengyang  90428  3月 19 19:49 DEVELOPERS
drwxrwxr-x    2 zhengyang zhengyang   4096  3月 19 19:49 dl/
drwxrwxr-x    5 zhengyang zhengyang   4096  3月 19 19:49 docs/
-rw-rw-r--    1 zhengyang zhengyang    561  3月 19 19:49 .editorconfig
-rw-rw-r--    1 zhengyang zhengyang     96  3月 19 19:49 .flake8
drwxrwxr-x   20 zhengyang zhengyang   4096  3月 19 19:49 fs/
drwxrwxr-x    8 zhengyang zhengyang   4096  3月 19 19:49 .git/
drwxrwxr-x    3 zhengyang zhengyang   4096  3月 19 19:49 .github/
-rw-rw-r--    1 zhengyang zhengyang    134  3月 19 19:49 .gitignore
drwxrwxr-x    3 zhengyang zhengyang   4096  3月 19 19:49 .gitlab/
-rw-rw-r--    1 zhengyang zhengyang    814  3月 19 19:49 .gitlab-ci.yml
drwxrwxr-x    3 zhengyang zhengyang   4096  3月 19 19:49 linux/
-rw-rw-r--    1 zhengyang zhengyang  46727  3月 19 19:49 Makefile
-rw-rw-r--    1 zhengyang zhengyang   2292  3月 19 19:49 Makefile.legacy
drwxrwxr-x 2937 zhengyang zhengyang  69632  3月 19 19:49 package/
drwxrwxr-x    2 zhengyang zhengyang   4096  3月 19 19:49 qt_test/
-rw-rw-r--    1 zhengyang zhengyang   1075  3月 19 19:49 README
-rw-rw-r--    1 zhengyang zhengyang      0  3月 19 19:49 .shellcheckrc
drwxrwxr-x   13 zhengyang zhengyang   4096  3月 19 19:49 support/
drwxrwxr-x    3 zhengyang zhengyang   4096  3月 19 19:49 system/
drwxrwxr-x    6 zhengyang zhengyang   4096  3月 19 19:49 toolchain/
drwxrwxr-x    4 zhengyang zhengyang   4096  3月 19 19:49 utils/

dl目录存放从互联网下载的源代码及应用软件的压缩包,比如zipglicbusyboxalsa-libalsa-plugins等,这里我们直接将包拷贝过来。

从网盘中 04-文件系统-->buildroot->源码中下载dl压缩包,链接: https://pan.baidu.com/s/1FZcnFcmTGd5GcyP8ayFm5A?pwd=1234

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/buildroot-2024.08$ tar -xvf buildroot-2024.08-dl.efb8dc7-build.20250213090211.tar.xz -C dl/ --strip-components 1
3.5.2 配置

同内核编译有点类似,首先需要选择一个单板的配置,单板的默认配置在configs目录下;

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/buildroot-2024.08$ ll configs/ | grep 2k
-rw-rw-r--  1 zhengyang zhengyang  8132  3月 19 19:49 loongarch64_2k1000_defconfig
-rw-rw-r--  1 zhengyang zhengyang  9799  3月 19 19:49 loongarch64_2k300_all_defconfig
-rw-rw-r--  1 zhengyang zhengyang  9701  3月 19 19:49 loongarch64_2k300_all_gcc14_defconfig
-rw-rw-r--  1 zhengyang zhengyang  8146  3月 19 19:49 loongarch64_2k300_defconfig
-rw-rw-r--  1 zhengyang zhengyang  8472  3月 19 19:49 loongarch64_2k300_opecv4_defconfig
-rw-rw-r--  1 zhengyang zhengyang  7978  3月 19 19:49 loongarch64_2k300_qt6_defconfig
-rw-rw-r--  1 zhengyang zhengyang  6821  3月 19 19:49 loongarch64_2k500_defconfig

选择loongarch64_2k300_defconfig

shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/buildroot-2024.08$ make loongarch64_2k300_defconfig
......
# configuration written to /home/loongson/workspace/buildroot/.config
3.5.3 编译
shell 复制代码
zhengyang@ubuntu:/opt/2k0300/build-2k0300/workspace/buildroot-2024.08$ make -j$(nproc)

编译成功后在output/images 下会生成rootfs.tar.gzrootfs.img 文件;

3.6 编译驱动

下载驱动代码:

shell 复制代码
git clone https://gitee.com/lq-tech/Loongson_2k300_301_Library.git

注意:这里的驱动默认使用的是kernel 4.19,因此要移植到kernel 6.12

加载模块:

shell 复制代码
insmod hello.ko

查看已加载的模块

shell 复制代码
lsmod

卸载模块

shell 复制代码
rmmod hello

查看模式信息

shell 复制代码
modinfo hello.ko

查看内核日志,可以看到加载的模块所打印的日志信息

shell 复制代码
dmesg

四、更新固件

久久派2K0300核心板默认配套的是PMON固件以及linux 4.19的内核,这里我们打算将其替换换为uboot以及linux 6.12版本。

4.1 刷写uboot

uboot烧写参考资料:

4.1.1 准备工作

2K0300开发板串口连接到电脑,然后打开电脑的MobaXterm,选择串口端口,设置波特率1152008位数据位,1位停止位。

确保开发板和电脑在一个局域网,可以通过路由器连接实现。

4.1.2 搭建tftp服务器

由于我们要通过PMON中更新PMON固件,首先需要在我们的ubuntu虚拟机搭建一个tftp服务器,具体可以参考《嵌入式Linux开发环境搭建》,这里我在/opt 目录下创建一个子目录tftpboot;

shell 复制代码
zhengyang@ubuntu:/opt$ mkdir tftpboot

并按照教程中进行 搭建tftp服务器,我们需要将我们的固件u-boot-with-spl.bin放在这个目录下。

4.1.3 进入PMON命令行

2K0300开发板复位上电,通过串口打印输出:

疯狂按c进入进入PMON命令行模式;

直到出现 PMON> 提示符,首先给开发板配置一个与tftp服务器同网段的IP地址:

shell 复制代码
PMON> ifaddr syn0 172.23.34.188
PMON> ping 172.23.34.187

IP设置为172.23.34.188 。这样,开发板 (172.23.34.188) 和ubuntu虚拟机 (172.23.34.187) 就在同一个网段上,可以开始传文件刷机了。

4.1.4 烧录

tftp服务器下载指定的固件文件(u-boot-with-spl.bin),并直接将其烧录到当前开发板的引导闪存SPI Flash的起始位置:

shell 复制代码
PMON> fload tftp://172.23.34.187/u-boot-with-spl.bin

此过程中,务必保持板卡通电,严禁断电。耐心等待加载及烧录完成,直至界面依次出现Erase end!Programming end

Verifying FLASH所有提示,且PMON命令行再次出现,即表示PMON烧录完成。

按开发板重启按钮,等待终端出现大大的LOONGSONSOC#字样说明更新uboot固件成功。

4.2 更新内核和rootfs
4.2.1 网络启动系统

uboot启动阶段按,在倒计时执行完之前,按CTRL+C即可进入uboot命令行,这里可以执行许多命令,有兴趣可以查看《Rockchip RK3399 - TPL/SPL方式加载uboot》。

4.2.1.1 搭建根文件系统

由于我们要通过nfs来挂载根文件系统rootfs,因此需要搭建NFS服务器,具体参考《NFS服务器》。

这里我在/opt 目录下创建一个子目录nfs_root;

shell 复制代码
zhengyang@ubuntu:/opt$ mkdir nfs_root

并按照教程中进行搭建NFS服务器,我们需要将根文件系统复制到nfs共享路径下:

复制代码
4.2.1.2 uboot配置

接着设置久久派ip ,网关等,根据自己网段修改, 保证局域网内没有其他设备使用;

shell 复制代码
setenv ipaddr 172.23.34.188
setenv netmask 255.255.128.0
setenv gatewayip 172.23.0.1

设置网关,根据自己局域网设置;

shell 复制代码
setenv serverip 172.23.34.186

设置通过网络挂在根文件系统:

shell 复制代码
setenv bootargs "console=ttyS0,115200 root=/dev/nfs rw nfsroot=172.23.34.186:/opt/nfs_root/buildroot_rootfs ip=172.23.34.188:172.23.34.186:172.23.0.1:255.255.128.0::eth0:off"

其中:

  • root:表示使用/dev/nfs这个设备作为根文件系统,rw 表示可读可写的;
  • nfsroot:表示服务器中rootfs所在路径,注意需要跟上服务器的ip地址;
  • 172.23.34.188:是板子启动之后的ip地址;
  • 172.23.34.186:是nfs服务器的ip地址;
  • 172.23.0.1:是板子网关地址;
  • 255.255.128.0:是板子子网掩码。

具体可以参考《linux驱动移植-DM9000网卡驱动以及NFS文件系统》。

4.2.1.3 设置tftp下载内核

我们需要将我们的内核镜像uImage放在/opt/tftpboot目录下;

shell 复制代码
setenv bootcmd tftp ${loadaddr} uImage
4.2.1.4 保存及查看
shell 复制代码
saveenv
printenv
4.2.1.5 启动系统
shell 复制代码
boot
4.2.2 烧录系统到eMMC

输入密码root进入系统,在ubuntu虚拟机中将项目中rootfs.tar.gz拷贝至/opt/nfs_root/buildroot_rootfs/root

shell 复制代码
cp rootfs.tar.gz /opt/nfs_root/buildroot_rootfs/root

在久久派中使用mkfs.ext4格式化emmc

shell 复制代码
mkfs.ext4 /dev/mmcblk0

输入y确认格式化,接着挂载emmc

shell 复制代码
mount /dev/mmcblk0 /mnt

解压:

shell 复制代码
tar -zxvf rootfs.tar.gz -C /mnt

将新内核拷贝到emmc中:

shell 复制代码
cp system/uImage /mnt/boot

取消emmc挂载:

复制代码
umount /mnt

此时已经成功将内核和系统烧写至emmc

4.2.3 uboot设置emmc启动

reboot重新启动系统:

复制代码
reboot

在倒计时执行完之前,按CTRL+C即可进入uboot命令行,设置启动参数:

shell 复制代码
setenv bootargs root=/dev/mmcblk0

设置启动命令:

shell 复制代码
setenv bootcmd 'ext4load mmc 0:0 ${loadaddr} boot/uImage; bootm ${loadaddr}'

保存参数并启动系统:

shell 复制代码
saveenv
boot

参考文章

[1] Rockchip RK3399 - NanoPC-T4开发板介绍

[2] Rockchip RK3588 - NanoPC-T6开发板介绍

[3] 龙邱科技 龙芯2k301核心板软件开源库

[4] 龙芯LS2K0300久久派上手体验

[5] LS2K0300 龙芯智能车 PC端环境搭建教程

[6] Loongson-2K0300-99PAI(久久派资料,推荐)

[7] 三、龙芯智能车学习之路 -- 内核编译篇

[8] open-loongarch(官方仓库)

[9] SeekFree/逐飞科技LS2K0300开源库

[10] WwuSama/21届智能车走马观碑开源仓库