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

AWTK 在树莓派 pico 上的移植笔记

在这里插入图片描述

1. 配置文件 (awtk_config.h)

pico 和 stm32f103 的配置差不多,虽然 pico 的内存要大不少,但是也不足提供一个完整的 FrameBuffer,所以只能使用片段 LCD。

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

 /* 使用片段 LCD */
 #define FRAGMENT_FRAME_BUFFER_SIZE 40 * 1024

 /* pico 提供了一个 sleep_us 的函数的函数 */
 #define HAS_SLEEP_US64 1

2. LCD 的实现

为了提高刷新的效率,我们实现一个 lcd_draw_bitmap_impl 函数,这样可以调用更底层的函数。

static ret_t lcd_pico_update(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t* p) {
  int n = w * h;
  LCD_SetWindow(x, y, x + w, y + h); 

  DEV_Digital_Write(LCD_DC_PIN,1);
  DEV_Digital_Write(LCD_CS_PIN,0);
  while(n--) {
    uint16_t v = *p++;
    SPI4W_Write_Byte(v >> 8); 
    SPI4W_Write_Byte(v & 0XFF);
  }
  DEV_Digital_Write(LCD_CS_PIN,1);

  return RET_OK;
}

#define lcd_draw_bitmap_impl lcd_pico_update

这里其实还可以进一步优化,调用 spi_write_blocking 函数,直接写入整个数组,减少函数调用的开销,不过字节顺序可能需要调整。

3. 触摸屏的实现

SDK 提供了一个触摸屏的驱动,但是里面并没有合适的函数来读取触摸屏的数据,所以我们需要自己实现一个 TP_Read,调用 TP_Read 读取坐标,分发到 AWTK 主循环。

ret_t platform_disaptch_input(main_loop_t* l) {
  int x = 0;
  int y = 0;
  int pressed = 0;
  TP_Read(&x, &y, &pressed);
  
  if (pressed) {
    main_loop_post_pointer_event(main_loop(), TRUE, x, y); 
  } else {
    main_loop_post_pointer_event(main_loop(), FALSE, x, y); 
  }

  return RET_OK;
}

static lcd_t* platform_create_lcd(wh_t w, wh_t h) {
  return lcd_mem_fragment_create(w, h); 
}

4. 平台函数

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

uint64_t get_time_ms64(void) {
  return to_ms_since_boot(get_absolute_time());
}

5. 编译脚本

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

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

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

add_library(awtk
  ${AWTK_BASE_SOURCE_FILES}
  ${AWTK_RAW_COMMON_SOURCE_FILES}
  ${AWTK_PORT_SOURCE_FILES}
  ${AWTK_PORT_RAW_SOURCE_FILES}
  )

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

相关文章:

  • 在MySQL 主库上进行自动清理 purged gtid 时,会等待 binlog复制到从库吗
  • Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
  • ubuntu安装sublime安装与免费使用
  • Word窗体联动Excel实现级联组合框
  • 水电站视频智能监控系统方案设计与技术应用方案
  • GPT人工智能在医疗文档中的应用
  • HTMLCSSJavaScriptDOM 之间的关系?
  • 组态页面渲染器通过npm包方式使用页面没有渲染成功的问题
  • gesp(三级)(14)洛谷:B4039:[GESP202409 三级] 回文拼接
  • 贪心算法求解加油站问题
  • 《ROS2 机器人开发 从入门道实践》 鱼香ROS2——第4章内容
  • WebAuthn 项目常见问题解决方案
  • C++抽象类与类继承相关注意事项 [学习笔记]
  • select 1 from table的作用 详解
  • 【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
  • sentinel学习笔记8-系统自适应与黑白名单限流
  • LabVIEW实现GSM/GPRS通信
  • LeetCode 3138.同位字符串连接的最小长度:计数(一个数最多128个因数)
  • Python中定位元素包含文本信息的详细解析与代码示例
  • QWebChannel实现与JS的交互
  • 使用React构建一个掷骰子的小游戏
  • skywalking 搭建
  • 【漫话机器学习系列】016.误差中的偏差(BIAS)
  • 【漏洞复现】CVE-2015-5531 Arbitrary File Reading
  • 序列化和反序列化(二)
  • ML-Agents 概述(二)