Tina_Linux_系统软件 开发指南

Posted 韦东山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tina_Linux_系统软件 开发指南相关的知识,希望对你有一定的参考价值。

Tina_Linux_系统软件 开发指南





1 概述

编写目的:本文档作为Allwinner Tina Linux系统平台开发指南,旨在帮助软件开发工程师、技术支持工程师快速上手,熟悉Tina Linux系统的开发及调试流程。

适用范围:Tina Linux v3.5及以上版本。

2 Tina系统资料

2.1 概述

Tina SDK发布的文档旨在帮助开发者快速上手开发及调试,文档中涉及的内容并不能涵盖所有的开发知识和问题。文档列表也正在不断更新。

Tina SDK提供丰富的文档资料,包括硬件参考设计文档、Flash等基础器件支持列表、量产工具使用说明、软件开发与制定介绍文档、芯片研发手册等资料。

2.2 文档列表

请以全志科技全志客户服务平台最新列表为准。

3 Tina系统概述

3.1 概述

Tina Linux系统是基于openwrt-14.07的版本的软件开发包,包含了Linux系统开发用到的内核源码、驱动、工具、系统中间件与应用程序包。openwrt是一个开源的嵌入式Linux系统自动构建框架,是由Makefile脚本和Kconfig配置文件构成的。使得用户可以通过menuconfig配置,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件。

3.2 系统框图

Tina系统软件框图如图所示,从下至上分为Kernel && Driver、Libraries、System Ser-vices、Applications四个层次。各层次内容如下:

  1. Kernel&&Driver主要提供Linux Kernel的标准实现。Tina平台的Linux Kernel 采用Linux3.4、linux3.10、linux4.4、linux4.9等内核(不同硬件平台可能使用不同内核版本)。提供安全性,内存管理,进程管理,网络协议栈等基础支持;主要是通过Linux内核管理设备硬件资源,如CPU调度、缓存、内存、I/O等。
  2. Libraries层对应一般嵌入式系统,相当于中间件层次。包含了各种系统基础库,及第三方开源程序库支持,对应用层提供API接口,系统定制者和应用开发者可以基于Libraries层的API开发新的应用。
  3. System Services层对应系统服务层,包含系统启动管理、配置管理、热插拔管理、存储管理、多媒体中间件等。
  4. Applications层主要是实现具体的产品功能及交互逻辑,需要一些系统基础库及第三方程序库支持,开发者可以开发实现自己的应用程序,提供系统各种能力给到最终用户。

3.3 开发流程

Tina Linux 系统是基于 Linux Kernel,针对多种不同产品形态开发的 SDK。可以基于本
SDK,有效地实现系统定制和应用移植开发。

如上图所示,开发者可以遵循上述开发流程,在本地快速构建Tina Linux系统的开发环境和编译
代码。下面将简单介绍下该流程:

  1. 检查系统需求:在下载代码和编译前,需确保本地的开发设备能够满足需求,包括机器的硬件能力,软件系统,工具链等。目前Tina Linux系统只支持Ubuntu操作系统环境下编译,并仅提供Linux环境下的工具链支持,其他如MacOS,Windows等系统暂不支持。
  2. 搭建编译环境:开发机器需要安装的各种软件包和工具,详见开发环境章节,获知TinaLinux已经验证过的操作系统版本,编译时依赖的库文件等。
  3. 选择设备:在编译源码前,开发者需要先导出预定义环境变量,然后根据开发者根据的需求,选择对应的硬件板型,详见编译章节。
  4. 系统定制:开发者可以根据使用的硬件板子、产品定义,定制U-Boot、Kernel及Open-wrt,请参考后续章节中相关开发指南和配置的描述。
  5. 编译与打包:完成设备选择、系统定制之后执行编译命令,包括整体或模块编译以及编译清理等工作,进一步的,将生成的boot/内核二进制文件、根文件系统、按照一定格式打包成固件。详见编译打包章节。
  6. 烧录并运行:继生成镜像文件后,将介绍如何烧录镜像并运行在硬件设备,进一步内容详见系统烧写章节。

4 Tina开发环境

4.1 概述

嵌入式产品开发流程中,通常有两个关键的步骤,编译源码与烧写固件。源码编译需要先准备好

编译环境,而固件烧写则需要厂家提供专用烧写工具。本章主要讲述这如何搭建环境来实现Tinasdk的编译、烧写。

4.2 编译环境搭建.

一个典型的嵌入式开发环境包括本地开发主机和目标硬件板。

  • 本地开发主机作为编译服务器,需要提供Linux操作环境,建立交叉编译环境,为软件开发提供代码更新下载,代码交叉编译服务。
  • 本地开发主机通过串口或USB与目标硬件板连接,可将编译后的镜像文件烧写到目标硬件板,并调试系统或应用程序。

4.2.1 开发主机配置.

Tina Linux SDK是在ubuntu14.04开发测试的,因此我们 推荐使用Ubuntu 14.04 主机环境进行源码编译,其他版本没有具体测试,可能需要对软件包做相应调整。

4.2.2 软件包配置.

编译Tina Linux SDK 之前,需要先确定编译服务器安装了gcc,binutils,bzip2,flex,python,perl,make,ia32-libs,find,grep,diff,unzip,gawk,getopt,subver-sion,libz-dev,libc headers。

ubuntu可直接执行以下命令安装:

sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawkflex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip ia32-libslib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y

ubuntu 16.04及以上版本,执行下面命令安装软件包:

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++ libstdc++6 -y libc6:i386 libstdc++6:i386 lib32ncurses5 lib32z

5 Tina系统获取

5.1 概述

5.2 SDK获取

Allwinner Tina Linux SDK通过全志代码服务器对外发布。客户需要向业务/技术支持窗口申请SDK下载权限。申请需同步提供SSH公钥进行服务器认证授权,获得授权后即可同步代码。

5.3 SDK结构

Tina Linux SDK主要由构建系统、配置工具、工具链、host工具包、目标设备应用程序、文档、脚本、linux内核、bootloader部分组成,下文按照目录顺序介绍相关的组成组件。

Tina-SDK/
    ├── build
    ├── config
    ├── Config.in
    ├── device
    ├── dl
    ├── docs
    ├── lichee
    ├── Makefile
    ├── out
    ├── package
    ├── prebuilt
    ├── rules.mk
    ├── scripts
    ├── target
    ├── tmp
    ├── toolchain
    └── tools

5.3.1 build目录

build目录存放Tina Linux的构建系统文件,此目录结构下主要是一系列基于Makefile规格编
写的mk文件。主要的功能是:

  1. 检测当前的编译环境是否满足Tina Linux的构建需求。
  2. 生成host包编译规则。
  3. 生成工具链的编译规则。
  4. 生成target包的编译规则。
  5. 生成linux kernel的编译规则。
  6. 生成系统固件的生成规则。
build/
    ├── autotools.mk
    ├── aw-upgrade.mk
    ├── board.mk
    ├── cmake.mk
    ├── config.mk
    ├── debug.mk
    ├── depends.mk
    ├── device.mk
    ├── device_table.txt
    ├── download.mk
    ├── dumpvar.mk
    ├── envsetup.sh

5.3.2 config目录

config目录主要存放Tina Linux中配置菜单的界面以及一些固定的配置项,该配置菜单基于内
核的mconf规格书写。

config/
    ├── Config-build.in
    ├── Config-devel.in
    ├── Config-images.in
    ├── Config-kernel.in
    └── top_config.in

5.3.3 devices目录

devices目录用于存放方案的配置文件,包括内核配置,env配置,分区表配置,sys_config.fex,
board.dts等。

这些配置在旧版本上是保存于target目录下,新版本挪到device目录。

注意defconfig仍保存在target目录。

device/
    └── config
        ├── chips
        ├── common
        └── rootfs_tar

快捷跳转命令:cconfigs

5.3.4 docs目录

docs目录主要存放用于开发的文档,以markdown格式书写。

本目录不再更新,请以全志客户服务平台系统文档为准。

docs/
    ├── build.md
    ├── config.md
    ├── init-scripts.md
    ├── Makefile
    ├── network.md
    ├── tina.md
    ├── wireless.md
    └── working.md

5.3.5 lichee目录

lichee目录主要存放bootloader,内核,arisc,dsp等代码。

lichee/
    ├── bootloader
    │ ├── uboot_2011_sunxi_spl
    │ └── uboot_2014_sunxi_spl
    ├── brandy
    │ ├── u-boot-2011.09
    │ └── u-boot-2014.07
    ├── brandy-2.0
    │ ├── spl
    │ ├── tools
    │ └── u-boot-2018
    ├── linux-3.4
    ├── linux-3.10
    ├── linux-4.4
    ├── linux-4.9
    ├── arisc

快捷跳转命令:ckernel,cboot,cboot0,carisc。

5.3.6 package目录

package目录存放target机器上的软件包源码和编译规则,目录按照目标软件包的功能进行分
类。

package/
    ├── allwinner
    ├── base-files
    ├── devel
    ├── dragonst
    ├── firmware
    ├── kernel
    ├── ......
    └── utils

5.3.7 prebuilt目录

prebuild目录存放预编译交叉编译器,目录结构如下。

prebuilt/
    └── gcc
        └── linux-x86
            ├── aarch64
            │   ├── toolchain-sunxi-musl
            │   └── toolchain-sunxi-glibc
            ├── arm
            │   ├── toolchain-sunxi-arm9-glibc
            │   ├── toolchain-sunxi-arm9-musl
            │   ├── toolchain-sunxi-glibc
            │   ├── toolchain-sunxi-musl
            └── host
            └── host-toolchain.txt

5.3.8 scripts目录

scripts目录用于存放一些构建编译相关的脚本。

scripts/
    ├── arm-magic.sh
    ├── brcmImage.pl
    ├── bundle-libraries.sh
    ├── checkpatch.pl
    ├── clang-gcc-wrapper
    ├── cleanfile
    ├── clean-package.sh
    ├── cleanpatch
    ├── ......

5.3.9 target目录

target目录用于存放目标板相关的配置以及sdk和toolchain生成的规格。

target/
    ├── allwinner
    ├── Config.in
    ├── imagebuilder
    ├── Makefile
    ├── sdk
    └── toolchain

快捷跳转命令:cdevice。

5.3.10 toolchain目录.

toolchain目录包含交叉工具链构建配置、规则。

toolchain/
    ├── binutils
    ├── Config.in
    ├── fortify-headers
    ├── gcc
    ├── gdb
    ├── glibc
    ├── info.mk
    ├── insight
    ├── kernel-headers
    ├── Makefile
    ├── musl
    └── wrapper

5.3.11 tools目录.

tools目录用于存放host端工具的编译规则。

tools/
    ├── autoconf
    ├── automake
    ├── aw_tools
    ├── b43-tools
    ├── ......

5.3.12 out目录.

out目录用于保存编译相关的临时文件和最终镜像文件,编译后自动生成此目录,例如编译方案
r328s2-perf1。

out/
    ├── r328s2-perf
    └── host

其中host目录用于存放host端的工具以及一些开发相关的文件。

r328s2-perf1目录为方案对应的目录。方案目录下的结构如下:

out/r328s2-perf
    ├── boot.img
    ├── compile_dir
    ├── image
    ├── md5sums
    ├── packages
    ├── r328s2-perf1-boot.img
    ├── r328s2-perf1-uImage
    ├── r328s2-perf1-zImage
    ├── rootfs.img
    ├── sha256sums
    ├── staging_dir
    └── tina_r328s2-perf1_uart0.img
  • boot.img为最终烧写到系统boot分区的数据,可能为boot.img格式也可能为uImage格式。
  • rootfs.img为最终烧写到系统rootfs分区的数据,该分区默认为squashfs格式。
  • r328s2-perf1-zImage为内核的zImage格式镜像,用于进一步生成uImage。
  • r328s2-perf1-uImage为内核的uImage格式镜像,若配置为uImage格式,则会拷贝成boot.img。
  • r328s2-perf1-boot.img为内核的boot.img格式镜像,若配置为boot.img格式,则会拷贝成boot.img
  • compile_dir为sdk编译host,target和toolchain的临时文件目录,存有各个软件包的源码。
  • staging_dir为sdk编译过程中保存各个目录结果的目录。
  • packages目录保存的是最终生成的ipk软件包。
  • tina_r328s2-perf1_uart0.img为最终固件包(系统镜像),串口信息通过串口输出
  • 若使用pack -d,则生成的固件包为xxx_card0.img,串口信息转递到tf卡座输出。

快捷跳转命令:cout。

5.4 SDK更新

SDK更新分为两类:一类是以补丁的形式发布到一号通,发布后系统以邮件形式通知开发者;另一类是定期(半年或季度)的小版本迭代升级,将过往的补丁合入到SDK中,发布后以系统邮件通知开发者,可基于干净的SDK包通过repo sync命令更新。

5.5 问题反馈

Allwinner提供全志客户服务平台(https://open.allwinnertech.com),用来登记客户遇到的
问题以及解决状态。方便双方追踪,使问题处理更加高效。后续SDK问题、技术问题、技术咨询
等都可以提交到此系统上,Allwinner技术服务会及时将问题进行分发、处理和跟踪。

注:系统登录帐号需要与Allwinner开通确认。

6 Tina编译打包

6.1 概述

6.2 编译系统

(1) source build/envsetup.sh
(2) lunch
(3) make [-jN]
(4) pack [-d]

其中,
步骤(1)建立编译环境,导出编译变量。
步骤(2)提示需要选择你想要编译的方案。
步骤(3)参数N为并行编译进程数量,依赖编译服务器CPU核心数,如 4 核PC,可"make -j4"
步骤(4)打包固件,-d参数使生成固件包串口信息转到tf卡座输出。
编译完成后系统镜像会打包在out/<board>/目录下

6.3 编译boot

命令命令有效目录作用
mboottina下任意目录编译boot0和uboot
mboot0tina下任意目录编译boot0
muboottina下任意目录编译uboot

6.4 编译内核

命令命令有效目录作用
mkerneltina下任意目录编译内核

6.5 编译arisc

arisc是AW平台对cpus代码环境的代称,主要功能是负责休眠,关机等底层操作。它包含
cpus运行所需的驱动,库及工具链等,编译产生scp.bin,然后打包在Tina镜像中,有boot-
loader在启动时加载到cpus域运行。

Tina中提供了如下与arisc相关的跳转、编译命令

命令命令有效目录作用
carisctina下任意目录跳转到cpus代码工程目录
mkarisctina下任意目录编译cpus代码

在Tina中,编译arisc代码有两种方式,如下:

第一种方式,跳转到arisc代码路径下,使用make编译

arisc代码库具有独立的工具链和构建体系,因此对arisc代码的编译,也可以cd到对应的路径
下,执行make命令。但需注意,此时需要手动将生成的scp.bin文件拷贝到SDK的bin文件
路径下,覆盖对应的文件(一般路径是tina/device/config/chips/$平台名/bin)。

操作如下,

step1
使用carisc或cd命令跳转到arisc代码环境下,一般为tina/lichee/arisc/ar100s。

step2
生成必要的配置。在arch/configs/下,存在许多defconfig默认配置文件,可根据AXP型号选择使用,例如make sun50iw10p1_axp803_defconfig。此操作将会在arisc根目录生成.config。

step3
修改默认配置,可使用make menuconfig。此操作会生成配置菜单,按需选择配置即可,该操作会修改.config。如需重新使用默认配置,重新执行step2即可。

step4
使用make命令编译

step5
将scp.bin拷贝到Tina的bin目录,即cbin可跳转的目录即可。如/tina/device/config/chips/r818/binstep6

若需清理工程,可使用make clean

step7
如需提交defconfig配置修改,可使用make savedefconfig命令。此命令会根据.config在arisc根目录生成 defconfig。将defconfig拷贝到arch/configs/下,覆盖对应配置文件即可。

注意:

一般来说,arisc执行的功能较为底层,多与休眠,关机等操作相关,对稳定性要求较高。我们不
建议客户自己修改任何相关配置和代码,如必须,请与我司联系或执行足够的稳定性测试。

第二种方式,使用mkarisc命令

如上述方法所述,Tina为了解决arisc编译后还需手动拷贝的问题,Tina提供了这个快捷命令
mkarisc。需要指出的是:目前只支持R818、MR813的arisc代码编译。

操作如下,较为简单

step1
配置tina环境,如soure build/envsetup.sh, lunch等操作。

step2
使用mkarisc编译即可或直接编译Tina,在编译Tina时,也会自动调用mkarisc命令。

注意:

使用mkarisc命令编译时,会自动读取board.dts获取AXP型号,然后使用对应的默认配置文
件编译。如board.dts中指定使用“x-powers,axp803”时,mkarsic命令会使用arisc工程环
境下的sun50iw10p1_axp803_defconfig配置文件编译。此时,若您需要修改该arisc配置,
只能先修改该配置文件后编译,除此外不接受其他配置修改的方式。

6.6 编译E907固件(V85x平台异构AMP核)

E907是V85x平台AMP CPU的代称,其主要功能是提供通用算力补充、辅助Linux实现快起
等。它包含E907运行所需的驱动、库及工具链等,编译产生riscv.fex,打包到Tina镜像中,
由bootloader在启动时加载到RISC-V核上运行。

在Tina SDK中,编译E907 RISCV代码如下:

E907 RISCV 代码库具有独立的工具链和构建体系,因此对 E907 固件的编译,也可以跳
转到对应的路径下,执行命令。但需注意,此时需要手动将生成的 melis30.elf 文件拷贝
到 SDK 的 bin 文件路径下,覆盖对应的文件(一般路径是 device/config/chips/$平台
名/configs/default/riscv.fex)。

操作如下,

step1
使用cd命令跳转到e907代码环境下,一般为rtos-dev/lichee/melis-v3.0/source

step2
source melis-env.sh

step3
lunch v853-e907-ver1-board

step4
make menuconfig

step5
make -j

step6
如需减少存储空间,可裁剪调试信息,在melis source目录执行:riscv64-unknown-elf-strip ekernel/melis30.elf

step7
拷贝并重命名成riscv.fex替换掉tina/device/config/chips/v853/configs/default目录下的riscv.fex

cp ekernel/melis30.elf /home/xxx/tina/device/config/chips/v853/configs/default/riscv.fex

step8
Tina系统目录执行打包命令pack

6.7 重编应用

请确保进行过一次固件的编译,确保SDK基础已经编译,才能单独重编应用包。重编应用包应用场景一般为: 只修改了应用,不想重新烧写固件,只需要安装应用安装包即可 。请确保在编译前已加载tina环境:

$ source build/envsetup.sh
$ lunch

6.7.1 方法一

当在应用包的目录(包括其子目录)中,可执行

$ mm [-B]
=> B参数则先clean此应用临时文件再编译

示例:假设软件包路径为:tina/package/utils/rwcheck,则:

$ cd tina/package/utils/rwcheck
$ mm -B

编译出应用安装包保存路径为:

tina/out/<方案>/packages/base

6.7.2 方法二

当在tina的根目录,可执行:

$ make <应用包的路径>/clean,==>清空应用包临时文件
$ make <应用包的路径>/install,==>编译软件包
或者
$ make <应用包的路径>/clean,install,==>先清空临时文件再编译

示例:假设软件包的路径为:tina/package/utils/rwcheck,则:

$ cd tina
$ make package/utils/rwcheck/clean,install

6.8 其他命令

命令命令有效目录作用
maketina根目录 编译整个sdk
makemenuconfig tina根目录 启动软件包配置界面
makekernel_menuconfig tina根目录 启动内核配置界面
mkarisctina下任意目录 编译cpus源码,根据AXP型号选择对应的默认配置
printfconfigtina下任意目录 打印当前SDK的配置
croottina下任意目录 快速切换到tina根目录
cconfigstina下任意目录 快速切换到方案的bsp配置目录
cdevicetina下任意目录 快速切换到方案配置目录
carisctina下任意目录 快速切换到cpus代码目录
cgenerictina下任意目录 快速切换到方案generic目录
couttina下任意目录 快速切换到方案的输出目录
cboottina下任意目录 快速切换到bootloader目录
cgreptina下任意目录 在c/c++/h文件中查找字符串
minstallpath/to/package/ tina根目录 编译并安装软件包
mcleanpath/to/package/ tina根目录 clean软件包
mm [-B]软件包目录 编译软件包,-B指编译前先clean
packtina根目录 打包固件
mtina下任意目录 make的快捷命令,编译整个sdk
ptina下任意目录 pack的快捷命令,打包固件

7 Tina系统烧写

7.1 概述

本章节主要介绍如何将构建完成的镜像文件(image)烧写并运行在硬件设备上的流程。

SDK中的烧录工具不再更新,后续会删除,请优先选择从全志客户服务平台下载最新烧录工具。

windows工具均集成在APST中,下载安装APST即可,APST的工具均自带文档。

7.2 烧录工具

Tina提供的几种镜像烧写工具介绍如表所示,用户可以选择合适的烧写方式进行烧写。

工具运行系统描述
PhoenixSuitwindows分分区升级及整个固件升级工具
PhoenixCardwindows卡固件制作工具
PhoenixUSBprowindows量产升级工具,支持USB一拖 8 烧录
LiveSuitubuntu固件升级工具

对于ubuntu:

  • 64bit主机使用LiveSuitV306_For_Linux64.zip。
  • 32bit主机使用LiveSuitV306_For_Linux32.zip。

具体烧录工具和使用说明,请到全志客户服务平台下载。

7.3 进入烧录模式.

设备需进入烧录模式,以下几种情况会进入烧录模式:

  1. BROM无法读取到boot0,例如新换的flash不包含数据,或者上电时短路flash阻断通信。
  2. 在串口中按 2 进入烧录。即,在串口工具输出框中,按住键盘的’2’,不停输出字符’2’,上电启动。boot0检测到此字符,会跳到烧录模式。
  3. 在uboot控制台,执行efex。
  4. 在linux控制台,执行reboot efex。
  5. adb可用的情况下,可使用adb shell reboot efex,或点击烧录工具上的“立即烧录”按钮。
  6. 当完整配置[fel_key]下fel_key_max和fel_key_min时,按下键值在范围内按键,之后上电。
  7. 当板子有FEL按键时,按住FEL按键上电。
  8. 制作特殊的启动卡,从卡启动再进入烧录模式。

8 Tina uboot定制开发

8.1 概述

本章节简单介绍uboot基本配置、功能裁剪、编译打包、常用命令的使用,帮助客户了解Tina
平台uboot框架,为boot定制开发提供基础。

目前Tina SDK共有三版uboot,分别是uboot-2011、uboot-2014、uboot-2018,分别在不
同硬件平台上使用,客户拿到SDK需要根据开发的硬件平台核对版本信息。

8.2 代码路径

TinaSDK/
├── brandy
│   ├── ...
│   ├── u-boot-2011
│   └── u-boot-2014
├── brandy-2.0
│   ├── ...
│   └── u-boot-2018

8.3 uboot功能

TinaSDK中,bootloader/uboot在内核运行之前运行,可以初始化硬件设备、建立内存空间映
射图,从而将系统的软硬件环境带到一个合适状态,为最终调用linux内核准备好正确的环境。
在Tina系统平台中,除了必须的引导系统启动功能外,uboot还提供烧写、升级等其它功能。

  • 引导内核能从存储介质(nand/mmc/spinor)上加载内核镜像到DRAM指定位置并运行。
  • 量产&升级包括卡量产,USB量产,私有数据烧录,固件升级。
  • 电源管理包括进入充电模式时的控制逻辑和充电时的显示画面。
  • 开机提示信息开机能显示启动logo图片(BMP格式)。
  • Fastboot功能实现fastboot的标准命令,能使用fastboot刷机。

8.4 uboot配置

以uboot-2018为例,各项功能可以通过defconfig或配置菜单menuconfig进行开启或关闭,
具体配置方法如下:

8.4.1 defconfig方式

8.4.1.1 defconfig配置步骤
  1. vim /TinaSDK/lichee/brandy2.0/u-boot-2018/configs/sun8iw18p1_defconfig (若是spinor方案则打开sun8iw18p1_nor_defconfig)
  2. 打开sun8iw18p1_defconfig或sun8iw18p1_nor_defconfig后,在相应的宏定义前去掉或添加"#"即可将相应功能开启或关闭。

如上图,只要将CONFIG_SUNXI_NAND前的#去掉即可支持NAND相关功能,其他宏定义的开启关闭也类似。

8.4.1.2 defconfig配置宏介绍.

如下图是sun8iw18p1_defconfig/sun8iw18p1_nor_defconfig中的基本宏定义的介绍:

8.4.2 menuconfig方式

通过menuconfig方式配置的方法步骤如下:

cd /TinaSDK/lichee/brandy2.0/u-boot-2018/
make ARCH=arm menuconfig或make ARCH=arm64 menuconfig

注意:arm针对 32 位平台,arm64针对 64 位平台。

执行上述命令会弹出menuconfig配置菜单,如下图所示,此时即可对各模块功能进行配置,配
置方法menuconfig配置菜单窗口中有说明。

8.5 uboot编译

8.5.1 方法一

在tina目录下即可编译uboot。

source build/envsetup.sh(见详注1)
lunch (见详注2)
muboot(见详注3)
详注:
1 加载环境变量及tina提供的命令。
2 输入编号,选择方案。
3 编译uboot,编译完成后自动更新uboot binary到TinaSDK/target/allwinner/$(BOARD)-common/bin/。

8.5.2 方法二

source build/envsetup.sh(见详注1)
lunch (见详注2)
cboot(见详注3)
make XXX_config(见详注4)
make -j

详注:
3 跳转到Uboot源码目录。
4 选择方案配置,如果是使用norflash,运行make XXX_nor_config。
5 执行编译uboot的动作。

8.6 uboot的配置

8.6.1 sys_config配置.

sys_config.fex是对不同模块参数进行配置的重要文件,对各模块重要参数的更改及更新提供了
极大的方便。其文档存放路径:

TinaSDK/target/allwinner/$(BOARD)/configs/sys_config.fex
TinaSDK/device/config/chips/$(CHIP)/configs/$(BOARD)/sys_config.fex
8.6.1.1 sys_config.fex结构介绍

sys_config.fes主要由主键和子键构成,主键是某项功能或模块的主标识,由[]括起,子键是对
该功能或模块中各个参数的配置项,如下图所示,dram_para是主键,dram_clk、dram_type
和dram_zp是子键。

8.6.1.2 sys_config.fex配置实例

[platform]:平台相关配置项。

例如,debug_mode =1表示开启uboot的调试模式,开启后会在log中打印出对应的调试信
息。next_work=2表示烧录完成后系统的下一步执行动作(0x1表示正常启动、0x2表示重启、
0x3表示关),其他配置可以查看[platform]前的提示说明。

[target]:目标平台相关功能配置项

上图中的可以通过配置boot_clock配置cpu的频率大小。

[uart_para]:串口配置项,uart_para配置项是uboot串口打印调试时用到的重要配置

上图中的uart_debug_port=0表示使用的是uart0,uart_debug_tx/uart_debug_rx配置的gpio口(PA04/PA05)需要根据对应的GPIO DATASHEET进行配置。

8.6.1.3 sys_config.fex解析流程

在uboot2014/2018中sys_config.fex最终会被转化为dtb(device tree binary,linux内核配置方式),dtb最终会被打包烧录至flash中,启动过程中会将该文件加载至内存,之前在sys_config.fex中配置的参数已转化为dtb节点,最终会调用fdt_getprop_32()函数对dtb中的节点进行解析。

8.6.2 环境变量配置.

uboot的环境变量就是一个个的键值对,操作接口为:getenv(),setenv(),saveenv()。环境变量的形式:

boot_normal=sunxi_flash read 40007800 boot;boota 4000780\\
boot_recovery=sunxi_flash read 40007800 recovery;boota 40007800\\
boot_fastboot= fastboot
8.6.2.1 环境变量作用.

可以把一些参数信息或者命令序列定义在该环境变量中。在环境变量中定义UBOOT命令序列,

可以把UBOOT各个功能模块按顺序组合在一起执行,从而完成某个重要功能。

例如,如果执行了上述提到的 boot_normal 环境变量对应的命令,Uboot 则会先调用
sunxi_flash命令从存储介质的boot分区上加载内核到DRAM的0x40007800位置;然后调
用boota命令完成内核的引导。

uboot启动时调用环境变量方式下如图所示:

8.6.2.2 环境变量配置示例介绍.

TinaSDK中,环境变量配置文件保存在TinaSDK/target/allwinner/$(BOARD)/configs/env.cfg
文件,用户使用的时候,可能会看到env-4.4.cfg、env-4.9.cfg等文件,env-xxx后缀数字表示在不同内核版本上的配置。打开后其内容示例如下,

  • bootdelay=0,改环境变量bootdelay(即boot启动时log中的倒计时延迟时间)值的大小,为便于调试,bootdelay的值一般不要等于 0 ,这样在小机上电后按下任意键才能进入uboot shell命令状态。
  • boot_normal=sunxi_flash read 40007800 boot;boota 4000780,设置启动内核命令,即将boot分区读到内存0x40007800地址处,然后从内存0x40007800地址处启动内核。
  • Setargs_nand=setenv bootargs earlyprintk=$earlyprink… ,设置内核相关环境变量,该变量在启动至内核的log中会打印处理,即cmdline如下图:

  • loglevel=8,设置内核log打印等级。

8.6.3 sys_partition.fex分区配置

分区配置文件是一个规划磁盘分区的文件,烧录过程会按照该分区配置文件将各分区数据烧录至flash中。

TinaSDK中,分区配置文件路径TinaSDK/target/allwinner/$(BOARD)/configs/sys_partition.fex。有些方案可以看到sys_partition.fex、sys_partition_nor.fex两个分区配置文件,若是打包Tina非nor固件,则使用的是sys_partition_linux.fex配置文件,若是打包nor固件,则使用的是sys_partition_nor.fex。

8.6.3.1 sys_partition.fex分区配置介绍

一个分区的属性,包含名称、分区大小、下载文件与用户属性。以下是文件中所描述的一个分区的属性:

  • name,分区名称由用户自定义。当用户在定义一个分区的时候,可以把这里改成自己希望的字符串,但是长度不能超过 16 个字节。
  • size,定义该分区的大小,以扇区的单位(1扇区=512bytes,如上图给env 分区分配了32768 个扇区,即32768*512/1024/1024 = 16M),注意,为了字节对齐,这里分配的扇区大小应当能整除 128 。
  • downloadfile,下载文件的路径和名称。可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径。
  • user_type,提供给操作系统使用的属性。目前,每个操作系统在读取分区的时候,会根据用户属性来判断当前分区是不是属于自己的然后才进行操作。这样设计的目的是为了避免在多系统同时存在的时候,A操作系统把B操作系统的系统分区进行了不应该的读写操作,导致B操作系统无法正常工作。

更具体的说明,可参考《TinaLinux存储管理开发指南》。

9 Tina kernel定制开发

9.1 概述

本章节简单介绍kernel基本配置、功能裁剪、常用命令的使用,帮助客户了解Tina平台linux
内核,为内核定制开发提供基础。

目前Tina SDK共有 4 版linux kernel,分别是linux-3.4、linux-3.10、linux-4.4、linux-
4.9,分别在不同硬件平台上使用,客户拿到SDK需要根据开发的硬件平台核对内核信息。

9.2 代码路径

TinaSDK/
    ├── ...
    ├── linux-3.10
    ├── linux-3.4
    ├── linux-4.4
    └── linux-4.9

9.3 模块开发文档.

详阅BSP开发文档,文档目录包括常用内核模块使用与开发说明。

9.4 内核配置

客户在定制化产品时,通常需要更改linux内核配置,在TinaSDK中,打开内核配置的方式如
下,

croot
make kernel_menuconfig

执行完后,shell控制台会跳出配置菜单。如下图所示,

10 Tina系统定制开发

10.1 Tina procd-init与busybox-init切换.

tina默认为procd-init:

make menuconfig进行配置:
1.System init 选择procd-init

2.以下一步步选中
Base system --->
    <*>block-mount
    <*>busybox................................ Core utilities for embedded Linux --->
        Init Utilities --->
            [ ] init 此处不选
        Coreutils --->
            [*] head
        Miscellaneous Utilities --->
            [*] strings
    <*> uci
    <*> logd

3.env.cfg修改
init=/sbin/init

busybox-init自启动方式配置如下:

make menuconfig进行配置:
1.System init 选择busy-init

2.以下一步步选中
Base system --->
    <*>busybox................................ Core utilities for embedded Linux --->
    Init Utilities --->
    [* ] init 此处选上

3.env.cfg修改
    init=/init
    rdinit=/rdinit

10.2应用移植

在Tina Linux SDK中一个软件包目录下通常包含如下两个目录和一个文件:

package/<分类>/<软件包名>/Makefile
package/<分类>/<软件包名>/patches/ [可选]
package/<分类>/<软件包名>/files/ [可选]
其中,
patches 保存补丁文件,在编译前会自动给源码打上所有补丁
files 保存软件包的源码,在编译时会对应源码覆盖源码中的源文件
Makefile 编译规则文件,

10.2.1 Makefile范例

该Makefile的功能是软件源码的准备,编译和安装的过程,提供给Tina Linux识别和管理软件包的接口,软件的编译逻辑是由软件自身的Makefile决定,理论上和该Makefile(该Makefile只执行make命令和相关参数)无实质关系。

详注:

1.如果是开源软件,软件包版本建议与下载软件包的版本一致。
2.以PKG开头的变量主要告诉编译系统去哪里下载软件包。
3.md5sum用于校验下载下来的软件包是否正确,如果正确,在编译该软件的时候,就会在PKG_BUILD_DIR下找到该软件包的源码。
4.Package/<name>: <name>用来指定该Package的名字,该名字会在配置系统中显示。
5.使用依赖包的名字<name>来指定依赖关系,如果是扩展包,前面添加一个”+”号,如果是内核版本依赖使用@LINUX_2_<minor version>。
6.如果该值为 1 ,该包将不会出现在配置菜单中,但会作为固定编译,可选。
7.在开源软件中一般用来生成Makefile,其中参数可以通过CONFIGURE_VARS来传递。
8.在开源软件中一般相当于执行make,其中有两个参数可以使用:MAKE_FLAGS和MAKE_VARS。
9.内置的几个关键字如下:
    INSTALL_DIR相当于install -d m0755
    INSTALL_BIN相当于install -m0755
    INSTALL_DATA相当于install -m0644
    INSTALL_CONF相当于install -m0600
10.该Makefile的所有define部分都是为该宏的参数做的定义.上层Makefile通过调用此宏进行编译。

10.2.2 自启动设置

在Tina Linux中支持两种格式的初始化脚本,一种是busybox式或者sysV式的初始化脚本,
一种是procd式的初始化脚本。一般我们把由初始化脚本启动的应用叫做服务

初始化脚本以shell脚本的编程语言组织,shell脚本作为基础知识在此不展开说明。一般情况
下,初始化脚本源码保存在软件的files目录,且后缀为“.init”,例如:

tina/package/system/fstools/files/fstab.init

在Makefile的install中把初始化脚本安装到小机端的/etc/init.d中,例如:

define Package/block-mount/install
$(INSTALL_DIR) $(1)/etc/init.d/
$(INSTALL_BIN) ./files/fstab.init $(1)/etc/init.d/fstab
endef

10.2.2.1调用自启动脚本.

  • 手动调用方式在启动的时候会有太多的log,且log信息已被logd守护进程收集,不利于我们
    调试初始化脚本,此时可通过小机端的命令行手动调用的形式来调试,例如:
root@TinaLinux: /# /etc/init.d/fstab start

10.2.2.2 sysV格式脚本

sysV式的初始化脚本保存在小机端的/etc/init.d/目录下,实现开机自启动。下例以最小内容的初
始化脚本作示例讲解,核心是实现start/stop函数:

#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org
START=10
STOP=15
DEPEND=xxxx
start() 
#commands to launch application

stop() 
#commands to kill application

注意:
START=10, 指明开机启动优先级(序列) [数值越小, 越先启动],取值范围0-99。
STOP=15, 指明关机停止优先级(序列) [数值越小, 越先关闭],取值范围0-99。
DEPEND=xxxx, 指明初始化脚本会并行执行,通过此项配置确保执行的依赖。
名称属性功能
start必须实现启动一个服务
stop必须实现停止一个服务
reload可选实现重启一个服务
enable可选实现重新加载服务
disable可选实现禁用服务

在shell里面可以使用如下的命令来操作相关的服务。

$ root@TinaLinux:/# /etc/init.d/exmple restart|start|stop|reload|enable|disable

10.2.2.3 procd格式脚本

以下例的初始化脚本作示例讲解,主要是实现函数start_service:

#!/bin/sh /etc/rc.common
USE_PROCD=1
PROG=xxxx
START=10
STOP=15
DEPEND=xxxx
start_service() 
procd_open_instance
procd_set_param command $PROG -f
......
procd_close_instance

详细的介绍可以参考:https://wiki.openwrt.org/inbox/procd-init-scripts。

10.3应用调试

新添加的软件默认配置为不使能,此时需要手动配置使能软件包。通过在tina的根目录执行
make menuconfig进入软件包的配置界面:

软件包的所在路径与软件包的Makefile中的定义有关,以fstools为例,在Makefile中定义
为:

define Package/fstools
    SECTION:=base
    CATEGORY:=Base system
    DEPENDS:=+ubox +USE_GLIBC:librt +NAND_SUPPORT:ubi-utils
    TITLE:=OpenWrt filesystem tools
    MENU:=1
endef

此时,只需要在menuconfig界面中进入Basy system即可找到fstools的软件包。

前缀符号含义:

[*] 或<*> : 编译进入SDK
[ ] 或< > : 不包含

支持操作:

Y或y:选择包含
N或n:取消选择

10.4应用编译

详见重编应用章节。

10.5应用安装

  1. 获取安装包

安装包一般位于目录:

tina/out/<方案>/packages/base

安装包命名格式为:

<应用名>_<应用版本>-<应用释放版本>_sunxi.ipk
  1. 安装应用包

通过adb推送安装包到小机:

$ adb push <安装包路径> <推送到小机路径>

安装应用包:

$ opkg install <安装包路径>

10.6分区与挂载

  • 升级分区
分区功能
boot分区存内核镜像
rootfs分区基础系统镜像分区,包含/lib,/bin,/etc等
recovery分区存放恢复系统镜像,仅大容量方案有,详见OTA文档
extend分区存放恢复系统镜像及rootfs的usr部分,仅小容量方案有,详见OTA文档
  • 不升级分区
分区功能
private分区存储SN号分区
misc分区系统状态、刷机状态分区
UDISK分区用户数据分区,一般挂载在/mnt/UDISK
overlayfs分区存储overlayfs覆盖数据
  • 默认挂载点
分区挂载点备注
/dev/by-name/boot/boot
/dev/by-name/boot-res/boot-res
/dev/by-name/UDISK/mnt/UDISK用户数据分区
/dev/mmcblk0或/dev/mmcblk0p1/mnt/SDCARDTf卡挂载点
/dev/by-name/rootfs_data/overlay存储overlayfs覆盖数据

以上是关于Tina_Linux_系统软件 开发指南的主要内容,如果未能解决你的问题,请参考以下文章

Tina_Linux_各平台多媒体格式_支持列表_new

Tina_Linux打包流程说明指南_new

Tina_Linux_图形系统_开发指南

Tina_Linux_系统裁剪_开发指南

Tina_Linux_安全_开发指南

Tina_Linux量产测试使用指南_new