linuxOS_D21X/source/artinchip/awtk-ui/README.md
2024-11-29 16:23:11 +08:00

255 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AWTK 简要说明
本项目的编译工具是CMAKE依托AIC SDK进行编译。配置AWTK 参数需要在AIC SDK 根目录使用命令
使用**make menuconfig** 进入可视化界面进行配置对SDK进行配置。具体使用可以参考AIC docs
## 1. 配置说明
配置所在路径在AIC SDK 根目录使用命令make menuconfig 进入可视化界面选择AWTK GUI
```sh
ArtInChip Luban SDK Configuration
ArtInChip packages -->
[*] awtk-ui ----
```
配置项只供选择是否启用AWTK选择启用后编译AWTK 并编译 chart demo然后默认开机后运行 chart demo例程
### 1.1 默认配置说明
**不建议**修改默认配置,一般情况,简单修改**启动脚本**即可满足资源配置和打印调试信息输出要求。
AWTK 资源路径默认设置为**当前路径**,也就是宏 **APP_RES_ROOT = ./** 。如果需要修改APP 路径,在./CMakeLists.txt 添加代码 add_definitions(-DAPP_RES_ROOT = /sdcard/)。
AWTK 日志等级默认为,**debug**等级。debug 等级这里由于和AIC 的宏定义冲突了将原先的DEBUG 改为了TK_DEBUG。如果需要修改日志等级为 info等级添加宏 "TK_DEBUG",在./CMakeLists.txt 添加代码 add_definitions(-DTK_DEBUG)
修改AWTK源码部分代码awtk\src\awtk_main.inc 中
```c
#ifdef TK_NDEBUG // 原先是NDEBUG
log_set_log_level(LOG_LEVEL_INFO);
#else
log_set_log_level(LOG_LEVEL_DEBUG);
#endif /*TK_NDEBUG*/
log_info("Build at: %s %s\n", __DATE__, __TIME__);
```
如果需要自己更改AWTK 配置,可以参考 ./CMakeLists.txt 文件,参考代码
```c
# 这里是添加AWTK 编译的信息
add_definitions(-DWITH_STB_IMAGE)
add_definitions(-DWITH_STB_FONT)
add_definitions(-DWITH_TEXT_BIDI=1)
add_definitions(-DWITH_DEC_IMAGE)
add_definitions(-DWITH_AIC_G2D)
#add_definitions(-DTK_DEBUG)
#add_definitions(-DAPP_RES_ROOT = /sdcard/)
```
### 1.2 启动脚本说明
启动脚本在:../../../package/artinchip/awtk-ui/S00test_awtk
打开AWTK 后,系统启动后默认运行启动脚本内容。对于里面内容不需要修改,仅仅需要修改**切换路径的命令**和**输出信息的路径**即可。
关键信息:
```sh
cd /usr/local/share/awtk_data/res # 切换到资源路径
#PID=`$DAEMON $DAEMONOPTS > /dev/console 2>&1 & echo $!` # 将AWTK 打印信息到控制台
PID=`$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!`
```
cd /usr/local/share/awtk_data/res
cd 命令用于切换所在目录。因为AWTK 资源路径默认设置为**当前路径**,只有切换到资源所在路径才能正常运行。
PID=`$DAEMON $DAEMONOPTS > /dev/stderr 2>&1 & echo $!`
这个命令用于输出调试信息到控制台输出DEBUG 等级信息,用于调试
PID=`$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!`
这个命令用于丢弃调试信息使用这个命令后AWTK 将不会有任何输出到控制台
### 1.3 内存配置
AWTK 使用到GE和VE。GE用于2D加速VE用于图片解码。依赖dma-buf、CMA。一般而言使用`默认配置`即可。默认配置下dma-buf、CMA默认打开。一般情况只根据使其情况配置**CMA Size**。CMA Size 主要用于存储解码后的图片和额外分配一块屏幕内存。
在SDK根目录下执行 make kernel-menuconfig进入kernel的功能配置按如下选择
```sh
Linux
Memory Management options
[*] Contiguous Memory Allocator
```
CMA区域的大小配置如下默认配置为 16MB建议修改为20M可以根据具体需求来配置size大小
```sh
Linux
Library routines
[*] DMA Contiguous Memory Allocator
(20) Size in Mega Bytes
```
打开 dma-buf
在SDK根目录下执行 make kernel-menuconfig进入kernel的功能配置按如下选择
```sh
Linux
Device Drivers
DMABUF options
[*] Explicit Synchronization Framework
[*] Sync File Validation Framework
[*] userspace dmabuf misc driver
[*] DMA-BUF Userland Memory Heaps
[*] DMA-BUF CMA Heap
```
## 2.编译说明
AWTK编译用到的所有相关宏均定义在 ./CMakeList.txt 中
相关宏的说明可以参考awtk/docs/porting_common.md
如果需要编译自己的 app需要修改./CMakeList.txt。AWTK Designed 生成的资源文件也需要做出一些调整不需要的资源可以不进行安装。例如仅仅留下默认主题文件default\raw。安装资源到板子可以参考下面代码资源默认安装到 /usr/local/share 目录下
```sh
# set project
set(PRJ_APP demo_char)
# set user app path
set(USER_APPS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/user_apps)
set(USER_DEMO_CHART ${USER_APPS_ROOT}/awtk-demo-chart)
## demo source file
set(DEMO_SOURCE_FILES "")
# add user 3rd
set(USER_DEMO_3RD ${USER_DEMO_CHART}/3rd/awtk-widget-chart-view/src)
file(GLOB DEMO_3RD_SRC
${USER_DEMO_3RD}/*.c
${USER_DEMO_3RD}/base/*.c
${USER_DEMO_3RD}/chart_view/*.c
${USER_DEMO_3RD}/pie_slice/*.c
)
set(DEMO_SOURCE_FILES ${DEMO_SOURCE_FILES} ${DEMO_3RD_SRC})
# add user src
set(USER_DEMO_SRC ${USER_DEMO_CHART}/src)
file(GLOB USER_DEMO_SRC
${USER_DEMO_SRC}/*.c
${USER_DEMO_SRC}/pages/*.c
${USER_DEMO_SRC}/common/*.c
)
set(DEMO_SOURCE_FILES ${DEMO_SOURCE_FILES} ${USER_DEMO_SRC})
# install resource data to /usr/local/share
if(DEFINED CMAKE_INSTALL_FULL_DATAROOTDIR)
install(DIRECTORY user_apps/awtk-demo-chart/res/assets/default/raw
DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/awtk_data/res/assets/default) # 仅安装需要的资源到板子中,其他不安装,默认安装到 /usr/local/share 目录下
endif() # CMAKE_INSTALL_FULL_DATAROOTDIR
```
## 3. 功能支持说明
luban SDK支持AWTK的绝大部分功能支持部分三方功能详细可以看./CMakeList.txt
关键支持功能如下:
- 拼音输入法,包含软键盘
- 动画功能,动画缓冲
- unicode 换行算法
- 双向排列算法
- 文件系统
- STB 库解码包括truetype字体解码
- CSV 文件读写
支持的三方库如下:
- miniz
- ubjson
- cjson
- hal
- mbedtls
额外注意:
高效旋转目前不支持主要原因是g2d_rotate_image_ex() 和 g2d_blend_image_rotate() 接口还没进行对接。启用文件系统情况下,不要定义宏 `WITH_FAST_LCD_PORTRAIT` 即可。关于高效旋转更多请看文档:./awtk/docs/how_to_use_fast_lcd_portrait.md。
## 4 优化建议
### 4.1 运行速度优化建议
- 提前加载图片资源到内存中assets_manager_preload
- 将图片数据存放到 /usr/local/share 区从SD 卡读取数据较慢
- 增大图片缓冲区。使用函数image_manager_set_max_mem_size_of_cached_images(image_manager(), 1366430),以增大缓冲区。
### 4.2 优化内存使用
- 将frame buffer格式由RGB888/ARGB8888 改变为RGB565
- 使用image_manager_set_max_mem_size_of_cached_images(image_manager(), 1366430) 设置合理的缓冲区大小。
- image_manager_unload_unused(image_manager(), 1); 配置从图片管理器中卸载指定时间内没有使用的图片。
- 关闭窗口动画缓存。
关于图片资源内存的优化建议
- 使用更低分辨率的图片
- 如果不需要使用到透明度可以将32位图转换为24/16位图
- JPEG 格式相比PNG格式更省内存但没有透明度。
- JPEG和PNG 格式选择,可以根据 [5. 硬件图片解码格式进行选择](#5硬件图片解码格式支持)
## 5.硬件图片解码格式支持
关于格式描述方式AWTK和AIC的格式的字节序都是小端但是格式名称描述不一样比如AIC 格式描述为ABGR_8888 对应 AWTK 格式描述为RGBA8888。本文档和配置文件均按照AIC 的格式描述进行描述。
PNG格式不支持硬件解码为RGB565格式JPEG格式仅支持解码为YUV格式。
支持格式:
| 图片格式 | RGB565 | RGB888/ARGB8888 |
| --------------------| --------| ----------------|
| PNG | 不支持 | 支持 |
| JEPG/JPG | 不支持 | 不支持 |
在硬件解码需要注意两点:
- PNG 格式原图是什么格式将解码成什么格式。如果想要减少内存的使用可以将使用原来PNG 24位的图片转换为16位图片
- JGP/JGEG 格式解码为YUV 格式然后将YUV 格式转换为RGB 格式以供AWTK 使用。
推荐图片使用:在默认配置,`动画功能打开`的情况下。如果关闭了动画功能或者内存比较紧张的情况下,请参考上面解码支持和图片使用注意点自行选择。
推荐使用32位 PNG图片这样解码效率最高
## 6. 对接流程
除了图片解码的流程和AWTK 标准流程不一样其他流程都是按照AWTK 的软件流程进行对接的。可以参考AWTK 官方的移植文档和这里的对接源码。由于Linux AWTK基本已经对接好很多接口了文件系统系统时钟多线程都不需要进行额外的对接。仅仅对接好显示设备、输入设备、硬件加速和解码部分即可。
对接源码结构:
```sh
-> aic_g2d # 加速(GE)和解码(VE)部分对接代码
-> aic_dec_asset_frame.c # AIC 图片解码帧内存申请和图片头信息解析
-> aic_dec_asset.c # AIC 硬件图片解码实现使用VE 进行实现
-> aic_g2d.c # AIC G2D和图片格式转换实现使用GE 进行实现
-> aic_graphic_buffer.c # AIC graphic buffer实现AWTK 基于此结构体进行具体图片信息管理
-> aic_linux_mem.c # AIC GE 和VE 需要用到的CMA 内存管理
-> input_thread # 触摸对接代码
-> touch_thread.c # 触摸模块代码,目前仅用到这个
-> input_dispatcher.c # 触摸调试代码
-> lcd_linux # lcd 对接代码
-> fb_info.h # 获取fb 信息实现
-> lcd_linux_fb.c # lcd 移植具体实现
-> main_loop_linux.c # 自己实现的mai_loop 函数
-> devices.c # 设备加载接口
```
图片解码流程做了一些调整因为硬件解码需要CMA 内存如果CMA 内存不够软件解码。关于CMA 内存也可以理解为资源的一部分,资源分配失败就返回。
**AIC 图片硬件解码流程**
获取资源 + 硬件解码 -> 图片格式转化 -> 加入管理器进行管理
**AWTK 图片软件解码流程**
获取资源 -> STB 软件解码 + 图片格式转化 -> 加入管理器进行管理
AIC 硬件解码和AWTK 软件解码的区别就是在获取资源函数的时候就进行硬件解码。如果解码失败则交由软件再次进行资源获取和进行下一步的调用STB库进行解码。