手把手带你玩转全志TinaSDK

1.Tina SDK开发环境搭建

1.1 虚拟机

使用VMWare创建一个Ubuntu虚拟机推荐使用18.04
image.png

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

然后输入全志在线的的用户名和密码
image.png
使用命令拉取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

所需软件

  1. AllwinnertechPhoeniSuit
  2. AllwinnerUSBFlashDeviceDriver

插入板卡,板卡支持正反插typec切换串口和usb
image.png
如果插入为usb,贼会提示未知设备,双击未知设备
image.png
点击更新驱动程序
image.png
选择TinaSDK里面的UsbDriver
image.png
点击始终安装此驱动程序软件
image.png
如果有下面这个设备就代表安装成功
image.png

1.4.2 烧录到SDCard

所需工具

  1. SDCardFormatter
  2. PhoenixCard

首先使用读卡器将SD卡插入电脑,打开SD Card Formatter格式化SD卡
image.png
然后使用PhoenixCard烧录
image.png
如下代表烧录完成
image.png

2.TinaSDK的目录结构


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

:::success
target/allwinner/t113-FunnyPi
:::
image.png

3. 添加软件包

下面以LVGL为例讲解如何添加LVGL
首先使用TinaSDK提供的脚本配置环境变量

source build/envsetup.sh

image.png
然后通过menuconfig添加LVGL

make menuconfig

Gui->Littlevglimage.png
然后save
image.png
然后开始编译

make -j
pack

image.png
此时会提示rootfs.fex文件大于part_size

vim device/config/chips/t113/configs/100ask/sys_partition.fex

image.png
修改rootfs的的size参数
image.png
然后重新生成镜像

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文件
修改前
image.png
修改后
image.png
然后修改当前目录下的Makefile文件
修改前
image.png
修改后
image.png
然后修改当前目录下的TinaProducts.mk文件
修改前
image.png
修改后
image.png
然后修改defconfig文件
修改前
image.png
修改后
image.png
然后修改当前目录下的vendorsetup.sh文件
修改前
image.png
修改后
image.png

4.3 更新板卡信息

回到sdk的根目录

source build/envsetup.sh setup
lunch

image.png

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文件夹
image.png
sun8iw20p1是t113的代号
在u-boot-2018目录下执行下面代码使用sun8iw20p1_uart3_defconfig里面的配置参数

make sun8iw20p1_uart3_defconfig

然后通过make -j即可编译

5.3 编译boot0

进入lichee/brandy-2.0/spl
清除之前编译残余 make distclean
根据存储介质运行不同的命令

  1. nand flash

make p=sun8iw20p1 m=nand

  1. emmc

make p=sun8iw20p1 m=emmc

  1. sdcard

make p=sun8iw20p1 m=card
然后make -j 编译
:::warning
还有一个更加简单的方法
在配置好环境变量的情况下在根目录下面运行mboot命令即可编译出uboot和boot0
:::

5.4 问题解决

使用mboot命令编译时遇到
image.png
解决方法:
在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串口,所以我们需要进行修改
image.png
image.png
image.png
查看手册原理图可知UART2使用PE2和PE3的func3

6.1 修改boot0串口

修改sys_config.fexmodify即可修改boot0串口

路径在device/config/chips/t113/configs/FunnyPi
image.png
modify
image.png
:::success
总结:使用的串口号填到uart_debug_port = 后面
使用的tx rx引脚号填到port后面,紧跟的第一个尖括号填对应功能为func几
:::

6.2 修改uboot串口

查看FunnyPi目录下面的BoardConfig.mk文件
image.png
可以看到BRANDY_DECONF是指向sun8iw20p1_uart3_defconfig这个配置文件
我打算复制并重命名这个sun8iw20p1_uart3_defconfig为sun8iw20p1_uart2_defconfig所以将sun8iw20p1_uart3_defconfig改为sun8iw20p1_uart2_defconfig
image.png
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文件
image.png
modify
image.png
:::success
注意:CONFIG_CONS_INDEX = 串口号+1
例如本例中我们使用UART2,那么这里就要填3
:::

6.3 修改Linux Kernel串口

device/config/chips/t113/configs/FunnyPi
image.png
board.dts存放了内核设备树,修改设备树节点参数来修改debug串口
image.png
修改对应串口的status为okay
image.png
修改
在env.cfg文件中存放了uboot变量
image.png
earlyprintk变量指定了内核日志打印的设备
第一个参数为对应设备,第二个参数设备地址
console指定了串口和波特率
设备地址通过查看t113-s3_user_manual的Memory Mapping获得
image.png
例如本例使用UART2那么就改为
image.png
注意在ARM平台下面还需要设置Kernel
make kernel_menuconfig 找到
kernel hacking->Kernel low-level debugging functions,修改寄存器地址
image.png
modify
image.png

7.添加心跳灯

FunnyPi具有两个指示灯,SYS指示灯被用作3V3电源指示灯,而USR指示灯可以根据我们的需要进行自定义,本节将USR指示灯设置为Linux系统心跳灯
image.png
image.png
通过查看原理图可以知道USR指示灯的控制引脚为PE13
打开内核menuconfig

croot
make kernel_menuconfig

打开Device Drivers->LED Support->LED Support for GPIO connected LEDs
image.png
打开Device Drivers->LED Support->LED Trigger support->LED Heartbeat Trigger
image.png

7.1 添加设备树

image.png

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插入电脑链接到虚拟机
image.png
使用adb扫描设备

adb devices

image.png
使用adb shell来进入设备

adb shell

image.png
使用adb push来传输文件到开发板
image.png
会发现上传不了,说是文件系统为只读的

8.1 文件系统只读解决方法

按照教程编译D1的Tina Linux系统,为什么是只读系统,无法新建文件
:::success
这个问题是因为没有打开 e2fsprog ,导致没有 mkfs.ext4,所以不能加载 overlayfs 引起
:::
OverlayFS文件系统可以类似达到把只读文件系统改为可写文件系统的效果
首先make menuconfig打开e2fsprog
image.png
然后make kernel_menuconfig打开ext4
image.png
重新编译烧录即可

8.SD卡检测脚反转

在百问网的补丁包基础上修改了串口之后烧录系统启动后会发现can't open blockdev,原因是因为默认检测低电平为sd卡插入
image.png
似乎我买的sd卡座det脚为高电平有效
所以这边不再使用det脚检测sd卡,而是使用轮询方式
修改设备树,把cd-gpios注释掉,然后取消broken-cd的注销
image.png

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自带支持
:::
SCH_Schematic1_2-Core_2024-04-07.png
image.png

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的驱动,但是为了将教程的通用性,我们不使用内核里面的驱动
image.png
获取驱动源码,放到内核驱动路径drivers/net/wireless下。
对于现在内核源码里面已经有驱动的情况,我们直接复制内核源码里面的驱动到wireless下就行

cp rtl8723bs/ -rf ../net/wireless/

image.png
修改rtl8723bs的Kconfig文件,防止和内核自带的rtl8723bs驱动冲突
image.png
modify
image.png
修改net/wireless目录下的Kconfig和Makefile将驱动添加到kernel_menuconfig
image.png
image.png
在make kernel_menuconfig中将rtl8723bs驱动编译成module
image.png
打开Allwinner rfkill driver
image.png
打开Allwinner sunxi SD/MMC Host Controller support
image.png
使用mkernel命令编译内核,编译完成之后来到wireless/rtl8723bs下,可以看到已经编译出ko文件了
image.png
然后打开对应方案的board.dts

cconfigs
vim board.dts

我们先来分析一下设备树原本的rfkill配置
image.png
image.png
他将PG11引脚配置为CLK_FANOUT,用于给wifi芯片提供时钟信号,由于FunnyPi使用的RTL8723BS模块并没有使用主控提供的32k时钟所以这边不用管他
image.png
image.png
image.png
以上所有项必须参看原理图进行配置,配置与原理图实际使用的资源保持一致

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))

image.png
需要注意驱动文件的路径要是正确的
image.png
我们的驱动文件前面有个r,所以要进行修改,并且为了方便区分内核自带的rtl8723bs和我们自己添加的所以我们将rtl8723bs改为rtl8723bs-my
image.png
接着在 tina 根目录执行 make menuconfig 就可以看到新添加的模组
kernel modules->wireless drivers
将他选择为*
image.png

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~~
image.png
然后在rtl8723bs文件夹中创建rtl8723bs.mk文件,将rtl8723ds文件夹里面的rtl8723ds.mk复制过来,进行修改
image.png

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了
image.png
重新编译uboot和kernel并烧录系统,然后进入板卡
使用insmod命令安装驱动
image.png
:::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);

image.png
重新编译重新加载驱动即可

7.2.4 上网配置

通过上面的操作我们已经成功的完成了wifi驱动的启用,接下来就是需要连接wifi并上网,这边使用的是wpa_supplicant来连接wifi

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

insmod r8723bs

image.png
先使用ifconfig -a看一下是否有wlan0
image.png
然后开启wlan0

ifconfig wlan0 up

image.png
修改/etc/wps_supplicant.conf文件

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
    ssid="whoami_mix4"
    psk="88888889"
}

image.png
在/var/run 下面创建wpa_supplicant文件夹

mkdir -p /var/run/wpa_supplicant

开启wpa_supplicant连接wifi

wpa_supplicant -D nl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

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

udhcpc -i wlan0

image.png
使用ifconfig命令查看wlan0是否已经分配到ip了
image.png
尝试ping bing.com
image.png
可以成功联网了

10.学习OpenWrt的软件编译构建系统

参考
从mk文件深度剖析OpenWrt软件编译构建系统、并手把手教学构建自己的系统软件_openwrt package 构建的基本方法-CSDN博客
由于TinaSDK是基于OpenWrt的所以也包含了OpenWrt的软件编译构建系统
在TinaSDK根目录下有个package文件夹,下面存放的就是OpenWrt软件编译构建系统相关文件
以dnsmasq软件为例
image.png
:::success
补丁(patches)目录:是可选的,典型包含缺陷修改或者用于优化可执行程序大小的补丁文件。
files目录:也是可选的,它一般用于保存默认配置文件和初始化启动脚本。
src目录:如果为OpenWrt本身项目所包含的软件模块,因为代码将完全受到自己控制,这时将不会patches 目录存在,而是会有一个 src 目录,代码直接放在src目录下(在下一篇文章中我们自己定义的软件包就有这个目录)。
Makefile:提供下载、编译、安装以及生成 OPKG 安装包的功能,这个文件是必须有的。
:::

10.1 OpenWrt的Makefile

此Makefile与普通的Makefile不同,OpenWrt没有遵守传统的Makefile格式风格,而是将Makefile写成面向对 象格式,这样就简化了多平台移植过程
下面以dnsmasq软件的Makefile为例
image.png

posted @ 2024-04-16 11:58  flose  阅读(5923)  评论(2)    收藏  举报