跳到主要内容

SDK 环境部署(PC端)

LuckfoxPico-SDK主要在Ubuntu LTS系统上进行开发和测试,主要支持Ubuntu 22.04版本。如果您的系统是Ubuntu 22.04,只需安装相应的依赖编译即可。为了确保与不同版本的Ubuntu兼容,我们还为用户提供了一个方便使用的 Docker 环境。注意:按照文档的步骤配置就能成功编译镜像,如果出现错误请检查自己的环境。例如:使用WSL2编译出现环境变量的错误Your PATH contains spaces, TABs, and/or newline (\n) characters This doesn't work. Fix yOu PATH,就需要过滤空格、制表符和换行符。

export PATH=$(echo "$PATH" | tr -d ' \t\n')

1. Ubuntu22.04 环境下编译镜像

1.1 搭建编译环境

  1. 安装依赖环境:

    sudo apt update

    sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync
  2. 获取最新的 SDK :

    git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
  3. 编译镜像

    luckfox@luckfox:~$ ./build.sh lunch
    You're building on Linux
    Lunch menu...pick the Luckfox Pico hardware version:
    选择 Luckfox Pico 硬件版本:
    [0] RV1103_Luckfox_Pico
    [1] RV1103_Luckfox_Pico_Mini_A
    [2] RV1103_Luckfox_Pico_Mini_B
    [3] RV1103_Luckfox_Pico_Plus
    [4] RV1106_Luckfox_Pico_Pro_Max
    [5] RV1106_Luckfox_Pico_Ultra
    [6] RV1106_Luckfox_Pico_Ultra_W
    [7] custom
    Which would you like? [0~7][default:0]: 3
    Lunch menu...pick the boot medium:
    选择启动媒介:
    [0] SD_CARD
    [1] SPI_NAND
    Which would you like? [0~1][default:0]: 1
    Lunch menu...pick the system version:
    选择系统版本:
    [0] Buildroot(Support Rockchip official features)
    Which would you like? [0~1][default:0]: 0
    [build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk boards...
    [build.sh:info] Running build_select_board succeeded.

    luckfox@luckfox:~$ ./build.sh

1.2 SDK 目录说明

  1. SDK目录结构

    ├── build.sh -> project/build.sh ---- SDK编译脚本
    ├── media --------------------------- 多媒体编解码、ISP等算法相关(可独立SDK编译)
    ├── sysdrv -------------------------- U-Boot、kernel、rootfs目录(可独立SDK编译)
    ├── project ------------------------- 参考应用、编译配置以及脚本目录
    ├── output -------------------------- SDK编译后镜像文件存放目录
    └── tools --------------------------- 烧录镜像打包工具以及烧录工具
  2. 镜像存放目录

    output/
    ├── image
    │ ├── download.bin ---------------- 烧录工具升级通讯的设备端程序,只会下载到板子内存
    │ ├── env.img --------------------- 包含分区表和启动参数
    │ ├── uboot.img ------------------- uboot镜像
    │ ├── idblock.img ----------------- loader镜像
    │ ├── boot.img -------------------- kernel镜像
    │ ├── rootfs.img ------------------ kernel镜像
    │ └── userdata.img ---------------- userdata镜像
    └── out
    ├── app_out --------------------- 参考应用编译后的文件
    ├── media_out ------------------- media相关编译后的文件
    ├── rootfs_xxx ------------------ 文件系统打包目录
    ├── S20linkmount ---------------- 分区挂载脚本
    ├── sysdrv_out ------------------ sysdrv编译后的文件
    └── userdata -------------------- userdata

1.3 SDK配置文件说明

  1. Luckfox-Pico 系列 SDK 配置文件存放在 project/cfg/BoardConfig_IPC 目录下。

    BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra-IPC.mk
    BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
    BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Ultra-IPC.mk
    BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
    BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico-IPC.mk
    BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk
    BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_B-IPC.mk
    BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk
    BoardConfig-SD_CARD-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
    BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico-IPC.mk
    BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Mini_A-IPC.mk
    BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Mini_B-IPC.mk
    BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Plus-IPC.mk
    BoardConfig-SD_CARD-Ubuntu-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
    BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Mini_B-IPC.mk
    BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk
    BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
    rv1103-spi_nor-post.sh
    rv1106-spi_nor-post.sh
  2. 我们将以 'BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pro_Max-IPC.mk' 为例,详细介绍其中关键的文件配置。

    # Config CMA size in environment
    export RK_BOOTARGS_CMA_SIZE="66M"

    # Kernel dts
    export RK_KERNEL_DTS=rv1106g-luckfox-pico-pro-max.dts

    # Target boot medium: emmc/spi_nor/spi_nand
    export RK_BOOT_MEDIUM=emmc

    export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs),-(media)"

    # Target rootfs : ubuntu(only emmc)/buildroot/busybox
    export LF_TARGET_ROOTFS=ubuntu

    # SUBMODULES : gitee/gitee
    export LF_SUBMODULES_BY=gitee

    # Buildroot defconfig
    export RK_BUILDROOT_DEFCONFIG=luckfox_pico_defconfig
    • RK_BOOTARGS_CMA_SIZE:给摄像头分配的内存,如果不使用摄像头可以将其修改为 1M
    • RK_KERNEL_DTS:指定设备树文件
    • RK_BOOT_MEDIUM:指定目标启动介质,可以是 emmc(指的是SD卡)、spi_nor(SPI NOR Flash)或 spi_nand(SPI NAND Flash)
    • RK_PARTITION_CMD_IN_ENV:这是用于配置分区表的信息,如果需要与 SD 卡的存储空间匹配,您可以修改 rootfs 分区。
    • LF_TARGET_ROOTFS:指定目标的根文件系统(Root File System)
    • LF_SUBMODULES_BY:指定子模块的来源
    • RK_BUILDROOT_DEFCONFIG:指定 Buildroot 的配置文件

1.4 编译镜像

从《1.3 SDK配置文件说明》可以得知,Ubuntu 镜像仅支持 SD 卡启动,而 Buildroot 镜像既支持TF卡启动又支持 SPI NAND FLASH 启动。

  1. 如果需要编译ubuntu系统,并且使用gitee源,请修改对应的板型mk文件中LF_SUBMODULES_BY改为gitee,如:

    LF_SUBMODULES_BY=gitee
  2. 安装交叉编译工具链:

    cd {SDK_PATH}/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/
    source env_install_toolchain.sh
  3. 全部编译镜像:

    cd luckfox-pico

    #编译busybox/buildroot
    ./build.sh lunch
    ./build.sh

    #编译ubuntu
    sudo ./build.sh lunch
    sudo ./build.sh
    • 注意编译ubuntu时需要注意使用sudo,否则会导致文件系统错误
    • 下文就不一一区分两者指令区别,请自行根据情况选择

1.4.1 部分编译

  1. 单独编译U-Boot

    ./build.sh clean uboot
    ./build.sh uboot
    • 生成镜像文件: output/image/MiniLoaderAll.bin output/image/uboot.img
  2. 单独编译kernel

    ./build.sh clean kernel
    ./build.sh kernel
    • 生成镜像文件: output/image/boot.img
  3. 单独编译rootfs

    ./build.sh clean rootfs
    ./build.sh rootfs
    • 注:编译后需使用./build.sh firmware命令重新打包
  4. 单独编译media

    ./build.sh clean media
    ./build.sh media
    • 生成文件的存放目录:output/out/media_out ,编译后需使用./build.sh firmware命令重新打包
  5. 单独编译参考应用

    ./build.sh clean app
    ./build.sh app
    • 注1:app依赖media
    • 注2:编译后需使用./build.sh firmware命令重新打包
  6. 固件打包

    ./build.sh firmware

2. Docker 环境

版本描述下载
luckfoxtech/luckfox_pico 1.0Docker镜像离线下载Docker百度网盘链接

如果docker pull失败,可以用离线方式获取。

#docker镜像安装
sudo docker load -i ./luckfox_pico_docker.tar

2.1 Docker简介

Docker是一种轻量级的容器化平台,用于打包、分发和运行应用程序及其依赖关系。它利用容器技术,将应用程序及其所有运行时环境封装在一个可移植的容器中。这使得应用程序可以在任何支持Docker的环境中一致地运行,提高了开发、部署和扩展的效率。 Docker通过使用镜像来定义应用程序和环境,使得容器可以在不同的操作系统和云平台上无缝运行。

2.2 Docker 概念

容器: Docker 使用容器来封装应用程序及其所有依赖关系,包括代码、运行时、系统工具、系统库等。容器提供了一种轻量级、一致性和可移植性的方式,使应用程序能够在不同环境中运行。

镜像: 镜像是容器的基础,它包含了运行容器所需的所有信息,如文件系统、库、配置等。镜像可以被共享、存储在仓库中,并通过网络传输。

仓库: 仓库是用于存储和组织 Docker 镜像的地方。公共仓库如 Docker Hub 提供了许多常见的镜像,同时用户也可以创建私有仓库。

2.3 Docker 下载

  1. 下载安装 docker :

    sudo apt install docker.io -y

2.4 将用户添加到 Docker 组

在Ubuntu系统上,需要在运行Docker命令时添加 sudo 是因为 Docker 守护进程默认以 root 用户权限运行。Docker 执行一些需要特权权限的操作,如访问系统资源、管理容器、构建镜像、挂载文件系统等,以确保安全性和系统稳定性。如果希望不每次都使用 sudo 运行 Docker 命令,可以将当前用户加入 docker 组。

  1. 运行以下命令将当前用户添加到docker组中:

    sudo usermod -aG docker $USER
  2. 注销并重新登录,或者运行以下命令使更改生效:

    sudo service docker restart
    newgrp docker
  3. 确保用户 luckfox 已经成功添加到 docker 组。可以使用以下命令检查:

    id luckfox

2.5 Docker 常用命令

以下是 Docker 的一部分命令。要查看完整的命令列表和帮助信息,请运行 docker --help

  1. 镜像相关命令:

    docker pull luckfoxtech/luckfox_pico:1.0      #从 Docker Hub 下载镜像。
    docker images #列出本地所有的镜像。
    docker rmi luckfoxtech/luckfox_pico:1.0 #删除本地一个或多个镜像。
    docker search [image] #在 Docker Hub 上搜索镜像。
  2. 容器相关命令:

    docker ps                                     #列出当前运行的容器。
    docker ps -a #列出所有的容器,包括停止的。

    luckfox@luckfox:~$ docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS
    1758ef6954f6 luckfoxtech/luckfox_pico:1.0 "/bin/bash" 2 weeks ago Exited (137) 39 minutes ago
  3. 容器操作:

    docker start 1758                            #启动一个停止的容器。
    docker stop 1758 #停止一个运行中的容器。
    docker restart 1758 #重启一个容器。
    docker exec -it 1758 ls #在运行中的容器中执行命令。
    docker exec -it 1758 bash #进入一个已经打开的容器
    exit #退出
    docker rm 1758 #删除一个或多个容器。
  4. 运行容器:

    sudo docker run -it --name luckfox --privileged -v /home/ubuntu/luckfox-pico:/home luckfoxtech/luckfox_pico:1.0 /bin/bash
    • -it运行一个交互式容器
    • --name可以为容器指定一个名称,使得容器更易于识别和管理
    • -v 选项可以将主机上的目录或文件挂载到容器内部。上述例子中,将主机上的 /home/ubuntu/luckfox-pico 目录挂载到容器内的 /home 目录
  5. 系统信息:

    docker logs 1758                             #查看容器的日志。
    docker inspect 1758 #查看容器的详细信息。
    docker top 1758 #查看容器中运行的进程。
    • 注:通常你只需要提供容器的前几位字符作为容器的 ID,由于 Docker 容器的 ID 是唯一的。前几位字符通常足以唯一标识一个容器。使用命令时请替换自己的实际容器 ID。

2.6 编译SDK

  1. 获取已经配置好的官方 Docker 镜像。

    sudo docker pull luckfoxtech/luckfox_pico:1.0
  2. 获取最新的的 SDK使用如下指令下载 。

    git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
    cd luckfox-pico
    git submodule update --init
  3. 启动一个交互式的容器,使用名为 "luckfox",并将本地主机上的 SDK 目录映射到容器内的 /home 目录,最后以 Bash shell 运行。

    #第一次运行docker环境
    sudo docker run -it --name luckfox --privileged -v /home/ubuntu/luckfox-pico:/home luckfoxtech/luckfox_pico:1.0 /bin/bash

    #第二次运行docker环境
    sudo docker start -ai luckfox

    #退出
    exit
  4. 安装交叉编译工具链。

    cd tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/
    source env_install_toolchain.sh
  1. 进入/home 目录,清除编译。

    root@b165d8d4c29b:# cd /home
    root@b165d8d4c29b:/home# ./build.sh clean
  2. 编译选择分支,分别是指定 LuckFox Pico 、LuckFox Pico Mini A 、LuckFox Pico Mini B、LuckFox Pico Plus 和 LuckFox Pico Pro/Max。

    root@22259b5440c0:/home# ./build.sh lunch
    You're building on Linux
    Lunch menu...pick the Luckfox Pico hardware version:
    选择 Luckfox Pico 硬件版本:
    [0] RV1103_Luckfox_Pico
    [1] RV1103_Luckfox_Pico_Mini_A
    [2] RV1103_Luckfox_Pico_Mini_B
    [3] RV1103_Luckfox_Pico_Plus
    [4] RV1106_Luckfox_Pico_Pro_Max
    [5] RV1106_Luckfox_Pico_Ultra
    [6] RV1106_Luckfox_Pico_Ultra_W
    [7] custom
    Which would you like? [0~7][default:0]: 3
    Lunch menu...pick the boot medium:
    选择启动媒介:
    [0] SD_CARD
    [1] SPI_NAND
    Which would you like? [0~1][default:0]: 1
    Lunch menu...pick the system version:
    选择系统版本:
    [0] Buildroot(Support Rockchip official features)
    Which would you like? [0~1][default:0]: 0
    [build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk boards...
    [build.sh:info] Running build_select_board succeeded.
  3. 全部编译镜像。

    root@b165d8d4c29b:/home# ./build.sh  
    ....
    Make firmware OK!
    ------ OK ------
    ********rkImageMaker ver 2.2********
    Generating new image, please wait...
    Writing head info...
    Writing boot file...
    Writing firmware...
    Generating MD5 data...
    MD5 data generated successfully!
    New image generated successfully!
    [mk-update_pack.sh:info] Making -RK1106 update.img OK.
    [build.sh:info] Running build_updateimg succeeded.
    [build.sh:info] Running build_firmware succeeded.
    [build.sh:info] Running build_all succeeded.
    save to /home/luckfox/Luckfox-Pico/luckfox-pico/IMAGE/SPI_NAND_RV1103G-LUCKFOX-PICO-PLUS.DTS_20230816.1811_RELEASE_TEST
    [build.sh:info] Running build_save succeeded.
    [build.sh:info] Running build_allsave succeeded.
  4. 编译成功后,固件存放在 SDK目录/output/image 目录下。

  5. 清除文件,方便重新编译,有一些配置文件修改后,需要执行这个命令后,在重新编译才能生效 。

    ./build.sh clean             

3. 文件共享

虚拟机和 Windows 电脑之间文件传输可以使用 Samba 服务来实现文件共享,在 Windows 的网络邻居中,可以轻松访问虚拟机的文件系统,非常便捷。

3.1 Ubuntu 环境配置

  1. 下载和安装 Samba 。

    sudo apt-get update
    sudo apt-get install samba -y
  2. 配置Samba服务。

    sudo vim /etc/samba/smb.conf

    #在文件末尾填入以下内容

    [share]
    comment = share folder
    browseable = yes
    path = /home/luckfox
    create mask = 0700
    directory mask = 0700
    valid users = luckfox
    force user = luckfox
    force group = luckfox
    public = yes
    available = yes
    writable = yes
    • 其中luckfox为主机名,根据自己实际主机名填写。
  3. 设置分享账户密码。

    sudo smbpasswd -a luckfox
  4. 查看虚拟机或主机的 IP 地址。

    luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ifconfig
    enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.10.61 netmask 255.255.252.0 broadcast 192.168.11.255
    inet6 fe80::814f:a51e:5f24:f0f7 prefixlen 64 scopeid 0x20<link>
    ether 08:00:27:d2:60:b9 txqueuelen 1000 (Ethernet)
    RX packets 699559 bytes 754875799 (754.8 MB)
    RX errors 0 dropped 4 overruns 0 frame 0
    TX packets 53024 bytes 3278048 (3.2 MB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    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 (Local Loopback)
    RX packets 190 bytes 24144 (24.1 KB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 190 bytes 24144 (24.1 KB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

3.2 Windows 环境

  1. 在 Windows 地址栏输入(根据自己实际 IP 地址填写)。

  2. 输入虚拟机账户密码默认都是 luckfox 。

  3. 成功登录虚拟机或主机。

4. 修改设备树

Luckfox Pico和Luckfox Mini系列开发板的用户,如果在硬件上进行了自行升级以支持网口功能,为了能够正常使用有线网络,还需要手动在设备树中进行相应的配置。

  1. 进入 /luckfox/luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts 目录下修改设备树文件。

    $ ls | grep luckfox*
    rv1103g-luckfox-pico.dts
    rv1103g-luckfox-pico-mini-a.dts
    rv1103g-luckfox-pico-mini-b.dts
    rv1103g-luckfox-pico-plus.dts
    rv1103-luckfox-pico-ipc.dtsi
    rv1106g-luckfox-pico-pro-max.dts
    rv1106g-luckfox-pico-ultra.dts
    rv1106g-luckfox-pico-ultra-w.dts
    rv1106-luckfox-pico-pro-max-ipc.dtsi
    rv1106-luckfox-pico-ultra-ipc.dtsi
  2. 打开 rv1103g-luckfox-pico.dts 设备树文件,将 gmac 下的 “disable ”修改为“okay”,保存退出。

  3. 重新编译固件。

    ./build.sh clean  
    ./build.sh

5. Linux下加载ko驱动模块

5.1 ko 文件简介

在Linux操作系统中,.ko文件是内核模块文件的扩展名。内核模块是一种可以在运行时加载和卸载的代码,用于扩展Linux内核的功能,无需重新编译整个内核。每个.ko文件包含模块的代码和元数据,允许用户在不重新启动系统的情况下添加或移除特定功能,如驱动程序或文件系统支持。

5.2 ko文件的优点

  1. 动态加载和卸载:内核模块可以在运行时动态加载到内核中,也可以随时卸载,无需重新启动系统。这使得系统管理员和开发人员能够在不中断系统运行的情况下添加、测试或修复功能。
  2. 节约资源:内核模块允许将不常用的功能作为模块加载,从而减少了系统内核的大小和内存占用。这有助于提高系统的资源利用率。
  3. 定制性: 内核模块允许用户根据需要添加或移除特定功能,从而实现定制化的系统。这对于嵌入式系统、特定硬件支持和特定应用场景非常有用。
  4. 减少编译时间: 重新编译整个内核可能会花费大量时间,而使用内核模块则可以避免这种情况。只需编译和加载所需的模块,节省了时间和资源。
  5. 快速调试和开发:内核模块可以在不重新启动系统的情况下加载和卸载,这使得驱动程序和其他内核代码的调试和开发变得更加高效。
  6. 易于维护: 内核模块的独立性使得它们可以独立于整个内核进行维护和升级。这有助于降低系统维护的复杂性。
  7. 增加兼容性:内核模块可以根据需要支持多个内核版本,从而增加了软件的兼容性和灵活性。

5.3 应用实例

下载工程文件戳我下载,整个工程只有两个文件,一个helloworld.c,一个用来控制编译的Makefile。

  1. 将工程文件复制到已经安装了编译通过的 Luckfox Pico SDK 的 Ubuntu 主机或虚拟机上。

  2. 打开、修改 Makefile 文件让 make 命令进入指定的内核源代码目录也就是 Luckfox Pico SDK目录/luckfox-pico/sysdrv/source/kernel 。(Makefile 文件建议直接下载使用,复制粘贴需自己修改Tab缩进问题)

    obj-m += helloworld.o
    KDIR:=/home/luckfox/Luckfox-Pico/luckfox-pico/sysdrv/source/kernel
    PWD?=$(shell pwd)
    all:
    make -C $(KDIR) M=$(PWD) modules
    echo $(PWD)
    clean:
    rm -f *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.order
  3. 代码部分:

    #include <linux/module.h>
    #include <linux/init.h>

    static int helloworld_init(void)
    {
    printk("helloworld!\n");
    return 0;
    }

    static void helloworld_exit(void)
    {
    printk("helloworld bye\n");
    }

    module_init(helloworld_init);
    module_exit(helloworld_exit);

    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Luckfox");
    MODULE_VERSION("V1.0");
    • 模块加载函数:当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。 Linux内核模块加载函数一般以__init标识声明,模块加载函数以“module_init(函数名)”的形式被指定。它返回整型值,若初始化成功,应返回0。而在初始化失败时,应该返回错误编码。在Linux内核里,错误编码是一个接近于0的负值。
    • 模块卸载函数:当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块卸载函数相反的功能。 Linux内核模块加载函数一般以__exit标识声明,模块卸载函数在模块卸载的时候执行,而不返回任何值,且必须以“module_exit(函数名)”的形式来指定。
    • 模块许可证声明许可证(LICENSE):明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(Kernel Tainted)的警告。在Linux内核模块领域,可接受的LICENSE包括“GPL”、“GPL v2”、“GPLand additional rights”、“Dual BSD/GPL”、“Dual MPL/GPL”和“Proprietary”(关于模块是否可以采用非GPL许可权,如“Proprietary”,这个在学术界和法律界都有争议)。大多数情况下,内核模块应遵循GPL兼容许可权。Linux内核模块最常见的是以MODULE_LICENSE(“GPL v2”)语句声明模块采用GPL v2。
    • 模块作者等信息声明:MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION、MODULE_DEVICE_TABLE、MODULE_ALIAS分别声明模块的作者、描述、版本、设备表和别名
  4. 进入工程文件中,执行以下命令(其中CROSS_COMPILE的地址需要按SDK的实际路径填写):

    export ARCH=arm

    export CROSS_COMPILE=/home/luckfox/Luckfox-Pico/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-

    make
    • 效果如下:
  1. 把helloworld.ko上传到开发板上,可以使用TFTP,ADB等方式。

    tftp 192.168.10.127 -g -r helloworld.ko
  2. 执行以上命令可以进行验证。

    # insmod helloworld.ko
    [ 200.330884] helloworld!
    # rmmod helloworld.ko
    [ 218.624421] helloworld bye
  3. 最后我们使用 dmesg 查看日志。

    # dmesg | grep hello
    [ 200.330884] helloworld!
    [ 218.624421] helloworld bye

6. 内核配置

menuconfig 是 Linux 内核的配置工具,提供终端图形化界面,便于直观地修改配置文件,同时自动处理配置项依赖关系。其他类似的配置界面还包括 nconfigxconfig,下面介绍 menuconfig 的基本功能和操作。

6.1 配置界面

执行如下指令,打开配置界面:

cd <SDK目录>/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

6.2 基本操作

执行命令后显示的配置界面如下:

从界面上方我们可以看到 menuconfig 的基本操作和说明。

按键操作:

  • PgUpPgDn:浏览、选择内核功能
  • :选择Select、Exit等操作
  • Enter:进入子菜单
  • Y:选中这项功能
  • N:排除这项功能
  • M:以模块的形式选择
  • Esc:双击Esc返回上一级菜单
  • ?:查看这项功能的帮助信息
  • /:搜索

图例说明:

  • [*] :已选中的项目
  • [ ] :未选中的项目
  • <M> :已选中的项目(以模块形式)
  • < > :未选中的项目(以模块形式)

中间区域是用户选择各项功能的地方,您可以使用上下方向键进行导航,同时也支持直接按下行首带颜色的字母,跳转到该行,如 Kernel Features 的首字母 K,当我们按下 K 键时就会直接跳转至该行。

底部区域包含了一些常用的操作选项,为用户提供了重要的交互功能。它们的作用如下:

  • <Select>:进入当前高亮配置项的子菜单
  • <Exit>:退出当前菜单,返回上一层
  • <Help>:提供当前高亮配置项的帮助信息
  • <Save>:保存当前的配置更改,但不退出配置工具
  • <Load>:加载指定的配置文件

6.3 功能简述

内核配置界面的中间部分是一个多层级的菜单系统,您可以通过上下方向键进行导航,按 Enter 键进入子菜单,按 Esc 键返回上一级菜单

通过这个界面,用户可以根据系统需求灵活配置内核,选择需要的功能和驱动,以构建适合特定硬件和用途的定制内核,以下是 Linux 内核配置界面中的主要项目:

  • General setup(常规设置):运行时的基本配置
  • Kernel Features(内核特性):核心功能的配置,如模块化、块设备支持等
  • CPU Power Management(CPU 功耗管理):配置 CPU 的功耗管理选项
  • Enable loadable module support(启用可加载模块支持):是否支持内核模块
  • IO Schedulers(I/O 调度器):配置磁盘 I/O 调度器
  • Networking support(网络支持):配置网络支持,包括协议、设备等
  • Device Drivers(设备驱动):配置各种设备驱动,如输入设备、USB 设备等
  • File systems(文件系统):配置文件系统支持,选择支持的文件系统类型
  • Security options(安全选项):配置内核安全相关选项
  • Cryptographic API(加密 API):配置加密 API 支持

6.4 修改配置

我们这里以使能dht11为例说明,按下 / 键,输入 dht11 回车进行搜索

搜索结束,仅有一个搜索结果,我们按下 1 进行跳转

跳转到 DHT11 配置项后,按 Y 键使能,完成配置

6.5 保存配置

menuconfig中完成配置后,你可以使用以下步骤保存你的配置:

  1. 使用左右方向键导航到底部的 < Save > 选项。
  2. 按回车键,切换到保存界面。
  3. 输入保存文件名称,默认保存到 .config 文件。

除了上面这种方法,还可以通过连续按 Esc 键来退出。在退出时,系统会询问是否要保存配置文件。如果你希望保存当前的配置,选择 "Yes" 即可,这将更新 .config 文件。选择 "No" 你的配置更改将不会被保存。如果想要继续修改配置而不退出,可以再按两次 Esc 键重新返回 menuconfig 界面继续进行修改。

退出配置界面后执行指令:

make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig

6.6 重烧固件

  1. 编译选择分支,指定开发板型号

    luckfox@luckfox:~/luckfox-pico$ ./build.sh lunch
  2. 编译

    luckfox@luckfox:~/luckfox-pico$ ./build.sh
  3. 重新烧录固件

    编译完成后重新烧录固件

7. Buildroot 配置

Buildroot 是一个专为嵌入式系统设计的工具,其目标是简化嵌入式 Linux 系统的构建过程。通过配置 Buildroot,您可以定制嵌入式系统中包含的软件包和库,以满足特定的需求。本文将演示如何通过配置 Buildroot 添加 iftop、minicom 的软件包以及 python-arrow 库。

7.1 添加软件包

7.1.1 打开配置界面

cd <SDK 目录>/sysdrv/source/buildroot/buildroot-2023.02.6/
make luckfox_pico_w_defconfig
make menuconfig

请注意,刚下载SDK没有 "buildroot-2023.02.6" 这个目录,需要先编译一次SDK:

luckfox@luckfox:~/luckfox-pico$ ./build.sh lunch
luckfox@luckfox:~/luckfox-pico$ ./build.sh

7.1.2 iftop

  1. 简介

    iftop 是一个实时网络流量监控工具,通过图形界面显示当前系统上各个网络连接的实时流量情况。它能够按流量大小排序并展示每个连接的详细信息,帮助用户迅速定位网络瓶颈或异常流量。

  2. 修改配置

    按下 / 输入 "iftop" 后回车进行搜索,仅有一个搜索结果,我们按下 1 进行跳转

    按下 Y 使能 iftop 软件包

1.3 minicom

  1. 简介

    Minicom 是一款串口通信工具,类似于 Windows 下的超级终端,主要用于与串口设备进行通信,例如调试交换机和 Modem。它提供了一套简单而有效的命令行界面,支持串口参数的配置和文件传输协议(如 XMODEM、YMODEM)。Minicom 是一个轻量级工具,适用于嵌入式系统开发和串口通信的调试场景。

  2. 修改配置

    按下 / 输入 "minicom" 后回车进行搜索,仅有一个搜索结果,我们按下 1 进行跳转

    按下 Y 使能 minicom 软件包

1.4 保存配置

配置好后连续按 Esc,提示是否保存时选择 "Yes",保存后重新进行编译:

make savedefconfig 
make

7.2 添加Python库

我们不仅可以通过配置 Buildroot 添加软件包,还可以添加需要的 Python 库到系统中,下面以添加 python-arrow 库为例说明。

7.2.1 打开配置界面

cd <SDK 目录>/sysdrv/source/buildroot/buildroot-2023.02.6/
make luckfox_pico_defconfig
make menuconfig

7.2.2 修改配置

在配置菜单中,找到并选择 Target packages ,选择 Interpreter languages and scripting ,然后再选择 External python modules

找到需要的库,按 Y 使能

7.2.3 保存配置

配置好后连续按 Esc,提示是否保存时选择 "Yes",保存后重新进行编译:

make savedefconfig 
make

7.3 重新烧录固件

  1. 编译选择分支,指定开发板型号

    luckfox@luckfox:~/luckfox-pico$ ./build.sh lunch
  2. 编译

    luckfox@luckfox:~/luckfox-pico$ ./build.sh
  3. 重新烧录固件

    编译完成后重新烧录固件

7.4 运行效果

7.4.1 iftop

  1. 执行命令

    iftop -i eth0 -P -nNB -m 15M
  2. 参数解析

    • -i eth0: 指定要监控的网络接口,这里是 eth0。您可以根据需要更改为其他网络接口的名称。
    • -P: 显示端口号。
    • -n: 以数字形式显示主机地址而不是域名。
    • -N: 在主机和服务列中显示端口号,不显示端口对应的服务名称。
    • -B: 以字节为单位显示流量。
    • -m 15M: 限制显示的最大带宽为 15 兆比特每秒(Mbps)。
  3. 运行效果,按 "L" 显示进度条

7.4.2 minicom

  1. 执行命令

    minicom -s
  2. 执行指令后显示 minicom 配置界面,选择 "Serial port setup"

  3. 选中 "Serial port setup" 后按下回车,进入设置菜单

  4. 菜单中有 14 个项目,分别对应 A、B...N,第一个是选择串口设备,这里以 UART3 为例说明,UART3 的设备文件为 /dev/ttyS3,因此串口设备要设置为 /dev/ttyS3。设置方法为首按下 "A" 键,然后输入 /dev/ttyS3,回车确认。同时,这里还可以设置其他的配置项,如 E 设置波特率、数据位和停止位、 F 设置硬件流控,这里我们按 "F",关闭硬件流控制。

  5. 设置完后按回车确认,退回到配置界面

  6. 按下 "Esc" 退出配置界面,进入串口调试界面,可以看到当前的串口文件为 /dev/ttyS3

  7. 在电脑端打开 sscom,波特率设置为115200,连接 Luckfox Pico 的 UART3 后发送数据

  8. Luckfox Pico 成功接收到数据

  9. 按下 "CTRL+A",再按下 "Z" 可以打开 minicom 帮助信息界面。从下图可以看出, minicom 有很多功能可以使用, minicom 的回显功能是默认关闭的,对应的配置项为"local Echo on/off…E", 我们按下 "E" 键即可打开/关闭回显功能

  10. 在 minicom 通信界面按下 "CTRL+A",再按下 "X" 即可关闭 minicom

7.4.3 python-arrow

  1. 执行命令

    python3
    import arrow
  2. 成功导入 arrow 库

FAQ

  1. 网络原因导致编译buildroot时下载诸如expatPython等软件包失败如何解决?

    答:下载离线包,替换自己的luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/目录下的dl文件夹。
    文件名描述下载
    dlbuildroot中的软件包百度网盘链接