summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@bitmath.org>2010-09-06 09:59:01 +0200
committerHenrik Rydberg <rydberg@bitmath.org>2010-09-06 09:59:01 +0200
commita9606c01f7edfc21a3fce1f10152fbf266e74d4f (patch)
treec036a72be47944e9bcffbf2ae7b40d102fe577c1 /usr/src
parent9c70cefed5bc44284a2cd63fc5e3b4ab3d90d0bf (diff)
Align with 2.6.37
This patch aligns wacom support with kernel 2.6.37. The tablet buttons have been remapped and the code has been prepared for adding the rest of the Bamboo family. Signed-off-by: Henrik Rydberg <rydberg@bitmath.org>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/dkms_source_tree/wacom.h1
-rw-r--r--usr/src/dkms_source_tree/wacom_sys.c57
-rw-r--r--usr/src/dkms_source_tree/wacom_wac.c108
-rw-r--r--usr/src/dkms_source_tree/wacom_wac.h12
4 files changed, 124 insertions, 54 deletions
diff --git a/usr/src/dkms_source_tree/wacom.h b/usr/src/dkms_source_tree/wacom.h
index 284dfaa..de5adb1 100644
--- a/usr/src/dkms_source_tree/wacom.h
+++ b/usr/src/dkms_source_tree/wacom.h
@@ -118,6 +118,7 @@ struct wacom {
118extern const struct usb_device_id wacom_ids[]; 118extern const struct usb_device_id wacom_ids[];
119 119
120void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); 120void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
121void wacom_setup_device_quirks(struct wacom_features *features);
121void wacom_setup_input_capabilities(struct input_dev *input_dev, 122void wacom_setup_input_capabilities(struct input_dev *input_dev,
122 struct wacom_wac *wacom_wac); 123 struct wacom_wac *wacom_wac);
123#endif 124#endif
diff --git a/usr/src/dkms_source_tree/wacom_sys.c b/usr/src/dkms_source_tree/wacom_sys.c
index 42ba369..fc6fd53 100644
--- a/usr/src/dkms_source_tree/wacom_sys.c
+++ b/usr/src/dkms_source_tree/wacom_sys.c
@@ -195,17 +195,30 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
195 features->pktlen = WACOM_PKGLEN_TPC2FG; 195 features->pktlen = WACOM_PKGLEN_TPC2FG;
196 features->device_type = BTN_TOOL_TRIPLETAP; 196 features->device_type = BTN_TOOL_TRIPLETAP;
197 } 197 }
198 features->x_max = 198 if (features->type == BAMBOO_PT) {
199 get_unaligned_le16(&report[i + 3]); 199 /* need to reset back */
200 features->x_phy = 200 features->pktlen = WACOM_PKGLEN_BBTOUCH;
201 get_unaligned_le16(&report[i + 6]); 201 features->device_type = BTN_TOOL_TRIPLETAP;
202 features->unit = report[i + 9]; 202 features->x_phy =
203 features->unitExpo = report[i + 11]; 203 get_unaligned_le16(&report[i + 5]);
204 i += 12; 204 features->x_max =
205 get_unaligned_le16(&report[i + 8]);
206 i += 15;
207 } else {
208 features->x_max =
209 get_unaligned_le16(&report[i + 3]);
210 features->x_phy =
211 get_unaligned_le16(&report[i + 6]);
212 features->unit = report[i + 9];
213 features->unitExpo = report[i + 11];
214 i += 12;
215 }
205 } else if (pen) { 216 } else if (pen) {
206 /* penabled only accepts exact bytes of data */ 217 /* penabled only accepts exact bytes of data */
207 if (features->type == TABLETPC2FG) 218 if (features->type == TABLETPC2FG)
208 features->pktlen = WACOM_PKGLEN_GRAPHIRE; 219 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
220 if (features->type == BAMBOO_PT)
221 features->pktlen = WACOM_PKGLEN_BBFUN;
209 features->device_type = BTN_TOOL_PEN; 222 features->device_type = BTN_TOOL_PEN;
210 features->x_max = 223 features->x_max =
211 get_unaligned_le16(&report[i + 3]); 224 get_unaligned_le16(&report[i + 3]);
@@ -234,6 +247,15 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
234 features->y_phy = 247 features->y_phy =
235 get_unaligned_le16(&report[i + 6]); 248 get_unaligned_le16(&report[i + 6]);
236 i += 7; 249 i += 7;
250 } else if (features->type == BAMBOO_PT) {
251 /* need to reset back */
252 features->pktlen = WACOM_PKGLEN_BBTOUCH;
253 features->device_type = BTN_TOOL_TRIPLETAP;
254 features->y_phy =
255 get_unaligned_le16(&report[i + 3]);
256 features->y_max =
257 get_unaligned_le16(&report[i + 6]);
258 i += 12;
237 } else { 259 } else {
238 features->y_max = 260 features->y_max =
239 features->x_max; 261 features->x_max;
@@ -245,6 +267,8 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
245 /* penabled only accepts exact bytes of data */ 267 /* penabled only accepts exact bytes of data */
246 if (features->type == TABLETPC2FG) 268 if (features->type == TABLETPC2FG)
247 features->pktlen = WACOM_PKGLEN_GRAPHIRE; 269 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
270 if (features->type == BAMBOO_PT)
271 features->pktlen = WACOM_PKGLEN_BBFUN;
248 features->device_type = BTN_TOOL_PEN; 272 features->device_type = BTN_TOOL_PEN;
249 features->y_max = 273 features->y_max =
250 get_unaligned_le16(&report[i + 3]); 274 get_unaligned_le16(&report[i + 3]);
@@ -333,11 +357,16 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
333 struct usb_host_interface *interface = intf->cur_altsetting; 357 struct usb_host_interface *interface = intf->cur_altsetting;
334 struct hid_descriptor *hid_desc; 358 struct hid_descriptor *hid_desc;
335 359
336 /* default device to penabled */ 360 /* default features */
337 features->device_type = BTN_TOOL_PEN; 361 features->device_type = BTN_TOOL_PEN;
362 features->x_fuzz = 4;
363 features->y_fuzz = 4;
364 features->pressure_fuzz = 0;
365 features->distance_fuzz = 0;
338 366
339 /* only Tablet PCs need to retrieve the info */ 367 /* only Tablet PCs need to retrieve the info */
340 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) 368 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
369 (features->type != BAMBOO_PT))
341 goto out; 370 goto out;
342 371
343 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { 372 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
@@ -352,12 +381,6 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
352 if (error) 381 if (error)
353 goto out; 382 goto out;
354 383
355 /* touch device found but size is not defined. use default */
356 if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
357 features->x_max = 1023;
358 features->y_max = 1023;
359 }
360
361 out: 384 out:
362 return error; 385 return error;
363} 386}
@@ -493,9 +516,11 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
493 if (error) 516 if (error)
494 goto fail2; 517 goto fail2;
495 518
519 wacom_setup_device_quirks(features);
520
496 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); 521 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
497 522
498 if (features->type == TABLETPC || features->type == TABLETPC2FG) { 523 if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
499 /* Append the device type to the name */ 524 /* Append the device type to the name */
500 strlcat(wacom_wac->name, 525 strlcat(wacom_wac->name,
501 features->device_type == BTN_TOOL_PEN ? 526 features->device_type == BTN_TOOL_PEN ?
diff --git a/usr/src/dkms_source_tree/wacom_wac.c b/usr/src/dkms_source_tree/wacom_wac.c
index d1c388e..fd2463c 100644
--- a/usr/src/dkms_source_tree/wacom_wac.c
+++ b/usr/src/dkms_source_tree/wacom_wac.c
@@ -855,12 +855,13 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
855 return retval; 855 return retval;
856} 856}
857 857
858static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len) 858static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
859{ 859{
860 static int trkid; 860 struct wacom_features *features = &wacom->features;
861 struct input_dev *input = wacom->input; 861 struct input_dev *input = wacom->input;
862 unsigned char *data = wacom->data; 862 unsigned char *data = wacom->data;
863 int i, sp = 0, sx = 0, sy = 0, count = 0; 863 int sp = 0, sx = 0, sy = 0, count = 0;
864 int i;
864 865
865 if (len != WACOM_PKGLEN_BBTOUCH) 866 if (len != WACOM_PKGLEN_BBTOUCH)
866 return 0; 867 return 0;
@@ -871,14 +872,15 @@ static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len)
871 if (p) { 872 if (p) {
872 int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; 873 int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
873 int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; 874 int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
874 /* artificial scaling */ 875 if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
875 x <<= 4; 876 x <<= 5;
876 y <<= 4; 877 y <<= 5;
878 }
877 input_report_abs(input, ABS_MT_PRESSURE, p); 879 input_report_abs(input, ABS_MT_PRESSURE, p);
878 input_report_abs(input, ABS_MT_POSITION_X, x); 880 input_report_abs(input, ABS_MT_POSITION_X, x);
879 input_report_abs(input, ABS_MT_POSITION_Y, y); 881 input_report_abs(input, ABS_MT_POSITION_Y, y);
880 if (wacom->id[i] < 0) 882 if (wacom->id[i] < 0)
881 wacom->id[i] = trkid++ & MAX_TRACKING_ID; 883 wacom->id[i] = wacom->trk_id++ & MAX_TRACKING_ID;
882 if (!count++) 884 if (!count++)
883 sp = p, sx = x, sy = y; 885 sp = p, sx = x, sy = y;
884 } else { 886 } else {
@@ -896,7 +898,8 @@ static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len)
896 input_report_abs(input, ABS_Y, sy); 898 input_report_abs(input, ABS_Y, sy);
897 899
898 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); 900 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
899 input_report_key(input, BTN_MIDDLE, (data[1] & 0x06) != 0); 901 input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
902 input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
900 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); 903 input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
901 904
902 input_sync(input); 905 input_sync(input);
@@ -949,8 +952,8 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
949 sync = wacom_tpc_irq(wacom_wac, len); 952 sync = wacom_tpc_irq(wacom_wac, len);
950 break; 953 break;
951 954
952 case BAMBOO_TOUCH: 955 case BAMBOO_PT:
953 sync = wacom_bbt_irq(wacom_wac, len); 956 sync = wacom_bpt_irq(wacom_wac, len);
954 break; 957 break;
955 958
956 default: 959 default:
@@ -994,6 +997,34 @@ static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
994 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); 997 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
995} 998}
996 999
1000
1001void wacom_setup_device_quirks(struct wacom_features *features)
1002{
1003
1004 /* touch device found but size is not defined. use default */
1005 if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
1006 features->x_max = 1023;
1007 features->y_max = 1023;
1008 }
1009
1010 /* these device have multiple inputs */
1011 if (features->type == TABLETPC || features->type == TABLETPC2FG ||
1012 features->type == BAMBOO_PT)
1013 features->quirks |= WACOM_QUIRK_MULTI_INPUT;
1014
1015 /* quirks for bamboo touch */
1016 if (features->type == BAMBOO_PT &&
1017 features->device_type == BTN_TOOL_TRIPLETAP) {
1018 features->x_max <<= 5;
1019 features->y_max <<= 5;
1020 features->x_fuzz <<= 5;
1021 features->y_fuzz <<= 5;
1022 features->pressure_max = 256;
1023 features->pressure_fuzz = 16;
1024 features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
1025 }
1026}
1027
997void wacom_setup_input_capabilities(struct input_dev *input_dev, 1028void wacom_setup_input_capabilities(struct input_dev *input_dev,
998 struct wacom_wac *wacom_wac) 1029 struct wacom_wac *wacom_wac)
999{ 1030{
@@ -1004,9 +1035,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
1004 1035
1005 __set_bit(BTN_TOUCH, input_dev->keybit); 1036 __set_bit(BTN_TOUCH, input_dev->keybit);
1006 1037
1007 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); 1038 input_set_abs_params(input_dev, ABS_X, 0, features->x_max,
1008 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); 1039 features->x_fuzz, 0);
1009 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); 1040 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max,
1041 features->y_fuzz, 0);
1042 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max,
1043 features->pressure_fuzz, 0);
1010 1044
1011 __set_bit(ABS_MISC, input_dev->absbit); 1045 __set_bit(ABS_MISC, input_dev->absbit);
1012 1046
@@ -1130,24 +1164,31 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
1130 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1164 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1131 break; 1165 break;
1132 1166
1133 case BAMBOO_TOUCH: 1167 case BAMBOO_PT:
1134 __clear_bit(ABS_MISC, input_dev->absbit); 1168 __clear_bit(ABS_MISC, input_dev->absbit);
1135 __set_bit(BTN_LEFT, input_dev->keybit);
1136 __set_bit(BTN_MIDDLE, input_dev->keybit);
1137 __set_bit(BTN_RIGHT, input_dev->keybit);
1138 1169
1139 __set_bit(BTN_TOOL_FINGER, input_dev->keybit); 1170 if (features->device_type == BTN_TOOL_TRIPLETAP) {
1140 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); 1171 __set_bit(BTN_LEFT, input_dev->keybit);
1172 __set_bit(BTN_FORWARD, input_dev->keybit);
1173 __set_bit(BTN_BACK, input_dev->keybit);
1174 __set_bit(BTN_RIGHT, input_dev->keybit);
1141 1175
1142 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 32, 0); 1176 __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1143 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 32, 0); 1177 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1144 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 16, 0);
1145 1178
1146 input_mt_create_slots(input_dev, 2); 1179 input_mt_create_slots(input_dev, 2);
1147 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, features->x_max, 32, 0); 1180 input_set_abs_params(input_dev, ABS_MT_POSITION_X,
1148 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, features->y_max, 32, 0); 1181 0, features->x_max,
1149 input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, features->pressure_max, 16, 0); 1182 features->x_fuzz, 0);
1150 input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, MAX_TRACKING_ID, 0, 0); 1183 input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
1184 0, features->y_max,
1185 features->y_fuzz, 0);
1186 input_set_abs_params(input_dev, ABS_MT_PRESSURE,
1187 0, features->pressure_max,
1188 features->pressure_fuzz, 0);
1189 input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0,
1190 MAX_TRACKING_ID, 0, 0);
1191 }
1151 break; 1192 break;
1152 } 1193 }
1153} 1194}
@@ -1286,19 +1327,13 @@ static const struct wacom_features wacom_features_0xE3 =
1286 { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; 1327 { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG };
1287static const struct wacom_features wacom_features_0x47 = 1328static const struct wacom_features wacom_features_0x47 =
1288 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; 1329 { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS };
1289static const struct wacom_features wacom_features_0xD0_0 = 1330static struct wacom_features wacom_features_0xD0 =
1290 { "Wacom Bamboo Touch", WACOM_PKGLEN_BBTOUCH, 7680, 5120, 255, 0, BAMBOO_TOUCH }; 1331 { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
1291static const struct wacom_features wacom_features_0xD0_2 =
1292 { "Wacom Bamboo Boot", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO };
1293 1332
1294#define USB_DEVICE_WACOM(prod) \ 1333#define USB_DEVICE_WACOM(prod) \
1295 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ 1334 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
1296 .driver_info = (kernel_ulong_t)&wacom_features_##prod 1335 .driver_info = (kernel_ulong_t)&wacom_features_##prod
1297 1336
1298#define USB_DEVICE_WACOM_PROTO(prod, pr) \
1299 USB_DEVICE_INTERFACE_PROTOCOL(USB_VENDOR_ID_WACOM, prod, pr), \
1300 .driver_info = (kernel_ulong_t)&wacom_features_##prod##_##pr
1301
1302const struct usb_device_id wacom_ids[] = { 1337const struct usb_device_id wacom_ids[] = {
1303 { USB_DEVICE_WACOM(0x00) }, 1338 { USB_DEVICE_WACOM(0x00) },
1304 { USB_DEVICE_WACOM(0x10) }, 1339 { USB_DEVICE_WACOM(0x10) },
@@ -1358,8 +1393,7 @@ const struct usb_device_id wacom_ids[] = {
1358 { USB_DEVICE_WACOM(0xC6) }, 1393 { USB_DEVICE_WACOM(0xC6) },
1359 { USB_DEVICE_WACOM(0xC7) }, 1394 { USB_DEVICE_WACOM(0xC7) },
1360 { USB_DEVICE_WACOM(0xCE) }, 1395 { USB_DEVICE_WACOM(0xCE) },
1361 { USB_DEVICE_WACOM_PROTO(0xD0, 0) }, 1396 { USB_DEVICE_WACOM(0xD0) },
1362 { USB_DEVICE_WACOM_PROTO(0xD0, 2) },
1363 { USB_DEVICE_WACOM(0xF0) }, 1397 { USB_DEVICE_WACOM(0xF0) },
1364 { USB_DEVICE_WACOM(0xCC) }, 1398 { USB_DEVICE_WACOM(0xCC) },
1365 { USB_DEVICE_WACOM(0x90) }, 1399 { USB_DEVICE_WACOM(0x90) },
diff --git a/usr/src/dkms_source_tree/wacom_wac.h b/usr/src/dkms_source_tree/wacom_wac.h
index 0c5a35d..00ca015 100644
--- a/usr/src/dkms_source_tree/wacom_wac.h
+++ b/usr/src/dkms_source_tree/wacom_wac.h
@@ -38,6 +38,10 @@
38#define WACOM_REPORT_TPC1FG 6 38#define WACOM_REPORT_TPC1FG 6
39#define WACOM_REPORT_TPC2FG 13 39#define WACOM_REPORT_TPC2FG 13
40 40
41/* device quirks */
42#define WACOM_QUIRK_MULTI_INPUT 0x0001
43#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002
44
41/* largest reported tracking id */ 45/* largest reported tracking id */
42#define MAX_TRACKING_ID 0xfff 46#define MAX_TRACKING_ID 0xfff
43 47
@@ -48,6 +52,7 @@ enum {
48 PTU, 52 PTU,
49 PL, 53 PL,
50 DTU, 54 DTU,
55 BAMBOO_PT,
51 INTUOS, 56 INTUOS,
52 INTUOS3S, 57 INTUOS3S,
53 INTUOS3, 58 INTUOS3,
@@ -61,7 +66,6 @@ enum {
61 WACOM_MO, 66 WACOM_MO,
62 TABLETPC, 67 TABLETPC,
63 TABLETPC2FG, 68 TABLETPC2FG,
64 BAMBOO_TOUCH,
65 MAX_TYPE 69 MAX_TYPE
66}; 70};
67 71
@@ -78,6 +82,11 @@ struct wacom_features {
78 int y_phy; 82 int y_phy;
79 unsigned char unit; 83 unsigned char unit;
80 unsigned char unitExpo; 84 unsigned char unitExpo;
85 int x_fuzz;
86 int y_fuzz;
87 int pressure_fuzz;
88 int distance_fuzz;
89 unsigned quirks;
81}; 90};
82 91
83struct wacom_shared { 92struct wacom_shared {
@@ -91,6 +100,7 @@ struct wacom_wac {
91 int id[3]; 100 int id[3];
92 __u32 serial[2]; 101 __u32 serial[2];
93 int last_finger; 102 int last_finger;
103 int trk_id;
94 struct wacom_features features; 104 struct wacom_features features;
95 struct wacom_shared *shared; 105 struct wacom_shared *shared;
96 struct input_dev *input; 106 struct input_dev *input;