diff options
Diffstat (limited to 'firmware/target/hosted/samsungypr/ypr1/mcs5000.h')
-rw-r--r-- | firmware/target/hosted/samsungypr/ypr1/mcs5000.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/firmware/target/hosted/samsungypr/ypr1/mcs5000.h b/firmware/target/hosted/samsungypr/ypr1/mcs5000.h new file mode 100644 index 0000000000..45cce19a32 --- /dev/null +++ b/firmware/target/hosted/samsungypr/ypr1/mcs5000.h | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Unfortunately I couldn't find any datasheet for this touch controller nor | ||
3 | * any other information. I tried to send Melfas an email but their servers | ||
4 | * seem to be full in this period. The best thing I could find is a Linux | ||
5 | * driver written by Samsung. | ||
6 | * In the opensource package for YP-R1 there are also some more information | ||
7 | * in the file r1TouchMelfasReg.h, which at the moment are not used (I2C stuff | ||
8 | * and error codes) | ||
9 | * | ||
10 | * The rest, function definitions, are written by me (Lorenzo Miori) | ||
11 | * | ||
12 | * mcs5000_ts.c - Touchscreen driver for MELFAS MCS-5000 controller | ||
13 | * | ||
14 | * Copyright (C) 2009 Samsung Electronics Co.Ltd | ||
15 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
16 | * | ||
17 | * Based on wm97xx-core.c | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or modify it | ||
20 | * under the terms of the GNU General Public License as published by the | ||
21 | * Free Software Foundation; either version 2 of the License, or (at your | ||
22 | * option) any later version. | ||
23 | * | ||
24 | */ | ||
25 | |||
26 | /** | ||
27 | * This is the wrapper to r1Touch.ko module with the possible | ||
28 | * ioctl calls | ||
29 | * The touchscreen controller is the Melfas MCS5000 | ||
30 | */ | ||
31 | |||
32 | #define MCS5000_IOCTL_MAGIC 'X' | ||
33 | |||
34 | #define MCS5000_IOCTL_TOUCH_RESET 0 | ||
35 | #define MCS5000_IOCTL_TOUCH_ON 1 | ||
36 | #define MCS5000_IOCTL_TOUCH_OFF 2 | ||
37 | #define MCS5000_IOCTL_TOUCH_FLUSH 3 | ||
38 | #define MCS5000_IOCTL_TOUCH_SLEEP 4 | ||
39 | #define MCS5000_IOCTL_TOUCH_WAKE 5 | ||
40 | #define MCS5000_IOCTL_TOUCH_ENTER_FWUPG_MODE 6 | ||
41 | #define MCS5000_IOCTL_TOUCH_I2C_READ 7 | ||
42 | #define MCS5000_IOCTL_TOUCH_I2C_WRITE 8 | ||
43 | #define MCS5000_IOCTL_TOUCH_RESET_AFTER_FWUPG 9 | ||
44 | #define MCS5000_IOCTL_TOUCH_RIGHTHAND 10 | ||
45 | #define MCS5000_IOCTL_TOUCH_LEFTHAND 11 | ||
46 | #define MCS5000_IOCTL_TOUCH_IDLE 12 | ||
47 | #define MCS5000_IOCTL_TOUCH_SET_SENSE 13 | ||
48 | #define MCS5000_IOCTL_TOUCH_GET_VER 14 | ||
49 | #define MCS5000_IOCTL_TOUCH_SET_REP_RATE 15 | ||
50 | #define MCS5000_IOCTL_TOUCH_ENABLE_WDOG 16 | ||
51 | #define MCS5000_IOCTL_TOUCH_DISABLE_WDOG 17 | ||
52 | |||
53 | struct mcs5000_i2c_data | ||
54 | { | ||
55 | int count; | ||
56 | unsigned char addr; | ||
57 | unsigned char pData[256]; | ||
58 | } __attribute__((packed)); | ||
59 | |||
60 | #define DEV_CTRL_TOUCH_RESET _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_RESET) | ||
61 | #define DEV_CTRL_TOUCH_ON _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_ON) | ||
62 | #define DEV_CTRL_TOUCH_OFF _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_OFF) | ||
63 | #define DEV_CTRL_TOUCH_FLUSH _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_FLUSH) | ||
64 | #define DEV_CTRL_TOUCH_SLEEP _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_SLEEP) | ||
65 | #define DEV_CTRL_TOUCH_WAKE _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_WAKE) | ||
66 | #define DEV_CTRL_TOUCH_ENTER_FWUPG_MODE _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_ENTER_FWUPG_MODE) | ||
67 | #define DEV_CTRL_TOUCH_I2C_READ _IOWR(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_I2C_READ, mcs5000_i2c_data) | ||
68 | #define DEV_CTRL_TOUCH_I2C_WRITE _IOWR(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_I2C_WRITE, mcs5000_i2c_data) | ||
69 | #define DEV_CTRL_TOUCH_RESET_AFTER_FWUPG _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_RESET_AFTER_FWUPG) | ||
70 | #define DEV_CTRL_TOUCH_RIGHTHAND _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_RIGHTHAND) | ||
71 | #define DEV_CTRL_TOUCH_LEFTHAND _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_LEFTHAND) | ||
72 | #define DEV_CTRL_TOUCH_IDLE _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_IDLE) | ||
73 | #define DEV_CTRL_TOUCH_SET_SENSE _IOW(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_SET_SENSE, int) | ||
74 | #define DEV_CTRL_TOUCH_GET_VER _IOR(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_GET_VER, int) | ||
75 | #define DEV_CTRL_TOUCH_SET_REP_RATE _IOW(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_SET_REP_RATE, int) | ||
76 | #define DEV_CTRL_TOUCH_ENABLE_WDOG _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_ENABLE_WDOG) | ||
77 | #define DEV_CTRL_TOUCH_DISABLE_WDOG _IO(MCS5000_IOCTL_MAGIC, MCS5000_IOCTL_TOUCH_DISABLE_WDOG) | ||
78 | #define DEV_CTRL_TOUCH_MAX_NR 18 | ||
79 | |||
80 | /* Register definitions */ | ||
81 | #define MCS5000_TS_STATUS 0x00 | ||
82 | #define STATUS_OFFSET 0 | ||
83 | #define STATUS_NO (0 << STATUS_OFFSET) | ||
84 | #define STATUS_INIT (1 << STATUS_OFFSET) | ||
85 | #define STATUS_SENSING (2 << STATUS_OFFSET) | ||
86 | #define STATUS_COORD (3 << STATUS_OFFSET) | ||
87 | #define STATUS_GESTURE (4 << STATUS_OFFSET) | ||
88 | #define ERROR_OFFSET 4 | ||
89 | #define ERROR_NO (0 << ERROR_OFFSET) | ||
90 | #define ERROR_POWER_ON_RESET (1 << ERROR_OFFSET) | ||
91 | #define ERROR_INT_RESET (2 << ERROR_OFFSET) | ||
92 | #define ERROR_EXT_RESET (3 << ERROR_OFFSET) | ||
93 | #define ERROR_INVALID_REG_ADDRESS (8 << ERROR_OFFSET) | ||
94 | #define ERROR_INVALID_REG_VALUE (9 << ERROR_OFFSET) | ||
95 | |||
96 | #define MCS5000_TS_OP_MODE 0x01 | ||
97 | #define RESET_OFFSET 0 | ||
98 | #define RESET_NO (0 << RESET_OFFSET) | ||
99 | #define RESET_EXT_SOFT (1 << RESET_OFFSET) | ||
100 | #define OP_MODE_OFFSET 1 | ||
101 | #define OP_MODE_SLEEP (0 << OP_MODE_OFFSET) | ||
102 | #define OP_MODE_ACTIVE (1 << OP_MODE_OFFSET) | ||
103 | #define GESTURE_OFFSET 4 | ||
104 | #define GESTURE_DISABLE (0 << GESTURE_OFFSET) | ||
105 | #define GESTURE_ENABLE (1 << GESTURE_OFFSET) | ||
106 | #define PROXIMITY_OFFSET 5 | ||
107 | #define PROXIMITY_DISABLE (0 << PROXIMITY_OFFSET) | ||
108 | #define PROXIMITY_ENABLE (1 << PROXIMITY_OFFSET) | ||
109 | #define SCAN_MODE_OFFSET 6 | ||
110 | #define SCAN_MODE_INTERRUPT (0 << SCAN_MODE_OFFSET) | ||
111 | #define SCAN_MODE_POLLING (1 << SCAN_MODE_OFFSET) | ||
112 | #define REPORT_RATE_OFFSET 7 | ||
113 | #define REPORT_RATE_40 (0 << REPORT_RATE_OFFSET) | ||
114 | #define REPORT_RATE_80 (1 << REPORT_RATE_OFFSET) | ||
115 | |||
116 | #define MCS5000_TS_SENS_CTL 0x02 | ||
117 | #define MCS5000_TS_FILTER_CTL 0x03 | ||
118 | #define PRI_FILTER_OFFSET 0 | ||
119 | #define SEC_FILTER_OFFSET 4 | ||
120 | |||
121 | #define MCS5000_TS_X_SIZE_UPPER 0x08 | ||
122 | #define MCS5000_TS_X_SIZE_LOWER 0x09 | ||
123 | #define MCS5000_TS_Y_SIZE_UPPER 0x0A | ||
124 | #define MCS5000_TS_Y_SIZE_LOWER 0x0B | ||
125 | |||
126 | #define MCS5000_TS_INPUT_INFO 0x10 | ||
127 | #define INPUT_TYPE_OFFSET 0 | ||
128 | #define INPUT_TYPE_NONTOUCH (0 << INPUT_TYPE_OFFSET) | ||
129 | #define INPUT_TYPE_SINGLE (1 << INPUT_TYPE_OFFSET) | ||
130 | #define INPUT_TYPE_DUAL (2 << INPUT_TYPE_OFFSET) | ||
131 | #define INPUT_TYPE_PALM (3 << INPUT_TYPE_OFFSET) | ||
132 | #define INPUT_TYPE_PROXIMITY (7 << INPUT_TYPE_OFFSET) | ||
133 | #define GESTURE_CODE_OFFSET 3 | ||
134 | #define GESTURE_CODE_NO (0 << GESTURE_CODE_OFFSET) | ||
135 | |||
136 | #define MCS5000_TS_X_POS_UPPER 0x11 | ||
137 | #define MCS5000_TS_X_POS_LOWER 0x12 | ||
138 | #define MCS5000_TS_Y_POS_UPPER 0x13 | ||
139 | #define MCS5000_TS_Y_POS_LOWER 0x14 | ||
140 | #define MCS5000_TS_Z_POS 0x15 | ||
141 | #define MCS5000_TS_WIDTH 0x16 | ||
142 | #define MCS5000_TS_GESTURE_VAL 0x17 | ||
143 | #define MCS5000_TS_MODULE_REV 0x20 | ||
144 | #define MCS5000_TS_FIRMWARE_VER 0x21 | ||
145 | |||
146 | /* Touchscreen absolute values */ | ||
147 | #define MCS5000_MAX_XC 0x3ff | ||
148 | #define MCS5000_MAX_YC 0x3ff | ||
149 | |||
150 | /* this struct also seems to have an alignment requirement (256-byte aligned?). | ||
151 | * touchscreen won't work correctly with 8-byte alignment. The aligned attribute | ||
152 | * cannot be attached here because it would make the struct larger and packed | ||
153 | * be ignored. | ||
154 | * See also mcs5000_read() */ | ||
155 | struct mcs5000_raw_data | ||
156 | { | ||
157 | unsigned char inputInfo; | ||
158 | unsigned char xHigh; | ||
159 | unsigned char xLow; | ||
160 | unsigned char yHigh; | ||
161 | unsigned char yLow; | ||
162 | unsigned char z; | ||
163 | unsigned char width; | ||
164 | unsigned char gesture; | ||
165 | } __attribute__((packed)); | ||
166 | |||
167 | /** | ||
168 | * Two possibilities for hand usage | ||
169 | */ | ||
170 | enum | ||
171 | { | ||
172 | RIGHT_HAND, | ||
173 | LEFT_HAND, | ||
174 | }; | ||
175 | |||
176 | /* Open device */ | ||
177 | void mcs5000_init(void); | ||
178 | /* Close device */ | ||
179 | void mcs5000_close(void); | ||
180 | /* Power up the chip (voltages) */ | ||
181 | void mcs5000_power(void); | ||
182 | /* Shutdown the chip (voltages) */ | ||
183 | void mcs5000_shutdown(void); | ||
184 | /* Set user hand usage */ | ||
185 | void mcs5000_set_hand(int hand_setting); | ||
186 | /* Set touchscreen sensitivity. Valid values are 1,2,4,8 */ | ||
187 | void mcs5000_set_sensitivity(int level); | ||
188 | /* Read controller's data */ | ||
189 | int mcs5000_read(struct mcs5000_raw_data *touchData); | ||