summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/touchscreen.c31
-rw-r--r--firmware/export/config/cowond2.h1
-rw-r--r--firmware/export/config/mrobe500.h2
-rw-r--r--firmware/export/config/ondavx747.h1
-rw-r--r--firmware/export/config/ondavx767.h7
-rw-r--r--firmware/export/config/ondavx777.h1
-rw-r--r--firmware/export/config/sim.h1
-rw-r--r--firmware/export/lcd.h10
-rw-r--r--firmware/export/touchscreen.h1
-rw-r--r--firmware/target/hosted/android/lcd-android.c26
-rw-r--r--firmware/target/hosted/sdl/lcd-sdl.c6
11 files changed, 85 insertions, 2 deletions
diff --git a/firmware/drivers/touchscreen.c b/firmware/drivers/touchscreen.c
index 9660e0cb9d..823c2e7a92 100644
--- a/firmware/drivers/touchscreen.c
+++ b/firmware/drivers/touchscreen.c
@@ -25,6 +25,7 @@
#include "touchscreen.h"
#include "string.h"
#include "logf.h"
+#include "lcd.h"
/* Size of the 'dead zone' around each 3x3 button */
#define BUTTON_MARGIN_X (int)(LCD_WIDTH * 0.03)
@@ -167,3 +168,33 @@ enum touchscreen_mode touchscreen_get_mode(void)
{
return current_mode;
}
+
+
+#if ((CONFIG_PLATFORM & PLATFORM_ANDROID) == 0)
+/* android has an API for this */
+
+#define TOUCH_SLOP 16u
+#define REFERENCE_DPI 160
+
+int touchscreen_get_scroll_threshold(void)
+{
+#ifdef LCD_DPI
+ const int dpi = LCD_DPI;
+#else
+ const int dpi = lcd_get_dpi();
+#endif
+
+ /* Inspired by Android calculation
+ *
+ * float density = real dpi / reference dpi (=160)
+ * int threshold = (int) (density * TOUCH_SLOP + 0.5f);(original calculation)
+ *
+ * + 0.5f is for rounding, we use fixed point math to achieve that
+ */
+
+ int result = dpi * (TOUCH_SLOP<<1) / REFERENCE_DPI;
+ result += result & 1; /* round up if needed */
+ return result>>1;
+}
+
+#endif
diff --git a/firmware/export/config/cowond2.h b/firmware/export/config/cowond2.h
index f9de2768bd..ebaa636ac7 100644
--- a/firmware/export/config/cowond2.h
+++ b/firmware/export/config/cowond2.h
@@ -75,6 +75,7 @@
/* LCD dimensions */
#define LCD_WIDTH 320
#define LCD_HEIGHT 240
+#define LCD_DPI 160
#define LCD_DEPTH 16
#define LCD_PIXELFORMAT 565
diff --git a/firmware/export/config/mrobe500.h b/firmware/export/config/mrobe500.h
index 9a201951fc..776b0315f8 100644
--- a/firmware/export/config/mrobe500.h
+++ b/firmware/export/config/mrobe500.h
@@ -87,9 +87,11 @@
#if _RESOLUTION == _LCD_RES_VGA
#define LCD_NATIVE_WIDTH 480
#define LCD_NATIVE_HEIGHT 640
+#define LCD_DPI 216
#else
#define LCD_NATIVE_WIDTH 240
#define LCD_NATIVE_HEIGHT 320
+#define LCD_DPI 108
#endif
/* choose the lcd orientation. CONFIG_ORIENTATION defined in config.h */
diff --git a/firmware/export/config/ondavx747.h b/firmware/export/config/ondavx747.h
index ae80cac562..1cd9143965 100644
--- a/firmware/export/config/ondavx747.h
+++ b/firmware/export/config/ondavx747.h
@@ -79,6 +79,7 @@
#define LCD_WIDTH 240
#define LCD_HEIGHT 400
#endif
+#define LCD_DPI 155
#define LCD_DEPTH 16 /* 16bit colours */
#define LCD_PIXELFORMAT RGB565 /* rgb565 */
diff --git a/firmware/export/config/ondavx767.h b/firmware/export/config/ondavx767.h
index 19bb7ed580..bf9aaed7c1 100644
--- a/firmware/export/config/ondavx767.h
+++ b/firmware/export/config/ondavx767.h
@@ -65,8 +65,11 @@
/* LCD dimensions */
#define CONFIG_LCD LCD_ONDAVX767
-#define LCD_WIDTH 320
-#define LCD_HEIGHT 240
+/* this are not actually the correct dimensions (480x272 is correct)
+ * should be fixed once there's a working LCD driver */
+#define LCD_WIDTH 480
+#define LCD_HEIGHT 272
+#define LCD_DPI 128
#define LCD_DEPTH 16 /* 16bit colours */
#define LCD_PIXELFORMAT RGB565 /* rgb565 */
diff --git a/firmware/export/config/ondavx777.h b/firmware/export/config/ondavx777.h
index a2ad15533a..b6e7546590 100644
--- a/firmware/export/config/ondavx777.h
+++ b/firmware/export/config/ondavx777.h
@@ -73,6 +73,7 @@
#define LCD_WIDTH 240
#define LCD_HEIGHT 400
#endif
+#define LCD_DPI 155
#define LCD_DEPTH 16 /* 16bit colours */
#define LCD_PIXELFORMAT RGB565 /* rgb565 */
diff --git a/firmware/export/config/sim.h b/firmware/export/config/sim.h
index 066201ad08..fc7996e813 100644
--- a/firmware/export/config/sim.h
+++ b/firmware/export/config/sim.h
@@ -19,6 +19,7 @@
#undef HAVE_ATA_POWER_OFF
#undef CONFIG_LCD
+#undef LCD_DPI /* likely to be too different on a PC */
#undef CONFIG_LED
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 79231d198e..e6e19b1597 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -549,4 +549,14 @@ extern void lcd_bitmap_transparent(const fb_data *src, int x, int y,
#endif /* HAVE_LCD_BITMAP */
+
+#ifdef HAVE_TOUCHSCREEN
+/* only needed for touchscreen for now, feel free to implement it for others
+ * once needed
+ */
+
+/* returns the pixel density of the display */
+extern int lcd_get_dpi(void);
+#endif
+
#endif /* __LCD_H__ */
diff --git a/firmware/export/touchscreen.h b/firmware/export/touchscreen.h
index 7d1eb4ac8a..a27e60c653 100644
--- a/firmware/export/touchscreen.h
+++ b/firmware/export/touchscreen.h
@@ -50,5 +50,6 @@ void touchscreen_set_mode(enum touchscreen_mode mode);
enum touchscreen_mode touchscreen_get_mode(void);
void touchscreen_disable_mapping(void);
void touchscreen_reset_mapping(void);
+int touchscreen_get_scroll_threshold(void);
#endif /* __TOUCHSCREEN_INCLUDE_H_ */
diff --git a/firmware/target/hosted/android/lcd-android.c b/firmware/target/hosted/android/lcd-android.c
index 78b1f12f7f..f4ef7b5e75 100644
--- a/firmware/target/hosted/android/lcd-android.c
+++ b/firmware/target/hosted/android/lcd-android.c
@@ -35,6 +35,8 @@ static jmethodID java_lcd_update;
static jmethodID java_lcd_update_rect;
static bool display_on;
+static int dpi;
+static int scroll_threshold;
void lcd_init_device(void)
{
@@ -77,6 +79,20 @@ void lcd_init_device(void)
RockboxFramebuffer_class,
"java_lcd_update_rect",
"(IIII)V");
+
+ jmethodID get_dpi = e->GetMethodID(env_ptr,
+ RockboxFramebuffer_class,
+ "getDpi", "()I");
+
+ jmethodID get_scroll_threshold
+ = e->GetMethodID(env_ptr,
+ RockboxFramebuffer_class,
+ "getScrollThreshold", "()I");
+
+ dpi = e->CallIntMethod(env_ptr, RockboxFramebuffer_instance,
+ get_dpi);
+ scroll_threshold = e->CallIntMethod(env_ptr, RockboxFramebuffer_instance,
+ get_scroll_threshold);
display_on = true;
}
@@ -101,6 +117,16 @@ bool lcd_active(void)
return display_on;
}
+int lcd_get_dpi(void)
+{
+ return dpi;
+}
+
+int touchscreen_get_scroll_threshold(void)
+{
+ return scroll_threshold;
+}
+
/*
* (un)block lcd updates.
*
diff --git a/firmware/target/hosted/sdl/lcd-sdl.c b/firmware/target/hosted/sdl/lcd-sdl.c
index 15e4ba95c3..96b1a04aa6 100644
--- a/firmware/target/hosted/sdl/lcd-sdl.c
+++ b/firmware/target/hosted/sdl/lcd-sdl.c
@@ -111,3 +111,9 @@ void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end,
SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps);
}
+int lcd_get_dpi(void)
+{
+ /* TODO: find a way to query it from the OS, SDL doesn't support it
+ * directly; for now assume the more or less standard 96 */
+ return 96;
+}