build_embed_linux_system

附录三:全志t113_i平台SDK操作和移植说明

本节以创龙的TLT113_minievm平台进行说明,主要讲述全志t113_i平台和应用移植功能。

本篇

T113_i是全志的低端双核Cortex-A7处理,启动支持SPL模式,完整固件由SPL-Boot, U-Boot, Kernel, Rootfs(buildroot, ubuntu, openwrt等)组成,这里以Tronlong提供更新的官方SDK为基础进行开发。其中SDK的目录如下所示。

I.MX6ULL的平台操作不同,这里使用官方的SDK进行编译,打包和下载,因此需要学习不同于之前编译的一套规则,通过命令直接生成最终的img文件应用。

platform_make

基于创龙TLT113-i平台的操作方法如下所示。

# 添加
source ./build/envsetup.sh

# 配置编译环境
./build.sh config

All available platform:
   0. linux
Choice [linux]: 0           # 选择系统,linux
All available linux_dev:
   0. bsp
   1. dragonboard
   2. longan
   3. tinyos
Choice [longan]: 2          # 选择平台,longan
All available kern_ver:
   0. linux-5.4
Choice [linux-5.4]: 0       # 选择系统版本,linux5.4
All available ic:
   0. t113
   1. t113_i
Choice [t113_i]: 1          # 芯片类型,t113_i
All available board:
   0. evb1
   1. evb1_auto
   2. evb1_auto_nand
   3. evb1_auto_nor
   4. tlt113-evm-emmc
   5. tlt113-evm-nand
   6. tlt113-minievm-emmc
   7. tlt113-minievm-nand
Choice [tlt113-minievm-emmc]: 6 # 板级信息,tlt113-minievm-emmc(这个是创龙添加的配置)
All available output_configs:
   0. hdmi
Choice [hdmi]: 0                # 输出配置 hdmi
All available flash:
   0. default
   1. nor
Choice [default]: 0             # 默认flash模式
All available build_root:
   0. buildroot-201902
   1. ubuntu
Choice [buildroot-201902]: 0    # 编译buildroot文件系统
All available gnueabi:
   0. gnueabi
   1. gnueabihf
Choice [gnueabi]: 0             # 交叉编译工具,不带hf使用软件浮点,带hf表示硬件浮点。

下一步,则是支持的编译选项。

# 编译所有选项
./build.sh

# 编译spl和u-boot
./build.sh brandy

# 编译内核
./build.sh kernel

# 文件系统编译
./build.sh buildroot

# 打包生成最终文件
./build.sh pack

t113i平台使用网络启动,需要系统支持tftp和nfs驱动,启动执行命令如下。

# 允许网络启动
setenv ipaddr 192.168.2.56
setenv serverip 192.168.2.29
setenv gatewayip 192.168.2.1
setenv netmask 255.255.255.0
setenv nfsroot "/home/freedom/Desktop/user_git/sdk/nfs"
run boot_net

# boot_net执行的流程
# 将boot加载到指定地址,设定bootargs参数,跳转到内核执行 
boot_net="tftpboot 43000000 boot.fex;run setargs_netboot;bootm 43000000"

# setargs_netboot执行设置bootargs变量参数
setargs_netboot=setenv  bootargs clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=/dev/nfs rootwait ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}::eth0:off nfsroot=${serverip}:${nfsroot},nolock,v3,tcp init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1

# bootargs设置后的值
bootargs="clk_ignore_unused initcall_debug=0 console=ttyAS0,115200 loglevel=8 root=/dev/nfs rootwait ip=192.168.2.56:192.168.2.29:192.168.2.1:255.255.255.0::eth0:off nfsroot=192.168.2.29:/home/freedom/Desktop/user_git/sdk/nfs,nolock,v3,tcp init=/init partitions=${partitions} cma=16M snum=${snum} mac_addr="" wifi_mac="" bt_mac="" specialstr="" gpt=1"

platform_config

平台的目录和对应文件由./build.sh config中选择的平台和配置对应。

目录对应关系为: /device/config/chips/[chips_ic]/configs/[platform]/

  1. chips_ic表示选择的芯片IC, t113或t113_i
  2. platform表示选择的硬件平台,tlt113-minievm-emmc或tlt113-minievm-nand等

相关配置文件说明列表如下所示。

  1. U-Boot的设备树文件地址: ~/device/config/chips/t113_i/configs/tlt113-minievm-emmc/uboot-board.dts
  2. Kernel的设备树文件地址: ~/device/config/chips/t113_i/configs/tlt113-minievm-emmc/linux-5.4/board.dts
  3. ddr配置文件: ~/device/config/chips/t113_i/configs/tlt113-minievm-emmc/sys_config.fex
  4. 扇区管理文件: ~/device/config/chips/t113_i/configs/tlt113-minievm-emmc/longan/sys_partition.fex(flash选择default配置)
  5. U-Boot的默认配置文件: ~/device/config/chips/t113_i/configs/tlt113-minievm-emmc/longan/env.cfg(flash选择default配置)
  6. buildroot添加自定义程序目录: ~/out/t113_i/tlt113-minievm-emmc/longan/buildroot/target/
  7. 启动时的图片文字资源: ~/device/config/chips/t113_i/boot-resource/

platform_driver_build

Makefile文件如下所示。

# ============================== Makefile ============================
ifneq ($(KERNELRELEASE),)

obj-m := kernel_led.o
ccflags-y := -DDEBUG -g -std=gnu99 -Werror -Wno-declaration-after-statement -Wframe-larger-than=1000000000

else

all:
	make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE)

clean:
	rm -rf *.ko *.o *.mod *.mod.o *.mod.c *.symvers  modul* .creat_dev.* .tmp_versions .*.*.cmd

help:
	@echo "make KDIR=<you kernel path> CROSS_COMPILE=<your CROSS_COMPILE>"
	@echo "make KDIR=/home/freedom/sdk/t113/kernel/linux-5.4 CROSS_COMPILE=arm-linux-gnueabihf-"

endif
# =====================================================================

# 编译命令
make KDIR=/home/freedom/sdk/t113/out/kernel/build CROSS_COMPILE=arm-none-linux-gnueabihf-

buildroot_issue_fix

对应ubuntu 22.04平台,编译buildroot修改项。

issue-01

//"out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/host-fakeroot-1.20.2/libfakeroot.c"
#ifndef _STAT_VER
 #if defined (__aarch64__)
  #define _STAT_VER 0
 #elif defined (__x86_64__)
  #define _STAT_VER 1
 #else
  #define _STAT_VER 3
 #endif
#endif

issue-02

//"out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/host-m4-1.4.18/lib/c-stack.c"

注释掉
// #elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
// /* libsigsegv 2.6 through 2.8 have a bug where some architectures use
//    more than the Linux default of an 8k alternate stack when deciding
//    if a fault was caused by stack overflow.  */
// # undef SIGSTKSZ
// # define SIGSTKSZ 16384

issue-03

//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/host-libglib2-2.56.3/py-compile
// imp => importlib
import sys, os, py_compile, importlib

files = '''$files'''

sys.stdout.write('Byte-compiling python modules...\n')
for file in files.split():
    $pathtrans
    $filetrans
    if not os.path.exists(filepath) or not (len(filepath) >= 3
                                            and filepath[-3:] == '.py'):
	    continue
    sys.stdout.write(file)
    sys.stdout.flush()
    if hasattr(importlib, 'get_tag'):
        py_compile.compile(filepath, importlib.cache_from_source(filepath), path)
    else:
        py_compile.compile(filepath, filepath + 'c', path)
sys.stdout.write('\n')" || exit $?

issue-04

tina5.0-v1.0使用ubuntu22.04编译会选择错误的python3版本,导致执行出错。

/bin/bash: line 1: 677428 Segmentation fault (core dumped)

# buildroot
Tina5.0-v1.0/buildroot/buildroot/staging_dir/host/bin/python => /usr/bin/python3
Tina5.0-v1.0/buildroot/buildroot/staging_dir/host/bin/python3 => /usr/bin/python3

# openwrt
Tina5.0-v1.0/openwrt/openwrt/staging_dir/host/bin/python => /usr/bin/python3
Tina5.0-v1.0/openwrt/openwrt/staging_dir/host/bin/python3 => /usr/bin/python3

issue-05

解决qt编译问题。

// tina5.0_v1.0/out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/qt5base-5.11.3/src/corelib/global/qrandom.cpp:455:62

// 修改语句
- new (&rng->storage.engine()) RandomEngine(self()->sys);
+ new (&rng->storage.engine()) RandomEngine();
//tina5.0_v1.0/out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/qt5base-5.11.3/src/corelib/tools/qbytearraymatcher.h

// 添加头文件
#include <limits>

issue-06

//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/host-libglib2-2.56.3/gio/
//gdbusmessage.c
tupled_signature_str = g_strdup_printf ("(%s)", signature_str==NULL?"":signature_str);

//gdbusauth.c
debug_print ("SERVER: WaitingForBegin, read '%s'", line==NULL?"":line);

issue-07

//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/host-dtc-1.4.7

//dtc-lexer.lex.c
extern YYLTYPE yylloc;

issue-08

//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gstreamer1-1.14.4/libs/gst/controller/controller-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/video/video-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/tag/tag-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/app/app-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/audio/audio-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/rtp/gstrtp-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/rtsp/gstrtsp-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-base-1.14.4/gst-libs/gst/pbutils/pbutils-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-bad-1.14.4/gst-libs/gst/mpegts/gstmpegts-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-bad-1.14.4/gst-libs/gst/interfaces/photography-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-bad-1.14.4/gst-libs/gst/webrtc/webrtc-enumtypes.c
//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/gst1-plugins-bad-1.14.4/ext/srtp/gstsrtp-enumtypes.c
\#include "gstinterpolationcontrolsource.h"  => #include "gstinterpolationcontrolsource.h"

issue-09

问题:- ./mkerrcodes.awk:88: warning: regexp escape sequence `#’ is not a known regexp operator

//out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/build/libgpg-error-1.33/src

//mkerrcodes.awk
//mkerrcodes1.awk
//mkerrcodes2.awk
//mkerrnos.awk
//mkstrtable.awk
sub (/\#.+/, ""); => sub (/#.+/, "");

//Makefile
//Makefile.am
//Makefile.in
//mkstrtable.awk
namespace => pkg_namespace

如此,就可以完成buildroot的编译。

使用qt应用的方法,进入qt项目目录。

# 生成qt目录文件地址(编译完成后,不能够修改qt的目录,否则会导致无法链接)
/home/freedom/sdk/t113-buildroot/tina5.0_v1.0/out/t113_i/tlt113-minievm-emmc/buildroot/buildroot/host/usr/bin/qmake 

# 编译qt项目
make

issue-09

问题:local_t not exist.

//out\t113_i\tlt113-minievm-emmc\buildroot\buildroot\build\host-localedef-2.14.1-r17443-ptx1\eglibc\locale\locale.h
#ifdef	__USE_XOPEN2K8
/* The concept of one static locale per category is not very well
   thought out.  Many applications will need to process its data using
   information from several different locales.  Another application is
   the implementation of the internationalization handling in the
   upcoming ISO C++ standard library.  To support this another set of
   the functions using locale data exist which have an additional
   argument.

   Attention: all these functions are *not* standardized in any form.
   This is a proof-of-concept implementation.  */

/* Get locale datatype definition.  */
# include <locale.h>
# include <bits/types/locale_t.h>

next_chapter

返回目录

直接开始下一章节说明: 全志H618平台SDK操作和移植说明