【T113-S3】 Tina Linux SDK 深度解析:从BingPi-M2方案看嵌入式Linux开发

📅 发布时间:2026/7/7 7:56:33 👁️ 浏览次数:
【T113-S3】 Tina Linux SDK 深度解析:从BingPi-M2方案看嵌入式Linux开发
1. 从零认识 Tina Linux SDK不只是个“工具包”很多刚接触嵌入式Linux的朋友一听到“SDK”这个词就有点发怵感觉是个很高深的东西。其实吧你可以把它想象成一个“超级乐高套装”。你买了一个BingPi-M2开发板就像买了一盒基础乐高积木能拼出个简单的小车。而Tina Linux SDK呢就是那个附赠的、装满了各种特殊零件、电动马达、遥控器甚至拼装说明书的超大号工具箱。有了它你才能把这盒“积木”真正变成一个能跑、能亮灯、能联网的智能小车。所以SDKSoftware Development Kit真没那么神秘它就是软件开发工具包。对于嵌入式开发来说它尤其重要因为我们的“电脑”开发板和日常用的PC完全不同。我们写的程序需要在PCx86架构上“翻译”成开发板比如T113-S3是ARM架构能听懂的语言这个过程叫“交叉编译”。SDK就是这个“翻译官”兼“后勤部长”它把交叉编译器、代码库、配置工具、打包脚本等等全部打包好送给你让你能在一个熟悉的环境你的电脑里为另一个陌生的环境开发板制造软件。Tina Linux SDK是全志科技为其Tina Linux嵌入式系统提供的官方开发套件。我刚开始用的时候觉得它目录结构有点复杂但用熟了就会发现它把东西分门别类放得特别清楚这对管理一个庞大的嵌入式项目至关重要。这次我们就以BingPi-M2这块搭载了全志T113-S3双核Cortex-A7芯片的开发板为例把这个“超级工具箱”彻底拆开看看里面到底有什么宝贝以及我们怎么用它们来“造轮子”。2. Tina Linux SDK目录结构全景漫游当你第一次解压Tina Linux SDK的压缩包后面对一堆目录可能会眼花。别慌我们就像参观一个新家一个个房间看过去。理解每个目录的职责是后续高效开发的基础。这个结构是全志多年嵌入式经验的沉淀看似繁琐实则合理。2.1 核心“车间”build,config,device这几个目录决定了你的系统“怎么被造出来”以及“造成什么样”。build目录这是整个SDK的构建系统核心你可以把它理解为自动化工厂的“总控程序”。里面是一系列以.mk结尾的Makefile片段。全志基于OpenWrt的构建系统改造而来形成了自己的一套Tina Build System。当你执行make命令时就是从这里开始按照预设的规则调用编译器、链接器把源代码变成二进制文件。新手通常不需要修改这里但当你需要深度定制编译流程时这里就是关键。config目录这是系统的“配置中心”。里面存放着生成那个我们很熟悉的、字符界面的配置菜单make menuconfig的所有文件。当你运行make menuconfig时程序会读取这里的配置项生成一个交互界面。你在这里做的每一个选择比如选择什么文件系统、支持哪些网络协议、包含哪些软件包最终都会转化成编译时的宏定义或配置开关。config/chips/t113/这个路径尤其重要它存放了T113芯片平台架构级的通用配置是所有使用T113芯片方案包括BingPi-M2的基础。device目录这是“方案库”或者叫“项目仓库”。config目录管的是芯片T113通用配置而device目录管的是具体的板子BingPi-M2。这是开发者最常打交道的地方之一。里面会按厂商和方案名组织比如BingPi-M2的配置可能就在device/config/chips/t113/configs/bingpi-m2/这样的路径下。这里存放着这块板子独一无二的“身份证”和“规划图”sys_config.fex: 全志特有的板级配置文件非常强大。它定义了硬件资源的分配比如哪个GPIO管脚连着LEDUART串口用的是哪一组屏幕参数是什么摄像头接口如何配置等等。这个文件会被一个专用工具解析并生成二进制格式的sys_config.bin最终被bootloader读取。board.dts: 标准的Linux设备树文件。这是Linux内核识别硬件的主要依据。它以一种树状结构描述了CPU、内存、总线、外设如USB、Ethernet、GPIO控制器的拓扑关系和属性。DTS设备树源码会被编译成DTB设备树二进制文件由内核在启动时加载。通常sys_config.fex中的很多配置会通过脚本自动同步或影响到board.dts的生成。内核配置方案特定的Linux内核编译选项文件.config。分区表定义eMMC或SPI NAND Flash上各个分区的起始位置、大小和用途如boot、rootfs、recovery等。env配置U-Boot环境变量的默认设置。注意在实际开发中修改硬件配置大部分时间就是在和device/目录下的sys_config.fex和board.dts打交道。务必搞清楚两者的分工和联系。2.2 原料与工具库lichee,package,prebuilt,toolchain这几个目录提供了构建系统所需的“原材料”和“加工工具”。lichee目录这个名字来源于“荔枝”是全志对核心系统软件的统称。这里面是真正的“硬核”代码bootloader通常是U-Boot负责初始化最基础的硬件如DRAM、从存储设备加载内核、传递设备树给内核。它是系统上电后跑的第一段主要程序。linux内核Tina Linux所使用的特定版本Linux内核源码。全志会在此基础打上许多针对其芯片的驱动补丁和优化。DSP相关代码像T113-S3这类芯片可能集成了音频或视频DSP。这部分代码由于涉及第三方IP授权通常需要单独申请才能获取。package目录这是Tina Linux的“软件仓库”也是其生态强大的体现。里面包含了成千上万个开源或全志自研的软件包按功能分类比如network,utils,kernel,libs等。每个软件包目录里通常包含Makefile定义如何下载、打补丁、配置、编译和安装这个软件包。patches/针对该软件包使其能在Tina系统上正常工作的补丁。源码或指向源码下载地址的规则。 当你通过make menuconfig选中某个软件比如openssh,python3时构建系统就会到package目录里找到对应的规则把它编译并打包进最终的根文件系统镜像中。对于BingPi-M2你需要留意的是并非所有软件包都默认适配了T113平台有些可能需要你手动调整编译选项或打补丁。prebuilt与toolchain目录这两个关乎“翻译官”。toolchain存放着构建交叉工具链的规则和配置。工具链包含gcc编译器、gdb调试器、binutils二进制工具集等。SDK可能会提供源码让你自己编译工具链也可能直接配置好。prebuilt这里通常存放着预编译好的交叉工具链。为了节省时间SDK往往会直接提供一个已经编译好的、针对特定架构如arm-openwrt-linux-gnueabi的工具链。这样你解压SDK后无需等待漫长的工具链编译可以直接开始编译系统。2.3 输出与辅助out,scripts,target这是构建过程的“成品仓库”和“辅助工具间”。out目录这是编译输出目录。非常重要这个目录不是一开始就有的而是在你第一次执行make编译后自动生成的。所有编译过程中的临时文件、最终生成的系统镜像如tina_bingpi-m2_uart0.img、根文件系统压缩包等都会放在这里。清理编译输出通常就是删除这个目录或者在里面执行make clean。每次编译新方案out目录下都会生成对应的方案子目录如out/bingpi-m2。scripts目录存放各种实用脚本。有在PChost端运行的比如一些打包镜像、处理文件的脚本也有最终会放到开发板target上运行的比如初始化脚本。这些脚本自动化了很多繁琐的操作。target目录这个目录用于存放目标板相关的通用配置模板以及SDK和工具链的生成规格。它和device目录的区别在于device更偏向于硬件方案而target可能更偏向于软件系统层面的通用配置。3. 实战为BingPi-M2构建你的第一个Tina系统了解了工具箱里都有什么现在我们来亲手用它们造点东西。这个过程就像用乐高拼装说明书一步步操作只要环境对命令对基本都能成功。3.1 搭建开发环境打好地基工欲善其事必先利其器。嵌入式开发环境搭建是个细活我踩过的坑不少总结下来最关键的就几点。首先强烈推荐使用Ubuntu 20.04 LTS或22.04 LTS作为开发主机。Windows下的WSL2虽然能用但在涉及USB设备烧录、某些底层编译时可能会遇到权限或驱动问题对新手不友好。一台纯粹的Linux物理机或虚拟机是省心的选择。其次安装依赖包。Tina的构建系统需要一大堆工具的支持缺一不可。打开终端执行以下命令sudo apt-get update sudo apt-get install -y build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc6 libstdc6 libc6:i386 libstdc6:i386 lib32ncurses5-dev lib32z1-dev zlib1g:i386这一长串命令安装了从编译器、链接器到各种库文件的所有依赖。如果遇到个别包找不到可能是源的问题换个Ubuntu镜像源再试。网络环境很重要因为编译过程中需要从网上下载大量软件包源码。然后获取SDK。通常你会从官方渠道得到一个压缩包比如tina-t113-sdk.tar.gz。把它解压到一个路径没有中文和空格的目录下比如/home/yourname/workspace/tina-t113。记住这个路径后续所有操作都在这个SDK根目录下进行。tar -zxvf tina-t113-sdk.tar.gz cd tina-t113进入SDK根目录后建议先执行一下环境设置脚本如果存在的话或者直接开始配置。3.2 配置与编译一键生成系统镜像环境好了我们就可以开始为BingPi-M2定制系统了。这个过程主要是通过菜单配置来完成的。选择方案在SDK根目录下运行lunch命令。如果你的SDK版本支持会出现一个列表让你选择开发板方案。你应该能看到类似bingpi-m2的选项选中它对应的编号。如果不支持lunch可能需要手动执行make menuconfig进入主菜单后在Target Profile里选择BingPi-M2。进入主配置菜单执行make menuconfig。一个蓝底白字的字符界面会出现这就是Tina的“中枢神经”。在这里你可以决定你的系统包含什么、不包含什么。Target Profile确认已选中BingPi-M2。Kernel modules可以在这里增加或删除内核模块比如额外的文件系统驱动、网络驱动等。LuCI这是OpenWrt/Tina的Web管理界面如果你想通过浏览器配置开发板可以在这里选中它和相关的主题、应用。Network选择你需要的网络协议和工具如curl,wget,openssh-server强烈建议选中方便后续SSH登录。Utilities选择一些常用工具如vim,htop,file等。 对于第一次尝试你可以先保持默认配置或者只勾选openssh-server。用方向键移动空格键选中/取消选中[*]表示编译进内核[M]表示编译为模块[ ]表示不选左右键选择底部的Select, Exit , Help 回车键确认。保存并退出配置完成后选择 Save 保存配置文件通常是.config然后选择 Exit 退出菜单。开始编译在终端输入make -j$(nproc)然后回车。-j$(nproc)表示使用你电脑CPU的所有核心进行并行编译能极大加快速度。接下来就是一段漫长的等待初次编译可能需要1-3小时取决于电脑性能和网络速度。你会看到屏幕上飞速滚动的编译信息。在这个过程中构建系统会依次做这些事情编译交叉工具链如果prebuilt里没有的话。根据配置从package目录和网络下载选中的软件包源码。编译Linux内核。编译bootloaderU-Boot。编译所有选中的软件包。将内核、bootloader、根文件系统等打包成最终的固件镜像。获取成果编译成功后最终的固件镜像可以在out/bingpi-m2/目录下找到。镜像文件名通常类似tina_bingpi-m2_uart0.img。这个.img文件就是可以烧录到开发板eMMC或SD卡中的完整系统镜像。3.3 烧录与启动让板子“活”起来拿到镜像文件后下一步就是把它“灌入”BingPi-M2开发板。全志芯片通常使用PhoenixSuitWindows或LiveSuitLinux工具进行烧录但更通用和底层的方式是使用sunxi-fel工具通过USB OTG进行烧录。这里以更开发者向的sunxi-fel方式为例需要在Linux主机下操作安装sunxi-tools首先在你的Ubuntu主机上安装这个工具集。git clone https://github.com/linux-sunxi/sunxi-tools.git cd sunxi-tools make sudo make install确保fel命令可用。进入FEL模式断开BingPi-M2开发板电源。找到板子上的FEL按键或USB OTG接口附近的测试点具体请查阅BingPi-M2手册。按住FEL按键或短接测试点不放然后给开发板上电插入USB OTG线连接到电脑。此时电脑应该能识别到一个新的USB设备。烧录镜像在终端使用fel命令烧录。烧录到eMMC和SD卡的命令略有不同。假设你要烧录到SD卡TF卡且SD卡在电脑上识别为/dev/sdb请务必用lsblk命令确认你的设备号误操作会清空硬盘。# 将镜像写入SD卡请将 /dev/sdb 替换为你的实际设备 sudo dd ifout/bingpi-m2/tina_bingpi-m2_uart0.img of/dev/sdb bs1M statusprogress sudo sync如果是烧录到板载eMMC可能需要通过fel命令先初始化eMMC再写入镜像步骤更复杂建议参考板子具体手册。上电启动烧录完成后断开USB将SD卡插入BingPi-M2如果烧录到SD卡或者直接给板子上电如果烧录到eMMC。你应该在串口终端需要使用USB转TTL串口线连接板子的UART0波特率通常为115200看到U-Boot和Linux内核的启动日志。如果一切顺利最后会出现登录提示符。默认用户名可能是root密码可能为空或123456。4. 进阶定制你的专属系统第一次成功编译和启动会带来巨大的成就感但这只是开始。Tina SDK的强大之处在于深度定制。下面我们聊聊几个最常见的定制场景。4.1 添加一个自定义软件包假设你想在系统中加入一个自己写的小程序myapp。在package目录下创建目录在package目录下找一个合适的分组比如utils或者自己新建一个custom目录。然后创建package/utils/myapp/或package/custom/myapp/。编写Makefile这是最关键的一步。在myapp目录下创建Makefile内容模板如下include $(TOPDIR)/rules.mk # 软件包信息 PKG_NAME:myapp PKG_VERSION:1.0 PKG_RELEASE:1 PKG_BUILD_DIR:$(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk # 软件包定义 define Package/myapp SECTION:utils CATEGORY:Utilities TITLE:My First Custom Application DEPENDS:libc endef define Package/myapp/description This is a simple custom application for testing. endef # 编译准备如下载源码这里我们假设源码就在当前目录的src文件夹里 define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef # 配置如果软件包需要configure define Build/Configure # 可以在这里运行 ./configure endef # 编译 define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC$(TARGET_CC) \ CFLAGS$(TARGET_CFLAGS) \ LDFLAGS$(TARGET_LDFLAGS) endef # 安装到目标文件系统 define Package/myapp/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ endef $(eval $(call BuildPackage,myapp))这个Makefile定义了软件包的名字、版本描述了如何准备源码、如何编译、以及如何将编译好的二进制文件安装到目标根文件系统的指定位置这里是/usr/bin。放置源码在myapp目录下创建src文件夹把你的程序源码比如一个简单的myapp.c和对应的Makefile放进去。在菜单中启用回到SDK根目录运行make menuconfig。在Utilities或你自定义的分类下你应该能看到新出现的My First Custom Application选项选中它按Y键。重新编译执行make package/myapp/compile Vs可以单独编译你的包。编译成功后再执行make重新生成系统镜像你的myapp就已经被包含进去了。4.2 修改硬件配置点亮一个LED硬件配置主要修改device/config/chips/t113/configs/bingpi-m2/下的sys_config.fex文件。假设你想控制一个连接到PH10管脚的LED。找到GPIO配置段在sys_config.fex中搜索[gpio_para]或[gpio_pins]相关的段落。不同平台可能略有不同。配置管脚功能找到PH10的配置行或者添加一行。你需要将其功能设置为GPIO输出。例如[gpio_para] gpio_pin_1 port:PH101defaultdefault1这里的参数含义通常是端口:管脚功能内部电阻驱动能力初始电平。1可能代表GPIO输出功能1在最后可能代表初始高电平。具体语法请参考全志的《T113芯片手册》和《sys_config.fex配置说明》。在应用中使用修改后需要重新编译系统并更新到板子上。在应用程序中你可以通过标准的Linux GPIO sysfs接口/sys/class/gpio或更高效的libgpiod库来控制这个GPIO从而控制LED的亮灭。4.3 内核驱动调试与优化当遇到硬件不识别或性能问题时可能需要深入内核层面。查看内核日志使用dmesg命令可以查看内核启动和运行过程中的所有信息是排查硬件驱动问题的第一利器。调整内核配置运行make kernel_menuconfig可以进入Linux内核的详细配置菜单。在这里你可以精确地启用或禁用某个驱动、调整内核参数。例如你可以启用更多的USB设备驱动、文件系统支持或者打开内核调试信息CONFIG_DEBUG_INFO以便进行更深入的调试。使用设备树覆盖对于频繁修改的设备树配置不建议直接修改board.dts源文件。Tina系统通常支持设备树覆盖Device Tree Overlay。你可以将额外的设备节点比如一个新接的I2C设备写在一个独立的.dts文件中在系统启动时动态加载而无需重新编译整个内核镜像。从解压SDK到成功启动从编译默认系统到添加自己的软件、配置自己的硬件这个过程就是嵌入式Linux开发的缩影。Tina Linux SDK通过它清晰虽然初看复杂的目录结构把芯片厂商的底层支持、开源社区的庞大软件包、以及你自己的业务代码有机地整合在了一起。围绕BingPi-M2和T113-S3的每一次实践无论是成功点亮一个LED还是解决一个棘手的驱动兼容性问题都会让你对这套工具链的理解更深一层。记住遇到问题多查device目录下的配置文件多看看out目录下的编译日志善用make menuconfig这个强大的配置工具社区的论坛和Wiki也是宝贵的资源。嵌入式开发就是这样一个不断探索、试错和积累的过程而一个好的SDK就是这条路上最得力的助手。