TDA4VM的各种不靠谱尝试(根据官方文档)
购入了TI TDA4VM,参考官方文档进行Linux操作系统的安装:https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-sk-tda4vm/latest/exports/docs/devices/J7_Family/linux/index.html
但是发现这个官方文档……我看不太懂……
总之,还是记录一下踩雷经历吧!
0. 准备工作
按照User's Guide安装有关的驱动(cp210x USB转串口)
参考博客:https://blog.csdn.net/Zander0/article/details/134325727
因为安装Linux需要注册,于是先注册,然后下载
在linux上运行命令,但遇见以下问题:
因为没有安装有关的GCC,所以再安装:
sudo apt install gcc-12
然后运行以下命令将新安装的GCC版本设置为默认编译器:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
最后重试make命令:
make
但是依旧报错:
错误信息为:
note: (near initialization for ‘cp210x_device.port_remove’)
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:251: /home/dm/Desktop/Linux_3.x.x_4.x.x_VCP_Driver_Source/cp210x.o] Error 1
make[2]: *** [/usr/src/linux-headers-6.5.0-15-generic/Makefile:2037: /home/dm/Desktop/Linux_3.x.x_4.x.x_VCP_Driver_Source] Error 2
make[1]: *** [Makefile:234: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.5.0-15-generic'
make: *** [Makefile:7: all] Error 2
这个是编译过程中的错误信息。它显示一些警告被当作错误处理,导致编译失败。我尝试过一些取消警告的方式,但都失败了。
后来发现实际上在相关目录已经有相关的驱动了:
于是直接加载有关的模块,完成驱动的安装:
sudo modprobe usbserial
sudo modprobe cp210x
最后利用下述命令检查驱动是否安装完成:
lsmod | grep usbserial
结果如下:
将TDA4VM接入主机后,发现有四个虚拟Com端口
和用户手册的说明一致:
但这四个端口的区别是什么目前不清楚,也不知道该通过哪个端口连接到开发板
应该是要连接ttyUSB0.
可以按照以下操作让主机和开发板通过端口通信:
screen /dev/ttyUSB0 115200
进入screen,如果想要退出:
"ctrl+A" 然后再按下":"键,这将在屏幕底部显示一个命令提示符。输入quit,然后按下回车键。这将退出screen终端会话。
此外,运行以下命令也可以打开终端:
sudo minicom -D /dev/ttyUSB0
如果想要退出,可以使用Ctrl+A键组合,然后按下X键退出minicom
1. Overview
购买的SK-TDA4VM套件主要包括以下构件:
- SK-TDA4VM开发板
- Micro-SD卡(用于烧录程序)
整体思路:首先需要将TDA4VM有关的Software Development Kit(SDK) 安装到本机上(需要是Linux操作系统平台,若主机是Windows操作系统,可以安装虚拟机,在Linux虚拟机上安装有关的SDK),然后利用SD卡将有关的环境烧录到嵌入式开发板TDA4VM上。
2. 安装虚拟机
利用VMware安装Ubuntu22.04,然后再Ubuntu上安装SSH服务,从而可以方便地在本机和虚拟机之间利用Xftp传输文件。详见前面的博客,这里省略。
3. 在虚拟机上安装SDK
SDK包括在 TI SK-TDA4VM开发板上进行开发所需的组件。
SDK 包括开发文件系统、目标文件系统、示例应用程序、工具链和电路板支持包、易用脚本和文档。
Linux SK TDA4VM的SDK现在包括 ARM GCC 工具链。官网上说处理器 SDK Linux SK TDA4VM 是根据特定的 Linux 发行版(Ubuntu 22.04)构建和测试的,且不妨碍用户在其他 Linux 发行版上安装 SDK。(但我还是基于Ubuntu 22.04进行开发的)
(1)下载 SDK 安装程序
可以从 TDA4VM-Linux-SDK-Download 页面下载最新的SDK Linux SK TDA4VM 安装程序。
(2)在虚拟机上运行 SDK 安装程序
确保已设置执行权限。打开终端窗口,将目录更改为安装程序所在的目录,然后运行以下命令:
chmod +x ./ti-processor-sdk-linux-edgeai-j721e-evm-<version>-Linux-x86-Install.bin ./ti-processor-sdk-linux-edgeai-j721e-evm-<version>-Linux-x86-Install.bin
或者,也可以赋予执行权限,在 Linux 主机上双击运行 "ti-processor-sdk-linux-edgeai-j721e-evm-<version>-Linux-x86-Install.bin"。
结果如下图所示:
(3)运行setup script(设置脚本)
在 Linux 主机上安装 SDK 后,应运行setup script为软件开发做好准备。某些任务需要管理员权限。当需要这些管理员权限时,脚本会提示您。设置脚本会执行以下任务:
- 验证 Linux 主机是否为推荐的 Ubuntu LTS 版本
- 安装所需主机软件包
- 安装目标文件系统
- NFS 设置
- TFTP 安装
- Minicom 安装
- uboot 设置
- 加载 uboot 脚本
运行setup script的方法
在安装目录下找到setup.sh,我是默认路径安装sdk的,所以安装目录就在/home
进入安装目录,运行setup.sh
一开始想把NFS、TFTP、Minicom、uboot全安装了,但始终有问题(需要将虚拟机与开发板连接,但我始终连接失败),看到网上说NFS、TFTP、Minicom不必需,所以最后只安装了uboot。
(4)我在安装主目录里运行了以下命令,但也不知道对不对,,,
make
(5)后面想要安装NFS、TFTP、Minicom、uboot,发现存在以下问题
一番尝试始终无法解决
4. SDK简介
在下载了SDK后,简单看看其中都有什么内容。
参考官方手册1.4节 Directory Structure Overview:
Linux 版处理器 SDK 包含以下目录和文件
这些目录包含设备开发的代码和工具。
- bin —— 包含用于配置主机系统和目标设备的辅助脚本。setup.sh 会用到其中的大部分脚本。
- board-support —— 包含在移植到自定义平台时需要修改的 SDK 组件。其中包括内核和引导加载器以及任何非树型驱动程序。
- manifest —— 包含软件清单文件。
- licenses —— 包含软件许可证。
- example-applications —— 包含在开箱即用演示中看到的德州仪器提供的示例应用程序的源代码。
- filesystem —— 包含参考文件系统。其中包括较小的基础文件系统和功能齐全的 SDK 文件系统。
- linux-devkit —— 包含用于加速 ARMV8 架构目标设备开发的工具和库。
- k3r5-devkit —— 包含用于加速 ARMV7 架构目标设备开发的工具和库。
- Makefile —— 从 SDK 的顶层为许多 SDK 组件提供构建目标。
- makerules —— 为所有顶层 Makefile 构建目标制定规则。
- Rules.make —— 设置顶层 Makefile 和子组件 Makefile 使用的默认值。
- setup.sh —— 配置用户主机系统和开发目标系统。
- yocto-build —— 该目录允许使用 yocto bitbake 重建 SDK 组件和文件系统。有关运行 yocto 编译的更多详情,请参阅 "构建 SDK "部分(1.2节)。
5. 配置SD card
参考官方手册 1.1.3:
手册中给了四种方式将操作系统的镜像flash到SD卡的方式,这里选择第一种,即利用balenaEtcher。
(1)下载默认的可启动 SD 卡镜像(WIC 文件)
https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX-SK-TDA4VM
(2)下载并安装balenaEtcher软件
Balena Etcher 是一款开源工具,可安装在 Linux 和 Windows 系统上。可从以下链接下载并安装该工具。
利用Xftp将下载的.appimage传送到Linux虚拟机上。右键——>Properties,按下图设置
打算直接运行,但会出现
所以先安装libfuse2,在命令行输入以下命令:
sudo apt install libfuse2
安装成功后,
会出现以下窗口
(3)将 WIC 镜像刷到 SD 卡中
将 micro SD 卡插入 USB SD card reader 并启动 Etcher,选择要flash的default WIC 映像,选择 USB SD 读卡器作为目标,然后点击 "Flash"。Etcher 会解压镜像并将其写入 SD 卡。
具体过程示意图如下所示:
①SD卡如下
②SD卡读卡器如下:
③主机插入读卡器后,出现以下提醒
但发现SD读卡器无法接入虚拟机,按照网上的建议,首先修改了虚拟机的配置
修改完成后弹出如下对话框
于是接着将SD读卡器设置定向到虚拟机
发现balenaEtcher中可以找到SD读卡器了
选择好文件、设备后点击Flash,出现以下界面
显示Flash完成
注意安全弹出SD读卡器!
6. GCC ToolChain
处理器 SDK Linux SK TDA4VM 软件包包含 ARMv8 和 ARMv7 体系结构的交叉编译工具链。在编译目标二进制文件时,顶级层的makefile 会使用这些工具链。这些工具链还打包了一个环境设置脚本,该脚本可设置所有正确的变量,以便为目标架构编译二进制文件。工具链安装程序通过 yocto 构建系统构建,与目标文件系统镜像本身相同。下文将详细介绍它们的用法。
(1)Linux-devkit
处理器 SDK Linux SK TDA4VM 软件包预装了该工具链,位于 SDK 中的 linux-devkit/ 目录下。下表中的路径相对于 <SDK INSTALL DIR>。
表 Linux Devkit Contents
Variable |
Location |
Description |
---|---|---|
TOOLCHAIN_PREFIX |
linux-devkit/sysroots/x86_64-arago-linux/usr/bin/aarch64-oe-linux/aarch64-oe-linux- |
ARMv8 架构的交叉编译器工具链 |
target_sysroot |
linux-devkit/sysroots/aarch64-oe-linux/ |
Sysroot 带有针对 ARMv8 架构和 Linux 操作系统的交叉编译库和头文件 |
environment_setup_script |
linux-devkit/environment-setup-aarch64-oe-linux |
设置环境变量以编译 ARMv8 Linux 目标机二进制文件的 Shell 脚本 |
① targe_sysroot
Linux SDK 中的工具链不仅包含交叉编译器,还包含可用于应用程序的预编译库,无需你自己进行交叉编译。要查看这些库的列表,你可以参考 <SDK INSTALL DIR>/manifest 目录中的软件清单,或者查看 <target_sysroot>/usr/lib 目录中的可用库列表。您还可以在 <target_sysroot>/usr/include 目录中找到与这些库相对应的头文件。举例来说,如果你的应用程序想要访问 alsa asound 库,那么你现在可以执行以下命令:
host# ${TOOLCHAIN_PREFIX}gcc -lasound app.c -o app.out
②environment_setup_script
在交叉编译使用配置工具和自动工具的软件包时,需要进行许多设置以确保使用正确的交叉编译库。位于 <SDK INSTALL DIR>/linux-devkit 目录中的环境设置脚本会为你处理这些设置。该脚本导出变量以执行以下操作
- 将工具链添加到 PATH
- 设置 CPATH
- 设置 PKG_CONFIG_* 路径
- 将 CC、CPP、AR 等标准变量设置为交叉编译值
要使用环境设置脚本,只需将其作为源代码即可。操作如下
host# source ${environment_setup_script}
注意:由于 environment_setup 会更改 CC 等标准变量,因此当编译器项目同时编译主机端和目标端工具时,不应使用此脚本。Linux 内核就是一个很好的例子,它会在内核编译过程中编译一些主机端工具。如果环境设置脚本是源代码,那么 CC 值将指定用于构建主机端工具的交叉编译器。这意味着在内核构建过程中编译和使用的工具将针对 ARM 平台编译,而内核构建则试图在英特尔平台上运行这些工具。这将导致工具无法运行,内核无法编译。
③ 使用实例
官方文档中的示例涵盖了一个只使用标准 libgcc 库的应用程序,如下:
#include <stdio.h>
int main() {
printf ("Hello World from TI!!!\n");
return 0;
}
可以使用以下两种方法之一编译 c 文件,为目标架构生成可执行文件:
(a) 直接编译:直接使用交叉编译工具链交叉编译 helloworld.c 文件。
host# ${TOOLCHAIN_PREFIX}gcc --sysroot=${target_sysroot} helloworld.c -o helloworld
请务必提供 gcc 交叉编译器和目标 sysroot 的正确路径,如前所述。
(b)使用环境设置脚本 : 获取设置脚本后进行交叉编译
host# source ${environment_setup_script}
host# ${CC} helloworld.c -o helloworld
运行上述步骤后,您的目录中就应该有一个为 ARM 编译的 helloworld 可执行文件了。检查的简单方法是运行 "file "命令。它应该会返回类似下面的输出结果:
host# file helloworld
helloworld: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=bb96180ad71bd44e07fc148015a55c844134f30d, for GNU/Linux 3.14.0, with debug_info, not stripped
(2)k3r5-devkit
处理器 SDK Linux SK TDA4VM 软件包预装了 ARMv7 工具链,位于 SDK 中的 k3r5-devkit/ 目录下。以下路径相对于 <SDK INSTALL DIR>。
Variable |
Location |
Description |
---|---|---|
TOOLCHAIN_PREFIX |
k3r5-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-oe-eabi/arm-oe-eabi- |
ARMv7 架构的交叉编译器工具链 |
target_sysroot |
k3r5-devkit/sysroots/armv7at2hf-vfp-oe-eabi/ |
Sysroot 包含 ARMv7 架构的交叉编译库和头文件 |
environment_setup_script |
k3r5-devkit/environment-setup-armv7at2hf-vfp-oe-eabi |
设置环境变量以编译目标二进制文件的 Shell 脚本 |
7. 利用Yocto配置开发板操作系统
(1)Yocto简介
因为不懂Yocto,所以先百度了一下和Yocto有关的知识。参考知乎:https://zhuanlan.zhihu.com/p/111017587
Yocto Project由开源代码组合而成,旨在帮助开发者开发嵌入式产品的定制化Linux系统,无论是在什么样的硬件架构上。
Yocto Project提供了一系列的工具以及分享社区,用来为嵌入式设备创建(裁剪的)Linux系统。
Yocto Project 对以下三个关键组成进行组合,维护和验证:
- 一套用来使嵌入式Linux成功工作的集成工具,包括自动构建和测试的工具,板卡支持和符合许可的流程,以及定制化嵌入式Linux操作系统的组件信息。
- 一个参考嵌入式发行版本(称作为Poky)
- OpenEmbedded构建系统,和OpenEmbedded Project共同维护
Poky使用它所包含的构建系统(BitBake:构建引擎; OpenEmbedded-Core, 核心构建系统元数据)可以构建出一个很小的嵌入式操作系统。
下载构建系统时使用Poky构建指导‘文件’被称作为recipe(配方)和layer(层)。你可以修改,赋值,或者任何你需要的方式,来创建属于你的定制化嵌入式Linux。
Yocto的特性:
- 架构无关:Yocto Project支持Intel,ARM,MIPS,AMD,PPC和其他架构。大多数ODM, OSV和芯片提供商为它们的硬件创建并提供BSP。如果你有自己的芯片,你可以创建支持它架构的BSP. Yocto Project也通过Quick EMUlator(QEMU)为广泛的设备模拟提供支持。
- 移植镜像和代码容易:Yocto Project的输出可以很容易地在不同架构之间移植,而不需要使用新的开发环境。如果你使用Yocto Project创建了一个镜像或应用但是无法对它进行支持,诸如Wind River, Mentor Graphics, Timesys和ENEA这样地商业Linux供应商可以承担这个工作并提供支持。这些供应商有很多使用Yocto Project的产品。
- 适合资源有限的嵌入式和物联网设备:和一个完整的Linux发行版本不同,你可以使用Yocto Project为嵌入式设备创建精简版的版本。你只需要添加必要的功能支持和软件包。如果设备有显示部分,你可以使用X11, GTK+, Qt, Clutter, 和SDL这样的系统组件创建一个用户体验更好的发行版本。
- 工具链扩展:如果标准工具链不足以满足硬件某些功能,你可以自定义工具链。
(2)Introduction of 官方文档
本页提供了从源代码构建处理器 SDK 和单个组件的步骤。处理器 SDK 的构建基于 Arago 项目,该项目为 OpenEmbedded 和针对 TI 平台的 Yocto 项目提供了一系列层。
本页将提供重新创建处理器 SDK 所需的基本步骤,以及处理器 SDK 特定配置、构建目标和目标设备的参考。此外,还提供了提示和建议,以及更多深入信息的链接。
(……后面省略,可自行参见原文……)
8.使用 Makefile 简化 SDK 构建过程
处理器 SDK Linux SK TDA4VM 软件包中有一个顶层 Makefile 文件,可用于构建 SDK 中的一些子组件。该 Makefile 使用 Rules.make 文件,我们举例说明了如何构建各种组件以及 TDA4VM 使用的参数。
注意:在调用 environment-setup script时,不应调用此 makefile。子组件 Makefile 会在适当的情况下处理此脚本的来源,但某些 make target(如 Linux 内核的 make target)在此脚本已经来源的情况下无法正常工作。
(1)安装需要的软件包
请运行顶层的 setup.sh 脚本,安装 makefile targets所需的所有软件包。
(2)组件
顶层的 Makefile 的功能由这些组件实现:
-
makerules/Makefile_* : 这些包含 TI SDK 在不同平台上通用的所有 makerules。
-
Rules.make:编译规则文件,定义了用于配置处理器 SDK Linux SK TDA4VM 的 Makefile 的变量。
-
Makefile:只包含这些变量定义和 make rules
以下各节将自下而上地详细介绍这些组成部分。
(补充一个网络上搜寻到的有关Makefile和makerule有关的解释:
Makefile文件是编译的时候,指定编译器去编译哪个程序(COMPONENT),并使用什么样的方式(由makerules所指定)去编译。
原文链接:https://blog.csdn.net/utnewbear/article/details/6255804
)
(还搜索到了一些和target有关的资料:
在makefile中,target是指定的目标文件或操作的名称。它是一个规则的名称,用于描述make工具应该执行的操作。每个target都有一组依赖文件和一组命令。在makefile中,可以定义多个target,每个target都有一个rule。rule是描述如何生成目标文件的一组命令。当执行make命令时,可以通过指定目标来选择要执行的操作。
下面是一个简单的makefile的示例:
hello: main.c greeting.c
gcc -o hello main.c greeting.c
在这个简单的示例中,"hello"是一个target,它依赖于"main.c"和"greeting.c"这两个源文件。当执行"make hello"命令时,make工具会检查目标文件"hello"是否存在,并根据规则中的命令来生成它。
)
然后官方文档具体介绍了makerules, Rules.mak, Top Level Makefile,在此忽略。
(3)使用示例
下面的示例演示了如何使用顶层 Makefile 来构建和安装 u-boot 和 linux 镜像。以下所有示例都假定你是从 SDK 的顶层调用 Makefile。
其实我就没有看懂为什么这里又开始安装linux镜像了。实在看不懂这个官方文档,可能只有懂的人才能看懂这个官方文档吧==
找到了新的博客,但是和我用的官方文档都不太一样……
https://blog.csdn.net/yiyu20180729/article/details/130315178
https://zhuanlan.zhihu.com/p/640889380