【果壳】D1h开发板评测——基础使用、网络、显示和视频篇

上手体验D1-H_DualDisplay-Devkit

开发套件简介

百问网D1h双屏异显开发套件是采用全志科技首款RISC-V处理器D1-H,该芯片是基于RISC-V指令集的芯片,集成了阿里平头哥64位C906核心,支持RVV,1GHz+主频,可支持Linux、RTOS等系统。同时支持最高4K的H.265/H.264解码,内置一颗HiFi4 DSP,最高可外接2GB DDR3,可以应用于智慧城市、智能汽车、智能商显、智能家电、智能办公和科研教育等多个领域。

评测任务:

1.开发板快速启动等基础使用。
2.关于视频编解码HDMI显示(支持4K)播放视频。
3.关于音频通道的使用和切换,使用XR829的蓝牙,将开发板作为蓝牙音响。
4.使用红外接收控制HDMI显示屏切换LVGL的UI界面。
5.使用WIFI+HDMI实现投屏播放器功能(提供源码)。
6.双屏异显功能,我们可以单独提供MIPI屏幕。

我选择的评测任务是1和6,

评测计划

  1. 在开发板启动和基础使用阶段开发板启动阶段,我将完成以下工作:

1.1 环境搭建:
了解开发板基本结构,熟悉基本硬件功能,搭建基础编译环境,编译SDK,熟悉烧写工具和烧写步骤。
1.2 uboot执行:
确保uboot可以正常启动,设置启动参数,完成内核的加载。
1.3 内核执行:
在uboot引导下,加载操作系统内核,完成文件系统的解析、设备驱动的加载、动态链接库的加载等操作。
1.4 应用程序启动:
启动测试应用程序,让其开始正常运行。
通过运行一些简单的程序和实验例程来了解开发板的基本能力。在此过程中记录开发中遇到的问题,整理代码和文档。

  1. 同屏异显功能开发和验证

2.1 了解硬件平台和接口规格:
确定开发板的接口类型和规格。了解CSI和HDMI接口的技术细节,如分辨率、帧率、颜色格式等。
2.2 配置显示接口:
根据硬件规格和需求,配置CSI和HDMI接口的参数,包括分辨率、帧率、颜色格式等,完成设备树的配置。
2.3 开发和调试驱动程序:
开发适配CSI和HDMI接口的设备驱动程序,正确地初始化和配置相应的硬件接口,使用V4L2框架和DRM框架来操作显示器。
2.3 图像数据处理:
完成CSI和HDMI接口的视频显示功能
2.4 双缓冲和显示控制:
实现双缓冲机制来同时管理CSI和HDMI接口的图像数据。
在内存中分配两块缓冲区,分别用于存储CSI接口和HDMI接口的图像数据。
然后,通过显示控制器来动态地切换显示内容,以实现同屏异显的效果。
2.5 调试和优化:
在驱动和显示开发完成后,进行调试和优化,确保同屏异显功能能够稳定可靠地工作。
查找和修复驱动程序或应用程序中的bug,优化图像处理算法以提高性能作。
2.6 集成到应用程序:
将同屏异显功能集成到实际的应用程序中,用开发用户界面(UI)演示交互逻辑,以便方便地使用。在此过程中记录开发中遇到的问题,整理代码和文档。

系统启动

开发板连接如图所示:

上电启动系统

1. 连接串口线

将配套的TypeC线一段连接至开发板的串口/供电接口,另一端连接至电脑USB接口,连接成功后板载的红色电源灯会亮起。 默认情况下系统会自动安装串口设备驱动,如果没有自动安装,可以使用驱动精灵来自动安装。

  • 对于Windows系统 此时Windows设备管理器 在 端口(COM和LPT) 处会多出一个串口设备,以 USB-Enhanced-SERIAL CH343(COM4)开头,需要留意一下后面的具体COM编号,用于后续连接使用。

image-20240407020805184

如上图,COM号是4,我们接下来连接所使用的串口号就是4

2. 打开串口控制台

使用MobaXterm等串口工具来开发板设备。MobaXterm可以通过访问页面 https://mobaxterm.mobatek.net/ 获取 。

使用Mobaxterm登录串口

打开MobaXterm,点击左上角的“Session”,在弹出的界面选中“Serial”,如下图所示选择端口号(前面设备管理器显示的端口号COM21)、波特率(Speed 115200)、流控(Flow Control: none),最后点击“OK”即可。步骤如下图所示。 注意:流控(Flow Control)一定要选择none,否则你将无法在MobaXterm中向串口输入数据

3. 进入系统shell

使用串口工具成功打开串口后,可以直接按下 Enter 键 进入shell,当然您也可以按下板子上的 Reset复位键,来查看完整的系统信息。

系统默认的 登录 用户名 是 root 没有密码。

基础使用篇

烧写固件至SPI NAND

注意此方式烧录进的文件系统是只读的,如果操作 需要网络文件系统挂载或者使用TF卡,不推荐使用。

准备工作

  1. D1-H_DualDisplay-Devkit
  2. 下载全志线刷工具AllwinnertechPhoeniSuit: https://gitlab.com/dongshanpi/tools/-/raw/main/AllwinnertechPhoeniSuit.zip
  3. TypeC线 X2
  4. 下载SPI NAND最小系统镜像:https://gitlab.com/dongshanpi/tools/-/raw/main/tina_d1-h-nezha_uart0.zip
  5. 下载全志USB烧录驱动:https://gitlab.com/dongshanpi/tools/-/raw/main/AllwinnerUSBFlashDeviceDriver.zip

安装usb驱动

在我们连接好开发板以后,先按住 FEL 烧写模式按键,之后按一下 RESET 系统复位键,就可以自动进入烧写模式。

这时我们可以看到设备管理器 通用串行总线控制器 弹出一个 未知设备 ,这个时候我们就需要把我们提前下载好的 全志USB烧录驱动 进行修改,然后将解压缩过的 全志USB烧录驱动 压缩包,解压缩,可以看到里面有这么几个文件。

InstallUSBDrv.exe
drvinstaller_IA64.exe
drvinstaller_X86.exe
UsbDriver/ 
drvinstaller_X64.exe 
install.bat

对于wind7系统,只需要以管理员 打开 install.bat 脚本,等待安装,在弹出的 是否安装驱动的对话框里面,点击安装即可。

对于wind10/wind11系统,需要在设备管理器里面进行手动安装驱动。

如下图所示,在第一次插入OTG设备,进入烧写模式设备管理器会弹出一个未知设备。


(https://photos.100ask.net/dongshanpi-docs/DongshanNezhaSTU/Windows_FlashDevice_001.png)

接下来鼠标右键点击这个未知设备,在弹出的对话框里, 点击浏览我计算机以查找驱动程序软件。


(https://photos.100ask.net/dongshanpi-docs/DongshanNezhaSTU/Windows_FlashDevice_002.png)

之后在弹出新的对话框里,点击浏览找到我们之前下载好的 usb烧录驱动文件夹内,找到 UsbDriver/ 这个目录,并进入,之后点击确定即可。

注意进入到 UsbDriver/ 文件夹,然后点击确定,如下图所示。

此时,我们继续点击 下一页 按钮,这时系统就会提示安装一个驱动程序。 在弹出的对话框里,我们点击 始终安装此驱动程序软件 等待安装完成。
Windows_FlashDevice_004

安装完成后,会提示,Windows已成功更新你的驱动程序。

最后我们可以看到,设备管理器 里面的未知设备 变成了一个 USB Device(VID_1f3a_efe8)的设备,这时就表明设备驱动已经安装成功。

运行软件烧写

将下载下来的全志线刷工具 AllwinnertechPhoeniSuit 解压缩,同时将**SPI NAND最小系统镜像**下载下来也进行解压缩。

解压后,得到一个 tina_d1-h-nezha_uart0.img 镜像,是用于烧录到SPI NAND镜像得。另一个是**AllwinnertechPhoeniSuit**文件夹。

首先我们进入到 AllwinnertechPhoeniSuit\AllwinnertechPhoeniSuitRelease20201225 目录下 找到 PhoenixSuit.exe 双击运行。

打开软件后 软件主界面如下图所示

接下来 我们需要切换到 一键刷机**窗口,如下图所示,点击红框标号1,在弹出的新窗口内,我们点击 红框2 **浏览 找到我们刚才解压过的 SPI NAND 最小系统镜像 tina_d1-h-nezha_uart0.img ,选中镜像后,点击红框3 全盘擦除升级 ,最后点击红框4 立即升级

点击完成后,不需要理会 弹出的信息,这时 我们拿起已经连接好的开发板,先按住 FEL 烧写模式按键,之后按一下 RESET 系统复位键,就可以自动进入烧写模式并开始烧写。

烧写时会提示烧写进度条,烧写完成后 开发板会自己重启。

启动系统

一般情况下,烧写成功后 都会自动重启 启动系统,此时我们进入到 串口终端,可以看到它的启动信息,等所有启动信息加载完成,按enter键即可登录烧写好的系统内。

启动后系统的用lv_example 0测试mipi屏幕,效果如图所示:

使用 adb

在window10平台使用adb

ADB (Android Debug Bridge) 是一个通用命令行工具,它允许用户与连接的Android设备进行通信。现在很多linux系统也集成了adb服务,可以用来与linux设备通信。

使用百问网提供的adb工具,解压缩,去除文件夹中文,添加到环境变量中

image-20240407024829849

进入adb shell

打开cmd,输入 adb devices

出现以下错误:

image-20240407025246696

说明开发板的adbd服务没有启动,在开发板串口中输入;

adbd &

再次在cmd中输入adb devices

image-20240407025424626

这时已经连接到开发板的adb服务器

进入shell,在cmd中输入adb shell

image-20240407025544407

此时已经进入开发板的shell登录

使用adb传输文件

使用ADB,可以通过以下命令将文件从计算机传输到开发板,或者从开发板传输到计算机:

  1. 将文件从计算机传输到Android设备:

adb push <本地路径> <远程路径>

例如,将本地文件file.txt传输到开发板的`/root目录,可以使用以下命令:

adb push file.txt /root
  1. 将文件从Android设备传输到计算机:
adb pull <远程路径> <本地路径>

例如,将开发板的/root/file.txt的文件传输到本地计算机的,可以使用以下命令:

adb pull /root/file.txt .

在ubuntu14.04平台使用adb

将usb otag连接到虚拟机ubuntu14.04

安装adb工具

sudo apt-get install android-tools-adb

adb shell

adb shell
error: insufficient permissions for device

表示缺少合适的权限,需要配置

解决方法:

  • 添加用户到plugdev组

    sudo usermod -a -G plugdev $USER
    
  • 添加udev规则

    创建一个udev规则文件来允许adb设备被正确识别。在创建一个文件在 /etc/udev/rules.d/ 目录下创建51-android.rules,并添加如下内容

    SUBSYSTEM=="usb", ATTR{idVendor}=="[Vendor ID]", MODE="0666", GROUP="plugdev"
    

    其中Vendor ID可以通过lsusb查看,lsusb

     lsusb
    Bus 002 Device 003: ID 18d1:d002 Google Inc.
    

    18d1:d002即为[Vendor ID],填入即可

编译Tina

开发环境搭建

嵌入式产品开发流程中,通常有两个关键的步骤,编译源码与烧写固件。源码编译需要先准备 好编译环境,而固件烧写则需要厂家提供专用烧写工具。本文主要介绍如何搭建环境来实现Tina sdk的编译和打包。

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

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

编译环境

开发主机和系统:i9-10900k ubuntu14.04

依赖包安装

sudo apt-get update
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 -y

解压SDK

百问网提供的未解压的sdk包

tina-d1-h.tar.bz2.00
tina-d1-h.tar.bz2.01
tina-d1-h.tar.bz2.02
tina-d1-h.tar.bz2.03
tina-d1-h.tar.bz2.04
tina-d1-h.tar.bz2.05
tina-d1-h.tar.bz2.06
tina-d1-h.tar.bz2.07
tina-d1-h.tar.bz2.08

解压:

cat tina-d1-h.tar.bz2.* | tar -jxv

解压后的文件:

SDK结构

Tina Linux 基于 openwrt-14.07 版本的

Tina-SDK/
├── build		# 构建系统文件
├── config		# 配置菜单的界面以及一些固定的配置项,该配置菜单基于内核的 mconf 规格编写
├── Config.in	# 菜单项配置文件。和 make menuconfig 相关联的文件
├── device		# 用于存放方案的配置文件,包括内核配置、env 配置、分区表配置、sys_config.fex(全志定制板级配置文件)、board.dts(linux标准设备树文件) 等
├── dl			# 软件包文件
├── lichee		# 存放 bootloader、linux内核、DSP等代码
├── Makefile	# 在顶层目录执行 make 命令的入口文件
├── out			# 编译相关的临时文件和最终镜像文件 ,编译后自动生成此目录
├── package		# 存放Tina系统支持的软件包源码和编译规则
├── prebuilt	# 存放预编译交叉编译器
├── rules.mk	# 定义了 Makefile 中使用的一些通用变量和函数
├── scripts		# 存放host端(PC端,下同)或target端(小机端,即目标机器,下同)使用的一些脚本
├── target		# 存放目标板相关的配置以及sdk和toolchain生成的规格
├── tmp			# 临时文件夹。编译过程中的临时文件保存。
├── toolchain	# 交叉工具链构建配置、规则
└── tools		# 存放 host 端工具的编译规则

编译

#获取环境变量
source build/envsetup.sh
	Setup env done! Please run lunch next.
#选择方案
lunch
	You're building on Linux

	Lunch menu... pick a combo:
     	1. d1-h_nezha_min-tina
     	2. d1-h_nezha-tina
     	3. d1s_nezha-tina

	Which would you like?: 2
	============================================
	TINA_BUILD_TOP=/home/ccdroid/d1h/tina-d1-h
	TINA_TARGET_ARCH=riscv
	TARGET_PRODUCT=d1-h_nezha
	TARGET_PLATFORM=d1-h
	TARGET_BOARD=d1-h-nezha
	TARGET_PLAN=nezha
	TARGET_BUILD_VARIANT=tina
	TARGET_BUILD_TYPE=release
	TARGET_KERNEL_VERSION=5.4
	TARGET_UBOOT=u-boot-2018
	TARGET_CHIP=sun20iw1p1
	============================================
	no buildserver to clean
	[1] 37218
#编译
make -j32
#打包
pack
	/home/ccdroid/d1h/tina-d1-h/out/d1-h-nezha/tina_d1-h-nezha_uart0.img

编译完成后的目录结构

image-20240407061114604

将生成的tina_d1-h-nezha_uart0.img 烧写到开发板,进一步开发测试

单独编译命令

# 单独编译boot0和uboot:(可在Tina任意目录下使用)
mboot
# 单独编译boot0:(可在Tina任意目录下使用)
mboot0
# 单独编译uboot:(可在Tina任意目录下使用)
muboot
# 单独编译内核:(可在Tina任意目录下使用)
mkernel

# 单独编译某个包:(只能在编译的包路径下操作)
# 如包路径为 tina/package/utils/rwcheck,则需要进入到 tina/package/utils/rwcheck路径下再输入 mm 命令,
# 编译出来对应的安装包的路径在 tina/out/d1h/packages/base下
mm

# 在根目录下编译某个软件包:(需要在根目录下操作)
make <应用包的路径>/install	# 如 make package/utils/rwcheck/install

# 在根目录下清空应用包临时文件:(需要在根目录下操作)
make <应用包的路径>/clean		# 如 make package/utils/rwcheck/clean

环境配置

Samba服务器

安装samba

sudo apt-update
sudo apt-get install samba

配置Samba共享

编辑Samba配置文件/etc/samba/smb.conf,在文件末尾添加以下内容,配置一个共享目录(例如[share])

sudo vim /etc/samba/smb.conf
[share]
path = /path/to/share
read only = no
browsable = yes
#不用登陆账号和密码
guest ok = yes

将/path/to/share替换为想要共享的实际目录路径。

设置Samba密码

sudo smbpasswd -a your_username

替换your_username为实际用户名。

重启Samba服务

sudo service smbd restart

权限设置允许Samba访问。

sudo chown nobody:nogroup /path/to/share
sudo chmod 775 /path/to/share
sudo ufw allow samba

NFS服务

嵌入式Linux开发中,会经常使用NFS,目标系统通常作为NFS客户机使用,Linux主机作为NFS服务器。在目标系统上通过NFS,将服务器的NFS共享目录挂载到本地,可以直接运行服务器上的文件。在调试系统驱动模块以及应用程序,NFS都是十分必要的,并且Linux还支持NFS根文件系统,能直接从远程NFSroot启动系统,这对嵌入式Linux根文件系统裁剪和集成也是十分有必要的。

安装NFS服务程序

sudo apt-get install nfs-kernel-server

配置 NFS 文件系统服务

vim /etc/exports
/home/ccdroid *(rw,sync,no_root_squash,no_all_squash)

启动NFS服务

sudo service nfs-kernel-server restart 

开发板验证NFS服务器是否可用

mount  -t nfs 192.168.6.140:/home/ccdroid  /mnt -o nolock
ls /mnt
umount /mnt/ 

挂载成功后,可以在开发板的/mnt目录下看到NFS服务器上的文件。

网络篇

配置wifi

编译支持xr829

make kernel_menuconfig
make menuconfig
make -j16
pack

make kernel_menuconfig

make menuconfig

加载ko失败

[12687.826918] [XRADIO_ERR] sbus_sdio_init failed
[12687.833418] xradio_core_init failed (-110)!
[12687.842196] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[12687.875076] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 52, RTO !!
[12687.883284] sunxi-mmc 4021000.sdmmc: smc 1 p1 err, cmd 52, RTO !!
[12687.890249] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
failed to insert xr829.ko

解决方案:

设备树board.dts的569行改成PB12

menuconfig里面的XR829 40M的选项都改成XR829

WiFi的连接

查看wifi规格

支持2.4G wifi,支持13个工作信道(Channel1-13),提供wifi扫描命令,可搜索到附件的wifi list。

执行:

wifi_scan_results_test

可以看到:

root@TinaLinux:/# wifi_scan_results_test

*********************************
***Start scan!***
*********************************
bssid / frequency / signal level / flags / ssid
0e:e0:df:1e:6a:36       2472    -39     [WPA2-PSK-CCMP][ESS]    RANDOLPH
******************************
Wifi get_scan_results: Success!
******************************

station模式

开机时如检测到曾经连接过wifi,则自动连接上一此连接的wifi。

执行:

#扫描SSID
iw wlan0 scan | grep SSID
#连接wifi
wifi_connect_ap_test <ssid> <psk>

ping百度验证:

root@TinaLinux:/# ping baidu.com
PING baidu.com (220.181.38.148): 56 data bytes
64 bytes from 220.181.38.148: seq=0 ttl=50 time=84.309 ms
64 bytes from 220.181.38.148: seq=1 ttl=50 time=75.818 ms
64 bytes from 220.181.38.148: seq=2 ttl=50 time=69.916 ms
64 bytes from 220.181.38.148: seq=3 ttl=50 time=71.139 ms
64 bytes from 220.181.38.148: seq=4 ttl=50 time=102.807 ms
^C
--- baidu.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 69.916/80.797/102.807 ms

修改 wifi 热点配置自动连接wifi

package/allwinner/wifimanager/files/wpa_supplicant_overlay.conf

disable_scan_offload=1
#添加wifi连接信息
network={
    ssid="xxx"
    psk="xxx"
}

进入系统后获取ip

udhcpc -i wlan0

添加脚本wlan0自动获取ip

添加启动脚本

  • 在源码树中,package/base-files/files目录下包含了系统的一些基础文件。
  • 可以在这个目录下添加你的启动脚本,例如创建一个名为/etc/init.d/S98udhcpc的文件。
vim package/base-files/files/etc/init.d/udhcpc
#!/bin/sh /etc/rc.common
START=98
STOP=98
DEPEND=done
PROG=udhcpc

start() {
        $PROG -i wlan0 &
}
stop() {
        $PROG --release
}

chmod +x udhcpc

更新/etc/rc.d

  • 为了让脚本在启动时被执行,需要在package/base-files/files/etc/rc.d目录下创建一个符号链接或者添加一个启动脚本的调用。

开启openssh-server

配置menuconfig

编译

make -j16
pack

烧写

开放sshd的22端口

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

firewall编译错误

error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 7 and 11 [-Werror=format-overflow=]

vim out/d1-h-nezha/compile_dir/target/firewall-2016-01-29/redirects.c

357: ccdroid

out/d1-h-nezha/compile_dir/target/firewall-2016-01-29/iptables.c:

858 ccdroid

out/d1-h-nezha/compile_dir/target/rpcd/session.c

ccdroid

显示和视频篇

4寸 tft08086 MIPI显示屏驱动适配

Linux 提供了一套完整的屏幕驱动,支持 RGB,MIPI,DSI,eDP,LVDS,E-INK屏幕,也支持低分辨率的 SPI,IIC 屏幕。具体屏幕的驱动情况,需要根据芯片而确定。本文将通过介绍 D1-H Kernel 中的 LCD 驱动,讲解配置屏幕驱动的基本方法。

LCD 的驱动框架

显示驱动可划分为三个层面:驱动层,框架层及底层。底层与图形硬件相接,主要负责将上层配置的功能参数转换成硬件所需要的参数,并配置到相应寄存器中。

显示框架层对底层进行抽象封装成一个个的功能模块。

驱动层对外封装功能接口,通过内核向用户空间提供相应的设备结点及统一的接口。

在驱动层,分为三个驱动,分别是framebuffer驱动,display驱动,LCD&HDMI驱动。

  • framebuffer 驱动与 framebuffer core 对接,实现 linux 标准的framebuffer 接口。
  • display驱动是整个显示驱动中的核心驱动模块,所有的接口都由 display 驱动来提供,包括 lcd 的接口。
  • LCD&HDMI驱动是具体的LCD屏幕和标准HDMI的具体驱动

Uboot 配置

对于 U-Boot 平台,一般直接修改 config 文件,位于

lichee/brandy-2.0/u-boot-2018/configs/sun20iw1p1_defconfig

其中的sun20iw1p1是芯片的软件代号。可以在 BoardConfig.mk 文件里找到。D1-H 芯片的 BoardConfig.mk 文件,位于:

device/config/chips/d1-h/configs/default/BoardConfig.mk

打开 BoardConfig.mk 配置文件

可以看到这颗芯片使用的是 sun20iw1p1_defconfig 这个配置文件。可以在 U-Boot 的 config 文件夹找到这个配置文件。

 ls lichee/brandy-2.0/u-boot-2018/configs/
configs.tar               sun20iw1p1_defconfig      sun20iw1p1_nor_defconfig

在sun20iw1p1_defconfig文件

SUNXI LOGO DISPLAY 是DISP 驱动部分

主要部分如下:

CONFIG_CMD_SUNXI_BMP=y          # 开机 LOGO BMP 文件解析器
CONFIG_LZMA=y                   # 开机 LOGO 使用 LZMA 压缩解压工具
CONFIG_DISP2_SUNXI=y            # DISP 驱动
CONFIG_HDMI2_DISP2_SUNXI=y      # HDMI DISP 驱动 
CONFIG_AW_PHY=y                 # DISP 驱动使用的是全志自研外设
  • 关闭 U-Boot 的 LCD DISP 驱动输出,注释掉 CONFIG_DISP2_SUNXI=y 这一行

  • 关闭 HDMI DISP 驱动输出,注释掉 CONFIG_HDMI2_DISP2_SUNXI=y 这一行

    LCD屏幕配置部分

vim device/config/chips/d1-h/configs/nezha/board.dts
vim lichee/linux-5.4/arch/riscv/boot/dts/sunxi/sun20iw1p1.dtsi
echo 1 > /sys/class/disp/disp/attr/colorbar
./dtc -I dtb -O dts -o fdt-new.dts fdt-new.dtb
cd lichee/linux-5.4/scripts/dtc

/home/ccdroid/d1h/tina-d1-h/out/d1-h-nezha

屏幕操作

调整LCD背光亮度

mount -t debugfs none /sys/kernel/debug
echo lcd0 > /sys/kernel/debug/dispdbg/name
echo setbl > /sys/kernel/debug/dispdbg/command
echo 100 > /sys/kernel/debug/dispdbg/param
echo 1 > start

亮度 0 - 255 写入 param, 0最亮, 255最暗。

默认显示输出改成HDMI

在tina目录下修改下面两个文件

#disp节点
vim device/config/chips/d1-h/configs/nezha/uboot-board.dts
vim device/config/chips/d1-h/configs/nezha/linux-5.4/board.dts 
    screen0_output_type      = <3>;
    screen0_output_mode      = <10>;

    screen1_output_type      = <1>;
    screen1_output_mode      = <4>;
    dev0_output_type         = <4>;
    dev0_output_mode         = <10>;

    dev0_do_hpd              = <1>;

因为单独make编译的时候默认是不编译uboot的 所以要先编译一遍uboot
使用此命令进入进入uboot路径

cboot

单独编译uboot 编完uboot文件会自动复制到方案下

muboot

回到tina目录

cd ../../../

重新编译

make -j64

把logo文件复制到以下路径 logo在原文下载

cp bootlogo.bmp device/config/chips/d1-h/boot-resource/boot-resource/bat/bootlogo.bmp
cp bootlogo.bmp device/config/chips/d1-h/boot-resource/boot-resource/bootlogo.bmp
cp bootlogo.bmp device/config/chips/d1-h/configs/nezha/configs/bootlogo.bmp

如果没做这步那么开机的时候会绿屏

最后打包

pack

烧录完后启动系统 就能发现HDMI上显示出了logo

双屏异显

实验目标:在hdmi和mipi屏幕同时显示图像

修改 libuapi 库

vim d1-tina-open/package/allwinner/libuapi/src/videoOutPort.c
# 调转一下默认屏幕输出
+#define SCREEN_0 1
+#define SCREEN_1 0
#重新编译打包 烧录
make -j32 && pack

测试

  • hdmi屏幕显示
echo 1 > /sys/class/disp/disp/attr/colorbar
cat /sys/devices/virtual/disp/disp/attr/sys
    screen 0:
    de_rate 300000000 hz, ref_fps:60
    mgr0: 1920x1080 fmt[yuv444] cs[0x101] range[limit] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] 	iommu[1]
    dmabuf: cache[0] cache max[0] umap skip[0] umap skip max[4]
            hdmi output mode(10)    fps:60.6        1920x1080
            err:0   skip:45 irq:28591       vsync:0 vsync_skip:0
       BUF    enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[  0] fb[1920,1080;1920,1080;1920,1080] crop[   0,   0,1920,1080] frame[   0,   0,1920,1080] addr[ff000000,       0,       0] flags[0x       0] trd[0,0]

此时已经创建了screen0,并且在hdmi中显示出了colorbar-1

  • mipi屏幕显示
cd /sys/kernel/debug/dispdbg
echo disp0 > name; echo switch1 > command; echo 1 4 0 0 0x4 0x101 0 0 0 8 > param; echo 1 > start;
echo 1 > /sys/class/disp/disp/attr/colorbar

实验结果如下

由于tina2在图像显示方面存在问题,暂不测试视频和图像同时显示功能