将AWTK移植到STM32f429igtx裸系统

AWTK的可移植性很高,在移植时只需要实现平台初始化、lcd和mainloop三个方面的东西。本文以STM32f429igtx为例介绍移植AWTK到新平台的过程。

一、平台初始化

除了基本的libc函数外,AWTK对平台没有特别要求,在stm32f429igtx上没有函数gettimeofday,所以要实现一个获取当前时间的函数get_time_ms。另外需要给GUI分配一块内存空间,并调用tk_mem_init。

  1. uint32_t get_time_ms() {
  2. return HAL_GetTick();
  3. }
  4. void sleep_ms(uint32_t ms) {
  5. delay_ms(ms);
  6. }
  7. #define MEM2_MAX_SIZE 28912 * 1024
  8. #define MEM2_ADDR (uint8_t*)0XC01F4000
  9. ret_t platform_prepare(void) {
  10. tk_mem_init(MEM2_ADDR, MEM2_MAX_SIZE);
  11. return RET_OK;
  12. }

参考:awtk-port/platform.c

二、实现lcd

stm32f429igtx使用基于framebuffer的lcd的缺省实现,只需要调用函数lcd_mem_create_double_fb即可。

  1. extern u32 *ltdc_framebuf[2];
  2. #define online_fb_addr (uint8_t*)ltdc_framebuf[0]
  3. #define offline_fb_addr (uint8_t*)ltdc_framebuf[1]
  4. lcd_t* platform_create_lcd(wh_t w, wh_t h) {
  5. return lcd_mem_create_double_fb(lcdltdc.pwidth, lcdltdc.pheight, online_fb_addr, offline_fb_addr);
  6. }

参考 awtk-port/main_loop_stm32_raw.c

三、实现main_loop

main_loop主要负责事件分发和绘制这个不断循环的过程。main_loop_raw.inc里实现了裸系统main_loop的基本功能,在移植时加上输入事件的的分发即可:

  1. #include "base/g2d.h"
  2. #include "base/idle.h"
  3. #include "base/timer.h"
  4. #include "lcd/lcd_mem_rgb565.h"
  5. #include "main_loop/main_loop_simple.h"
  6. extern u32 *ltdc_framebuf[2];
  7. #define online_fb_addr (uint8_t*)ltdc_framebuf[0]
  8. #define offline_fb_addr (uint8_t*)ltdc_framebuf[1]
  9. uint8_t platform_disaptch_input(main_loop_t* loop) {
  10. int x = 0;
  11. int y = 0;
  12. uint8_t key = KEY_Scan(0);
  13. tp_dev.scan(0);
  14. x = tp_dev.x[0];
  15. y = tp_dev.y[0];
  16. y = lcdltdc.pheight - tp_dev.x[0];
  17. x = tp_dev.y[0];
  18. if(tp_dev.sta&TP_PRES_DOWN){
  19. main_loop_post_pointer_event(loop, TRUE, x, y);
  20. } else {
  21. main_loop_post_pointer_event(loop, FALSE, x, y);
  22. }
  23. return 0;
  24. }
  25. lcd_t* platform_create_lcd(wh_t w, wh_t h) {
  26. return lcd_mem_rgb565_create_double_fb(w, h, online_fb_addr, offline_fb_addr);
  27. }
  28. #include "main_loop/main_loop_raw.inc"

参考 awtk-port/main_loop_stm32_raw.c

注:正点原子的开发实验板为载体移植,其它开发板应该差不多。

完整项目和源码请参考:awtk-stm32f429igtx-raw