当前位置: 首页 > article >正文

AWTK 在 ESP 上的移植笔记

AWTK 在 ESP 上的移植笔记

在这里插入图片描述

1. 配置文件 (awtk_config.h)

这块板子 esps3 和 stm32f429 的配置差不多,内存可以提供双帧缓冲,可支持 png 和矢量字体。

我们在 awtk-stm32f429igtx 的配置 基础稍作修改即可。

/**
 * 使用标准的 malloc 函数。
 *
 */
#define HAS_STD_MALLOC 1

/**
 * 支持 printf 函数。
 *
 */
#define HAS_STDIO 1

/**
 * 包含 FreeRTOS 的头文件时带 freertos 目录。
 *
 */
#define WITH_FREE_RTOS_DIR 1

2. LCD 的实现

把 LVGL 例子中的代码拷贝过来,稍作修改即可。

static ret_t lcd_esp_flush(lcd_t* lcd) {
  lcd_mem_t* mem = (lcd_mem_t*)lcd;
  void* offline_buf = lcd_mem_get_offline_fb(mem);
  esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t)lcd->impl_data;

#if CONFIG_EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
  xSemaphoreGive(sem_gui_ready);
  xSemaphoreTake(sem_vsync_end, portMAX_DELAY);
#endif

  esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, lcd->w, lcd->h, offline_buf);

  return RET_OK;
}

lcd_t* lcd_impl_create(wh_t w, wh_t h) {
  lcd_t* lcd = NULL;
  ...
  /*把 LVGL 例子中创建 LCD 的代码拷贝过来*/
  ...
  lcd = lcd_mem_bgr565_create_single_fb(EXAMPLE_LCD_H_RES, EXAMPLE_LCD_V_RES, offline_buff);
  return_value_if_fail(lcd != NULL, NULL);

  lcd->impl_data = panel_handle;
  lcd->flush = lcd_esp_flush;
  s_touch_handle = tp;

  return lcd;
}  

如果使用双帧缓冲,会出现严重的撕裂感,所以我们只使用单帧缓冲,在 flush 函数中再刷新到屏幕上。


## 3. 触摸屏的实现

把 LVGL 例子中的代码拷贝过来,稍作修改即可。不过这里有点小问题,即使一直按住,touchpad_pressed 仍然会变成为 false,会不断上报 down/up 事件。

```c

static int s_prev_x = 0;
static int s_prev_y = 0;
static bool s_prev_pressed = FALSE;

ret_t platform_disaptch_touch_events(main_loop_t* loop) {
  uint16_t touchpad_x[1] = {0};
  uint16_t touchpad_y[1] = {0};
  uint8_t touchpad_cnt = 0;
  uint64_t now = time_now_ms();
  /* Read touch controller data */
  if (esp_lcd_touch_read_data(s_touch_handle) != ESP_OK) {
    return RET_OK;
  }

  /* Get coordinates */
  bool touchpad_pressed =
      esp_lcd_touch_get_coordinates(s_touch_handle, touchpad_x, touchpad_y, NULL, &touchpad_cnt, 1);

  if (touchpad_pressed && touchpad_cnt > 0) {
    int x = touchpad_x[0];
    int y = touchpad_y[0];

    s_prev_x = x;
    s_prev_y = y;
    main_loop_post_pointer_event(loop, TRUE, x, y);
    printf("down x: %d, y: %d\n", x, y);
    s_prev_pressed = TRUE;
  } else if (s_prev_pressed) {
    /*FIXME: 很奇怪 即使一直按住,touchpad_pressed 仍然为 false */
    main_loop_post_pointer_event(loop, FALSE, s_prev_x, s_prev_y);
    printf("up time: %lld x: %d, y: %d touchpad_pressed: %d touchpad_cnt: %d\n", now, s_prev_x,
           s_prev_y, touchpad_pressed, touchpad_cnt);
    s_prev_pressed = FALSE;
  }

  return RET_OK;
}

4. 平台函数

平台函数只需要实现 get_time_ms64sleep_ms 即可。

uint64_t get_time_ms64(void) {
  return esp_timer_get_time() / 1000;
}

void sleep_ms(uint32_t ms) {
  rtos_delay(ms);
}

5. 编译脚本

  • cmake

esp 使用 cmake 编译,我们需要在 CMakeLists.txt 中添加 AWTK 的源码和头文件。 awtk_mobile_common.mk 本来是给 Android/iOS/HarmonyOS/Web 用的,在这里也可以直接使用,省去不少功夫。

include(${CMAKE_CURRENT_LIST_DIR}/awtk/scripts/awtk_mobile_common.mk)

set(AWTK_FLAGS " -w ")
set(CMAKE_C_FLAGS "${AWTK_FLAGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${AWTK_FLAGS} ${CMAKE_CXX_FLAGS}")

set(AWTK_ALL_SOURCES_FILES
  ${AWTK_BASE_SOURCE_FILES}
  ${AWTK_RAW_COMMON_SOURCE_FILES}
  ${AWTK_PORT_SOURCE_FILES}
  ${AWTK_PORT_FREERTOS_SOURCE_FILES}
  ${AWTK_VGCANVAS_SOFT_SOURCE_FILES}
  )

idf_component_register(
  SRCS ${AWTK_ALL_SOURCES_FILES}
  INCLUDE_DIRS ${AWTK_COMMON_INCLUDES} ${CMAKE_CURRENT_LIST_DIR}/awtk-port ${AWTK_NANOVG_AGGE_INCLUDES}
  REQUIRES "driver" "esp_lcd" "esp_timer" "esp_system" "espressif__esp_lcd_touch_gt911" "espressif__esp_lcd_touch" "freertos"
)
  • Kconfig
menu "AWTK GUI"
    config HAS_AWTK_CONFIG
        bool "has awtk_config.h"
        default y

endmenu

默认配置修改

  • 修改分区表

默认文件位置为 C://Espressif/frameworks/esp-idf-v5.3.2/components/partition_table/partitions_singleapp.csv

# Name,   Type, SubType, Offset,  Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,      data, nvs,     ,        0x6000,
phy_init, data, phy,     ,        0x1000,
factory,  app,  factory, ,        6M,
  • 修改主线程栈大小
CONFIG_ESP_MAIN_TASK_STACK_SIZE=64000
  • 修改 flash 分区大小
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
CONFIG_ESPTOOLPY_FLASHSIZE="8MB"
  • 其它配置请参考 开发板的配置

http://www.kler.cn/a/463481.html

相关文章:

  • 卸载干净 IDEA(图文讲解)
  • MySQL秘籍之索引与查询优化实战指南
  • vue2、element的el-select 选项框的宽度设置、文本过长问题
  • 图书项目:整合SSM
  • 【Redis】集群配置(主从复制 哨兵搭建)
  • 建立一个Macos载入image的实例含界面
  • quasar v2 setup语法中报错: undefined is not an object (evaluating ‘this.$q.notify‘)
  • 使用 Actix-Web、SQLx 和 Redis 构建高性能 Rust Web 服务
  • 电子电气架构 --- 安全相关内容汇总
  • HeidiSQL导入与导出数据
  • 【GO基础学习】Go操作数据库MySQL
  • webpack打包node后端项目
  • 3维场景测试自动化
  • 18.2、网络安全评测技术与攻击
  • excel怎么删除右边无限列(亲测有效)
  • 青少年编程与数学 02-005 移动Web编程基础 15课题、移动应用开发
  • CentOS Stream 9 安装 JDK
  • 三分钟在你的react项目中引入tailwindcss
  • Vue.js组件开发-刷新当前页面方法
  • pyQT + OpenCV小练习
  • PyCharm专项训练5 最短路径算法
  • 【kubernetes组件合集】深入解析Kubernetes组件之三:client-go
  • 中国香港阿里云200M不限流量轻量云主机测试报告
  • 怎样用 Excel 做数据分析?
  • python-leetcode-删除有序数组中的重复项 II
  • SOME/IP 协议详解——远程过程调用(RPC)