手把手带你玩转全志TinaSDK
1.Tina SDK开发环境搭建
1.1 虚拟机
使用VMWare创建一个Ubuntu虚拟机推荐使用18.04

1.2 安装必要的软件包
sudo apt-get install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget python cvs git mercurial rsync subversion android-tools-mkbootimg vim libssl-dev android-tools-fastboot
sudo apt-get install build-essential subversion git 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 libc6:i386 libstdc++6:i386 lib32ncurses5 lib32z1 bison -y
1.3 获取Tina-SDK
SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。
mkdir -p ~/.bin
echo export PATH=$HOME/.bin:$PATH >> ~/.bashrc
source ~/.bashrc
curl https://mirrors.bfsu.edu.cn/git/git-repo > ~/.bin/repo
chmod a+x ~/.bin/repo
由于谷歌服务器位于国外,每次运行时Repo会检查更新导致下载较慢,国内用户可以配置镜像源。否则会卡住不动然后失败
echo export REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo' >> ~/.bashrc
source ~/.bashrc
新版本 git 默认加强了安全性,身份认证不会保存,导致拉取 repo 需要多次输入密码,可以用下列命令配置
git config --global credential.helper store
创建目录然后拉取sdk
mkdir tina-t113
cd tina-t113
repo init -u https://sdk.aw-ol.com/git_repo/D1_Tina_Open/manifest.git -b master -m tina-d1-h.xml
然后输入全志在线的的用户名和密码

使用命令拉取sdk
repo sync
拉取源码需要等待较长时间,时间长短取决于你的网速,一般半个小时左右可以完成
创建并切换分支
repo start FunnyPi --all
由于全志在线没有提供T113的支持,所以需要打百问网的T113补丁
cd ~
git clone https://github.com/DongshanPI/100ASK_T113-Pro_TinaSDK.git
cd 100ASK_T113-Pro_TinaSDK
git submodule update --init
cp ./* -rfvd ~/tina-t113/
repo status可以查看哪些仓库有修改
repo forall -vc git add .
repo forall -vc git commit -m "add 100ask T113-Pro"
1.4 烧录镜像
对于FunnyPi-T113,由于我们没有板载的SPI Flash所以我们的镜像是烧录到SD卡里面的,但是为了文档的完整性下面将介绍烧录到SPI Flash和烧录到SD两种烧录方式
1.4.1 烧录到SPI Flash
所需软件
插入板卡,板卡支持正反插typec切换串口和usb

如果插入为usb,贼会提示未知设备,双击未知设备

点击更新驱动程序

选择TinaSDK里面的UsbDriver

点击始终安装此驱动程序软件

如果有下面这个设备就代表安装成功

1.4.2 烧录到SDCard
所需工具
首先使用读卡器将SD卡插入电脑,打开SD Card Formatter格式化SD卡

然后使用PhoenixCard烧录

如下代表烧录完成

2.TinaSDK的目录结构

不用了解的面面俱到,以实际使用需要用到的为主
:::warning
😆如果想添加自己的产品需要关注以下目录
:::
:::success
device/config/chips/t113/configs/FunnyPi
:::


:::success
target/allwinner/t113-FunnyPi
:::


3. 添加软件包
下面以LVGL为例讲解如何添加LVGL
首先使用TinaSDK提供的脚本配置环境变量
source build/envsetup.sh

然后通过menuconfig添加LVGL
make menuconfig
Gui->Littlevgl
然后save

然后开始编译
make -j
pack

此时会提示rootfs.fex文件大于part_size
vim device/config/chips/t113/configs/100ask/sys_partition.fex

修改rootfs的的size参数

然后重新生成镜像
4.如何创建自己的开发板
4.1 以百问网的t113配置为基础创建FunnyPi的配置工程
在device/config/chips/t113/configs下复制一份100ask并重命名为FunnyPi
cp -rf 100ask/ FunnyPi
在package/allwinner/alsa-conf-aw/files/t113下复制t113-100ask并重命名为t113-FunnyPi
cp -rf t113-100ask/ t113-FunnyPi
在target/allwinner下复制t113-100ask并重命名为t113-FunnyPi
cp -rf t113-100ask/ t113-FunnyPi
4.2 进行一些定制化修改
进入target/allwinner下面的FunnyPi-T113,将t113_100ask.mk文件进行重命名为FunnyPi-T113.mk
mv t113_100ask.mk t113_FunnyPi.mk
然后编辑T113-FunnyPi.mk文件
修改前

修改后

然后修改当前目录下的Makefile文件
修改前

修改后

然后修改当前目录下的TinaProducts.mk文件
修改前

修改后

然后修改defconfig文件
修改前

修改后

然后修改当前目录下的vendorsetup.sh文件
修改前

修改后

4.3 更新板卡信息
回到sdk的根目录
source build/envsetup.sh setup
lunch

5.Uboot
Uboot的源码路径在
lichee/brandy-2.0/u-boot-2018
5.1 配置工具链
在之前我们通过source build/envsetup.sh脚本配置了我们的工具链所以这边不需要再进行配置了
5.2 编译uboot
进入lichee/brandy-2.0/u-boot-2018目录,查看configs文件夹

sun8iw20p1是t113的代号
在u-boot-2018目录下执行下面代码使用sun8iw20p1_uart3_defconfig里面的配置参数
make sun8iw20p1_uart3_defconfig
然后通过make -j即可编译
5.3 编译boot0
进入lichee/brandy-2.0/spl
清除之前编译残余 make distclean
根据存储介质运行不同的命令
- nand flash
make p=sun8iw20p1 m=nand
- emmc
make p=sun8iw20p1 m=emmc
- sdcard
make p=sun8iw20p1 m=card
然后make -j 编译
:::warning
还有一个更加简单的方法
在配置好环境变量的情况下在根目录下面运行mboot命令即可编译出uboot和boot0
:::
5.4 问题解决
使用mboot命令编译时遇到

解决方法:
在out/目录下复制一份t113-100ask重命名为t113-FunnyPi
cp -rf t113-100ask/ t113-FunnyPi
6.修改debug串口
百问网T113-Pro开发板默认使用UART3作为uboot和kernel的串口,而我们的FunnyPi-T113的typec连接的串口为UART2,所以我们使用UART2作为uboot和kernel串口,所以我们需要进行修改



查看手册原理图可知UART2使用PE2和PE3的func3
6.1 修改boot0串口
修改sys_config.fexmodify即可修改boot0串口
路径在device/config/chips/t113/configs/FunnyPi

modify

:::success
总结:使用的串口号填到uart_debug_port = 后面
使用的tx rx引脚号填到port后面,紧跟的第一个尖括号填对应功能为func几
:::
6.2 修改uboot串口
查看FunnyPi目录下面的BoardConfig.mk文件

可以看到BRANDY_DECONF是指向sun8iw20p1_uart3_defconfig这个配置文件
我打算复制并重命名这个sun8iw20p1_uart3_defconfig为sun8iw20p1_uart2_defconfig所以将sun8iw20p1_uart3_defconfig改为sun8iw20p1_uart2_defconfig

BRANDY目录下存放的就是uboot相关的
在lichee/brandy-2.0/u-boot-2018/configs目录下放置着uboot相关文件
我们复制并重命名sun8iw20p1_uart3_defconfig为sun8iw20p1_uart2_defconfig
cp sun8iw20p1_uart3_defconfig sun8iw20p1_uart2_defconfig
然后修改sun8iw20p1_uart2_defconfig文件

modify

:::success
注意:CONFIG_CONS_INDEX = 串口号+1
例如本例中我们使用UART2,那么这里就要填3
:::
6.3 修改Linux Kernel串口
device/config/chips/t113/configs/FunnyPi

board.dts存放了内核设备树,修改设备树节点参数来修改debug串口

修改对应串口的status为okay

修改
在env.cfg文件中存放了uboot变量

earlyprintk变量指定了内核日志打印的设备
第一个参数为对应设备,第二个参数设备地址
console指定了串口和波特率
设备地址通过查看t113-s3_user_manual的Memory Mapping获得

例如本例使用UART2那么就改为

注意在ARM平台下面还需要设置Kernel
make kernel_menuconfig 找到
kernel hacking->Kernel low-level debugging functions,修改寄存器地址

modify

7.添加心跳灯
FunnyPi具有两个指示灯,SYS指示灯被用作3V3电源指示灯,而USR指示灯可以根据我们的需要进行自定义,本节将USR指示灯设置为Linux系统心跳灯


通过查看原理图可以知道USR指示灯的控制引脚为PE13
打开内核menuconfig
croot
make kernel_menuconfig
打开Device Drivers->LED Support->LED Support for GPIO connected LEDs

打开Device Drivers->LED Support->LED Trigger support->LED Heartbeat Trigger

7.1 添加设备树

led {
compatible = "gpio-leds";
led1 {
label = "led1";
gpios = <&pio PE 13 GPIO_AVTIVE_LOW>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
};
8.使用ADB来传输文件
09_2_使用ADB传输文件_T113_哔哩哔哩_bilibili
ADB 命令大全
由于FunnyPi并没有引出rj45,所以无法像IMX6那样使用网线来传输文件,好在有ADB可以用来传输文件
首先在虚拟机中安装adb
sudo apt install adb
将FunnyPi插入电脑链接到虚拟机

使用adb扫描设备
adb devices

使用adb shell来进入设备
adb shell

使用adb push来传输文件到开发板

会发现上传不了,说是文件系统为只读的
8.1 文件系统只读解决方法
按照教程编译D1的Tina Linux系统,为什么是只读系统,无法新建文件
:::success
这个问题是因为没有打开 e2fsprog ,导致没有 mkfs.ext4,所以不能加载 overlayfs 引起
:::
OverlayFS文件系统可以类似达到把只读文件系统改为可写文件系统的效果
首先make menuconfig打开e2fsprog

然后make kernel_menuconfig打开ext4

重新编译烧录即可
8.SD卡检测脚反转
在百问网的补丁包基础上修改了串口之后烧录系统启动后会发现can't open blockdev,原因是因为默认检测低电平为sd卡插入

似乎我买的sd卡座det脚为高电平有效
所以这边不再使用det脚检测sd卡,而是使用轮询方式
修改设备树,把cd-gpios注释掉,然后取消broken-cd的注销

9.适配WIFI
推荐阅读
【网络专题1】Tina Wi-Fi模组移植_前导篇
【网络专题1】Tina Wi-Fi模组移植_理论篇
【网络专题1】Tina Wi-Fi模组移植_实践篇
FunnyPi的WIFI部分使用RTL8723BS,通过SDIO接口与T113-S3传输WIFI数据,通过UART接口传输蓝牙数据
:::success
HW-V1.0将WIFI&BT模组改为了RTL8723DS,TinaSDK自带支持
:::


7.1 WIFI模组的工作条件
7.1.1 供电
一版WIFI模组需要两路供电,主电源和IO电源,在上面的原理图中可以看到VBAT为主电源,VDD_IO为IO电源
7.1.2 WL_REG_ON
WL-REG-ON 信号主要用于控制 WiFi 模块的电源状态。当 WL-REG-ON 保持高电平时,WiFi 模块上电并可以工作;当 WL-REG-ON 为低电平时,WiFi 模块则处于关闭状态。在系统休眠或待机状态下,为了保持 WiFi 模块的状态,需要保持 WL-REG-ON 信号为高电平,以防止在唤醒过程中丢失 WiFi 内部状态,导致唤醒失败
7.1.3 SDIO
与SOC的通信有通过USB,SDIO 等,这里的WIFI模组使用的是SDIO
7.1.4 唤醒
WL-WAKE-AP(也称为 WL_HOST_WAKE)是一个用于唤醒主控的信号。当 WiFi 模块有数据需要处理时,它会通过这个信号唤醒主控,从而实现低功耗运行和有效数据管理。例如,在系统休眠时,如果 WiFi 模块收到数据,它会使用 WL-WAKE-AP 信号唤醒主控,处理这些数据
AP-WAKE-WL(也称为 WL_WAKE_HOST)则是另一个方向的信号,用于主控唤醒WIFI模块,当外部主机需要访问WIFI芯片时,它可以通过将WL HOST WAKE管脚拉高来唤醒芯片,使其恢复工作状态。
7.1.5 时钟
该模块通过外部晶振提供时钟源
7.2 WIFI模组的移植
因为WIFI芯片原厂驱动工程师已经编写了驱动程序,所以WIFI模组的移植可以在原厂驱动的基础上进行
allwinner device 除了可以可以通过dts 外(linux-3.4 内核无dts),可以通过修改sys_config.fex的方式,sys_config.fex 的优先级高于dts,一般情况下,直接配置sys_config.fex 即可
7.2.1 适配RTL8723BS
主线内核中已有rtl8723bs的驱动,但是为了将教程的通用性,我们不使用内核里面的驱动

获取驱动源码,放到内核驱动路径drivers/net/wireless下。
对于现在内核源码里面已经有驱动的情况,我们直接复制内核源码里面的驱动到wireless下就行
cp rtl8723bs/ -rf ../net/wireless/

修改rtl8723bs的Kconfig文件,防止和内核自带的rtl8723bs驱动冲突

modify

修改net/wireless目录下的Kconfig和Makefile将驱动添加到kernel_menuconfig


在make kernel_menuconfig中将rtl8723bs驱动编译成module

打开Allwinner rfkill driver

打开Allwinner sunxi SD/MMC Host Controller support

使用mkernel命令编译内核,编译完成之后来到wireless/rtl8723bs下,可以看到已经编译出ko文件了

然后打开对应方案的board.dts
cconfigs
vim board.dts
我们先来分析一下设备树原本的rfkill配置


他将PG11引脚配置为CLK_FANOUT,用于给wifi芯片提供时钟信号,由于FunnyPi使用的RTL8723BS模块并没有使用主控提供的32k时钟所以这边不用管他



以上所有项必须参看原理图进行配置,配置与原理图实际使用的资源保持一致
7.2.2 方案module适配
在 target/allwinner/t113-FunnyPi/modules.mk 中添加模块配置
将 t113-sdk/package/kernel/linux/modules/wireless.mk 里面关于rtl8723bs的配置复制过来
define KernelPackage/net-rtl8723bs-my
SUBMENU:=$(WIRELESS_MENU)
TITLE:=RTL8723BS support (staging)
DEPENDS:=@USB_SUPPORT +@DRIVER_WEXT_SUPPORT +r8723bs-firmware
# KCONFIG:=\
# CONFIG_STAGING=y \
# CONFIG_R8723BS \
# CONFIG_23BS_AP_MODE=y \
# CONFIG_23BS_P2P=n
FILES:=$(LINUX_DIR)/drivers/net/wireless/rtl8723bs/r8723bs.ko
AUTOLOAD:=$(call AutoProbe,r8723bs)
endef
define KernelPackage/net-rtl8723bs-my/description
Kernel modules for RealTek RTL8723BS support
endef
$(eval $(call KernelPackage,net-rtl8723bs-my))

需要注意驱动文件的路径要是正确的

我们的驱动文件前面有个r,所以要进行修改,并且为了方便区分内核自带的rtl8723bs和我们自己添加的所以我们将rtl8723bs改为rtl8723bs-my

接着在 tina 根目录执行 make menuconfig 就可以看到新添加的模组
kernel modules->wireless drivers
将他选择为*

7.2.3 添加Firmware
在/package/firmware/linux-firmware/rtl8723bs(需要自己创建文件夹)添加 rtl8723bs 需要的 firmware,这些文件可通过github获得
GitHub - jackeyt/RTL-8XXX-Serial-Firmware: This Repo for RTL 8XXX Serial Firmware to used by RTL 8XXX Serial’s drivers~~

然后在rtl8723bs文件夹中创建rtl8723bs.mk文件,将rtl8723ds文件夹里面的rtl8723ds.mk复制过来,进行修改

Package/r8723bs-firmware = $(call Package/firmware-default,RealTek RTL8723BS firmware)
define Package/r8723bs-firmware/install
$(INSTALL_DIR) $(1)/$(FIRMWARE_PATH)/rtlwifi
$(INSTALL_DATA) \
$(TOPDIR)/package/firmware/linux-firmware/rtl8723bs/rtl8723bs_nic.bin \
$(1)/$(FIRMWARE_PATH)/rtlwifi/rtl8723bs_nic.bin
endef
$(eval $(call BuildPackage,r8723bs-firmware))
然后就可以在sdk根目录执行make menuconfig了

重新编译uboot和kernel并烧录系统,然后进入板卡
使用insmod命令安装驱动

:::success
发现报错,出现该 WANRING 的原因是内核版本升级后文件系统存在差异,驱动调用了 kernel_read()函数,需要进行 import VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver 处理
:::
我们回到rtl8723bs的源码位置
在rtl8723bs/os_dep/os_intfs.c中加入
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);

重新编译重新加载驱动即可
7.2.4 上网配置
通过上面的操作我们已经成功的完成了wifi驱动的启用,接下来就是需要连接wifi并上网,这边使用的是wpa_supplicant来连接wifi

首先在menuconfig里面打开wps_supplicant,然后来到我们的开发板
先加载驱动
insmod r8723bs

先使用ifconfig -a看一下是否有wlan0

然后开启wlan0
ifconfig wlan0 up

修改/etc/wps_supplicant.conf文件
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="whoami_mix4"
psk="88888889"
}

在/var/run 下面创建wpa_supplicant文件夹
mkdir -p /var/run/wpa_supplicant
开启wpa_supplicant连接wifi
wpa_supplicant -D nl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

设置 wlan0 的 IP 地址,这里使用 udhcpc 命令从路由器申请 IP 地址
udhcpc -i wlan0

使用ifconfig命令查看wlan0是否已经分配到ip了

尝试ping bing.com

可以成功联网了
10.学习OpenWrt的软件编译构建系统
参考
从mk文件深度剖析OpenWrt软件编译构建系统、并手把手教学构建自己的系统软件_openwrt package 构建的基本方法-CSDN博客
由于TinaSDK是基于OpenWrt的所以也包含了OpenWrt的软件编译构建系统
在TinaSDK根目录下有个package文件夹,下面存放的就是OpenWrt软件编译构建系统相关文件
以dnsmasq软件为例

:::success
补丁(patches)目录:是可选的,典型包含缺陷修改或者用于优化可执行程序大小的补丁文件。
files目录:也是可选的,它一般用于保存默认配置文件和初始化启动脚本。
src目录:如果为OpenWrt本身项目所包含的软件模块,因为代码将完全受到自己控制,这时将不会patches 目录存在,而是会有一个 src 目录,代码直接放在src目录下(在下一篇文章中我们自己定义的软件包就有这个目录)。
Makefile:提供下载、编译、安装以及生成 OPKG 安装包的功能,这个文件是必须有的。
:::
10.1 OpenWrt的Makefile
此Makefile与普通的Makefile不同,OpenWrt没有遵守传统的Makefile格式风格,而是将Makefile写成面向对 象格式,这样就简化了多平台移植过程
下面以dnsmasq软件的Makefile为例


浙公网安备 33010602011771号