# Tina-Linux **Repository Path**: wangjun009xx/Tina-Linux ## Basic Information - **Project Name**: Tina-Linux - **Description**: Tina-Linux - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 16 - **Created**: 2024-04-27 - **Last Updated**: 2024-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Fork me on Gitee **【当前项目 fork 于 github 芒果不鸽】** https://mangopi.org , https://github.com/mangopi-sbc/Tina-Linux.git 由于 github 访问速度关系,将其同步至 gitee 用以开发 T113-s3 芯片,同时记录使用此 SDK 过程中遇到的各种问题以及解决方法。 # Tina-Linux Tina Linux 系统是基于 openwrt-14.07 的版本的软件开发包,包含了 Linux 系统开发用到的内核源码,驱动,工具、系统中间件与应用程序包。openwrt 是一个开源的嵌入式 Linux 系统自动构建框架,是由 Makefile 脚本和 Kconfig 配置文件构成的。使得用户可以通过 menuconfig 配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。 ## Win11 WSL2 Ubuntu-20.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++6 libstdc++6 libmpc-dev libgmp-dev -y ### SDK 下载 ``` sh $ git clone https://gitee.com/xiaobocwb/Tina-Linux.git $ cd Tina-Linux/ $ git submodule update --init --recursive // 下载并解压资源数据 方式一: (视网络环境可能需要1小时左右,全部 4G) $ wget http://dl.mangopi.cc/tina/prebuilt.tar.gz . $ tar xzvf prebuilt.tar.gz $ wget http://dl.mangopi.cc/tina/dl.tar . $ tar xvf dl.tar $ wget http://dl.mangopi.cc/tina/toolchain/riscv64-linux-x86_64-20200528.tar.xz -P ./lichee/brandy-2.0/tools/toolchain/ $ wget http://dl.mangopi.cc/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 从以下目标方案(芯片及板) ``` sh 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 下载](https://mangopi.cc/_media/phoenixcard4.2.8.zip) # 开发 ## WIFI 驱动 make menuconfig -> Kernel modules -> Wireless Drivers 选中板载 wifi 模块,取消其它,wifi 模块一般还有依赖的固件,在驱动中选中后会根据依赖自动选中,其目录在 menuconfig -> Firmware。 ![RTL8723ds](resource/rtl8723ds.png) ## OPENSSL 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 ![openssl_version](resource/openssl_version.png) 完成安装后重新 source buile/envsetup 加载环境,并选中 openssl 及其相关算法。 ![openssl_menuconfig](resource/openssl_menuconfig.png) 这里可能需要同时选中内核模块中的 zlib,从 openssl 的 Makefile 文件看是有依赖关系的,实际到底需不需要未进一步验证。 ![kmod-zlib](resource/kmod-zlib.png) ## SSH ssh 功能选中 Network -> SSH 下的 openssh-server 即可(ssh 依赖 openssl,所以 openssl 必须安装)。 ![ssh](resource/ssh.png) 另外默认不允许以 root 身份连接,将 /etc/ssh/sshd_config 文件内 PermitRootLogin 后面参数改为 yes 即可。 ![sshd_config](resource/sshd_config.png) wifi 连接后,通过 ssh 登录测试: ![ssh_test](resource/ssh_test.png) ## 内核初始化 SDK 默认内核启动后的初始化为 busybox init 方式,但实际测试(通过 ps 查看进程)发现 busybox init 方式下各种基础服务都没有启动,暂不细究,直接更换成 procd init 方式,首先在 System init 中选则 procd-init,然后在 Base system -> busybox 中取消其 init 选项,最后确保 init参数是 /sbin/init。 ![procd](resource/procd.png) ![busybox_init](resource/busybox_init.png) ![env_cfg](resource/env.cfg.png) ## LCD适配 当前适配 LCD 是一块 4.3 寸 800*480 分辨率的屏幕,电容触摸屏是全贴合的,驱动芯片是 gt911 I2C 接口。厂家给的屏参如图所示: ![lcd4.3](resource/lcd4.3.png) 需要修改设备树文件,芯片等硬件相关的配置皆在 device/ 目录下,当前修改 `device/config/chips/t113/configs/mq_r/` 下的 board.dts,uboot-board.dts,主要修改其中 lcd 配置部分,根据板原理图修改 I2C 及其下挂载的 gt911 触摸屏设备。 ```dts &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 阶段屏幕是否输出。 ### GT9xx 电容触摸 根据原理图电路,确定触摸屏挂载于哪个 I2C 下,然后在对应 I2C 下新增驱动信息。 ![twi_gt911](resource/twi_gt911.png) ```dts &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>;*/ }; }; ``` ## GUI LVGL 由于 T113 RAM 只有 128M,GUI 如果选择 QT 会占用大量内存,目前先试试 lvgl,在 GUI -> Littlevgl 下选择 lv_examples 等相关,然后在 `package/Gui/littlevgl-8/lv_examples/src/` 目录下修改 `lv_drv_conf.h` 文件,主要是更改触摸屏输入事件号,到时候运行时确定了具体是哪个 event 就通过软连接绑定。 ![lvgl](resource/lvgl.png) ![lvgl_event](resource/lvgl_event.png) 运行后查看 /dev/input/ 下有 event0,event1 怎么确定哪个是触摸屏呢,直接运行 cat event0 或 cat event1,运行后用手触摸屏幕看 sheel 上是否输出字符串就可以确定。 通过软连接绑定到 touchscreen: > ln -s /dev/input/event1 /dev/input/touchscreen 然后运行测试 demo 看看 lvgl 和 触摸的效果: ![lv_demo](resource/lv_demo.png) ![lv_demo1](resource/lvgl_demo1.jpg) > lv_examples 0 ## 各种工具 ### **binutils** GNU binutils 是一整套的编程语言工具程序,用来处理许多格式的目标文件,通常搭配GCC、make、和GDB这些程序来使用。 主要包括: * ld —— GNU链接器 * as—— GNU汇编器 * addr2line:从目标文件的虚拟地址获取文件的行号或符号。 * ar:可以对静态库做创建、修改和提取的操作。 * c++filt:反编译(反混淆,demangle)C++符号的工具。 * dlltool:创建创建Windows动态库。 * gold:另一种新的、更快的仅支持ELF的链接器。 * gprof:性能分析(profiling)工具程序。 * nlmconv:可以转换成NetWare Loadable Module(NLM)目标文件格式。 * nm:显示目标文件内的符号信息。 * objcopy:复制和转译目标文件。 * objdump:显示目标文件的相关信息,亦可反汇编。 * ranlib:产生静态库的索引。(和nm -s功能类似) * readelf: 显示ELF文件的内容。 * size:列出目标文件或库文件的section大小。 * strings:列出文件中可打印的字符串信息。 * strip:从目标文件中移除符号信息。 * windmc:Windows消息资源编译器。 * windres:Windows资源文件编译器。 ![](resource/binutils.png) ### **devmem** 这个工具可以直接通过命令行读写实际内存,对于硬件外设调试来说很方便,可以随时读写外设寄存器,加快调试速度。 ![utilitite](resource/utilitite.png) ### **i2cdetect** 这个工具在 Base system -> busybox 里,搜索一下就可以找到,用来探测连接的 I2C 设备地址,确认硬件连接,以下是搜索到地址为 0x14 的 gt911 触摸屏后的效果(显示和 sheel有关,正常情况下是类似表格一样的排版)。 ![i2cdetect](resource/i2cdetect.png) ## LUCI 手动启动 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 ## 蓝牙支持 首先根据原理图配置设备树文件: ![rtl8723ds_sch](resource/rtl8723ds_sch.png) ![rtl8723ds_sch1](resource/rtl8723ds_sch1.png) ```dts 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 协议栈 ![bluetooth_kernel_1](resource/bluetooth_kernel_1.png) RTL8723ds 模块选 H5 协议,并且使能 UART(H4) ![bluetooth_kernel_2](resource/bluetooth_kernel_2.png) RF switch 中不要选中 RF switch inputs support,要使能 GPIO RFKILL 驱动 ![bluetooth_kernel_3](resource/bluetooth_kernel_3.png) 用户空间配置项中选中开源协议栈 bluez-daemon 和 bluez-utils ![bluetooth_1](resource/bluetooth_1.png) 还有 rtl 的初始化工具 ![bluetooth_2](resource/bluetooth_2.png) 光协议栈没有应用也用不起来,选中全志的 btmanager 以及其 demo,提供 A2DP source/sink工具,可以做音频播放器或蓝牙音响,AVRCP 蓝牙无线遥控,HFP 蓝牙语音通话,此外还有 BLE 的 gatt 服务客户端等工具,这个工具基本上蓝牙该有功能的他都有了。 ![bluetooth_3](resource/bluetooth_3.png) 编译运行后使用 bt_test 命令可以启用蓝牙,其它功能,通过 bt_test -h 查看,这个命令还支持交互方式, bt_test -i,下面是实际运行起来的样子: ![bluetooth_run](resource/bluetooth_run.png) /etc/bluetooh/下 bt_init.sh 是初始化脚本,一般不需要改动,bluetooh.json 是蓝牙功能配置文件,可以选中初始化时启用的各种 profile,还有配置音频播放设备。