续上01教程分享,今天主要分享Luckfox Pico SDK 的环境部署
LuckfoxPico-SDK是基于Ubuntu LTS 系统开发测试的,在开发过程中,主要是用Ubuntu 18.04版本, 为了不必要的麻烦,我们推荐用户使用Ubuntu18.04的电脑主机或者虚拟机。
SDK 环境部署
一. 安装虚拟机软件
-
下载VirtualBox虚拟机软件和VBoxGuestAdditions(全屏工具);
-
先安装VirtualBox-7.0.8-156879-Win(根据自己实际的版本安装),建议安装在固态硬盘上;
-
安装过程如下。
二. 创建新的虚拟机
- 下载配置好的虚拟机文件(戳我下载);
- 单击“新建”以创建新的虚拟机,填写自定义名称,选择存储虚拟机的位置(建议虚拟机存储在固态硬盘上);
- 设置虚拟机的内存大小和处理器数量,建议为虚拟机提供大约 4GB 的 RAM和 4个 CPU以上。尽量保持在每个滑块的绿色区域,以防止同时运行虚拟机和主机操作系统的计算机出现问题;
- 使用已有的虚拟硬盘文件,未找到vdi文件点击add添加;
- 单击“下一步”继续并查看虚拟机设置的基本信息, 之后单击“完成”以初始化机器。
三. 安装VBoxGuestAdditions
- 单击“开始”启动虚拟机。窗口的分辨率固定为 800x600;
- 点击虚拟机,点击设置,选择存储,选择choose a disk file...,选择Virtualbox GuestAdditions加载成功点击OK;
- 安装完VBoxGuestAdditions,为了防止Ubuntu虚拟机启动后黑屏,需要设置显存的大小,直接改到最大128M;
- 右键虚拟机桌面VBox_GAs—>Open in Terminal,在虚拟机中执行脚本。
四. 虚拟机的常规配置
- 设置网络连接方式->桥接网卡;
- 启用USB3.0控制器;
- 设置Windows电脑与虚拟机的共享粘贴板。
五. 编译SDK
-
启动虚拟机,虚拟机的登录密码是:luckfox;
-
安装相关依赖包(提供的虚拟机镜像已默认安装);
sudo apt-get install repo 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
-
SDK文件默认存放在 Luckfox-Pico 文件夹下,如果想要最新的官方 SDK使用如下指令下载;
luckfox@luckfox:~/luckfox$ git clone https://github.com/LuckfoxTECH/luckfox-pico.git Cloning into 'luckfox-pico'... remote: Enumerating objects: 110533, done. remote: Total 110533 (delta 0), reused 0 (delta 0), pack-reused 110533 Receiving objects: 100% (110533/110533), 674.80 MiB | 133.00 KiB/s, done. Resolving deltas: 100% (16251/16251), done. Checking out files: 100% (107199/107199), done.
-
安装交叉编译工具链(提供的虚拟机镜像已默认安装);
cd tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/ source env_install_toolchain.sh
-
进入Luckfox-Pico 目录,查看目录下文件;
luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ls build.sh media project readme_cn.txt readme_en.txt sysdrv tools
-
编译选择分支,分别是指定 LuckFox Pico 和 LuckFox Pico Plus ;
luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ./build.sh lunch ls: cannot access 'BoardConfig*.mk': No such file or directory You're building on Linux Lunch menu...pick a combo: BoardConfig-*.mk naming rules: BoardConfig-"启动介质"-"电源方案"-"硬件版本"-"应用场景".mk BoardConfig-"boot medium"-"power solution"-"hardware version"-"applicaton".mk ---------------------------------------------------------------- 0. BoardConfig_IPC/BoardConfig-EMMC-NONE-RV1103_Luckfox_Pico-IPC.mk boot medium(启动介质): EMMC power solution(电源方案): NONE hardware version(硬件版本): RV1103_Luckfox_Pico applicaton(应用场景): IPC ---------------------------------------------------------------- ---------------------------------------------------------------- 1. BoardConfig_IPC/BoardConfig-SPI_NAND-NONE-RV1103_Luckfox_Pico_Plus-IPC.mk boot medium(启动介质): SPI_NAND power solution(电源方案): NONE hardware version(硬件版本): RV1103_Luckfox_Pico_Plus applicaton(应用场景): IPC ---------------------------------------------------------------- Which would you like? [0]: 1 [build.sh:info] switching to board: /home/luckfox/Luckfox-Pico/luckfox-pico/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-NONE-RV1103_Luckfox_Pico_Plus-IPC.mk [build.sh:info] Running build_select_board succeeded.
-
全部编译镜像;
luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ./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.
-
编译成功后,固件存放在/home/Luckfox-Pico/luckfox-pico/output/image 目录下;
-
清除文件,方便重新编译,有一些配置文件修改后,需要执行这个命令后,在重新编译才能生效 。
luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ./build.sh clean
六. 虚拟机文件共享
虚拟机和 Windows 电脑之间文件传输可以使用 Samba 服务来实现文件共享,在 Windows 的网络邻居中,可以轻松访问虚拟机的文件系统,非常便捷,提供的虚拟机文件默认已经配置好 Samba 可以直接使用。
-
首先确保设置虚拟机网络桥连,查看虚拟机的 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
-
在 Windows 地址栏输入(根据自己实际 IP 地址填写);
-
输入虚拟机账户密码默认都是 luckfox ;
-
成功登录虚拟机。
七. 修改设备树
如果购买的是LuckFox Pico Plus从 SD 卡启动,需要手动打开设备树网口:
-
进入 /luckfox/luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts 目录下修改设备树文件。;
-
打开 rv1103g-luckfox-pico.dts 设备树文件,将 gmac 下的 “disable ”修改为“okay”,保存退出;
-
重新编译固件。
./build.sh clean ./build.sh
八. Linux下加载ko驱动模块
(一)ko 文件简介
在Linux操作系统中,.ko文件是内核模块文件的扩展名。内核模块是一种可以在运行时加载和卸载的代码,用于扩展Linux内核的功能,无需重新编译整个内核。每个.ko文件包含模块的代码和元数据,允许用户在不重新启动系统的情况下添加或移除特定功能,如驱动程序或文件系统支持。
(二)ko文件的优点
- 动态加载和卸载:内核模块可以在运行时动态加载到内核中,也可以随时卸载,无需重新启动系统。这使得系统管理员和开发人员能够在不中断系统运行的情况下添加、测试或修复功能;
- 节约资源:内核模块允许将不常用的功能作为模块加载,从而减少了系统内核的大小和内存占用,这有助于提高系统的资源利用率;
- 定制性: 内核模块允许用户根据需要添加或移除特定功能,从而实现定制化的系统。这对于嵌入式系统、特定硬件支持和特定应用场景非常有用;
- 减少编译时间: 重新编译整个内核可能会花费大量时间,而使用内核模块则可以避免这种情况。只需编译和加载所需的模块,节省了时间和资源。
- 快速调试和开发:内核模块可以在不重新启动系统的情况下加载和卸载,这使得驱动程序和其他内核代码的调试和开发变得更加高效。
- 易于维护: 内核模块的独立性使得它们可以独立于整个内核进行维护和升级。这有助于降低系统维护的复杂性。
- 增加兼容性:内核模块可以根据需要支持多个内核版本,从而增加了软件的兼容性和灵活性。
应用实例
下载工程文件戳我下载,整个工程只有两个文件,一个helloworld.c,一个用来控制编译的Makefile。
-
将工程文件复制到已经安装了编译通过的 Luckfox Pico SDK 的 Ubuntu 主机或虚拟机上。
-
打开、修改 Makefile 文件让 make 命令进入指定的内核源代码目录也就是 Luckfox Pico SDK 的内核路径。(提供的虚拟机镜像目录为/home/luckfox/Luckfox-Pico/luckfox-pico/sysdrv/source/kernel 。)
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
-
代码部分:
#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分别声明模块的作者、描述、版本、设备表和别名
-
进入工程文件中,执行以下命令(其中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
-
把helloworld.ko上传到开发板上,可以使用TFTP,ADB等方式。
tftp 192.168.10.127 -g -r helloworld.ko
-
执行以上命令可以进行验证。
# insmod helloworld.ko [ 200.330884] helloworld! # rmmod helloworld.ko [ 218.624421] helloworld bye
-
最后我们使用 dmesg 查看日志。
# dmesg | grep hello [ 200.330884] helloworld! [ 218.624421] helloworld bye
如有更多分享,欢迎讨论~