1. 全志T113 Tina5.0开发环境搭建
在开始定制应用程序和优化启动流程之前,我们需要先搭建好开发环境。全志T113 Tina5.0系统支持OpenWrt和Buildroot两种构建系统,这里我们以OpenWrt为例进行说明。
首先需要下载Tina5.0 SDK开发包,解压后你会看到一个完整的开发目录结构。我建议在Ubuntu 18.04或20.04系统上进行开发,因为这是官方测试最多的环境。实测在Windows下的WSL2也能运行,但可能会遇到一些路径问题。
安装必要的依赖包:
sudo apt-get update sudo apt-get install 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 lib32stdc++6 libstdc++6 -y配置环境变量很重要,我习惯在~/.bashrc中添加:
export PATH=$PATH:/opt/toolchain/bin export STAGING_DIR=/opt/toolchain/staging_dir编译整个系统前,建议先执行:
make menuconfig在这里选择正确的芯片型号(T113)和开发板配置。新手最容易犯的错误就是选错了芯片型号,导致后续编译失败。
2. 添加自定义应用程序到Tina系统
2.1 应用程序打包方式
Tina系统提供了两种方式来打包自定义应用程序:
第一种是通过busybox-init-base-files机制。这个目录下的文件在编译时会自动覆盖到rootfs中。我们可以把应用程序直接放在:
/home/sdk/t113_tina5.0/openwrt/target/t113/t113-ws_devboard/busybox-init-base-files这种方式简单直接,适合静态文件或简单的脚本。
第二种是通过创建OpenWrt软件包的方式,这是更规范的做法。我们可以在:
/home/sdk/t113_tina5.0/openwrt/package目录下创建自己的软件包。我建议参考现有的软件包结构,比如btmanager这个示例。
2.2 创建自定义软件包
让我们以一个简单的helloworld程序为例,演示如何创建完整的软件包:
- 在package目录下创建helloworld文件夹
- 新建Makefile文件,内容如下:
include $(TOPDIR)/rules.mk PKG_NAME:=helloworld PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/helloworld SECTION:=utils CATEGORY:=Utilities TITLE:=Helloworld -- prints a snarky message endef define Package/helloworld/description It's my first package demo. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Configure endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC="$(TARGET_CC)" \ CFLAGS="$(TARGET_CFLAGS) -Wall" \ LDFLAGS="$(TARGET_LDFLAGS)" endef define Package/helloworld/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin/ endef $(eval $(call BuildPackage,helloworld))- 创建src目录并编写helloworld.c程序
- 执行make menuconfig,在Utilities类别中找到helloworld并选中
- 执行make package/helloworld/compile进行编译
2.3 常见问题解决
在实际操作中,我遇到过几个典型问题:
- 权限问题:确保你的开发账户对SDK目录有读写权限
- 路径问题:绝对路径和相对路径要区分清楚,建议使用$(TOPDIR)这样的变量
- 依赖问题:如果程序依赖其他库,需要在Makefile中明确声明
- 编译选项:交叉编译时要注意目标架构和本机的区别
3. 配置应用程序开机自启动
3.1 init.d脚本编写
Tina系统使用busybox的init机制,启动脚本存放在:
/home/sdk/t113_tina5.0/openwrt/target/t113/t113-dev/busybox-init-base-files/etc/init.d一个典型的启动脚本如下:
#!/bin/sh /etc/rc.common START=95 STOP=15 APP_NAME="myapp" APP_PATH="/usr/bin/myapp" APP_PID_FILE="/var/run/myapp.pid" start() { echo "Starting $APP_NAME" start-stop-daemon -S -b -m -p $APP_PID_FILE -x $APP_PATH } stop() { echo "Stopping $APP_NAME" start-stop-daemon -K -p $APP_PID_FILE } restart() { stop sleep 1 start }几个关键点:
- START=95表示启动顺序,数字越大启动越晚
- 使用start-stop-daemon管理进程
- 记得给脚本执行权限:chmod +x /etc/init.d/myapp
3.2 启用自启动
创建好脚本后,需要启用它:
/etc/init.d/myapp enable这会在/etc/rc.d/下创建对应的软链接。
3.3 调试技巧
调试启动脚本时,我常用的方法:
- 在脚本中添加调试输出:
echo "Debug: Starting at $(date)" >> /tmp/debug.log- 手动测试:
/etc/init.d/myapp start /etc/init.d/myapp stop- 查看日志:
logread | grep myapp- 检查进程:
ps | grep myapp4. 修改开机LOGO与启动优化
4.1 替换开机LOGO
Tina系统的开机LOGO文件位置取决于使用的构建系统:
对于OpenWrt构建:
/home/sdk/t113_tina5.0/openwrt/target/t113/t113-common/boot-resource/boot-resource/bootlogo.bmp对于Buildroot构建:
/home/sdk/t113_tina5.0/device/config/chips/t113/boot-resource/boot-resource/bootlogo.bmp替换时要注意:
- 图片必须是BMP格式
- 建议使用24位色深
- 分辨率要匹配屏幕
- 文件大小不能超过分区限制
4.2 解决LOGO大小问题
如果替换后打包报错,可能是LOGO太大。需要修改分区配置:
/home/sdk/t113_tina5.0/device/config/chips/t113/configs/axx/linux-5.4/sys_partition.fex找到boot-resource分区,调整size值:
[partition] name = boot-resource size = 23404.3 启动流程优化
要实现快速启动,可以从以下几个方面优化:
- 精简内核:通过make kernel_menuconfig移除不需要的驱动和功能
- 优化init进程:减少不必要的启动脚本
- 并行启动:在/etc/inittab中添加::sysinit:/etc/init.d/rcS S boot &
- 延迟加载:非关键服务可以延迟启动
- 文件系统优化:使用squashfs只读rootfs,减少校验时间
实测通过这些优化,T113的启动时间可以从原来的10秒左右缩短到5秒以内。
5. 高级定制技巧
5.1 文件系统定制
除了添加应用程序,我们还可以定制整个文件系统:
添加自定义用户: 在busybox-init-base-files/etc/passwd和/etc/shadow中添加条目
修改网络配置: 编辑busybox-init-base-files/etc/config/network
添加自定义服务: 创建/etc/init.d脚本和/etc/config配置文件
5.2 内核模块开发
如果需要开发内核模块,可以:
- 在package/kernel目录下创建模块
- 编写Kconfig和Makefile
- 通过make kernel_menuconfig启用模块
- 编译并打包到镜像中
5.3 固件打包与烧写
完成所有修改后,执行:
make -j$(nproc)生成固件位于out/t113/目录下。
烧写工具推荐使用PhoenixSuit,注意:
- 开发板要进入FEL模式
- 选择正确的固件文件
- 第一次烧写可能需要安装驱动
6. 调试与问题排查
开发过程中难免会遇到各种问题,我总结了一些常见问题的解决方法:
- 系统无法启动:
- 检查串口输出,定位卡在哪个阶段
- 确认内核命令行参数是否正确
- 验证文件系统是否完整
- 应用程序运行异常:
- 使用strace跟踪系统调用
- 检查动态库依赖:ldd /path/to/app
- 查看系统日志:logread
- 性能问题:
- 使用top查看系统资源使用情况
- 使用ftrace分析内核性能
- 使用perf进行性能剖析
- 网络问题:
- ifconfig查看接口状态
- route -n检查路由表
- ping测试基本连通性
在实际项目中,我建议建立一个checklist,记录每次遇到的问题和解决方法,这样可以大大提高开发效率。