| .. | ||
| awtk | ||
| awtk-linux-fb | ||
| user_apps/awtk-demo-chart | ||
| CMakeLists.txt | ||
| README.md | ||
AWTK 简要说明
本项目的编译工具是CMAKE,依托AIC SDK进行编译。配置AWTK 参数需要在AIC SDK 根目录使用命令
使用make menuconfig 进入可视化界面进行配置对SDK进行配置。具体使用可以参考AIC docs
1. 配置说明
配置所在路径:在AIC SDK 根目录使用命令make menuconfig 进入可视化界面,选择AWTK GUI
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 中
#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 文件,参考代码
# 这里是添加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 后,系统启动后默认运行启动脚本内容。对于里面内容不需要修改,仅仅需要修改切换路径的命令和输出信息的路径即可。
关键信息:
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的功能配置,按如下选择:
Linux
Memory Management options
[*] Contiguous Memory Allocator
CMA区域的大小配置,如下默认配置为 16MB,建议修改为20M,可以根据具体需求来配置size大小
Linux
Library routines
[*] DMA Contiguous Memory Allocator
(20) Size in Mega Bytes
打开 dma-buf 在SDK根目录下执行 make kernel-menuconfig,进入kernel的功能配置,按如下选择:
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 目录下
# 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.硬件图片解码格式支持
关于格式描述方式: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基本已经对接好很多接口了,文件系统,系统时钟,多线程都不需要进行额外的对接。仅仅对接好显示设备、输入设备、硬件加速和解码部分即可。
对接源码结构:
-> 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库进行解码。