同步操作将从 xiaobo/Tina-Linux 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
【当前项目 fork 于 github 芒果不鸽】 https://mangopi.org , https://github.com/mangopi-sbc/Tina-Linux.git
由于 github 访问速度关系,将其同步至 gitee 用以开发 T113-s3 芯片,同时记录使用此 SDK 过程中遇到的各种问题以及解决方法。
Tina Linux 系统是基于 openwrt-14.07 的版本的软件开发包,包含了 Linux 系统开发用到的内核源码,驱动,工具、系统中间件与应用程序包。openwrt 是一个开源的嵌入式 Linux 系统自动构建框架,是由 Makefile 脚本和 Kconfig 配置文件构成的。使得用户可以通过 menuconfig 配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。
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 libmpc-dev libgmp-dev -y
$ git clone https://gitee.com/xiaobocwb/Tina-Linux.git
$ cd Tina-Linux/
$ git submodule update --init --recursive
// 下载并解压资源数据
方式一: (视网络环境可能需要1小时左右,全部 4G)
$ wget http://dl.mangopi.org/tina/prebuilt.tar.gz .
$ tar xzvf prebuilt.tar.gz
$ wget http://dl.mangopi.org/tina/dl.tar .
$ tar xvf dl.tar
$ wget http://dl.mangopi.org/tina/toolchain/riscv64-linux-x86_64-20200528.tar.xz -P ./lichee/brandy-2.0/tools/toolchain/
$ wget http://dl.mangopi.org/tina/toolchain/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz -P ./lichee/brandy-2.0/tools/toolchain/
方式二:
链接:https://pan.baidu.com/s/1dErX9d0sXunmJQ-eD7TteQ
提取码:9999
通过百度网盘下载之后,根据方式一中命令将资源复制并解压到相应目录下。
加载环境变量
source build/envsetup.sh
选择目标方案
lunch
从以下目标方案(芯片及板)
You're building on Linux
Lunch menu... pick a combo:
1. d1_mq_pro-tina
2. d1_nezha_min-tina
3. d1_nezha-tina
4. f133_evb1-tina
5. f133_mq_r-tina
6. t113_evb1-tina
7. t113_mq_r-tina
运行图形化配置界面,加载 package/ 目录下所有包(*非必须)
(wsl2 默认环境下此步骤不会出问题,虚拟机 ubuntu-14.04 下试过出现找不到 libxxx.so.x)
make menuconfig
编译内核及各种包(编译线程数根据电脑配置决定):
make -j8 -s
编译 uboot(首次需要,后续无改动不需要重复编译):
mboot
打包镜像,打包完成后镜像地址会有显示:
pack
使用 phoenixcard4 直接选中位于 linux 下的镜像文件,选择启动卡,插入 SD 卡烧录,烧录完成后即可运行测试。 phoenixcar 下载
make menuconfig -> Kernel modules -> Wireless Drivers 选中板载 wifi 模块,取消其它,wifi 模块一般还有依赖的固件,在驱动中选中后会根据依赖自动选中,其目录在 menuconfig -> Firmware。
WSL2 ubuntu-20.04 下默认 openssl 版本是 1.1.1,Tina package 内适配的 openssl 版本是 1.1.0i 版本,编译时会出现关于 ”RSA {aka struct rsa_st}“ 相关的错误,这是由于在 openssl 1.1.1 版本及以上将 RSA,DES 等结构体内部隐藏了起来,在头文件中是以 typedef 的方式声明,其内部成员的访问提供了 get,set相关的接口函数,openssl 1.1.0 版本及以下直接通过 RSA 结构体指针访问成员的方式编译就会出错,需要做的不是网上说的打 210-xxx 的补丁,而是通过 apt 对当前宿主机 openssl 降级。
openssl version
sudo apt-cache madison openssl
sudo apt install openssl=1.1.0g-2ubuntu4
完成安装后重新 source buile/envsetup 加载环境,并选中 openssl 及其相关算法。
这里可能需要同时选中内核模块中的 zlib,从 openssl 的 Makefile 文件看是有依赖关系的,实际到底需不需要未进一步验证。
ssh 功能选中 Network -> SSH 下的 openssh-server 即可(ssh 依赖 openssl,所以 openssl 必须安装)。
另外默认不允许以 root 身份连接,将 /etc/ssh/sshd_config 文件内 PermitRootLogin 后面参数改为 yes 即可。
wifi 连接后,通过 ssh 登录测试:
SDK 默认内核启动后的初始化为 busybox init 方式,但实际测试(通过 ps 查看进程)发现 busybox init 方式下各种基础服务都没有启动,暂不细究,直接更换成 procd init 方式,首先在 System init 中选则 procd-init,然后在 Base system -> busybox 中取消其 init 选项,最后确保 init参数是 /sbin/init。
当前适配 LCD 是一块 4.3 寸 800*480 分辨率的屏幕,电容触摸屏是全贴合的,驱动芯片是 gt911 I2C 接口。厂家给的屏参如图所示:
需要修改设备树文件,芯片等硬件相关的配置皆在 device/ 目录下,当前修改 device/config/chips/t113/configs/mq_r/
下的 board.dts,uboot-board.dts,主要修改其中 lcd 配置部分,根据板原理图修改 I2C 及其下挂载的 gt911 触摸屏设备。
&lcd0 {
lcd_used = <1>;
lcd_driver_name = "default_lcd";
lcd_backlight = <50>;
lcd_if = <0>;
lcd_x = <800>;
lcd_y = <480>;
lcd_width = <95>;
lcd_height = <54>;
lcd_dclk_freq = <24>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <7>;
lcd_pwm_freq = <500>;
lcd_pwm_pol = <0>;
lcd_hbp = <12>;
lcd_ht = <816>;
lcd_hspw = <4>;
lcd_vbp = <12>;
lcd_vt = <496>;
lcd_vspw = <4>;
lcd_lvds_if = <0>;
lcd_lvds_colordepth = <1>;
lcd_lvds_mode = <0>;
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
pinctrl-0 = <&rgb18_pins_a>;
pinctrl-1 = <&rgb18_pins_b>;
}
其中 v,t参数取表中典型值:
lcd_hpp = Front Porch + Pulse Width = 12
lcd_ht = Display Period + Front Porch + Back Porch
lcd_hspw = Pulse Width
VSYNC 参数同上
lcd_dclk_freq 参数表中为 25MHz 但为了分频方便,这里取可以整除的 24MHz (官方 SDK 无法输出低于 48MHz 的时钟,需要打补丁)
lcd_x,lcd_y 是分辨率参数
lcd_width,lcd_hight 是屏幕物理尺寸,用于计算 DPI
以上参数同步更改到 uboot-board.dts, 为了防止开机时屏幕闪烁,kernel 在检测到 lcd 已经被 uboot 初始化后就不会再重新初始化,可以更改 uboot 阶段屏幕是否输出。
根据原理图电路,确定触摸屏挂载于哪个 I2C 下,然后在对应 I2C 下新增驱动信息。
&twi2 {
clock-frequency = <400000>;
pinctrl-0 = <&twi2_pins_a>;
pinctrl-1 = <&twi2_pins_b>;
pinctrl-names = "default", "sleep";
dmas = <&dma 45>, <&dma 45>;
dma-names = "tx", "rx";
status = "okay";
ctp@14 {
compatible = "allwinner,goodix";
device_type = "ctp";
reg = <0x14>;
status = "okay";
ctp_name = "gt9xxnew_ts";
ctp_twi_id = <0x2>;
ctp_twi_addr = <0x14>;
ctp_screen_max_x = <0x320>;
ctp_screen_max_y = <0x1e0>;
ctp_revert_x_flag = <0x0>;
ctp_revert_y_flag = <0x0>;
ctp_exchange_x_y_flag = <0x0>;
ctp_int_port = <&pio PB 3 GPIO_ACTIVE_HIGH>;
ctp_wakeup = <&pio PB 2 GPIO_ACTIVE_HIGH>;
/*ctp-supply = <®_aldo2>;*/
/*ctp_power_ldo = <®_aldo2>;*/
/*ctp_power_ldo_vol = <3300>;*/
};
};
由于 T113 RAM 只有 128M,GUI 如果选择 QT 会占用大量内存,目前先试试 lvgl,在 GUI -> Littlevgl 下选择 lv_examples 等相关,然后在 package/Gui/littlevgl-8/lv_examples/src/
目录下修改 lv_drv_conf.h
文件,主要是更改触摸屏输入事件号,到时候运行时确定了具体是哪个 event 就通过软连接绑定。
运行后查看 /dev/input/ 下有 event0,event1 怎么确定哪个是触摸屏呢,直接运行 cat event0 或 cat event1,运行后用手触摸屏幕看 sheel 上是否输出字符串就可以确定。
通过软连接绑定到 touchscreen:
ln -s /dev/input/event1 /dev/input/touchscreen
然后运行测试 demo 看看 lvgl 和 触摸的效果:
lv_examples 0
GNU binutils 是一整套的编程语言工具程序,用来处理许多格式的目标文件,通常搭配GCC、make、和GDB这些程序来使用。
主要包括:
这个工具可以直接通过命令行读写实际内存,对于硬件外设调试来说很方便,可以随时读写外设寄存器,加快调试速度。
这个工具在 Base system -> busybox 里,搜索一下就可以找到,用来探测连接的 I2C 设备地址,确认硬件连接,以下是搜索到地址为 0x14 的 gt911 触摸屏后的效果(显示和 sheel有关,正常情况下是类似表格一样的排版)。
手动启动 uhttpd 服务 /usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -u /ubus -t 60 -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.0.0:80 -p [::]:80
首先根据原理图配置设备树文件:
rfkill: rfkill@0 {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0 = <&wlan_pins_a>;
pinctrl-names = "default";
status = "okay";
wlan: wlan@0 {
compatible = "allwinner,sunxi-wlan";
clock-names = "32k-fanout1";
clocks = <&ccu CLK_FANOUT1_OUT>;
wlan_busnum = <0x1>;
wlan_regon = <&pio PG 12 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&pio PG 10 GPIO_ACTIVE_HIGH>;
/*wlan_power = "VCC-3V3";*/
/*wlan_power_vol = <3300000>;*/
/*interrupt-parent = <&pio>;
interrupts = < PG 10 IRQ_TYPE_LEVEL_HIGH>;*/
wakeup-source;
};
bt: bt@0 {
compatible = "allwinner,sunxi-bt";
clock-names = "32k-fanout1";
clocks = <&ccu CLK_FANOUT1_OUT>;
/*bt_power_num = <0x01>;*/
/*bt_power = "axp803-dldo1";*/
/*bt_io_regulator = "axp803-dldo1";*/
/*bt_io_vol = <3300000>;*/
/*bt_power_vol = <330000>;*/
bt_rst_n = <&pio PG 15 GPIO_ACTIVE_LOW>;
status = "okay";
};
};
btlpm: btlpm@0 {
compatible = "allwinner,sunxi-btlpm";
uart_index = <0x1>;
bt_wake = <&pio PG 14 GPIO_ACTIVE_HIGH>;
bt_hostwake = <&pio PG 13 GPIO_ACTIVE_HIGH>;
status = "okay";
};
addr_mgt: addr_mgt@0 {
compatible = "allwinner,sunxi-addr_mgt";
type_addr_wifi = <0x0>;
type_addr_bt = <0x0>;
type_addr_eth = <0x0>;
status = "okay";
};
make kernel_menuconfig 在内核配置中启用蓝牙相关协议:
RFCOMM 是语音通话相关,用不到不用选,主要就是选中 BR/EDR 协议栈
RTL8723ds 模块选 H5 协议,并且使能 UART(H4)
RF switch 中不要选中 RF switch inputs support,要使能 GPIO RFKILL 驱动
用户空间配置项中选中开源协议栈 bluez-daemon 和 bluez-utils
还有 rtl 的初始化工具
光协议栈没有应用也用不起来,选中全志的 btmanager 以及其 demo,提供 A2DP source/sink工具,可以做音频播放器或蓝牙音响,AVRCP 蓝牙无线遥控,HFP 蓝牙语音通话,此外还有 BLE 的 gatt 服务客户端等工具,这个工具基本上蓝牙该有功能的他都有了。
编译运行后使用 bt_test 命令可以启用蓝牙,其它功能,通过 bt_test -h 查看,这个命令还支持交互方式, bt_test -i,下面是实际运行起来的样子:
/etc/bluetooh/下 bt_init.sh 是初始化脚本,一般不需要改动,bluetooh.json 是蓝牙功能配置文件,可以选中初始化时启用的各种 profile,还有配置音频播放设备。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。