开发环境搭建
获取TinaSDK源码
Tina-SDKV2.0源码网盘链接:https://pan.baidu.com/s/13uKlqDXImmMl9cgKc41tZg?pwd=qcw7
上传到ubuntu,创建文件夹用来保存源码:
代码语言:javascript复制ubuntu@ubuntu1804:~$ mkdir Tina_SDK
ubuntu@ubuntu1804:~$ cd Tina_SDK/
ubuntu@ubuntu1804:~/Tina_SDK$ tree -L 1
.
├── 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
0 directories, 9 files
查看所有文件MD5校验值:
代码语言:javascript复制ubuntu@ubuntu1804:~/Tina_SDK$ md5sum tina-d1-h.tar.bz2.*
e755bae00cd76afc3fb276b4e3fd86ba tina-d1-h.tar.bz2.00
cb60ecfdb51c624ff3cbd7b24552866f tina-d1-h.tar.bz2.01
54e56a4cf1cef46ca0a94b85ea1d33a1 tina-d1-h.tar.bz2.02
4988fa08827c0f7af2dc170145e24b26 tina-d1-h.tar.bz2.03
a0463bcf8e73db27b5ecafaac593a919 tina-d1-h.tar.bz2.04
a87382ca16a8c12b3a94f1cad99ce77e tina-d1-h.tar.bz2.05
5973530baa3b282108351818641c27fd tina-d1-h.tar.bz2.06
ccd63e1d16534b364a101d2d44416261 tina-d1-h.tar.bz2.07
e0d72713565f4424ea43c07e15a38139 tina-d1-h.tar.bz2.08
确保校验值对上。否则需要重新上传。
解压源码:
代码语言:javascript复制ubuntu@ubuntu1804:~/Tina_SDK$ cat tina-d1-h.tar.bz2.* | tar -jxv
等待一段时间,即可解压完成。
代码语言:javascript复制ubuntu@ubuntu1804:~/Tina_SDK$ tree -L 1
.
├── tina-d1-h
├── 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
1 directory, 9 files
ubuntu@ubuntu1804:~/Tina_SDK$ mv tina-d1-h ../
编译固件之前,先安装一些依赖,否则编译会报错:
代码语言:javascript复制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 -y
编译出固件
进入源码目录,执行source build/envsetup.sh
、lunch
之后,选择2
:
ubuntu@ubuntu1804:~/tina-d1-h$ source build/envsetup.sh
Setup env done! Please run lunch next.
ubuntu@ubuntu1804:~/tina-d1-h$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. d1-h_nezha_min-tina
2. d1-h_nezha-tina
3. d1s_cvbs-tina
4. d1s_nezha-tina
5. t113_100ask_devkit-tina
6. t113_100ask-tina
Which would you like? [Default d1s_nezha]: 2
============================================
TINA_BUILD_TOP=/home/ubuntu/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] 66670
ubuntu@ubuntu1804:~/tina-d1-h$
接着make
编译、pack
打包:
ubuntu@ubuntu1804:~/tina-d1-h$ make
...
make[5]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner/generic/image'
make[4]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner/d1-h-nezha'
make[3]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner'
make[2]: Leaving directory '/home/ubuntu/tina-d1-h'
export MAKEFLAGS= ;make -w -r package/index
make[2]: Entering directory '/home/ubuntu/tina-d1-h'
Generating package index...
Signing key has not been configured
make[2]: Leaving directory '/home/ubuntu/tina-d1-h'
make[1]: Leaving directory '/home/ubuntu/tina-d1-h'
[2] Done $T/tools/build/buildserver --path $T 2> /dev/null 1>&2
#### make completed successfully (15:50 (mm:ss)) ####
ubuntu@ubuntu1804:~/tina-d1-h$
ubuntu@ubuntu1804:~/tina-d1-h$ ls
build Config.in dl logs out prebuilt rules.mk target toolchain
config device lichee Makefile package README.md scripts tmp tools
ubuntu@ubuntu1804:~/tina-d1-h$ pack
--==========--
PACK_CHIP sun20iw1p1
PACK_PLATFORM tina
PACK_BOARD d1-h-nezha
PACK_KERN
PACK_DEBUG uart0
PACK_SIG none
PACK_SECURE none
PACK_MODE normal
PACK_FUNC android
PACK_PROGRAMMER none
PACK_TAR_IMAGE none
PACK_TOPDIR /home/ubuntu/tina-d1-h
--==========--
No kernel param, parse it from d1-h
copying tools file
copying configs file
storage_type value is 5
rm /home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sys_partition_nor.fex
rm /home/ubuntu/tina-d1-h/out/d1-h-nezha/image/image_nor.cfg
copying boot resource
LZMA 4.65 : Igor Pavlov : Public domain : 2009-02-03
copying boot file
make user resource for : /home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sys_partition.fex
handle partition user-res
no user resource partitions
APP_PART_DOWNLOAD_FILE = /home/ubuntu/tina-d1-h/out/d1-h-nezha/image/app.fex
Need size of filesystem
no data resource partitions
don't build dtbo ...
update_chip
pack boot package
GetPrivateProfileSection read to end
content_count=3
LICHEE_REDUNDANT_ENV_SIZE config in BoardConfig.mk
--mkenvimage create redundant env data!--
---redundant env data size 0x20000---
packing for tina linux
normal
mbr count = 4
partitation file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin
mbr_name file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sunxi_mbr.fex
download_name file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/dlinfo.fex
mbr size = 252
mbr magic softw411
disk name=boot-resource
disk name=env
disk name=env-redund
disk name=boot
disk name=rootfs
disk name=dsp0
disk name=recovery
this is not a partition key
update_for_part_info 0
crc 0 = 4c7bc2df
crc 1 = d9c69382
crc 2 = bc706624
crc 3 = 29cd3779
gpt_head->header_crc32 = 0x892c53ba
GPT----part num 8---
gpt_entry: 128
gpt_header: 92
GPT:boot-resource: a1f8 c177
GPT:env : c178 c36f
GPT:env-redund : c370 c567
GPT:boot : c568 1161f
GPT:rootfs : 11620 1b597
GPT:dsp0 : 1b598 1b987
GPT:recovery : 1b988 227c7
GPT:UDISK : 227c8 ffffffde
update gpt file ok
update mbr file ok
temp = 20
mbr count = 4 total_sectors = 15269888 logic_offset = 40960
partitation file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin
mbr_name file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/sunxi_mbr.fex
download_name file Path=/home/ubuntu/tina-d1-h/out/d1-h-nezha/image/dlinfo.fex
mbr size = 252
mbr magic softw411
disk name=boot-resource
disk name=env
disk name=env-redund
disk name=boot
disk name=rootfs
disk name=dsp0
disk name=recovery
this is not a partition key
update_for_part_info 0
crc 0 = 4c7bc2df
crc 1 = d9c69382
crc 2 = bc706624
crc 3 = 29cd3779
gpt_head->header_crc32 = 0x1328fa28
GPT----part num 8---
gpt_entry: 128
gpt_header: 92
GPT:boot-resource: a1f8 c177
GPT:env : c178 c36f
GPT:env-redund : c370 c567
GPT:boot : c568 1161f
GPT:rootfs : 11620 1b597
GPT:dsp0 : 1b598 1b987
GPT:recovery : 1b988 227c7
GPT:UDISK : 227c8 e8ffde
update gpt file ok
update mbr file ok
====================================
show "sys_partition_for_dragon.fex" message
------------------------------------
[mbr]
mbr_size : 252 Kbyte
------------------------------------
partition_name : boot-resource
partition_size : 8064
downloadfile : boot-resource.fex
boot-resource.fex size : 3.0M byte
------------------------------------
partition_name : env
partition_size : 504
downloadfile : env.fex
env.fex size : 128K byte
------------------------------------
partition_name : env-redund
partition_size : 504
downloadfile : env.fex
env.fex size : 128K byte
------------------------------------
partition_name : boot
partition_size : 20664
downloadfile : boot.fex
boot.fex -> /home/ubuntu/tina-d1-h/out/d1-h-nezha/boot.img
boot.img size : 5.0M byte
------------------------------------
partition_name : rootfs
partition_size : 40824
downloadfile : rootfs.fex
rootfs.fex -> /home/ubuntu/tina-d1-h/out/d1-h-nezha/rootfs.img
rootfs.img size : 16M byte
------------------------------------
partition_name : dsp0
partition_size : 1008
downloadfile : dsp0.fex
dsp0.fex size : 249K byte
------------------------------------
partition_name : recovery
partition_size : 28224
------------------------------------
/home/ubuntu/tina-d1-h/out/host/bin/
/home/ubuntu/tina-d1-h/out/d1-h-nezha/image
Begin Parse sys_partion.fex
Add partion boot-resource.fex BOOT-RESOURCE_FEX
Add partion very boot-resource.fex BOOT-RESOURCE_FEX
FilePath: boot-resource.fex
FileLength=2f8c00Add partion env.fex ENV_FEX000000000
Add partion very env.fex ENV_FEX000000000
FilePath: env.fex
FileLength=20000Add partion env.fex ENV_FEX000000000
Add partion very env.fex ENV_FEX000000000
FilePath: env.fex
FileLength=20000Add partion boot.fex BOOT_FEX00000000
Add partion very boot.fex BOOT_FEX00000000
FilePath: boot.fex
FileLength=4f4000Add partion rootfs.fex ROOTFS_FEX000000
Add partion very rootfs.fex ROOTFS_FEX000000
FilePath: rootfs.fex
FileLength=fc0000Add partion dsp0.fex DSP0_FEX00000000
Add partion very dsp0.fex DSP0_FEX00000000
FilePath: dsp0.fex
FileLength=3e38cBuildImg 0
Dragon execute image.cfg SUCCESS !
----------image is for nand/emmc----------
----------image is at----------
/home/ubuntu/tina-d1-h/out/d1-h-nezha/tina_d1-h-nezha_uart0.img
pack finish
打包成功后,镜像文件保存在/home/ubuntu/tina-d1-h/out/d1-h-nezha/tina_d1-h-nezha_uart0.img
烧录固件
把镜像文件传到PC端,打开全志线刷工具 AllwinnertechPhoeniSuit,找到PhoenixSuit.exe ,双击运行:
选择一键刷机
:
找到镜像路径,选择全盘擦除升级:
选择好之后,不需要其他界面操作,这时拿起已经连接好的开发板,先按住 FEL 烧写模式按键,之后按一下 RESET 系统复位键,就可以自动进入烧写模式并开始烧写。
串口打印信息,如下:
代码语言:javascript复制[53]HELLO! BOOT0 is starting!
[56]BOOT0 commit : 88480af
[58]set pll start
[60]periph0 has been enabled
[63]set pll end
[64][pmu]: bus read error
[67]board init ok
[69]get_pmu_exist() = -1
[71]DRAM BOOT DRIVE INFO: V0.33
[74]DRAM CLK = 792 MHz
[76]DRAM Type = 3 (2:DDR2,3:DDR3)
[79]DRAMC ZQ value: 0x7b7bfb
[82]DRAM ODT value: 0x42.
[84]ddr_efuse_type: 0x0
[87]DRAM SIZE =512 M
[89]dram_tpr4:0x0
[91]PLL_DDR_CTRL_REG:0xf8004100
[94]DRAM_CLK_REG:0xc0000000
[96][TIMING DEBUG] MR2= 0x18
[100]DRAM simple test OK.
[103]dram size =512
[105]spinand UBOOT_START_BLK_NUM 8 UBOOT_LAST_BLK_NUM 32
[110]block from 8 to 32
[165]Check is correct.
[167]dma 0x301a8 int is not used yet
[171]dma 0x301a8 int is free, you do not need to free it again
[176]Entry_name = opensbi
[179]Entry_name = u-boot
[183]Entry_name = dtb
[186]Jump to second Boot.
OpenSBI auto-t113-linux-V0.8-2-g053d088
____ _____ ____ _____
/ __ / ____| _ _ _|
| | | |_ __ ___ _ __ | (___ | |_) || |
| | | | '_ / _ '_ ___ | _ < | |
| |__| | |_) | __/ | | |____) | |_) || |_
____/| .__/ ___|_| |_|_____/|____/_____|
| |
|_|
Platform Name : T-HEAD Xuantie Platform
Platform HART Features : RV64ACDFIMSUVX
Platform Max HARTs : 1
Current Hart : 0
Firmware Base : 0x41fc0400
Firmware Size : 75 KB
Runtime SBI Version : 0.2
MIDELEG : 0x0000000000000222
MEDELEG : 0x000000000000b1ff
PMP0 : 0x0000000041fc0000-0x0000000041fdffff (A)
PMP1 : 0x0000000040000000-0x000000007fffffff (A,R,W,X)
PMP2 : 0x0000000080000000-0x00000000bfffffff (A,R,W,X)
PMP3 : 0x0000000000020000-0x0000000000027fff (A,▒
U-Boot 2018.05-g24521d6-dirty (Jun 25 2024 - 02:56:26 -0400) Allwinner Technology
[00.271]DRAM: 512 MiB
[00.273]Relocation Offset is: 1dee9000
[00.277]secure enable bit: 0
[00.280]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz MBus=300Mhz
[00.286]flash init start
[00.289]workmode = 0,storage type = 0
sspi->base_addr = 0x4025000, the SPI control register:
[VER] 0x4025000 = 0x00010001, [GCR] 0x4025004 = 0x00000083, [TCR] 0x4025008 = 0x00000184
[ICR] 0x4025010 = 0x00000f00, [ISR] 0x4025014 = 0x00000032, [FCR] 0x4025018 = 0x00200020
[FSR] 0x402501c = 0x00000000, [WCR] 0x4025020 = 0x00000000, [CCR] 0x4025024 = 0x00000002
[SDC] 0x4025028 = 0x00002000, [BCR] 0x4025030 = 0x00000000, [TCR] 0x4025034 = 0x00000000
[BCC] 0x4025038 = 0x20000000, [DMA] 0x4025088 = 0x000000e5
[00.336]sunxi-spinand-phy: not detect any munufacture from id table
[00.342]sunxi-spinand-phy: get spi-nand Model from fdt fail
[00.348]sunxi-spinand-phy: get phy info from fdt fail
device nand0 <nand>, # parts = 4
#: name size offset mask_flags
0: boot0 0x00100000 0x00000000 1
1: uboot 0x00300000 0x00100000 1
2: secure_storage 0x00100000 0x00400000 1
3: sys 0x07b00000 0x00500000 0
active partition: nand0,0 - (boot0) 0x00100000 @ 0x00000000
defaults:
mtdids : nand0=nand
mtdparts: mtdparts=nand:1024k@0(boot0)ro,3072k@1048576(uboot)ro,1024k@4194304(secure_storage)ro,-(sys)
[00.462]ubi0: attaching mtd4
[00.557]ubi0: scanning is finished
[00.563]ubi0: attached mtd4 (name "sys", size 123 MiB)
[00.568]ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 258048 bytes
[00.574]ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 2048
[00.581]ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[00.587]ubi0: good PEBs: 492, bad PEBs: 0, corrupted PEBs: 0
[00.592]ubi0: user volume: 10, internal volumes: 1, max. volumes count: 128
[00.599]ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
[00.607]ubi0: available PEBs: 0, total reserved PEBs: 492, PEBs reserved for bad PEB handling: 20
[00.615]sunxi flash init ok
[00.618]line:703 init_clocks
[00.621]drv_disp_init
request pwm success, pwm0:pwm0:0x2000c00.
[00.638]drv_disp_init finish
[00.640]boot_gui_init:start
[00.643]set disp.dev2_output_type fail. using defval=0
[00.648]lcd_open_flow
[00.650]lcd_cfg_panel_info
[00.653]lcd_open_flow
[00.655]lcd_power_on
[00.680]boot_gui_init:finish
partno erro : can't find partition bootloader
[00.800]lcd_open_flow
[00.802] tft08006 drivers/video/sunxi/disp2/disp/lcd/tft08006.c lcd_panel_init 162
[00.809]lcd_panel_init
[01.283]lcd_open_flow
54 bytes read in 0 ms
[01.288]bmp_name=bootlogo.bmp size 1152054
[01.335]lcd_open_flow
[01.337]lcd_bl_open
FDT ERROR:fdt_get_all_pin:get property handle pinctrl-0 error:FDT_ERR_INTERNAL
sunxi_pwm_pin_set_state, fdt_set_all_pin, ret=-1
[01.350]lcd_open_flow
[01.353]lcd_open_flow
[01.355]LCD open finish
1152054 bytes read in 75 ms (14.6 MiB/s)
[01.491]Loading Environment from SUNXI_FLASH... OK
[01.512]out of usb burn from boot: not need burn key
[01.518]Item0 (Map) magic is bad
partno erro : can't find partition private
[01.544]update bootcmd
[01.556]change working_fdt 0x5eaa8da0 to 0x5ea88da0
No reserved memory region found in source FDT
[01.584]update dts
noncached_alloc(): addr = 0x5eca7080
noncached_alloc(): addr = 0x5eca70c0
noncached_alloc(): addr = 0x5eca7100
noncached_alloc(): addr = 0x5eca7940
phy_mode=rgmii, phy_interface=7
gmac: *** using ephy_clk ***
eth0
Warning: eth0 (eth0) using random MAC address - 62:2c:14:f8:ee:8c
Hit any key to stop autoboot: 0
dsp0:gpio init config fail
dsp0:sharespace config fail
dsp0 version is r528-tina-v1.0.0-release-37-g735b6b4-dirty
DSP0 start ok, img length 254860, booting from 0x400660
[01.901]no vendor_boot partition is found
Android's image name: d1-h-nezha
Detect comp gzip
[02.154]
Starting kernel ...
[ 0.000000] Linux version 5.4.61 (ubuntu@ubuntu1804) (riscv64-unknown-linux-gnu-gcc (C-SKY RISCV Tools V1.8.4 B20200702) 8.1.0, GNU ld (GNU Binutils) 2.32) #50 PREEMPT Tue Jun 25 06:59:32 UTC 2024
[ 0.000000] cma: Reserved 8 MiB at 0x000000005f800000
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000040000000-0x000000005fffffff]
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000040000000-0x000000005fffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000005fffffff]
[ 0.000000] On node 0 totalpages: 131072
[ 0.000000] DMA32 zone: 1792 pages used for memmap
[ 0.000000] DMA32 zone: 0 pages reserved
[ 0.000000] DMA32 zone: 131072 pages, LIFO batch:31
[ 0.000000] elf_hwcap is 0x20112d
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 129280
[ 0.000000] Kernel command line: ubi.mtd=sys ubi.block=0,rootfs earlyprintk=sunxi-uart,0x02500000 clk_ignore_unused initcall_debug=0 console=ttyS0,115200 loglevel=8 root=/dev/ubiblock0_5 rootfstype=squashfs init=/sbin/init partitions=mbr@ubi0_0:boot-resource@ubi0_1:env@ubi0_2:env-redund@ubi0_3:boot@ubi0_4:rootfs@ubi0_5:dsp0@ubi0_6:recovery@ubi0_7:rootfs_data@ubi0_8:UDISK@ubi0_9: cma=8M snum= mac_addr= wifi_mac= bt_mac= specialstr= gpt=1 androidboot.hardware=sun20iw1p1 boot_type=5 androidboot.boot_type=5 gpt=1 uboot_message=2018.05-g24521d
[ 0.000000] Dentry cache hash table entries: 65536 (order: 7, 524288 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 6, 262144 bytes, linear)
[ 0.000000] Sorting __ex_table...
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 495332K/524288K available (6406K kernel code, 663K rwdata, 2165K rodata, 184K init, 336K bss, 20764K reserved, 8192K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[ 0.000000] plic: mapped 200 interrupts with 1 handlers for 2 contexts.
[ 0.000000] riscv_timer_init_dt: Registering clocksource cpuid [0] hartid [0]
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000006] sched_clock: 64 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.000022] riscv_timer_clockevent depends on broadcast, but no broadcast function available
[ 0.000311] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[ 0.000911] Console: colour dummy device 80x25
[ 0.000948] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[ 0.000965] pid_max: default: 32768 minimum: 301
[ 0.001130] Mount-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
[ 0.001150] Mountpoint-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
[ 0.002696] ASID allocator initialised with 65536 entries
[ 0.002847] rcu: Hierarchical SRCU implementation.
[ 0.003453] devtmpfs: initialized
[ 0.016485] random: get_random_u32 called from bucket_table_alloc.isra.31 0x4e/0x15e with crng_init=0
[ 0.017399] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.017429] futex hash table entries: 256 (order: 0, 6144 bytes, linear)
[ 0.017813] pinctrl core: initialized pinctrl subsystem
[ 0.019052] NET: Registered protocol family 16
[ 0.020928] DMA: preallocated 256 KiB pool for atomic allocations
[ 0.021517] cpuidle: using governor menu
[ 0.063906] rtc_ccu: sunxi ccu init OK
[ 0.072980] clock: sunxi ccu init OK
[ 0.073776] clock: sunxi ccu init OK
[ 0.102457] iommu: Default domain type: Translated
[ 0.102628] sunxi iommu: irq = 4
[ 0.103675] SCSI subsystem initialized
[ 0.103996] usbcore: registered new interface driver usbfs
[ 0.104089] usbcore: registered new interface driver hub
[ 0.104190] usbcore: registered new device driver usb
[ 0.104349] mc: Linux media interface: v0.10
[ 0.104405] videodev: Linux video capture interface: v2.00
[ 0.105459] sunxi-msgbox-amp 3003000.msgbox: invalid resource
[ 0.106252] Advanced Linux Sound Architecture Driver Initialized.
[ 0.106819] Bluetooth: Core ver 2.22
[ 0.106894] NET: Registered protocol family 31
[ 0.106905] Bluetooth: HCI device and connection manager initialized
[ 0.106926] Bluetooth: HCI socket layer initialized
[ 0.106940] Bluetooth: L2CAP socket layer initialized
[ 0.106974] Bluetooth: SCO socket layer initialized
[ 0.107245] pwm module init!
[ 0.108757] g2d 5410000.g2d: Adding to iommu group 0
[ 0.109209] G2D: rcq version initialized.major:250
[ 0.109863] input: sunxi-keyboard as /devices/virtual/input/input0
[ 0.111373] clocksource: Switched to clocksource riscv_clocksource
[ 0.123010] sun8iw20-pinctrl 2000000.pinctrl: initialized sunXi PIO driver
[ 0.137891] thermal_sys: Registered thermal governor 'user_space'
[ 0.137897] thermal_sys: Registered thermal governor 'power_allocator'
[ 0.138388] NET: Registered protocol family 2
[ 0.139140] tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes, linear)
[ 0.139182] TCP established hash table entries: 4096 (order: 3, 32768 bytes, linear)
[ 0.139241] TCP bind hash table entries: 4096 (order: 3, 32768 bytes, linear)
[ 0.139288] TCP: Hash tables configured (established 4096 bind 4096)
[ 0.139422] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[ 0.139460] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[ 0.139672] NET: Registered protocol family 1
[ 0.140824] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pc not found, using dummy regulator
[ 0.141366] spi spi0: spi0 supply spi not found, using dummy regulator
[ 0.141679] sunxi_spi_resource_get()2151 - [spi0] SPI MASTER MODE
[ 0.141740] sunxi_spi_resource_get()2189 - Failed to get sample mode
[ 0.141752] sunxi_spi_resource_get()2194 - Failed to get sample delay
[ 0.141762] sunxi_spi_resource_get()2198 - sample_mode:-1431633921 sample_delay:-1431633921
[ 0.141818] sunxi_spi_clk_init()2240 - [spi0] mclk 100000000
[ 0.142463] sunxi_spi_probe()2653 - [spi0]: driver probe succeed, base ffffffd004060000, irq 31
[ 0.144302] Initialise system trusted keyrings
[ 0.144493] workingset: timestamp_bits=62 max_order=17 bucket_order=0
[ 0.151060] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.170468] Key type asymmetric registered
[ 0.170482] Asymmetric key parser 'x509' registered
[ 0.170504] io scheduler mq-deadline registered
[ 0.170512] io scheduler kyber registered
[ 0.170531] atomic64_test: passed
[ 0.171741] [DISP]disp_module_init
[ 0.172287] disp 5000000.disp: Adding to iommu group 0
[ 0.172892] [DISP] disp_init,line:2386:
[ 0.172898] smooth display screen:0 type:1 mode:4
[ 0.207628] lcd_cfg_panel_info
[ 0.207639] tft08006
[ 0.207682] display_fb_request,fb_id:0
[ 0.223221] Freeing logo buffer memory: 1500K
[ 0.223650] disp_al_manager_apply ouput_type:1
[ 0.223794] [DISP] lcd_clk_config,line:732:
[ 0.223807] disp 0, clk: pll(300000000),clk(300000000),dclk(25000000) dsi_rate(25000000)
[ 0.223807] clk real:pll(300000000),clk(300000000),dclk(75000000) dsi_rate(150000000)
[ 0.224184] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pb not found, using dummy regulator
[ 0.224891] [DISP]disp_module_init finish
[ 0.225740] sunxi_sid_init()551 - insmod ok
[ 0.226103] pwm-regulator vdd-cpu: Failed to get PWM: -16
[ 0.226131] pwm-regulator: probe of vdd-cpu failed with error -16
[ 0.232818] uart uart0: get regulator failed
[ 0.232846] uart uart0: uart0 supply uart not found, using dummy regulator
[ 0.233177] uart0: ttyS0 at MMIO 0x2500000 (irq = 18, base_baud = 1500000) is a SUNXI
[ 0.233202] sw_console_setup()1808 - console setup baud 115200 parity n bits 8, flow n
[ 1.063245] printk: console [ttyS0] enabled
[ 1.068808] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pg not found, using dummy regulator
[ 1.080225] uart uart1: get regulator failed
[ 1.085090] uart uart1: uart1 supply uart not found, using dummy regulator
[ 1.093121] uart1: ttyS1 at MMIO 0x2500400 (irq = 19, base_baud = 1500000) is a SUNXI
[ 1.102998] misc dump reg init
[ 1.107246] sunxi-rfkill soc@3000000:rfkill@0: module version: v1.0.9
[ 1.114493] sunxi-rfkill soc@3000000:rfkill@0: get gpio chip_en failed
[ 1.121855] sunxi-rfkill soc@3000000:rfkill@0: get gpio power_en failed
[ 1.129242] sunxi-rfkill soc@3000000:rfkill@0: wlan_busnum (1)
[ 1.135805] sunxi-rfkill soc@3000000:rfkill@0: Missing wlan_power.
[ 1.142741] sunxi-rfkill soc@3000000:rfkill@0: wlan clock[0] (32k-fanout1)
[ 1.150439] sunxi-rfkill soc@3000000:rfkill@0: wlan_regon gpio=44 assert=1
[ 1.158229] sunxi-rfkill soc@3000000:rfkill@0: wlan_hostwake gpio=202 assert=1
[ 1.166360] sunxi-rfkill soc@3000000:rfkill@0: wakeup source is enabled
[ 1.174043] sunxi-rfkill soc@3000000:rfkill@0: Missing bt_power.
[ 1.180762] sunxi-rfkill soc@3000000:rfkill@0: bt clock[0] (32k-fanout1)
[ 1.188353] sunxi-rfkill soc@3000000:rfkill@0: bt_rst gpio=210 assert=0
[ 1.196514] [ADDR_MGT] addr_mgt_probe: module version: v1.0.10
[ 1.204188] [ADDR_MGT] addr_mgt_probe: success.
[ 1.210142] sunxi-spinand: AW SPINand MTD Layer Version: 2.0 20201228
[ 1.217408] sunxi-spinand-phy: AW SPINand Phy Layer Version: 1.10 20200306
[ 1.225321] sunxi-spinand-phy: not detect any munufacture from id table
[ 1.232764] sunxi-spinand-phy: get spi-nand Model from fdt fail
[ 1.239385] sunxi-spinand-phy: get phy info from fdt fail
[ 1.245430] sunxi-spinand-phy: not detect munufacture from fdt
[ 1.252110] sunxi-spinand-phy: detect munufacture from id table: Winbond
[ 1.259604] sunxi-spinand-phy: detect spinand id: ff21aaef ffffffff
[ 1.266615] sunxi-spinand-phy: ========== arch info ==========
[ 1.273167] sunxi-spinand-phy: Model: W25N01GVZEIG
[ 1.279863] sunxi-spinand-phy: Munufacture: Winbond
[ 1.286095] sunxi-spinand-phy: DieCntPerChip: 1
[ 1.291772] sunxi-spinand-phy: BlkCntPerDie: 1024
[ 1.297690] sunxi-spinand-phy: PageCntPerBlk: 64
[ 1.303437] sunxi-spinand-phy: SectCntPerPage: 4
[ 1.309081] sunxi-spinand-phy: OobSizePerPage: 64
[ 1.314831] sunxi-spinand-phy: BadBlockFlag: 0x0
[ 1.320652] sunxi-spinand-phy: OperationOpt: 0x7
[ 1.326520] sunxi-spinand-phy: MaxEraseTimes: 65000
[ 1.332562] sunxi-spinand-phy: EccFlag: 0x0
[ 1.338384] sunxi-spinand-phy: EccType: 2
[ 1.344058] sunxi-spinand-phy: EccProtectedType: 3
[ 1.349687] sunxi-spinand-phy: ========================================
[ 1.357131] sunxi-spinand-phy:
[ 1.360631] sunxi-spinand-phy: ========== physical info ==========
[ 1.367541] sunxi-spinand-phy: TotalSize: 128 M
[ 1.372899] sunxi-spinand-phy: SectorSize: 512 B
[ 1.378254] sunxi-spinand-phy: PageSize: 2 K
[ 1.383422] sunxi-spinand-phy: BlockSize: 128 K
[ 1.388757] sunxi-spinand-phy: OOBSize: 64 B
[ 1.394044] sunxi-spinand-phy: ========================================
[ 1.401440] sunxi-spinand-phy:
[ 1.404936] sunxi-spinand-phy: ========== logical info ==========
[ 1.411772] sunxi-spinand-phy: TotalSize: 128 M
[ 1.417111] sunxi-spinand-phy: SectorSize: 512 B
[ 1.422472] sunxi-spinand-phy: PageSize: 4 K
[ 1.427631] sunxi-spinand-phy: BlockSize: 256 K
[ 1.432992] sunxi-spinand-phy: OOBSize: 128 B
[ 1.438329] sunxi-spinand-phy: ========================================
[ 1.445863] sunxi-spinand-phy: block lock register: 0x00
[ 1.451967] sunxi-spinand-phy: feature register: 0x19
[ 1.457605] sunxi-spinand-phy: sunxi physic nand init end
[ 1.464272] Creating 4 MTD partitions on "sunxi_mtd_nand":
[ 1.470399] 0x000000000000-0x000000100000 : "boot0"
[ 1.482551] 0x000000100000-0x000000500000 : "uboot"
[ 1.490925] random: fast init done
[ 1.512572] 0x000000500000-0x000000600000 : "secure_storage"
[ 1.532519] 0x000000600000-0x000008000000 : "sys"
[ 1.733115] libphy: Fixed MDIO Bus: probed
[ 1.737689] CAN device driver interface
[ 1.743097] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pe not found, using dummy regulator
[ 1.754440] sunxi gmac driver's version: 1.0.0
[ 1.759554] gmac-power0: NULL
[ 1.762911] gmac-power1: NULL
[ 1.766216] gmac-power2: NULL
[ 1.770656] Failed to alloc md5
[ 1.774250] eth0: Use random mac address
[ 1.778955] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 1.786363] sunxi-ehci: EHCI SUNXI driver
[ 1.791357] get ehci1-controller wakeup-source is fail.
[ 1.797379] sunxi ehci1-controller don't init wakeup source
[ 1.803712] [sunxi-ehci1]: probe, pdev->name: 4200000.ehci1-controller, sunxi_ehci: 0xffffffe000962758, 0x:ffffffd00407c000, irq_no:31
[ 1.817272] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply drvvbus not found, using dummy regulator
[ 1.829857] sunxi-ehci 4200000.ehci1-controller: 4200000.ehci1-controller supply hci not found, using dummy regulator
[ 1.842114] sunxi-ehci 4200000.ehci1-controller: EHCI Host Controller
[ 1.849334] sunxi-ehci 4200000.ehci1-controller: new USB bus registered, assigned bus number 1
[ 1.859202] sunxi-ehci 4200000.ehci1-controller: irq 49, io mem 0x04200000
[ 1.891419] sunxi-ehci 4200000.ehci1-controller: USB 2.0 started, EHCI 1.00
[ 1.899192] sunxi-ehci 4200000.ehci1-controller: ehci_irq: highspeed device connect
[ 1.908691] hub 1-0:1.0: USB hub found
[ 1.913001] hub 1-0:1.0: 1 port detected
[ 1.918153] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 1.925184] sunxi-ohci: OHCI SUNXI driver
[ 1.930181] get ohci1-controller wakeup-source is fail.
[ 1.936194] sunxi ohci1-controller don't init wakeup source
[ 1.942496] [sunxi-ohci1]: probe, pdev->name: 4200400.ohci1-controller, sunxi_ohci: 0xffffffe0009632b0
[ 1.952932] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply drvvbus not found, using dummy regulator
[ 1.965478] sunxi-ohci 4200400.ohci1-controller: 4200400.ohci1-controller supply hci not found, using dummy regulator
[ 1.977718] sunxi-ohci 4200400.ohci1-controller: OHCI Host Controller
[ 1.984975] sunxi-ohci 4200400.ohci1-controller: new USB bus registered, assigned bus number 2
[ 1.994798] sunxi-ohci 4200400.ohci1-controller: irq 50, io mem 0x04200400
[ 2.076326] hub 2-0:1.0: USB hub found
[ 2.080570] hub 2-0:1.0: 1 port detected
[ 2.086001] usbcore: registered new interface driver uas
[ 2.092203] usbcore: registered new interface driver usb-storage
[ 2.098963] usbcore: registered new interface driver ums-alauda
[ 2.105710] usbcore: registered new interface driver ums-cypress
[ 2.112568] usbcore: registered new interface driver ums-datafab
[ 2.119327] usbcore: registered new interface driver ums_eneub6250
[ 2.126371] usbcore: registered new interface driver ums-freecom
[ 2.133353] usbcore: registered new interface driver ums-isd200
[ 2.140017] usbcore: registered new interface driver ums-jumpshot
[ 2.146979] usbcore: registered new interface driver ums-karma
[ 2.153601] usbcore: registered new interface driver ums-onetouch
[ 2.160510] usbcore: registered new interface driver ums-realtek
[ 2.167326] usbcore: registered new interface driver ums-sddr09
[ 2.174035] usbcore: registered new interface driver ums-sddr55
[ 2.180740] usbcore: registered new interface driver ums-usbat
[ 2.187931] sunxi_gpadc_init,2151, success
[ 2.194794] sunxi-rtc 7090000.rtc: registered as rtc0
[ 2.200543] sunxi-rtc 7090000.rtc: setting system clock to 1970-01-01T00:01:19 UTC (79)
[ 2.209577] sunxi-rtc 7090000.rtc: sunxi rtc probed
[ 2.215667] i2c /dev entries driver
[ 2.219651] IR NEC protocol handler initialized
[ 2.225143] sunxi-rc-recv 7040000.s_cir: sunxi_irrx_resource_get: get ir protocol failed
[ 2.234350] Registered IR keymap rc_map_sunxi
[ 2.239323] rc rc0: sunxi-ir as /devices/platform/soc@3000000/7040000.s_cir/rc/rc0
[ 2.248053] rc rc0: lirc_dev: driver sunxi-rc-recv registered at minor = 0, raw IR receiver, no transmitter
[ 2.259150] input: sunxi-ir as /devices/platform/soc@3000000/7040000.s_cir/rc/rc0/s_cir_rx
[ 2.269480] sunxi cedar version 1.1
[ 2.273701] sunxi-cedar 1c0e000.ve: Adding to iommu group 0
[ 2.279972] VE: install start!!!
[ 2.279972]
[ 2.285283] usb 1-1: new high-speed USB device number 2 using sunxi-ehci
[ 2.293018] VE: cedar-ve the get irq is 6
[ 2.293018]
[ 2.299387] VE: ve_debug_proc_info:(____ptrval____), data:(____ptrval____), lock:(____ptrval____)
[ 2.299387]
[ 2.311028] VE: install end!!!
[ 2.311028]
[ 2.316213] VE: sunxi_cedar_probe
[ 2.321557] sunxi-wdt 6011000.watchdog: Watchdog enabled (timeout=16 sec, nowayout=0)
[ 2.330746] Bluetooth: HCI UART driver ver 2.3
[ 2.335744] Bluetooth: HCI UART protocol H4 registered
[ 2.341500] Bluetooth: HCI UART protocol BCSP registered
[ 2.347428] Bluetooth: XRadio Bluetooth LPM Mode Driver Ver 1.0.10
[ 2.354736] [XR_BT_LPM] bluesleep_probe: bt_wake polarity: 1
[ 2.361079] sun8iw20-pinctrl 2000000.pinctrl: pin PG16 already requested by 7040000.s_cir; cannot claim for 2000000.pinctrl:208
[ 2.373967] sun8iw20-pinctrl 2000000.pinctrl: pin-208 (2000000.pinctrl:208) status -22
[ 2.382857] Bluetooth: can't request bt_wake gpio 208
[ 2.388510] sunxi-btlpm: probe of soc@3000000:btlpm@0 failed with error -22
[ 2.398188] sunxi-mmc 4021000.sdmmc: SD/MMC/SDIO Host Controller Driver(v4.21 2021-11-18 10:02)
[ 2.408192] sunxi-mmc 4021000.sdmmc: ***ctl-spec-caps*** 8
[ 2.414407] sunxi-mmc 4021000.sdmmc: No vmmc regulator found
[ 2.420743] sunxi-mmc 4021000.sdmmc: No vqmmc regulator found
[ 2.427178] sunxi-mmc 4021000.sdmmc: No vdmmc regulator found
[ 2.433642] sunxi-mmc 4021000.sdmmc: No vd33sw regulator found
[ 2.440147] sunxi-mmc 4021000.sdmmc: No vd18sw regulator found
[ 2.446673] sunxi-mmc 4021000.sdmmc: No vq33sw regulator found
[ 2.453229] sunxi-mmc 4021000.sdmmc: No vq18sw regulator found
[ 2.459759] sunxi-mmc 4021000.sdmmc: Cann't get pin bias hs pinstate,check if needed
[ 2.469497] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 2.480638] sunxi-mmc 4021000.sdmmc: no vqmmc,Check if there is regulator
[ 2.500857] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 2.514064] hub 1-1:1.0: USB hub found
[ 2.518457] hub 1-1:1.0: 4 ports detected
[ 2.523012] sunxi-mmc 4021000.sdmmc: detmode:manually by software
[ 2.530756] sunxi_led_probe()1749 - start
[ 2.535386] sunxi_get_str_of_property()1595 - failed to get the string of propname led_regulator!
[ 2.545326] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 52, RTO !!
[ 2.552447] sunxi_register_led_classdev()1483 - led_classdev start
[ 2.559374] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 52, RTO !!
[ 2.566267] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 2.583233] sunxi_led_probe()1845 - finish
[ 2.588435] usbcore: registered new interface driver usbhid
[ 2.594848] usbhid: USB HID core driver
[ 2.599290] rpmsg_client_dsp_standby 3003000.msgbox.sunxi,dsp-power-msgbox.512.256: new channel: 0x200 -> 0x100!
[ 2.612043] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 2.624365] usbcore: registered new interface driver snd-usb-audio
[ 2.633914] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pd not found, using dummy regulator
[ 2.646314] sunxi-daudio 2034000.daudio: regulator missing or invalid
[ 2.653570] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 5, RTO !!
[ 2.661171] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 5, RTO !!
[ 2.668032] [AUDIOCODEC][sunxi_codec_parse_params][2412]:digital_vol:0, lineout_vol:26, mic1gain:19, mic2gain:19 pa_msleep:120, pa_level:1, pa_pwr_level:1
[ 2.668032]
[ 2.685111] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 5, RTO !!
[ 2.692007] [AUDIOCODEC][sunxi_codec_parse_params][2448]:adcdrc_cfg:0, adchpf_cfg:1, dacdrc_cfg:0, dachpf:0
[ 2.702900] sunxi-mmc 4021000.sdmmc: smc 0 p1 err, cmd 5, RTO !!
[ 2.709697] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt B
[ 2.721345] [AUDIOCODEC][sunxi_internal_codec_probe][2609]:codec probe finished
[ 2.731246] sid_rd_ver_reg()254 - ver >= 4, soc ver:5
[ 2.737112] debugfs: Directory '203034c.dummy_cpudai' with parent 'audiocodec' already present!
[ 2.746939] [SNDCODEC][sunxi_card_init][583]:card init finished
[ 2.755719] sunxi-codec-machine 2030340.sound: 2030000.codec <-> 203034c.dummy_cpudai mapping ok
[ 2.772435] input: audiocodec sunxi Audio Jack as /devices/platform/soc@3000000/2030340.sound/sound/card0/input2
[ 2.784506] [SNDCODEC][sunxi_card_dev_probe][836]:register card finished
[ 2.792794] sunxi-rpaf-dsp soc@3000000:rpaf-dsp@203034c: register device finished!
[ 2.801241] sunxi-rpaf-dsp soc@3000000:rpaf-dsp@203034c: [rpaf_dsp0] probe finished!
[ 2.810335] rpmsg_hifi 3003000.msgbox.sunxi,dsp-msgbox.514.258: id:sunxi,dsp-msgbox new channel: 0x202 -> 0x102!
[ 2.821878] rpmsg_hifi 3003000.msgbox.sunxi,dsp-msgbox.514.258: rpmsg hifi[0] client driver is probed
[ 2.833780] NET: Registered protocol family 10
[ 2.840125] Segment Routing with IPv6
[ 2.844515] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[ 2.851953] NET: Registered protocol family 17
[ 2.856969] can: controller area network core (rev 20170425 abi 9)
[ 2.864076] NET: Registered protocol family 29
[ 2.869041] can: raw protocol (rev 20170425)
[ 2.873834] can: broadcast manager protocol (rev 20170425 t)
[ 2.880177] can: netlink gateway (rev 20190810) max_hops=1
[ 2.886609] Bluetooth: RFCOMM TTY layer initialized
[ 2.892153] Bluetooth: RFCOMM socket layer initialized
[ 2.897933] Bluetooth: RFCOMM ver 1.11
[ 2.903168] Loading compiled-in X.509 certificates
[ 2.910707] HDMI 2.0 driver init start!
[ 2.915106] boot_hdmi=false
[ 2.918286] ERROR: pinctrl_get for HDMI2.0 DDC fail
[ 2.925306] HDMI2.0 module init end
[ 2.954998] sunxi-i2c sunxi-i2c2: sunxi-i2c2 supply twi not found, using dummy regulator
[ 2.971010] input: fts_ts as /devices/platform/soc@3000000/sunxi-i2c2/i2c-2/2-0038/input/input3
[ 2.981200] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 2.989304] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.021548] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.029148] fts_ts 2-0038: 2-0038 supply not found, using dummy regulator
[ 3.037167] fts_ts 2-0038: 2-0038 supply not found, using dummy regulator
[ 3.044906] debugfs: Directory '2-0038-' with parent 'reg-dummy-regulator-dummy' already present!
[ 3.311557] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.319656] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.361531] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.369612] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.411552] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.419649] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.461544] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.469640] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.511551] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.519649] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.561531] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.569612] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.611550] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.619666] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.661526] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.669625] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.711554] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.719668] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.761527] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.769624] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.811540] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.819636] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.861534] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.869633] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.911566] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.919683] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 3.961530] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 3.969609] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 4.011554] sunxi-i2c sunxi-i2c2: SLA W has been transmitted; ACK not received
[ 4.019653] sunxi-i2c sunxi-i2c2: engine-mode: xfer failed(dev addr:0x38)
[ 4.061677] sunxi-i2c sunxi-i2c2: probe success
[ 4.070880] debugfs: Directory '2031000.dmic' with parent 'snddmic' already present!
[ 4.081098] sunxi-audio-card 2031060.sounddmic: dmic-hifi <-> 2031000.dmic mapping ok
[ 4.091101] get ehci0-controller wakeup-source is fail.
[ 4.097104] sunxi ehci0-controller don't init wakeup source
[ 4.103362] [sunxi-ehci0]: probe, pdev->name: 4101000.ehci0-controller, sunxi_ehci: 0xffffffe000962390, 0x:ffffffd004bca000, irq_no:2e
[ 4.116915] [sunxi-ehci0]: Not init ehci0
[ 4.121874] get ohci0-controller wakeup-source is fail.
[ 4.127836] sunxi ohci0-controller don't init wakeup source
[ 4.134116] [sunxi-ohci0]: probe, pdev->name: 4101400.ohci0-controller, sunxi_ohci: 0xffffffe000962ee8
[ 4.144554] [sunxi-ohci0]: Not init ohci0
[ 4.149457] ubi0: attaching mtd3
[ 4.489346] random: crng init done
[ 4.547059] ubi0: scanning is finished
[ 4.562100] ubi0 warning: ubi_eba_init: cannot reserve enough PEBs for bad PEB handling, reserved 16, need 20
[ 4.575844] ubi0: attached mtd3 (name "sys", size 122 MiB)
[ 4.582007] ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 258048 bytes
[ 4.589699] ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 2048
[ 4.597310] ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[ 4.605131] ubi0: good PEBs: 488, bad PEBs: 0, corrupted PEBs: 0
[ 4.611868] ubi0: user volume: 10, internal volumes: 1, max. volumes count: 128
[ 4.620035] ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
[ 4.629372] ubi0: available PEBs: 0, total reserved PEBs: 488, PEBs reserved for bad PEB handling: 16
[ 4.639728] ubi0: background thread "ubi_bgt0d" started, PID 70
[ 4.648304] block ubiblock0_5: created from ubi0:5(rootfs)
[ 4.656347] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 4.667201] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 4.674859] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[ 4.684537] clk: Not disabling unused clocks
[ 4.689329] ALSA device list:
[ 4.692762] cfg80211: failed to load regulatory.db
[ 4.698177] #0: audiocodec
[ 4.701452] #1: snddmic
[ 4.704380] alloc_fd: slot 0 not NULL!
[ 4.712604] VFS: Mounted root (squashfs filesystem) readonly on device 254:0.
[ 4.724171] devtmpfs: mounted
[ 4.727648] Freeing unused kernel memory: 184K
[ 4.732686] This architecture does not have kernel memory protection.
[ 4.739896] Run /sbin/init as init process
[ 5.540788] init: Console is alive
[ 5.544987] init: - watchdog -
[ 5.548530] init: - preinit -
[ 6.806363] hdmi_hpd_sys_config_release
/dev/by-name/UDISK already format by ubifs
/dev/by-name/rootfs_data already format by ubifs
[ 6.932034] mount_root: loading kmods from internal overlay
[ 7.178600] block: attempting to load /etc/config/fstab
[ 7.207531] UBIFS (ubi0:9): Mounting in unauthenticated mode
[ 7.214373] UBIFS (ubi0:9): background thread "ubifs_bgt0_9" started, PID 117
[ 7.322289] UBIFS (ubi0:9): recovery needed
[ 7.595009] UBIFS (ubi0:9): recovery completed
[ 7.600582] UBIFS (ubi0:9): UBIFS: mounted UBI device 0, volume 9, name "UDISK"
[ 7.608856] UBIFS (ubi0:9): LEB size: 258048 bytes (252 KiB), min./max. I/O unit sizes: 4096 bytes/4096 bytes
[ 7.619967] UBIFS (ubi0:9): FS size: 53673984 bytes (51 MiB, 208 LEBs), journal size 7741440 bytes (7 MiB, 30 LEBs)
[ 7.631699] UBIFS (ubi0:9): reserved for root: 0 bytes (0 KiB)
[ 7.638207] UBIFS (ubi0:9): media format: w4/r0 (latest is w5/r0), UUID 0F597857-8DF5-4158-BE5D-801B4C610776, small LPT model
[ 7.655206] block: extroot: UUID match (root: 14aa15db-35e00f98-1674d058-b2b76b5f, overlay: 14aa15db-35e00f98-1674d058-b2b76b5f)
[ 7.678473] mount_root: switched to extroot
[ 7.698526] procd: - early -
[ 7.702102] procd: - watchdog -
[ 8.102634] procd: - watchdog -
[ 8.106465] procd: - ubus -
[ 8.110233] procd (1): /proc/128/oom_adj is deprecated, please use /proc/128/oom_score_adj instead.
[ 8.231464]
[ 8.231464] insmod_device_driver
[ 8.231464]
[ 8.238620] sunxi_usb_udc 4100000.udc-controller: 4100000.udc-controller supply udc not found, using dummy regulator
[ 8.455153] procd: - init -
Please press Enter to activate this console.
[ 9.367332] fuse: init (API version 7.31)
[ 9.652921] usbcore: registered new interface driver uvcvideo
[ 9.700342] USB Video Class driver (1.1.1)
[ 9.947238] file system registered
[ 10.136731] configfs-gadget 4100000.udc-controller: failed to start g1: -19
[ 10.584643] read descriptors
[ 10.587868] read strings
[ 10.771638] sunxi_set_cur_vol_work()397 WARN: get power supply failed
[ 10.813963] android_work: sent uevent USB_STATE=CONNECTED
[ 10.970922] sunxi_set_cur_vol_work()397 WARN: get power supply failed
[ 11.032261] configfs-gadget gadget: high-speed config #1: c
[ 11.038600] android_work: sent uevent USB_STATE=CONFIGURED
[ 11.061464] sunxi_vbus_det_work()3356 WARN: get power supply failed
[ 11.081660] android_work: sent uevent USB_STATE=DISCONNECTED
[ 11.639655] android_work: sent uevent USB_STATE=CONNECTED
[ 12.861861] ======== XRADIO WIFI OPEN ========
[ 12.876291] [XRADIO] Driver Label:XR_V02.16.85_P2P_HT40_01.31
[ 12.890370] [XRADIO] Allocated hw_priv @ 000000008a45bbe0
[ 12.911506] sunxi-rfkill soc@3000000:rfkill@0: bus_index: 1
[ 12.927757] sunxi-rfkill soc@3000000:rfkill@0: wlan power on success
[ 13.192456] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 13.203999] [XRADIO] Detect SDIO card 1
[ 13.221934] sunxi-mmc 4021000.sdmmc: no vqmmc,Check if there is regulator
[ 13.241446] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 13.267967] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 13.285285] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 13.310972] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[ 13.331938] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[ 13.356333] sunxi-mmc 4021000.sdmmc: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 4 timing SD-HS(SDR25) dt B
[ 13.379484] mmc0: new high speed SDIO card at address 0001
[ 13.398023] [SBUS] XRadio Device:sdio clk=50000000
[ 13.404845] [XRADIO] XRADIO_HW_REV 1.0 detected.
[ 13.512096] [XRADIO] xradio_update_dpllctrl: DPLL_CTRL Sync=0x01400000.
[ 13.585205] [XRADIO] Bootloader complete
[ 13.751601] [XRADIO] Firmware completed.
[ 13.762818] [WSM] Firmware Label:XR_C09.08.52.64_DBG_02.100 2GHZ HT40 Jan 3 2020 13:14:37
[ 13.791479] [XRADIO] Firmware Startup Done.
[ 13.801820] [XRADIO_WRN] enable Multi-Rx!
[ 13.821092] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 13.874500] xt_time: kernel timezone is -0000
[ 13.911779] Error: Driver 'gt9xxnew_ts' is already registered, aborting...
kmodloader done
[ 14.656076] ieee80211_do_open: vif_type=2, p2p=0, ch=3, addr=00:65:d8:1d:b6:8e
[ 14.681553] [STA] !!!xradio_vif_setup: id=0, type=2, p2p=0, addr=00:65:d8:1d:b6:8e
[ 14.712564] [AP_WRN] BSS_CHANGED_ASSOC but driver is unjoined.
[ 17.264412] libphy: 4500000.eth: probed
[ 17.268701] sunxi-gmac 4500000.eth eth0: No PHY found!
[ 17.564261] libphy: 4500000.eth: probed
[ 17.568578] sunxi-gmac 4500000.eth eth0: No PHY found!
Trying to connect to SWUpdate...
[ 17.602210] sunxi-gmac 4500000.eth eth0: phy init failed
[ 17.626982] br-lan: port 1(eth0) entered blocking state
[ 17.665325] br-lan: port 1(eth0) entered disabled state
[ 17.910180] [SNDCODEC][sunxi_card_hw_params][620]:stream_flag: 0
[ 17.924492] device eth0 entered promiscuous mode
[ 21.976053] [STA_WRN] Freq 2442 (wsm ch: 7) prev: 3.
[ 21.994314] wlan0: authenticate with 94:d9:b3:b7:c9:0a (try 1)
[ 22.007660] [STA_WRN] [HT40][xradio_join_work][bss_ht_info]:
[ 22.007660] [primary_chan :0x00000007]
[ 22.007660] [ht_param :0x0000000f]
[ 22.007660] [operation_mode:0x00000006]
[ 22.007660] [stbc_param :0x00000000]
[ 22.007660] [basic_set[0] :0x00000000]
[ 22.074197] [STA_WRN] [HT40][xradio_join_work][PhyModeCfg:0x0027]
[ 22.074197] [ModemFlags :0x00000007]
[ 22.074197] [ChWidthCfg :0x00000002]
[ 22.074197] [PriChCfg :0x00000000]
[ 22.074197] [BandCfg :0x00000000]
[ 22.074197] [STBC_Enable :0x00000000]
[ 22.074197] [PreambleCfg :0x00000000]
[ 22.074197] [SGI_Enable :0x00000000]
[ 22.074197] GF_Enable :0x00000000]
[ 22.412103] [TXRX_WRN] [RX] IF=0, No key found.
[ 22.514074] wlan0: authenticate with 94:d9:b3:b7:c9:0a (try 2)
[ 22.534240] wlan0: authenticated
[ 22.541050] wlan0: associate with 94:d9:b3:b7:c9:0a (try 1)
[ 22.606343] wlan0: RX AssocResp from 94:d9:b3:b7:c9:0a (capab=0x431 status=0 aid=8)
[ 22.629980] wlan0: associated
[ 22.639652] [AP_WRN] [STA] ASSOC HTCAP 11N 58
[ 22.654007] [AP_WRN] [HT40][xradio_bss_info_changed][ht_prot:0x0000000a][HtProtMode:0x0002][Green:0x0004]
[ 22.654455] [AP_WRN] [HT40][xradio_bss_info_changed][PhyModeCfg:0x5027]
[ 22.654455] [ModemFlags :0x00000007]
[ 22.654455] [ChWidthCfg :0x00000002]
[ 22.654455] [PriChCfg :0x00000000]
[ 22.654455] [BandCfg :0x00000000]
[ 22.654455] [STBC_Enable :0x00000000]
[ 22.654455] [PreambleCfg :0x00000001]
[ 22.654455] [SGI_Enable :0x00000001]
[ 22.654455] [GF_Enable :0x00000000]
[ 22.815551] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
BusyBox v1.27.2 () built-in shell (ash)
_____ _ __ _
|_ _||_| ___ _ _ | | |_| ___ _ _ _ _
| | _ | || | | |__ | || || | ||_'_|
| | | || | || _ | |_____||_||_|_||___||_,_|
|_| |_||_|_||_|_| Tina is Based on OpenWrt!
----------------------------------------------
Tina Linux (Neptune, 61CC0487)
----------------------------------------------
root@TinaLinux:/#
MIPI屏适配
100ASK-D1-H_DualDisplay-DevKit V11
1. 显示适配
1.1 修改设备树
1.1.1 修改内核设备树
进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4
修改board.dts
:
&lcd0 {
lcd_used = <1>;
lcd_driver_name = "tft08006";
lcd_backlight = <100>;
lcd_if = <4>;
lcd_x = <480>;
lcd_y = <800>;
lcd_width = <52>;
lcd_height = <52>;
lcd_dclk_freq = <25>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <1000>;
lcd_pwm_pol = <0>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <10>;
lcd_ht = <515>;
lcd_hspw = <5>;
lcd_vbp = <20>;
lcd_vt = <830>;
lcd_vspw = <5>;
lcd_dsi_if = <0>;
lcd_dsi_lane = <2>;
lcd_lvds_if = <0>;
lcd_lvds_colordepth = <0>;
lcd_lvds_mode = <0>;
lcd_frm = <0>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_fsync_en = <0>;
lcd_fsync_act_time = <1000>;
lcd_fsync_dis_time = <1000>;
lcd_fsync_pol = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_gpio_0 = <&pio PG 13 GPIO_ACTIVE_HIGH>;
pinctrl-0 = <&dsi4lane_pins_a>;
pinctrl-1 = <&dsi4lane_pins_b>;
};
根据原理图:
可以查看到,mipi屏的pwm通道引脚是PB5,设备树中搜索PB5,发现有I2C设备树节点占用,需要把status
位设置为disabled
:
lcd0设备树节点中的pwm通道是pwm0,即把pwm0设备树节点的引脚改为相应的PB5
引脚:
1.1.2 修改uboot设备树
进入目录:
代码语言:javascript复制/home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha
修改uboot-board.dts
:
&lcd0 {
lcd_used = <1>;
lcd_driver_name = "tft08006";
lcd_backlight = <100>;
lcd_if = <4>;
lcd_x = <480>;
lcd_y = <800>;
lcd_width = <52>;
lcd_height = <52>;
lcd_dclk_freq = <25>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <1000>;
lcd_pwm_pol = <0>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <10>;
lcd_ht = <515>;
lcd_hspw = <5>;
lcd_vbp = <20>;
lcd_vt = <830>;
lcd_vspw = <5>;
lcd_dsi_if = <0>;
lcd_dsi_lane = <2>;
lcd_lvds_if = <0>;
lcd_lvds_colordepth = <0>;
lcd_lvds_mode = <0>;
lcd_frm = <0>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_io_phase = <0x0000>;
lcd_dsi_te = <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_fsync_en = <0>;
lcd_fsync_act_time = <1000>;
lcd_fsync_dis_time = <1000>;
lcd_fsync_pol = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_gpio_0 = <&pio PG 13 GPIO_ACTIVE_HIGH>;
pinctrl-0 = <&dsi4lane_pins_a>;
pinctrl-1 = <&dsi4lane_pins_b>;
};
1.2 内核配置
修改内核驱动:
进入目录:
代码语言:javascript复制~/tina-d1-h/lichee/linux-5.4/drivers/video/fbdev/sunxi/disp2/disp/lcd
在这里100ASK_T113-PRO开发板适配4寸MIPI屏-Tina SDK - Allwinner / T113s3-PRO - 嵌入式开发问答社区可以下载到相应的驱动,替换到TinaSDK里面的tft08006.c
和tft08006.h
。
并修改如下:
执行ckernel
,进入内核配置界面:
m kernel_menuconfig
选上屏幕显示驱动TFT08006
:
选上支持显示框架驱动:
"DISP Driver Support"关乎显示驱动框架的整体启用,而"LCD panels select"则专注于在这个框架下选择和配置具体的LCD面板硬件。前者是基础支持层,后者是具体应用层。
1.3 uboot配置
修改uboot下的驱动:
进入目录:
代码语言:javascript复制~/tina-d1-h/lichee/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd
在这里100ASK_T113-PRO开发板适配4寸MIPI屏-Tina SDK - Allwinner / T113s3-PRO - 嵌入式开发问答社区可以下载到相应的驱动,替换到TinaSDK里面的tft08006.c
和tft08006.h
。
并修改如下:
执行cboot
,进入uboot配置界面:
make menuconfig
选上屏幕显示驱动:
选上支持显示框架驱动:
mipi屏幕显示需要先在uboot阶段初始化。
1.4 显示测试
为了方便测试屏幕显示,可以选上TinaSDK自带的lvgl例程。
执行croot
,进入配置界面:
make menuconfig
选上lvgl例程:
编译make
,打包pack
。
烧录到板子后,执行lv_examples 1
:
2. 触摸适配
2.1 修改内核设备树
根据原理图:
可以查看:
TP_INT→PB6;TP_RESET→PB4;DSI_SCL→PB0;DSI_SDA→PB1;
进入:
代码语言:javascript复制vi /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4/board.dts
看到PB0、PB1引脚对应的是twi2设备树节点。所以需要在twi2设备树节点中添加触摸屏设备树节点。
代码语言:javascript复制&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@38 {
compatible = "focaltech,fts";
reg = <0x38>;
status = "okay";
interrupt-parent = <&pio>;
interrupts = <PB 6 IRQ_TYPE_LEVEL_LOW>;
focaltech,reset-gpio = <&pio PB 4 GPIO_ACTIVE_HIGH>;
focaltech,irq-gpio = <&pio PB 6 IRQ_TYPE_LEVEL_LOW>;
focaltech,max-touch-number = <5>;
focaltech,display-coords = <0 0 480 800>;
focaltech,reg_vdd = <0x0000001f>;
focaltech,reg_avdd = <0x0000001f>;
};
};
如果原来有同样地址为0x38的I2C设备和触摸设备的节点时,可以注释或者删除。
2.2 添加触摸驱动
Tina_SDK自带相应的触摸驱动,只需修改内核配置,把驱动编译进系统。
执行ckernel
进入内核目录。
执行m kernel_menuconfig
,进入内核配置界面,选上Focaltech Touchscreen
:
执行croot
,进入SDK根目录,执行make menuconfig
进入配置界面,把触摸驱动模块添加进文件系统中:
2.3 修改触摸驱动
在测试过程中,发现触摸点(x,y)不对,需要修改驱动程序。
进入目录:
代码语言:javascript复制tina-d1-h/lichee/linux-5.4/drivers/input/touchscreen/focaltech_touch
修改:
代码语言:javascript复制vim focaltech_core.c
两处修改:
- 在
fts_input_dev_report_a
函数中修改,找到相应的位置:
#原来的
input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);
#修改的
input_report_abs(data->input_dev, ABS_MT_POSITION_X, -(event->au16_x[i] - 480));
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, -(event->au16_y[i] - 800));
- 在
fts_input_dev_report_b
函数中修改,找到相应的位置:
#原来的
input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);
#修改的
input_report_abs(data->input_dev, ABS_MT_POSITION_X, -(event->au16_x[i] - 480));
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, -(event->au16_y[i] - 800));
2.4 修改lvgl驱动配置文件
如果在lvgl的例程上测试触摸功能,需要进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/package/gui/littlevgl-8/lv_examples/src
修改:
代码语言:javascript复制vim lv_drv_conf.h
如果之前配置过lvgl例程,需要进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/out/d1-h-nezha/compile_dir/target
删除lv_examples
,再进行编译打包烧录。
开发板上执行lv_examples 0
,测试:
XR829芯片适配
1. 修改设备树
查看原理图:
原设备树中,WL_REG_ON
与原理图的不匹配,修改为PB12。
蓝牙的设备树节点无需修改:
与原理图引脚符合:
2. 添加内核模块
进入SDK根目录,执行:
代码语言:javascript复制make menuconfig
取消勾选xr829-40M,选上xr829。
3. 添加xr829固件
Firmware负责实现Wi-Fi和蓝牙的连接管理、数据传输、安全加密以及其他底层操作。
把xr829 with 40M sdd
取消勾选。
4. 启动odhcp6c服务
odhcp6c的核心作用在于简化并自动化IPv6网络环境下的地址配置过程,确保设备能够顺利接入并通信。
5. wifi测试
SDK根目录下,执行编译make
,打包pack
。
烧录到开发板上。
执行wifi_scan_results_test
扫描附近wifi热点:
root@TinaLinux:/# wifi_scan_results_test
*********************************
***Start scan!***
*********************************
bssid / frequency / signal level / flags / ssid
94:d9:b3:b7:c9:0a 2442 -30 [WPA-PSK-CCMP TKIP][WPA2-PSK-CCMP TKIP][ESS] Programmers
64:6e:97:5d:22:4a 2442 -67 [WPA-PSK-CCMP TKIP][WPA2-PSK-CCMP TKIP][ESS] pobo
d0:76:e7:f8:93:d8 2462 -68 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TP-LINK_93D8
9c:a6:15:3b:b9:94 2437 -69 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TP-LINK_B994
30:fc:68:4b:d7:94 2412 -70 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] 1708
f0:92:b4:a6:03:91 2452 -45 [WPA-PSK-CCMP TKIP][WPA2-PSK-CCMP TKIP][ESS] ChinaNet-kRAH
c8:50:e9:bb:f5:0a 2462 -48 [WPA-PSK-TKIP][WPA2-PSK FT/PSK-CCMP][WPS][ESS] ChinaNet-sqJr
32:95:e3:19:e8:48 2437 -62 [WPA2-PSK FT/PSK-CCMP][ESS]
30:95:e3:59:e8:48 2437 -62 [WPA2-PSK FT/PSK-CCMP][ESS] xe7xbexbdxe5x8dx92xe7xa7x91xe6x8ax80
74:69:4a:51:91:38 2417 -65 [WPA2-PSK-CCMP][ESS] 1510
34:12:f9:87:a6:49 2427 -69 [WPA2-PSK-CCMP][ESS] x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00
34:12:f9:87:a6:4d 2427 -70 [WPA2-PSK-CCMP][ESS] x00x00x00x00x00x00x00x00
******************************
Wifi get_scan_results: Success!
******************************
执行wifi_connect_ap_test
连接wifi热点:
root@TinaLinux:/# wifi_connect_ap_test Programmers 100asktech
==================================
Connecting to the network(Programmers)......
[ 2841.637787] [STA_WRN] Freq 2442 (wsm ch: 7) prev: 3.
[ 2841.643853] wlan0: authenticate with 94:d9:b3:b7:c9:0a (try 1)
[ 2841.657251] [STA_WRN] [HT40][xradio_join_work][bss_ht_info]:
[ 2841.657251] [primary_chan :0x00000007]
[ 2841.657251] [ht_param :0x0000000f]
[ 2841.657251] [operation_mode:0x00000006]
[ 2841.657251] [stbc_param :0x00000000]
[ 2841.657251] [basic_set[0] :0x00000000]
[ 2841.685173] [STA_WRN] [HT40][xradio_join_work][PhyModeCfg:0x0027]
[ 2841.685173] [ModemFlags :0x00000007]
[ 2841.685173] [ChWidthCfg :0x00000002]
[ 2841.685173] [PriChCfg :0x00000000]
[ 2841.685173] [BandCfg :0x00000000]
[ 2841.685173] [STBC_Enable :0x00000000]
[ 2841.685173] [PreambleCfg :0x00000000]
[ 2841.685173] [SGI_Enable :0x00000000]
[ 2841.685173] GF_Enable :0x00000000]
[ 2841.748294] wlan0: authenticated
[ 2841.752631] wlan0: associate with 94:d9:b3:b7:c9:0a (try 1)
[ 2841.806522] wlan0: RX AssocResp from 94:d9:b3:b7:c9:0a (capab=0x431 status=0 aid=5)
[ 2841.815277] wlan0: associated
[ 2841.824201] [AP_WRN] [STA] ASSOC HTCAP 11N 58
[ 2841.829535] [AP_WRN] [HT40][xradio_bss_info_changed][ht_prot:0x0000000a][HtProtMode:0x0002][Green:0x0004]
[ 2841.829952] [AP_WRN] [HT40][xradio_bss_info_changed][PhyModeCfg:0x5027]
[ 2841.829952] [ModemFlags :0x00000007]
[ 2841.829952] [ChWidthCfg :0x00000002]
[ 2841.829952] [PriChCfg :0x00000000]
[ 2841.829952] [BandCfg :0x00000000]
[ 2841.829952] [STBC_Enable :0x00000000]
[ 2841.829952] [PreambleCfg :0x00000001]
[ 2841.829952] [SGI_Enable :0x00000001]
[ 2841.829952] [GF_Enable :0x00000000]
[ 2841.922603] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Connected to the AP(Programmers)
Getting ip address(Programmers)......
[ 2842.217245] [TXRX_WRN] drop=1771, fctl=0x00d0.
Wifi connect ap : Success!
==================================
ifconfig
,查看是否分配ip地址:
root@TinaLinux:/# ifconfig
br-lan Link encap:Ethernet HWaddr 12:94:C8:33:1D:27
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fd93:2460:b4ec::1/60 Scope:Global
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:11280 errors:0 dropped:0 overruns:0 frame:0
TX packets:11280 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:879840 (859.2 KiB) TX bytes:879840 (859.2 KiB)
wlan0 Link encap:Ethernet HWaddr 00:65:D8:1D:B6:8E
inet addr:192.168.0.126 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::265:d8ff:fe1d:b68e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:333 errors:0 dropped:0 overruns:0 frame:0
TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33951 (33.1 KiB) TX bytes:4894 (4.7 KiB)
root@TinaLinux:/# ping www.baidu.com
PING www.baidu.com (183.2.172.42): 56 data bytes
64 bytes from 183.2.172.42: seq=0 ttl=52 time=8.906 ms
64 bytes from 183.2.172.42: seq=1 ttl=52 time=17.209 ms
64 bytes from 183.2.172.42: seq=2 ttl=52 time=18.982 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 8.906/15.032/18.982 ms
root@TinaLinux:/#
执行wifi_disconnect_ap_test
,断开wifi热点。
6. 蓝牙测试
6.1 蓝牙通话HFP
蓝牙HFP(Hands-Free Profile)是一种蓝牙配置文件,它允许用户通过蓝牙设备进行免提通话。HFP的实现通常建立在RFCOMM协议之上,并定义了音频网关(AG)和免提设备(HF)之间的通信方式,使用AT指令进行控制和状态信息的交换。
在开发板中,执行bt_test -i
,打开蓝牙电源、D1-H开发板和控制器XR829的数据传输通道HCI进入交互模式:
root@TinaLinux:/# bt_test -i
1719041879.566378: BTMG[bt_manager_set_enable_default:513]: enable default profile from bt config.
1719041879.566644: BTMG[bt_manager_enable:407]: bt manager version:Version:3.0.1.202110291544,builed time:Oct 29 2021-09:42:35
1719041879.566692: BTMG[bt_test_status_cb:82]: bt is turnning on.
[13383.789836] sunxi-rfkill soc@3000000:rfkill@0: block state already is 1
[13383.817822] sunxi-rfkill soc@3000000:rfkill@0: set block: 0
[13383.834060] sunxi-rfkill soc@3000000:rfkill@0: bt power on success
1719041885.082395: BTMG[bt_profile_global_init:355]: start bluealsa :1 times
1719041885.752543: BTMG[bt_test_adapter_power_state_cb:47]: Turn on bt successfully
1719041886.086287: BTMG[bt_test_status_cb:67]: BT is ON
[bt]#
打开手机,连接上蓝牙:
终端上输入hfp_dial 10086
,即可控制手机拨打10086:
[bt]#hfp_dial 10086
[bt]#bluealsa: Unsupported AT message: RESP: command:, value:OK
1719042215.140614: BTMG[bt_test_hfp_event_cb:423]: event HFP_OK
1719042215.244263: BTMG[bt_test_hfp_event_cb:423]: event HFP_CIEV
1719042215.245588: [rfcomm_bcs_resp_cb:225]:
1719042215.245640: BTMG[bt_test_hfp_event_cb:423]: event HFP_BCS
bluealsa: setsockopt BT_VOICE error 22, Invalid argument
1719042215.275556: BTMG[bt_test_hfp_event_cb:423]: event HFP_OK
bluealsa: SCO connection created by peer
1719042215.309518: [bt_hfp_hf_pcm_start:452]: enter
1719042215.309568: [aw_pcm_tansport_start:245]: enter,id:0
1719042215.309591: [aw_pcm_tansport_start:251[13719.425633] [SNDCODEC][sunxi_card_hw_params][620]:stream_flag: 1
]: device:hw:snddaudio1,default;chanels:1,sampling:16000
1719042215.309618: [aw_pcm_tansport_start:253]: hfp worker address:0x3fb8b9f658
1719042215.309797: [aw_pcm_tansport_start:245]: enter,id:1
1719042215.309841: [aw_pcm_tansport_start:251]: device:CaptureMic,hw:snddaudio1;chanels:1,sampling:16000
1719042215.309867: [aw_pcm_tansport_start:253]: hfp worker address:0x3fb8b9f680
1719042215.310315: [aw_pcm_transport_runtine:194]: enter,id:1
1719042215.310470: [aw_pcm_transport_runtine:208]: opening read pcm ......
1719042215.311252: [aw_pcm_transport_runtine:194]: enter,id:0
1719042215.311445: [aw_pcm_transport_runtine:208]: opening read pcm ......
ALSA lib pcm_hw.c:1713:(_snd_pcm_hw_open) Invalid value for card
1719042215.334374: BTMG[aw_pcm_open:400]: --->Couldn't open PCM:hw:snddaudio1
1719042215.334409: [aw_pcm_transport_runtine:210]: open read pcm failed
1719042215.334436: [aw_pcm_tansport_routine_device_free:169]: enter,id:0
1719042215.334459: [aw_pcm_tansport_routine_device_free:183]: quit,id:0
1719042215.334483: [aw_pcm_tansport_routine_data_free:157]: enter
1719042215.334505: [aw_pcm_tansport_routine_data_free:162]: quit
1719042215.338041: [aw_pcm_transport_runtine:214]: opening write pcm ......
ALSA lib pcm_hw.c:1713:(_snd_pcm_hw_open) Invalid value for card
1719042215.341763: BTMG[aw_pcm_open:400]: --->Couldn't open PCM:hw:snddaudio1
1719042215.341801: [aw_pcm_transport_runtine:216]: open write pcm failed
1719042215.341827: [aw_pcm_tansport_routine_device_free:169]: enter,id:1
1719042215.342343: [aw_pcm_tansport_routine_device_free:183]: quit,id:1
1719042215.342396: [aw_pcm_tansport_routine_data_free:157]: enter
1719042215.342420: [aw_pcm_tansport_routine_data_free:162]: quit
1719042216.014303: BTMG[bt_test_hfp_event_cb:423]: event HFP_CIEV
结果如下:
还有其他的一些操作:
代码语言:javascript复制来电接听:hfp_answer
来电拒绝:hfp_hangup
样机拨打上一个电话:hfp_last_num
样机获取手机:hfp_cnum
6.2 蓝牙音频A2DP
蓝牙音频A2DP(Advanced Audio Distribution Profile)区别于HFP的另一种蓝牙配置文件,主要用于音乐播放和其他音频流应用,它提供了一种从音频源设备(如智能手机、平板电脑或笔记本电脑)到音频接收设备(如蓝牙耳机、扬声器或车载音频系统)的音频传输机制。
A2DP定义了两种主要角色:Source(源)和Sink(接收器)。
6.2.1 Source
Source设备是数字音频流的发起者,它负责将音频数据编码并通过蓝牙发送给一个或多个Sink设备。
开发板中,执行bt_test -i -p a2dp-source
,打开Source模式并进入交互模式:
root@TinaLinux:/# bt_test -i -p a2dp-source
1719044146.397706: BTMG[bt_manager_enable:407]: bt manager version:Version:3.0.1.202110291544,builed time:Oct 29 2021-09:42:35
1719044146.398009: BTMG[bt_test_status_cb:82]: bt is turnning on.
[15650.616385] sunxi-rfkill soc@3000000:rfkill@0: set block: 1
[15650.622614] sunxi-rfkill soc@3000000:rfkill@0: bt power off success
[15650.650590] sunxi-rfkill soc@3000000:rfkill@0: set block: 0
[15650.666950] sunxi-rfkill soc@3000000:rfkill@0: bt power on success
1719044150.730524: BTMG[bt_profile_global_init:355]: start bluealsa :1 times
1719044151.289084: BTMG[bt_test_adapter_power_state_cb:47]: Turn on bt successfully
1719044151.732365: BTMG[bt_test_status_cb:67]: BT is ON
扫描附近蓝牙设备:
scan 1
:扫描设备获取到mac地址。scan 0
:停止扫描。scan_list
:获取已经扫描到的设备。
[bt]#scan 1
[bt]#1719044547.238333: BTMG[bt_test_discovery_status_cb:91]: bt start scanning.
1719044547.238379: BTMG[btmg_gap_bluez_callback:1228]: Discovery started
1719044552.490007: BTMG[bt_test_update_rssi_cb:139]: address:90:F0:52:BA:95:7D,name:linuxrf,rssi:-57
1719044555.674164: BTMG[bt_test_update_rssi_cb:139]: address:60:AB:67:60:85:1F,name:小米手机,rssi:-67
1719044556.831551: BTMG[bt_test_update_rssi_cb:139]: address:90:F0:52:BA:95:7D,name:linuxrf,rssi:-33
1719044558.882874: BTMG[bt_test_update_rssi_cb:139]: address:90:F0:52:BA:95:7D,name:linuxrf,rssi:-58
连接蓝牙设备:
代码语言:javascript复制[bt]#connect 80:76:C2:23:D0:A9
更多的操作可以输入help
来查看:
[bt]#help
Available commands:
enable enable [0/1]: open bt or not
scan scan [0/1]: scan for devices
scan_list scan_list: list available devices
pair pair [mac]: pair with devices
unpair uppair [mac]: unpair with devices
paired_list paired_list: list paired devices
get_state get_state: get bt state
get_name get_name: get bt name
set_name set_name [name]: set bt name
remote_name remote_name: get remote device name
set_vol set_vol: set a2dp source volme
get_vol get_vol: get a2dp source volme
get_addr get_addr: get bt address
set_dis set_dis [0~2]:0-NONE,1-page scan,2-inquiry scan&page scan
set_page_to real timeout = slots * 0.625ms
set_io_cap set_io_cap [0~4]:0-keyboarddisplay, 1-displayonly,2-displayyesno,3-keyboardonly,4-noinputnooutput
avrcp avrcp [play/pause/stop/fastforward/rewind/forward/backward]: avrcp control
profile_cn profile_cn [mac]:a2dp sink connect
profile_dis profile_dis [mac]:a2dp sink disconnect
connect connect [mac]:generic method to connect
disconnect disconnect [mac]:generic method to disconnect
remove remove [mac]:removes the remote device
a2dp_src_start a2dp_src_start:start a2dp source playing
a2dp_src_stop a2dp_src_stop:stop a2dp source playing
hfp_answer hfp_answer: answer the phone
hfp_hangup hfp_hangup: hangup the phone
hfp_dial hfp_dial [num]: call to a phone number
hfp_cnum hfp_cum: Subscriber Number Information
hfp_last_num hfp_last_num: calling the last phone number dialed
hfp_vol hfp_vol [0~15]: update phone's volume.
spp_connect spp_connect dev_id dst channel
spp_send spp_send data
spp_disconnect spp_disconnect dst
get_version get_version: get btmanager version
debug debug [0~5]: set debug level
ex_dbg ex_dbg [mask]: set ex debug mask
test test : test cmd
6.2.2 Sink
Sink设备接收来自Source的音频数据,对其进行解码,并播放音频。Sink设备还可以实现远程控制功能,允许用户控制播放、音量等。
开发板中,执行bt_test -p a2dp-sink
,打开Sink模式:
root@TinaLinux:/# bt_test -p a2dp-sink
root@TinaLinux:/# 1719045265.302286: BTMG[bt_manager_enable:407]: bt manager version:Version:3.0.1.202110291544,builed time:Oct 29 2021-09:42:35
1719045265.303777: BTMG[bt_test_status_cb:82]: bt is turnning on.
[16769.554233] sunxi-rfkill soc@3000000:rfkill@0: set block: 1
[16769.562498] sunxi-rfkill soc@3000000:rfkill@0: bt power off success
[16769.590341] sunxi-rfkill soc@3000000:rfkill@0: set block: 0
[16769.606706] sunxi-rfkill soc@3000000:rfkill@0: bt power on success
1719045269.582019: BTMG[bt_profile_global_init:355]: start bluealsa :1 times
1719045270.143978: BTMG[bt_test_adapter_power_state_cb:47]: Turn on bt successfully
1719045270.585384: BTMG[bt_test_status_cb:67]: BT is ON
打开手机连接上蓝牙,播放音乐,找个耳机插上D1H开发板耳机孔,即可听到音乐。
如果想要使用扬声器的接口来播放音乐,需要做以下设置:
在SDK根目录下执行make menuconfig
,选上:
在package/libs/tinyalsa/
,执行mm -B
:
ubuntu@ubuntu1804:~/tina-d1-h/package/libs/tinyalsa$ mm -B
ubuntu@ubuntu1804:~/tina-d1-h/package/libs/tinyalsa$ cd /home/ubuntu/tina-d1-h/out/d1-h-nezha/compile_dir/target/tinyalsa-1.1.1/ipkg-install/usr/bin/
ubuntu@ubuntu1804:~/tina-d1-h/out/d1-h-nezha/compile_dir/target/tinyalsa-1.1.1/ipkg-install/usr/bin$ ls
tinycap tinymix tinypcminfo tinyplay
ubuntu@ubuntu1804:~/tina-d1-h/out/d1-h-nezha/compile_dir/target/tinyalsa-1.1.1/ipkg-install/usr/bin$ adb push ./* /usr/bin
在开发板中,可以执行以下:
代码语言:javascript复制#转换为喇叭播放:
tinymix set "LINEOUTL Output Select" 1
tinymix set "LINEOUTR Output Select" 1
#设置音量:
tinymix set "LINEOUT volume" 15
tinymix set "LINEOUT Switch" 1
即可通过扬声器接口从喇叭上播放音乐。
播放网络视频
1. 开机默认HDMI输出
网络视频将通过HDMI屏幕来显示,需要先配置HDMI输出。
修改uboot的设备树,实现开机默认HDMI显示。
进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha
修改uboot-board.dts
:
vim uboot-board.dts
修改disp节点,如下:
代码语言:javascript复制&disp {
disp_init_enable = <1>;
disp_mode = <0>;
/*
screen0_output_type = <1>;
screen0_output_mode = <4>;
screen1_output_type = <3>;
screen1_output_mode = <10>;
*/
screen0_output_type = <3>;
screen0_output_mode = <10>;
screen1_output_type = <1>;
screen1_output_mode = <4>;
/*
screen1_output_format = <0>;
screen1_output_bits = <0>;
screen1_output_eotf = <4>;
screen1_output_cs = <257>;
screen1_output_dvi_hdmi = <2>;
screen1_output_range = <2>;
screen1_output_scan = <0>;
screen1_output_aspect_ratio = <8>;
*/
screen0_output_format = <0>;
screen0_output_bits = <0>;
screen0_output_eotf = <4>;
screen0_output_cs = <257>;
screen0_output_dvi_hdmi = <2>;
screen0_output_range = <2>;
screen0_output_scan = <0>;
screen0_output_aspect_ratio = <8>;
/*
dev0_output_type = <1>;
dev0_output_mode = <4>;
dev0_screen_id = <0>;
dev0_do_hpd = <0>;
*/
dev0_output_type = <4>;
dev0_output_mode = <10>;
dev0_screen_id = <0>;
dev0_do_hpd = <1>;
//dev1_output_type = <4>;
//dev1_output_mode = <10>;
//dev1_screen_id = <1>;
//dev1_do_hpd = <1>;
def_output_dev = <0>;
hdmi_mode_check = <1>;
fb0_format = <0>;
fb0_width = <0>;
fb0_height = <0>;
fb1_format = <0>;
fb1_width = <0>;
fb1_height = <0>;
chn_cfg_mode = <1>;
disp_para_zone = <1>;
/*VCC-LCD*/
/* dc1sw-supply = <®_dc1sw>;*/
/*VCC-DSI*/
/* eldo3-supply = <®_eldo3>;*/
/*VCC-PD*/
/* dcdc1-supply = <®_dcdc1>;*/
};
在SDK根目录下,烧写make
、打包pack
和烧录。即可在HDMI屏幕上显示。
2. 使能RTSP
进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/package/allwinner
新建文件support_rtsp.patch
:
touch support_rtsp.patch
写入以下内容:
代码语言:javascript复制diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am b/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
index f33af3743..5d1aeaf0c 100755
--- a/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
b/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
@@ -72,4 72,7 @@ if PLS_PARSER_ENABLE
SUBDIRS = pls
endif
-SUBDIRS = base
No newline at end of file
SUBDIRS = remux
SUBDIRS = base
diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
index 44305f3c6..a24273fbc 100755
--- a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
@@ -50,7 50,7 @@ static struct ParserUriKeyInfoS asfKeyInfo =
};
#endif
-#if 0
#if 1
extern CdxParserCreatorT remuxParserCtor;
static struct ParserUriKeyInfoS remuxKeyInfo =
{
@@ -460,7 460,7 @@ void AwParserInit(void)
AwParserRegister(&movParserCtor, CDX_PARSER_MOV, &movKeyInfo);
#endif
-#if 0
#if 1
AwParserRegister(&remuxParserCtor, CDX_PARSER_REMUX, &remuxKeyInfo);
#endif
diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
index 9dbb73590..86174f94e 100755
--- a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
@@ -65,6 65,8 @@ libcdx_parser_la_LIBADD = $(top_srcdir)/libcore/parser/avi/libcdx_avi_parser.la
libcdx_parser_la_CFLAGS = -DAVI_PARSER_ENABLE
endif
libcdx_parser_la_LIBADD = $(top_srcdir)/libcore/parser/remux/libcdx_remux_parser.la
if TS_PARSER_ENABLE
libcdx_parser_la_LIBADD = $(top_srcdir)/libcore/parser/ts/libcdx_ts_parser.la
libcdx_parser_la_CFLAGS = -DTS_PARSER_ENABLE
用 git apply 来运行 patch 补丁:
代码语言:javascript复制git apply support_rtsp.patch
如果出现以下错误:
代码语言:javascript复制ubuntu@ubuntu1804:~/tina-d1-h/package/allwinner$ git apply support_rtsp.patch
error: patch failed: allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am:72
error: allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am: patch does not apply
error: patch failed: allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c:50
error: allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c: patch does not apply
error: patch failed: allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am:65
error: allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am: patch does not apply
ubuntu@ubuntu1804:~/tina-d1-h/package/allwinner$
大概率是被修改过了,不用再修改。
执行croot
,进入配置界面:
make menuconfig
选上以下内容:
保存、编译make
、打包pack
和烧录。这样开发板就支持rtsp拉流功能了。
3. RTSP推流
有拉流,相应的就需要有推流。要实现这些功能,首先需要一个支持rtsp流媒体协议的服务器,可以在windows下搭建一个服务器。
下载链接:Releases · bluenviron/mediamtx (github.com)
下载完成后,双击.exe
,即可运行服务器:
一般使用的是8554
这个端口。
在ubuntu上,准备一个mp4格式的视频(视频尽量一分钟左右),使用ffmpeg工具来实现推流操作:
代码语言:javascript复制ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -f rtsp rtsp://192.168.0.198:8554/input.mp4
192.168.0.198
是windows上的无线ip地址。
这时推流已经就位了,下面开始在开发板上面进行拉流的操作。
4. RTSP拉流
完成了之前的步骤后,开发板进行 RTSP 拉流就比较容易了,联网、拉流即可。
wifi配置、连接根据之前写的操作来执行。
tplayerdemo 来拉流播放:
代码语言:javascript复制操作之前需要先把windows上的防火墙关闭,确保能ping通192.168.0.198,同样也需要能ping通ubuntu的桥接ip地址。
tplayerdemo rtsp://192.168.0.198:8554/input.mp4
可以看到视频可以播放到 HDMI 的输出了,日志如下:
代码语言:javascript复制root@TinaLinux:/# tplayerdemo rtsp://192.168.0.198:8554/input.mp4
WARNING: awplayer <cdx_log_set_level:30>: cdx Set log level to 6
INFO : cedarc <CedarPluginVDInit:79>: register h264 decoder success!
INFO : cedarc <CedarPluginVDInit:84>: register mjpeg decoder success!
INFO : cedarc <CedarPluginVDInit:86>: register mpeg2 decoder success!
INFO : cedarc <CedarPluginVDInit:92>: register mpeg4dx decoder success!
INFO : cedarc <CedarPluginVDInit:79>: register mpeg4H263 decoder success!
INFO : cedarc <CedarPluginVDInit:90>: register mpeg4Normal decoder success!
INFO : cedarc <CedarPluginVDInit:74>: register vc1 decoder success!
INFO : cedarc <CedarPluginVDInit:85>: register h265 decoder success!
******************************************************************************************
* This program implements a simple player, you can type commands to control the player.
* To show what commands supported, type 'help'.
******************************************************************************************
dd: writing '/dev/fb0': No space left on device
32401 0 records in
32400 0 records out
argc = 2
argv[0] = tplayerdemo
argv[1] = rtsp://192.168.0.198:8554/input.mp4
may be is one file:cut[ 133.664339] [SNDCODEC][sunxi_card_hw_params][620]:stream_flag: 0
down suffix is:.mp4
find the matched type:.mp4
create player:0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tina_multimedia <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
tag : tina3.5
branch: tina-dev
date : Mon Jul 15 19:04:59 2019 0800
Change-Id: I5f6c8a88d7b387a312b7744797a0d5f8ab07ee7a
-------------------------------------------------------------------------------
xplayer:process message XPLAYER_COMMAND_SET_AUDIOSINK.
xplayer:process message XPLAYER_COMMAND_SET_SURFACE.
xplayer:process message XPLAYER_COMMAND_SET_SUBCTRL.
xplayer:process message XPLAYER_COMMAND_SET_DI.
create player[0]:0x34a2a3d0
screen width:1920,screen height:1080
1:playVideo:0
before TPlayerSetDataSource,94712:rtsp://192.168.0.198:8554/input.mp4
xplayer:process message XPLAYER_COMMAND_SET_SOURCE.
setDataSource end
xplayer:process message XPLAYER_COMMAND_PREPARE.
Created new TCP socket 9 for connection
INFO : cedarc <log_set_level:4[ 133.983565] VE: enable hw clock
3>: Set log level to 5 from /ven[ 133.989646] enable_cedar_hw_clk,552
dor/etc/cedarc.conf
ERROR : cedarc <DebugCheckConfig:301>: [4[ 133.998973] VE: VE real_freq=576000000
[ 133.998973]
0;31mnow cedarc log level:5
info: media source is unseekable.
TPlayerPrepare end
TPlayerSetHoldLastPicture()
xplayer:process message XPLAYER_COMMAND_START.
(Allwinner Audio Middle Layer),line(971) : Create Decoder!!=====
(Allwinner Audio Middle Layer),line(603) : AudioDec_Installaudiolib ok
(Allwinner Audio Middle Layer),line(606) : audio decoder init start ...
(AllwinnerAlibs),line(50) :
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Audio <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
tag : audiocodec-v1.2
branch: new
commit: 3ba65962c01cbf1280ddda19d843009b6ef8ce85
date : Tue Jan 8 16:25:27 2019 0800
----------------------------------------------------------------------
(AllwinnerAlibs),line(700) : ----Loading so success!
(AllwinnerAlibs),line(902) : *************pAudioStreamInfo start******************
(AllwinnerAlibs),line(903) : eCodecFormat :id(4), name(aac low-complexy)
(AllwinnerAlibs),line(904) : eSubCodecFormat :0
(AllwinnerAlibs),line(905) : nChannelNum :2
(AllwinnerAlibs),line(906) : nBitsPerSample :16
(AllwinnerAlibs),line(907) : nSampleRate :44100
(AllwinnerAlibs),line(908) : nAvgBitrate :0
(AllwinnerAlibs),line(909) : nMaxBitRate :0
(AllwinnerAlibs),line(910) : nFileSize :0
(AllwinnerAlibs),line(911) : eAudioBitstreamSource:0
(AllwinnerAlibs),line(912) : eDataEncodeType :0
(AllwinnerAlibs),line(913) : nCodecSpecificDataLen:2
(AllwinnerAlibs),line(914) : pCodecSpecificData :0x3fbc088420
(AllwinnerAlibs),line(915) : nFlags :0
(AllwinnerAlibs),line(916) : nBlockAlign :0
(AllwinnerAlibs),line(917) : *************pAudioStreamInfo end ******************
(AAC Decoder),line(36) : init successs...
(Allwinner Audio Middle Layer),line(614) : AUDIO DECODE INIT OK...0
started.
tplayerdemo# ERROR : awplayer <PlayerStart:806>: invalid start operation, player already in started status.
have no enough data to play
have enough data to play again
ERROR : awplayer <__LayerQueueBuffer:969>: *** picNode is full when queue buffer
ERROR : awplayer <__LayerQueueBuffer:969>: *** picNode is full when queue buffer
*****tplayer:video decoded width = 1280,height = 720
*****tplayerdemo:video decoded width = 1280,height = 720real set to display rect:w = 1280,h = 720
warning: unknown callback from Tinaplayer.
*****tplayer:video width = 1280,height = 720
warning: unknown callback from Tinaplayer.
****player(0x34a2c7b0): first video pts = 1714438937699315*****
ERROR : awplayer <__LayerQueueBuffer:969>: *** picNode is full when queue buffer
ERROR : fbm.c <FbmReturnPicture:1043>: invalid frame status, a picture being returned, but bUsedByRender=0, bInValidPictureQueue=1, bAlreadyDisplayed=0.
ERROR : fbm.c <FbmReturnPicture:1044>: **picture[0x3fb4001f08],id[8]
WARNING: cedarc <ReturnPicture:1698>: FbmReturnPicture return fail, it means the picture being returned it not one of this FBM.
mediamtx服务器上的信息如下:
红外控制LVGL界面切换
1. 测试红外功能
1.1 配置设备树
查看原理图:
可以看到红外对应的引脚号是PG16
。
进入目录:
代码语言:javascript复制cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4
修改board.dts
:
vim board.dts
修改引脚:
以下节点是红外接收
的设备树节点,没有使能的话,需要使能:
1.2 配置内核配置文件
执行ckernel
,进入内核目录。
打开内核配置界面:
代码语言:javascript复制m kernel_menuconfig
红外有很多种协议,NEC红外协议是最常用的一种,默认选上:
添加红外接收驱动:
保存,回到SDK根目录,编译make
、打包pack
和烧录。
1.3 验证红外功能
开发板上,执行cat proc/bus/input/devices
:
root@TinaLinux:/# cat proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-keyboard"
P: Phys=sunxikbd/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=100000000 0 0 100000000800 4000000000000 10000000
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ir"
P: Phys=sunxi-ir/input0
S: Sysfs=/devices/platform/soc@3000000/7040000.s_cir/rc/rc0/s_cir_rx
U: Uniq=
H: Handlers=kbd event1
B: PROP=20
B: EV=100017
B: KEY=2
B: REL=3
B: MSC=10
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="audiocodec sunxi Audio Jack"
P: Phys=ALSA
S: Sysfs=/devices/platform/soc@3000000/2030340.sound/sound/card0/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=23
B: KEY=40 0 0 0 0 0 400000000 0 c000000000000 0
B: SW=14
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="fts_ts"
P: Phys=
S: Sysfs=/devices/platform/soc@3000000/sunxi-i2c2/i2c-2/2-0038/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=2
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=661800000000000
可以看到/dev/input/event1
就是红外接收的设备节点了。
执行:
代码语言:javascript复制hexdump /dev/input/event1
查看是否接收正常:
代码语言:javascript复制root@TinaLinux:/# hexdump /dev/input/event1
0000000 0d07 0000 0000 0000 4ab4 000c 0000 0000
0000010 0004 0004 0007 0000 0d07 0000 0000 0000
0000020 4ab4 000c 0000 0000 0000 0000 0000 0000
0000030 0d08 0000 0000 0000 4a1b 000e 0000 0000
0000040 0004 0004 0009 0000 0d08 0000 0000 0000
0000050 4a1b 000e 0000 0000 0000 0000 0000 0000
0000060 0d0a 0000 0000 0000 5968 0009 0000 0000
0000070 0004 0004 0007 0000 0d0a 0000 0000 0000
0000080 5968 0009 0000 0000 0000 0000 0000 0000
0000090 0d0b 0000 0000 0000 cf50 0004 0000 0000
00000a0 0004 0004 0009 0000 0d0b 0000 0000 0000
00000b0 cf50 0004 0000 0000 0000 0000 0000 0000
收到数据就是接收正常的现象。下面可以编写测试程序了。
1.4 编写红外接收测试程序
以下编写的测试文件:
代码语言:javascript复制ubuntu@ubuntu1804:~/C_Source/C_IRTest$ tree -L 2
.
├── bin
│ └── main
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ └── Makefile
├── build.sh
├── CMakeLists.txt
├── inc
│ └── ir_test.h
├── main.c
├── src
│ └── ir_test.c
└── toolchain.cmake
5 directories, 10 files
主函数main.c
如下:
#include <stdio.h>
#include "ir_test.h"
int main(int argc,char ** argv)
{
int rang_low = 0, rang_high = 0;
return test_keyboard(DEV_PATH);
}
红外模块测试程序/src/ir_test.c
如下:
#include "ir_test.h"
static const int key_exit = 102;
static int keys_fd = 0;
unsigned int test_keyboard(const char * event_file)
{
int code = 0, i;
struct input_event data={0};
keys_fd=open(DEV_PATH, O_RDONLY);
if(keys_fd <= 0)
{
printf("open %s error!n", DEV_PATH);
return -1;
}
fcntl(keys_fd,F_SETFL,O_NONBLOCK);
for(;;)
{
read(keys_fd, &data, sizeof(data));
if(data.value){
printf("%drn",data.value);
code = data.value;
}
}
close(keys_fd);
return 0;
}
所用到的头文件/inc/ir_test.h
如下:
#ifndef IR_TEST_H
#define IR_TEST_H
#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <limits.h>
#include <unistd.h>
#include <signal.h>
#define DEV_PATH "/dev/input/event1" //difference is possible
unsigned int test_keyboard(const char * event_file);
#endif
使用CMake来构建工程会更加方便一些,CMakeLists.txt
如下:
cmake_minimum_required(VERSION 3.10)
project(ir)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
include_directories(${PROJECT_SOURCE_DIR}/inc)
file(GLOB SRC_FILES "src/*.c")
add_executable(main main.c ${SRC_FILES})
#target_link_libraries(target_name lib1 lib2 ...)
指定交叉编译工具,toolchain.cmake
如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv)
set(tools "/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702")
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-g )
为了更加方便编译,编写一个脚本。build.sh
如下:
rm -rf build
mkdir -p build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" ..
make -j8
执行./build.sh
,生成的可执行程序在bin/
文件下。
使用adb来推送到开发板上:
代码语言:javascript复制adb push bin/main /mnt/UDISK/
在开发板上执行/mnt/UDISK/main
,即可验证红外接收:
root@TinaLinux:/mnt/UDISK# ./main
7
9
7
9
为后面实现红外切换LVGL界面做准备。
2. lvgl9移植
lvgl的界面准备使用9.0版本去实现,在这之前,需要先移植lvgl9.0版本例程到开发板上,为后面移植界面做准备。
参考文章:移植lvgl v9到嵌入式linux设备_lvgl9 linux-CSDN博客
2.1 准备移植资源
以下文件是从LVGL官方仓库,下载两个仓库:
注意:都要选择v9.0版本!!
名称 | 仓库地址 | 描述 |
---|---|---|
lvgl | https://github.com/lvgl/lvgl.git | 包含了LVGL图形界面控件源码、驱动接口源代码以及例程 |
lv_port_linux | https://github.com/lvgl/lv_port_linux.git | 适配有framebuffer的linux系统的接口 |
由于版本更新,直接在ubuntu上克隆是最新版本的,编译会出现问题。
建议在window上都选择V9.0版本下载上面两个仓库,最后用lvgl仓库代替lv_port_linux_frame_buffer的lvgl文件夹。
lv_port_linux
:
lvgl
:
2,2 移植步骤
替换好工程后,上传到ubuntu,新建一个目录用于存放该工程。
可以看到目录结构如下:
代码语言:javascript复制ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ tree -L 1
.
├── CMakeLists.txt
├── LICENSE
├── lv_conf.h
├── lvgl
├── main.c
├── Makefile
├── mouse_cursor_icon.c
└── README.md
1 directory, 7 files
如果需要支持触摸功能,修改lv_conf.h
:
888 /*Driver for evdev input devices*/
889 #define LV_USE_EVDEV 1
在mian.c
中添加触摸输入:
代码语言:javascript复制需要确定设备的触摸节点(可以使用
cat /dev/input/event3
测试)
int main(void)
{
lv_init();
/*Linux frame buffer device init*/
lv_display_t * disp = lv_linux_fbdev_create();
lv_linux_fbdev_set_file(disp, "/dev/fb0");
/*input touch device init*/
lv_indev_t *touch;
touch = lv_evdev_create(LV_INDEV_TYPE_POINTER,"/dev/input/event3");
/*Create a Demo*/
lv_demo_widgets();
//lv_demo_widgets_start_slideshow();
/*Handle LVGL tasks*/
while(1) {
lv_timer_handler();
usleep(5000);
}
return 0;
}
2.3 编译
指定交叉编译工具,编写一个toolchain.cmake
如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv)
set(tools "/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702")
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-g )
为了方便编译,编写一份脚本build.sh
:
rm -rf build
mkdir -p build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" ..
make -j8
编译:
代码语言:javascript复制ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ ls
bin build build.sh CMakeLists.txt LICENSE lv_conf.h lvgl main.c Makefile mouse_cursor_icon.c README.md toolchain.cmake
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux$ sudo chmod x build.sh
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ ./build.sh
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
...
[ 99%] Linking C static library liblvgl_examples.a
[ 99%] Built target lvgl_examples
[ 99%] Building C object CMakeFiles/main.dir/main.c.o
[ 99%] Building C object CMakeFiles/main.dir/mouse_cursor_icon.c.o
[100%] Linking CXX executable /home/ubuntu/lvgl_demo/lv_port_linux-release-v9.0/bin/main
[100%] Built target main
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$
编译成功后,可执行程序保存在bin/目录下:
代码语言:javascript复制ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0/bin$ file main
main: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0/bin$
3. lvgl输入设备适配
通过前面的测试,可以确认红外功能是可以使用的,为了方便控制lvgl的界面切换,需要把红外绑定到lvgl的输入设备框架里。
3.1 移植红外输入设备
参考官方文档:
Input device interface(输入设备接口) — LVGL 文档 (100ask.net)
可以看到,要创建输入设备,需要使用以下:
代码语言:javascript复制/*Register at least one display before you register any input devices*/
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_...); /*See below.*/
lv_indev_set_read_cb(indev, read_cb); /*See below.*/
其中LV_INDEV_TYPE_
成员可以是:
LV_INDEV_TYPE_POINTER
:触摸屏或鼠标LV_INDEV_TYPE_KEYPAD
:键盘或键垫LV_INDEV_TYPE_ENCODER
:具有左右旋转及按下选项的编码器LV_INDEV_TYPE_BUTTON
:外部按钮虚拟按压屏幕
read_cb
是一个函数指针,它将定期被调用以报告输入设备当前的状态。
每种类型,官网都简单写了一个read_cb
所指向的函数的用法。可以参考它的,把红外适配上去。
在这里,红外使用的是LV_INDEV_TYPE_BUTTON
类型,官网中的read_cb
指向的函数是这样使用的:
void button_read(lv_indev_t * indev, lv_indev_data_t*data){
static uint32_t last_btn = 0; /*Store the last pressed button*/
int btn_pr = my_btn_read(); /*Get the ID (0,1,2...) of the pressed button*/
if(btn_pr >= 0) { /*Is there a button press? (E.g. -1 indicated no button was pressed)*/
last_btn = btn_pr; /*Save the ID of the pressed button*/
data->state = LV_INDEV_STATE_PRESSED; /*Set the pressed state*/
} else {
data->state = LV_INDEV_STATE_RELEASED; /*Set the released state*/
}
data->btn_id = last_btn; /*Save the last button*/
}
这里需要把my_btn_read
修改成上一章验证过的红外测试接口 ,加以修改,如下:
static int ir_pressed(void)
{
struct input_event data={0};
int cnt = 0;
read(keys_fd, &data, sizeof(data));
if(data.value == 7)
{
cnt = 0;
return cnt;
}else if(data.value == 9)
{
cnt = 1;
return cnt;
}
return -1;
}
这样,read_cb
所指向的函数就变成:
static void read_cb(lv_indev_t * indev, lv_indev_data_t*data)
{
static uint32_t last_btn = 0; /*Store the last pressed button*/
int btn_pr = ir_pressed(); /*Get the ID (0,1,2...) of the pressed button*/
if(btn_pr >= 0) { /*Is there a button press? (E.g. -1 indicated no button was pressed)*/
last_btn = btn_pr; /*Save the ID of the pressed button*/
data->state = LV_INDEV_STATE_PRESSED; /*Set the pressed state*/
printf("last_btn : %dn",last_btn);
} else {
data->state = LV_INDEV_STATE_RELEASED; /*Set the released state*/
//printf("RELEASEDn");
}
data->btn_id = last_btn; /*Save the last button*/
//printf("data->btn_id : %dn",data->btn_id);
}
ir_pressed
返回的每个索引都分配了相应的坐标,使用了lv_indev_set_button_points(my_indev, points_array)
, points_array
应该看起来像 const lv_point_t points_array[] = { {12,30},{60,90}, ...}
。
添加上初始化,就可以用红外控制lvgl界面切换了(界面需要在lvgl9移植的工程上额外编写):
代码语言:javascript复制static const lv_point_t points_array[] = {{20,20},{120,20}};
void ir_init(void)
{
keys_fd = open(DEV_PATH, O_RDONLY);
if(keys_fd <= 0)
{
printf("open %s error!n", DEV_PATH);
return;
}
fcntl(keys_fd,F_SETFL,O_NONBLOCK);
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev,LV_INDEV_TYPE_BUTTON);
lv_indev_set_read_cb(indev,read_cb);
lv_indev_set_button_points(indev,points_array);
}
整个工程的目录结构如下:
代码语言:javascript复制ubuntu@ubuntu1804:~/C_Source/lvgl_v9_demo_irtest$ tree -L 2
.
├── bin
│ └── main
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── lib
│ ├── lvgl
│ └── Makefile
├── build.sh
├── CMakeLists.txt
├── inc
│ ├── anim.h
│ ├── calendar.h
│ ├── ir_test.h
│ └── my_lvgl_demo_irtest.h
├── lv_conf.h
├── lvgl
│ ├── CMakeLists.txt
│ ├── component.mk
│ ├── demos
│ ├── docs
│ ├── env_support
│ ├── examples
│ ├── idf_component.yml
│ ├── Kconfig
│ ├── library.json
│ ├── library.properties
│ ├── LICENCE.txt
│ ├── lv_conf_template.h
│ ├── lvgl.h
│ ├── lvgl.mk
│ ├── lvgl.pc.in
│ ├── README.md
│ ├── SConscript
│ ├── scripts
│ ├── src
│ └── tests
├── main.c
├── Makefile
├── mouse_cursor_icon.c
├── src
│ ├── anim.c
│ ├── calendar.c
│ ├── ir_test.c
│ └── my_lvgl_demo_irtest.c
└── toolchain.cmake
15 directories, 32 files
执行./build.sh
可以直接编译程序,可执行程序main
放在bin/文件里。
推送到开发板上:
代码语言:javascript复制adb push bin/main /mnt/UDISK/
3.2 测试
开发板上执行:
代码语言:javascript复制root@TinaLinux:/mnt/UDISK# ./main
last_btn : 0
last_btn : 0
last_btn : 1
last_btn : 1
last_btn : 0
last_btn : 1
last_btn : 0
last_btn : 1
界面如下:
0
是往前返回上一个界面,1
是往下一个界面走,搞定。
WIFI投屏
参考哪吒D1编译配置DLNA客户端进行B站投屏 / 全志 SOC / WhyCan Forum(哇酷开发者社区)实现wifi投屏功能。
1. 常见的投屏协议
实现该功能前,可以了解一下常见的投屏协议主要包括以下几种:
- AirPlay:由苹果公司开发的无线显示协议,允许将iPhone、iPad或Mac的屏幕内容投屏到Apple TV或支持AirPlay的Android电视盒子上。AirPlay支持镜像模式和流模式两种工作方式。
- Miracast:由Wi-Fi联盟制定的Wi-Fi投屏行业标准,基于Wi-Fi Direct技术,可以在Android 4.2及以上版本和Windows 8.1或Windows 10系统中使用,实现无线连接和数据传输。
- DLNA:由数字生活网络联盟(Digital Living Network Alliance)创建的投屏协议,基于UPnP协议,主要用于在设备之间共享多媒体内容。DLNA不是无线显示解决方案,而是在一台设备上获取内容并在另一台设备上播放的方法。
- Chromecast:由谷歌开发的无线投屏技术,与AirPlay相比,Chromecast的体验更接近于DLNA。
- WiDi:支持Windows 10笔记本的无线投屏方式,无需安装软件即可实现无线投屏。
2. 配置DLNA客户端
DLNA客户端可以接收并播放以DLNA协议推送的流媒体,而B站可以将视频通过DLNA协议来推送。 所以需要给D1h开发板配置DLNA客户端,就可以在同一网络下实现B站投屏了。
故事情节: 有个博主使用
gmrender-resurrect
用来做DLNA客户端。gmrender-resurrect
是基于 GStreamer 框架开发的项目,专门用于实现 DLNA/UPnP-AV 媒体播放功能。 GStreamer是一个全面的多媒体框架,提供了一整套工具和组件来处理各种媒体任务。 但是博主发现使用GStreamer来解码B站投屏的视频会出现闪屏和不能自动硬件缩放问题。 于是就对gmrender-resurrect
进行了魔改,把GStreamer 改成了tina自带的tplayer来播放视频。gmrender-resurrect
自此便成了tprender
。
在tina的package里面没有相关的库,下面将手动交叉编译tprender
和DLNA的底层upnp库。
2.1 获取源码资料
我们百问网提供了相应的源码和补丁:https://github.com/DongshanPI/DongshannezhaSTU_DLNA_ScreenProjection.git
进入ubuntu,把源码克隆下来:
代码语言:javascript复制ubuntu@ubuntu1804:~$ git clone https://github.com/DongshanPI/DongshannezhaSTU_DLNA_ScreenProjection.git
ubuntu@ubuntu1804:~$ tree DongshannezhaSTU_DLNA_ScreenProjection -L 1
DongshannezhaSTU_DLNA_ScreenProjection
├── libupnp-1.14.12
├── README.md
└── tprender
2 directories, 1 file
在交叉编译源码之前,先把补丁也克隆下来:
代码语言:javascript复制ubuntu@ubuntu1804:~$ git clone https://github.com/DongshanPI/Tina-sdk_dongshannezhastu
ubuntu@ubuntu1804:~$ tree Tina-sdk_dongshannezhastu -L 1
Tina-sdk_dongshannezhastu
├── config_gstreamer
├── device
├── package
├── README.md
└── target
3 directories, 2 files
ubuntu@ubuntu1804:~$ cd tina-d1-h/
ubuntu@ubuntu1804:~/tina-d1-h$ source build/envsetup.sh
Setup env done! Please run lunch next.
ubuntu@ubuntu1804:~/tina-d1-h$ 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? [Default d1-h_nezha]: 2
============================================
TINA_BUILD_TOP=/home/ubuntu/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
============================================
clean buildserver
[2] 90293
ubuntu@ubuntu1804:~/tina-d1-h$ rm .config
ubuntu@ubuntu1804:~/tina-d1-h$ rm out/ -rf
ubuntu@ubuntu1804:~/tina-d1-h$ cp ../Tina-sdk_dongshannezhastu/* -rfvd ./
如果执行了rm .config
和rm out/ -rf
,后续烧录系统需要wifi功能,就得重新根据之前的文章重新配置
wifi功能。
拷贝完成后,执行:
代码语言:javascript复制ubuntu@ubuntu1804:~/tina-d1-h$ cp config_gstreamer.txt .config
ubuntu@ubuntu1804:~/tina-d1-h$ make
编译完成后,记得进行打包pack
操作:
ubuntu@ubuntu1804:~/tina-d1-h$ pack
否则out/无法更新。就会影响到tprender
的编译。
2.2 交叉编译
新建一个终端,进入DongshannezhaSTU_DLNA_ScreenProjection
目录。
配置临时交叉编译环境变量:
代码语言:javascript复制ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection$ export PATH=$PATH:/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection$ cd libupnp-1.14.12/
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ ./configure --host=riscv64-unknown-linux-gnu
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ make
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ mkdir tmp
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ make install DESTDIR=$(pwd)/tmp/
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ ls -lh tmp/usr/local/lib
total 8.4M
-rw-r--r-- 1 ubuntu ubuntu 1.1M Jun 20 23:34 libixml.a
-rwxr-xr-x 1 ubuntu ubuntu 929 Jun 20 23:34 libixml.la
lrwxrwxrwx 1 ubuntu ubuntu 17 Jun 20 23:34 libixml.so -> libixml.so.11.1.2
lrwxrwxrwx 1 ubuntu ubuntu 17 Jun 20 23:34 libixml.so.11 -> libixml.so.11.1.2
-rwxr-xr-x 1 ubuntu ubuntu 205K Jun 20 23:34 libixml.so.11.1.2
-rw-r--r-- 1 ubuntu ubuntu 6.0M Jun 20 23:34 libupnp.a
-rwxr-xr-x 1 ubuntu ubuntu 955 Jun 20 23:34 libupnp.la
lrwxrwxrwx 1 ubuntu ubuntu 17 Jun 20 23:34 libupnp.so -> libupnp.so.17.1.3
lrwxrwxrwx 1 ubuntu ubuntu 17 Jun 20 23:34 libupnp.so.17 -> libupnp.so.17.1.3
-rwxr-xr-x 1 ubuntu ubuntu 1.2M Jun 20 23:34 libupnp.so.17.1.3
drwxrwxr-x 2 ubuntu ubuntu 4.0K Jun 20 23:34 pkgconfig
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$
就可以在当前的tmp/目录下得到相应的动态库。
进入tprender/目录:
代码语言:javascript复制ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/libupnp-1.14.12$ cd ../tprender/
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ cp ../libupnp-1.14.12/tmp/usr/local/lib/libixml.so.11.1.2 libs/libixml.so
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ cp ../libupnp-1.14.12/tmp/usr/local/lib/libixml.so.11.1.2 libs/libixml.so.11
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ cp ../libupnp-1.14.12/tmp/usr/local/lib/libupnp.so.17.1.3 libs/libupnp.so
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ cp ../libupnp-1.14.12/tmp/usr/local/lib/libupnp.so.17.1.3 libs/libupnp.so.17
修改CMakeLists.txt:
代码语言:javascript复制ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ gedit CMakeLists.txt
保存退出,编译即可得到可执行程序tprender
:
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ rm -rf CMakeFiles cmake_install.cmake CMakeCache.txt tags
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ cmake .
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ make
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ file tprender
tprender: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$
3. 测试投屏功能
扫描附近wifi:
代码语言:javascript复制root@TinaLinux:/# wifi_scan_results_test
*********************************
***Start scan!***
*********************************
bssid / frequency / signal level / flags / ssid
94:d9:b3:b7:c9:0a 2442 -36 [WPA-PSK-CCMP TKIP][WPA2-PSK-CCMP TKIP][ESS] Programmers
d6:84:09:1e:9b:95 2412 -59 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Guest_An
d4:84:09:1d:9b:95 2412 -61 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Voform
4a:0e:ec:50:95:83 2437 -62 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] 1415xe5xa4x87xe7x94xa8
48:0e:ec:50:95:83 2437 -66 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] A1415
f0:92:b4:a6:03:91 2452 -38 [WPA-PSK-CCMP TKIP][WPA2-PSK-CCMP TKIP][ESS] ChinaNet-kRAH
a4:a9:30:ba:83:16 2457 -51 [WPA2-PSK-CCMP][WPS][ESS] wifi1
1c:68:7e:bc:25:0a 2412 -58 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] xe9xa1xbaxe6x88x90xe5x8axb3xe5x8axa1
34:12:f9:87:a6:48 2427 -61 [WPA2-PSK-CCMP][WPS][ESS] Redmi_83D1
34:12:f9:87:a6:49 2427 -62 [WPA2-PSK-CCMP][ESS] x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00
a4:39:b3:73:ac:74 2427 -63 [WPA2-PSK-CCMP][WPS][ESS] Redmi_83D1
b4:77:48:a7:52:45 2437 -63 [WPA2-PSK-CCMP][ESS] VANTEN
98:0d:51:10:78:31 2437 -70 [WPA2-PSK-CCMP][WPS][ESS]
aa:a9:30:ba:83:16 2457 -61 [ESS]
a6:39:b3:63:ac:74 2427 -62 [ESS]
******************************
Wifi get_scan_results: Success!
******************************
root@TinaLinux:/#
在这里准备用手机的B站来进行投屏,开发板需要连接和手机同一个wifi:
代码语言:javascript复制root@TinaLinux:/# wifi_connect_ap_test <wifi名> <wifi密码>
root@TinaLinux:/# ifconfig
br-lan Link encap:Ethernet HWaddr 46:6C:D2:EA:24:03
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fd18:7ee6:608a::1/60 Scope:Global
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:108 (108.0 B) TX bytes:108 (108.0 B)
wlan0 Link encap:Ethernet HWaddr 00:65:D8:1D:B6:8E
inet addr:192.168.0.127 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::265:d8ff:fe1d:b68e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:103820 errors:0 dropped:0 overruns:0 frame:0
TX packets:18352 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:69417258 (66.2 MiB) TX bytes:3751190 (3.5 MiB)
root@TinaLinux:/#
连接成功后,wlan0节点会有ip地址。测试wifi功能:
代码语言:javascript复制root@TinaLinux:/# ping www.baidu.com
PING www.baidu.com (183.2.172.185): 56 data bytes
64 bytes from 183.2.172.185: seq=0 ttl=52 time=13.684 ms
64 bytes from 183.2.172.185: seq=1 ttl=52 time=18.239 ms
64 bytes from 183.2.172.185: seq=2 ttl=52 time=14.803 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 13.684/15.575/18.239 ms
root@TinaLinux:/#
在ubuntu上,推送可执行程序
与动态库
到D1h开发板:
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$ adb push libs/ tprender /root/
libs/: 4 files pushed. 1.4 MB/s (2738288 bytes in 1.887s)
tprender: 1 file pushed. 1.3 MB/s (116984 bytes in 0.087s)
5 files pushed. 1.3 MB/s (2855272 bytes in 2.143s)
ubuntu@ubuntu1804:~/DongshannezhaSTU_DLNA_ScreenProjection/tprender$
开发板上进入/root目录,执行:
代码语言:javascript复制root@TinaLinux:~# ./tprender -f "D1-H"
WARNING: awplayer <cdx_log_set_level:30>: cdx Set log level to 6
INFO : cedarc <CedarPluginVDInit:79>: register h264 decoder success!
INFO : cedarc <CedarPluginVDInit:84>: register mjpeg decoder success!
INFO : cedarc <CedarPluginVDInit:86>: register mpeg2 decoder success!
INFO : cedarc <CedarPluginVDInit:92>: register mpeg4dx decoder success!
INFO : cedarc <CedarPluginVDInit:79>: register mpeg4H263 decoder success!
INFO : cedarc <CedarPluginVDInit:90>: register mpeg4Normal decoder success!
INFO : cedarc <CedarPluginVDInit:74>: register vc1 decoder success!
INFO : cedarc <CedarPluginVDInit:85>: register h265 decoder success!
gmrender-resurrect started [ gmediarender 0.0.9 (libupnp-1.14.10; glib-2.50.1; withou[14742.072053] [SNDCODEC][sunxi_card_hw_params][620]:stream_flag: 0
t gstreamer.) ].
Logging switched off. Enable with --logfile=<filename> (or --logfile=stdout for console)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tina_multimedia <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
tag : tina3.5
branch: tina-dev
date : Mon Jul 15 19:04:59 2019 0800
Change-Id: I5f6c8a88d7b387a312b7744797a0d5f8ab07ee7a
-------------------------------------------------------------------------------
xplayer:process message XPLAYER_COMMAND_SET_AUDIOSINK.
xplayer:process message XPLAYER_COMMAND_SET_SURFACE.
xplayer:process message XPLAYER_COMMAND_SET_SUBCTRL.
xplayer:process message XPLAYER_COMMAND_SET_DI.
dd: writing '/dev/fb0': No space left on device
32401 0 records in
32400 0 records out
ERROR [2024-06-21 15:45:10.824354 | webserver] Could not stat './/grender-64x64.png': No such file or directory
ERROR [2024-06-21 15:45:10.824939 | webserver] Could not stat './/grender-128x128.png': No such file or directory
output_set_volume
Ready for rendering.
打开手机B站APP,在投屏功能上就可以看见D1-H
这个设备了:
点击D1-H
即可在hdmi屏幕上进行wifi投屏了。
LVGLv9.1.0移植
1. 移植步骤
1.1 下载LVGL源码
名称 | 仓库地址 | 描述 |
---|---|---|
lv_port_linux | https://github.com/lvgl/lv_port_linux.git | 适配有framebuffer、DRM/KMS和SDL2的linux系统的接口 |
在ubuntu上,新建终端,克隆上面的仓库地址:
代码语言:javascript复制ubuntu@ubuntu1804:~$ git clone https://github.com/lvgl/lv_port_linux.git
ubuntu@ubuntu1804:~$ cd lv_port_linux/
ubuntu@ubuntu1804:~/lv_port_linux$ git submodule update --init --recursive
Cloning into '/home/ubuntu/lv_port_linux/lvgl'...
Submodule path 'lvgl': checked out 'e29d35b43c509b6d7189f5dac87139441669ae66'
Submodule path 'lvgl': checked out 'e29d35b43c509b6d7189f5dac87139441669ae66'
查看目录结构:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ tree -L 2
.
├── CMakeLists.txt
├── LICENSE
├── lv_conf.h
├── lvgl
│ ├── CMakeLists.txt
│ ├── CMakePresets.json
│ ├── component.mk
│ ├── demos
│ ├── docs
│ ├── env_support
│ ├── examples
│ ├── idf_component.yml
│ ├── Kconfig
│ ├── library.json
│ ├── library.properties
│ ├── LICENCE.txt
│ ├── lv_conf_template.h
│ ├── lvgl.h
│ ├── lvgl.mk
│ ├── lvgl.pc.in
│ ├── README.md
│ ├── SConscript
│ ├── scripts
│ ├── src
│ └── tests
├── main.c
├── Makefile
├── mouse_cursor_icon.c
└── README.md
8 directories, 21 files
查看如果发现lvgl的库是9.0.1版本的,那就删除lvgl/文件夹,重新克隆:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ rm lvgl/ -rf
ubuntu@ubuntu1804:~/lv_port_linux$ git clone https://github.com/lvgl/lvgl.git
Cloning into 'lvgl'...
remote: Enumerating objects: 104172, done.
remote: Counting objects: 100% (15487/15487), done.
remote: Compressing objects: 100% (1633/1633), done.
remote: Total 104172 (delta 14432), reused 13985 (delta 13854), pack-reused 88685
Receiving objects: 100% (104172/104172), 332.99 MiB | 12.14 MiB/s, done.
Resolving deltas: 100% (79168/79168), done.
Checking out files: 100% (2894/2894), done.
ubuntu@ubuntu1804:~/lv_port_linux$
可以看到:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ cd lvgl/
ubuntu@ubuntu1804:~/lv_port_linux/lvgl$ vim lv_conf_template.h
/**
* @file lv_conf.h
* Configuration file for v9.1.1-dev
*/
源码获取完毕!接下来就是编译了。
1.2 编译
想要在开发板上运行,当然是需要指定相应的交叉编译工具的了。
创建一个文件toolchain.cmake
,用于指定交叉编译工具:
set(CMAKE_SYSTEM_NAME Linux)
#如果是arm,就写arm;这里是riscv
set(CMAKE_SYSTEM_PROCESSOR riscv)
set(tools "/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702")
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-g )
为了方便编译,编写一个脚本build.sh
:
rm -rf build
mkdir -p build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" ..
make -j8
目录结构如下:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ tree -L 1
.
├── build.sh
├── CMakeLists.txt
├── LICENSE
├── lv_conf.h
├── lvgl
├── main.c
├── Makefile
├── mouse_cursor_icon.c
├── README.md
└── toolchain.cmake
1 directory, 9 files
经过编译测试,需要修改CMakeLists.txt
,否则编译会报错,注释掉下面几个:
--- CMakeLists.txt-bak 2024-06-24 22:11:40.077461049 -0400
CMakeLists.txt 2024-06-24 22:12:16.549404544 -0400
@@ -12,12 12,12 @@
add_executable(main main.c mouse_cursor_icon.c)
-include(${CMAKE_CURRENT_LIST_DIR}/lvgl/tests/FindLibDRM.cmake)
-include_directories(${Libdrm_INCLUDE_DIRS})
#include(${CMAKE_CURRENT_LIST_DIR}/lvgl/tests/FindLibDRM.cmake)
#include_directories(${Libdrm_INCLUDE_DIRS})
-find_package(SDL2)
-find_package(SDL2_image)
-include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
#find_package(SDL2)
#find_package(SDL2_image)
#include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${Libdrm_LIBRARIES} m pthread)
add_custom_target (run COMMAND ${EXECUTABLE_OUTPUT_PATH}/main DEPENDS main)
执行./build.sh
,编译:
ubuntu@ubuntu1804:~/lv_port_linux$ sudo chmod x build.sh
ubuntu@ubuntu1804:~/lv_port_linux$ ./build.sh
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
...
[ 99%] Linking C static library ../lib/liblvgl_examples.a
[ 99%] Built target lvgl_examples
[ 99%] Linking C static library ../lib/liblvgl_demos.a
[ 99%] Built target lvgl_demos
[ 99%] Building C object CMakeFiles/main.dir/mouse_cursor_icon.c.o
[ 99%] Building C object CMakeFiles/main.dir/main.c.o
[100%] Linking CXX executable /home/ubuntu/lv_port_linux/bin/main
[100%] Built target main
ubuntu@ubuntu1804:~/lv_port_linux$
编译成功,可执行程序保存在bin/目录下:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ file bin/main
bin/main: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
ubuntu@ubuntu1804:~/lv_port_linux$
1.3 测试
使用adb推送到D1H开发板上即可:
代码语言:javascript复制ubuntu@ubuntu1804:~/lv_port_linux$ adb push bin/main /mnt/UDISK/
bin/main: 1 file pushed. 1.4 MB/s (2297184 bytes in 1.601s)
ubuntu@ubuntu1804:~/lv_port_linux$
开发板上执行./main
,会出现警告,还会感觉卡卡的:
root@TinaLinux:/mnt/UDISK# ./main
[Warn] (0.000, 0) lv_init: Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower lv_init.c:232
[Warn] (0.000, 0) lv_init: Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower lv_init.c:236
[Warn] (0.000, 0) lv_init: Style sanity checks are enabled that uses more RAM lv_init.c:240
根据警告,修改lv_conf.h
:
231 /*Enable asserts if an operation is failed or an invalid data is found.
232 *If LV_USE_LOG is enabled an error message will be printed on failure*/
233 #define LV_USE_ASSERT_NULL 0 /*Check if the parameter is NULL. (Very fast, recommended)*/
234 #define LV_USE_ASSERT_MALLOC 0 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/
235 #define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/
236 #define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/
237 #define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
再次编译./build.sh
,上传执行即可。
2. 支持触摸
2.1 修改lv_conf.h
如果想要支持触摸功能,修改lv_conf.h
:
888 /*Driver for evdev input devices*/
889 #define LV_USE_EVDEV 1
2.2 修改main.c
在main.c
,添加触摸初始化:
int main(void)
{
lv_init();
/*Linux display device init*/
lv_linux_disp_init();
/*input touch device init*/
lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event3");
/*Create a Demo*/
lv_demo_widgets();
//lv_demo_widgets_start_slideshow();
/*Handle LVGL tasks*/
while(1) {
lv_timer_handler();
usleep(5000);
}
return 0;
}
2.3 测试
如果不知道哪个是触摸的设备节点,用最简单的方式去测试。
执行hexdump /dev/input/event*
,一个一个设备节点去试,用手触碰屏幕:
root@TinaLinux:/mnt/UDISK# hexdump /dev/input/event3
0000000 0f0e 0000 0000 0000 aa0f 0006 0000 0000
0000010 0003 0039 0000 0000 0f0e 0000 0000 0000
0000020 aa0f 0006 0000 0000 0003 003a 0002 0000
0000030 0f0e 0000 0000 0000 aa0f 0006 0000 0000
0000040 0003 0030 0008 0000 0f0e 0000 0000 0000
0000050 aa0f 0006 0000 0000 0003 0035 0192 0000
0000060 0f0e 0000 0000 0000 aa0f 0006 0000 0000
0000070 0003 0036 01cd 0000 0f0e 0000 0000 0000
0000080 aa0f 0006 0000 0000 0001 014a 0001 0000
0000090 0f0e 0000 0000 0000 aa0f 0006 0000 0000
00000a0 0000 0000 0000 0000 0f0e 0000 0000 0000
00000b0 d808 0006 0000 0000 0003 003a 0003 0000
00000c0 0f0e 0000 0000 0000 d808 0006 0000 0000
00000d0 0000 0000 0000 0000 0f0e 0000 0000 0000
00000e0 05a1 0007 0000 0000 0003 003a 0004 0000
00000f0 0f0e 0000 0000 0000 05a1 0007 0000 0000
0000100 0000 0000 0000 0000 0f0e 0000 0000 0000
0000110 332e 0007 0000 0000 0003 003a 0005 0000
0000120 0f0e 0000 0000 0000 332e 0007 0000 0000
0000130 0000 0000 0000 0000 0f0e 0000 0000 0000
0000140 60bc 0007 0000 0000 0003 003a 0006 0000
0000150 0f0e 0000 0000 0000 60bc 0007 0000 0000
0000160 0003 0030 0007 0000 0f0e 0000 0000 0000
0000170 60bc 0007 0000 0000 0000 0000 0000 0000
0000180 0f0e 0000 0000 0000 8983 0007 0000 0000
0000190 0003 0039 ffff ffff 0f0e 0000 0000 0000
00001a0 8983 0007 0000 0000 0001 014a 0000 0000
00001b0 0f0e 0000 0000 0000 8983 0007 0000 0000
有数据说明就是这个设备节点了。
OK,编译再次上传执行,完毕!