From 4e8d6639f001bcf3939bfe8012943f287289d287 Mon Sep 17 00:00:00 2001 From: "chaos.proton@gmail.com" Date: Tue, 8 Nov 2011 09:33:18 +0000 Subject: [PATCH] bsp/stm32f10x: calibrate touch screen before starting GUI If we do not calibrate the touch screen, GUI is unusable. This patch use a semaphore to block GUI thread until calibration finish. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1791 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/stm32f10x/application.c | 13 +++++++++++++ bsp/stm32f10x/calibration.c | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/bsp/stm32f10x/application.c b/bsp/stm32f10x/application.c index 2518cb26f..5da04d883 100644 --- a/bsp/stm32f10x/application.c +++ b/bsp/stm32f10x/application.c @@ -45,6 +45,8 @@ #include "led.h" +extern rt_sem_t touch_screen_calibrated; + ALIGN(RT_ALIGN_SIZE) static rt_uint8_t led_stack[ 512 ]; static struct rt_thread led_thread; @@ -151,6 +153,17 @@ void rt_init_thread_entry(void* parameter) /* set lcd device as rtgui graphic driver */ rtgui_graphic_set_device(lcd); + /* without calibration, the position we got from the touch screen is + * useless raw value and the GUI is unusable. */ + calibration_init(); + if (touch_screen_calibrated != RT_NULL) + { + rt_sem_take(touch_screen_calibrated, RT_WAITING_FOREVER); + /* NOTE: no other thread use this semaphore, so we can delete it. + * If this is not your case, comment this line. */ + rt_sem_delete(touch_screen_calibrated); + } + /* startup rtgui */ rtgui_startup(); } diff --git a/bsp/stm32f10x/calibration.c b/bsp/stm32f10x/calibration.c index 92bd10fe4..544866f3f 100644 --- a/bsp/stm32f10x/calibration.c +++ b/bsp/stm32f10x/calibration.c @@ -30,6 +30,9 @@ struct calibration_session }; static struct calibration_session* calibration_ptr = RT_NULL; +/* a semaphore that will become avaible when calibration finished. */ +rt_sem_t touch_screen_calibrated = RT_NULL; + static void calibration_data_post(rt_uint16_t x, rt_uint16_t y) { if (calibration_ptr != RT_NULL) @@ -254,6 +257,8 @@ void calibration_entry(void* parameter) /* release memory */ rt_free(calibration_ptr); calibration_ptr = RT_NULL; + /* tell other thread that we finished calibration */ + rt_sem_release(touch_screen_calibrated); } void calibration_init() @@ -261,7 +266,12 @@ void calibration_init() rt_device_t device; device = rt_device_find("touch"); - if (device == RT_NULL) return; /* no this device */ + if (device == RT_NULL) + return; /* no such device */ + + touch_screen_calibrated = rt_sem_create("tc_cali", 0, RT_IPC_FLAG_FIFO); + if (touch_screen_calibrated == RT_NULL) + return; calibration_ptr = (struct calibration_session*)rt_malloc(sizeof(struct calibration_session)); rt_memset(calibration_ptr, 0, sizeof(struct calibration_data)); @@ -271,7 +281,8 @@ void calibration_init() calibration_ptr->tid = rt_thread_create("cali", calibration_entry, RT_NULL, 2048, 20, 5); - if (calibration_ptr->tid != RT_NULL) rt_thread_startup(calibration_ptr->tid); + if (calibration_ptr->tid != RT_NULL) + rt_thread_startup(calibration_ptr->tid); } #ifdef RT_USING_FINSH -- GitLab