|
Lines 24-30
Link Here
|
| 24 |
* http://sourceforge.net/projects/acpi4asus/ |
24 |
* http://sourceforge.net/projects/acpi4asus/ |
| 25 |
* |
25 |
* |
| 26 |
* Credits: |
26 |
* Credits: |
| 27 |
* Nicolas Trangez - Initial work to let ACPI buttons work over INPUT layer |
27 |
* Daniel Nascimento - Reworked input layer and add more keys |
|
|
28 |
* Nicolas Trangez - Initial work to let ACPI buttons work over INPUT layer |
| 28 |
* Pontus Fuchs - Helper functions, cleanup |
29 |
* Pontus Fuchs - Helper functions, cleanup |
| 29 |
* Johann Wiesner - Small compile fixes |
30 |
* Johann Wiesner - Small compile fixes |
| 30 |
* John Belmonte - ACPI code for Toshiba laptop was a good starting point. |
31 |
* John Belmonte - ACPI code for Toshiba laptop was a good starting point. |
|
Lines 254-264
ASUS_LED(pled, "phone");
Link Here
|
| 254 |
ASUS_LED(gled, "gaming"); |
255 |
ASUS_LED(gled, "gaming"); |
| 255 |
|
256 |
|
| 256 |
/* Input layer variables */ |
257 |
/* Input layer variables */ |
|
|
258 |
/* Magic number set 154 because 153 is the highest event in M51Sn */ |
| 259 |
#define ASUS_HOTK_MAP_LEN 154 |
| 260 |
#define ASUS_HOTK_MAP_SIZE ASUS_HOTK_MAP_LEN*sizeof(typeof(*hotk_keycode_map)) |
| 261 |
|
| 257 |
static u16 *hotk_keycode_map; |
262 |
static u16 *hotk_keycode_map; |
| 258 |
static int hotk_keycode_map_size; |
|
|
| 259 |
static struct input_dev *asus_hotk_inputdev; |
263 |
static struct input_dev *asus_hotk_inputdev; |
| 260 |
static int asus_hotk_inputdev_registered; |
264 |
static int asus_hotk_inputdev_registered; |
| 261 |
|
265 |
|
|
|
266 |
struct key_event { |
| 267 |
u16 key; |
| 268 |
u8 event; |
| 269 |
}; |
| 270 |
|
| 262 |
/* |
271 |
/* |
| 263 |
* This function evaluates an ACPI method, given an int as parameter, the |
272 |
* This function evaluates an ACPI method, given an int as parameter, the |
| 264 |
* method is searched within the scope of the handle, can be NULL. The output |
273 |
* method is searched within the scope of the handle, can be NULL. The output |
|
Lines 749-757
static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
Link Here
|
| 749 |
lcd_blank(FB_BLANK_POWERDOWN); |
758 |
lcd_blank(FB_BLANK_POWERDOWN); |
| 750 |
} |
759 |
} |
| 751 |
|
760 |
|
| 752 |
if (event < hotk_keycode_map_size) { |
761 |
if (event < ASUS_HOTK_MAP_LEN) { |
| 753 |
keycode = hotk_keycode_map[event]; |
762 |
keycode = hotk_keycode_map[event]; |
| 754 |
printk("Keycode: %04x (%d)\n", keycode, keycode); |
|
|
| 755 |
} else { |
763 |
} else { |
| 756 |
keycode = KEY_UNKNOWN; |
764 |
keycode = KEY_UNKNOWN; |
| 757 |
printk("Scancode %d out of keymap\n", event); |
765 |
printk("Scancode %d out of keymap\n", event); |
|
Lines 1145-1248
static void __exit asus_laptop_exit(void)
Link Here
|
| 1145 |
platform_driver_unregister(&asuspf_driver); |
1153 |
platform_driver_unregister(&asuspf_driver); |
| 1146 |
} |
1154 |
} |
| 1147 |
|
1155 |
|
| 1148 |
static int asus_hotk_init(void) |
1156 |
static int set_keycode_map(void) |
| 1149 |
{ |
1157 |
{ |
| 1150 |
int ret, i; |
1158 |
int i; |
| 1151 |
|
1159 |
|
| 1152 |
static u16 keycode_map_1[] __initdata = { |
1160 |
/* Some of these values are ovewriten by something */ |
| 1153 |
KEY_UNKNOWN, /* 0 */ |
1161 |
static struct key_event map_1[] = { |
| 1154 |
KEY_UNKNOWN, /* 1 */ |
1162 |
{ KEY_RESERVED, 17 }, /* Brightness up */ |
| 1155 |
KEY_UNKNOWN, /* 2 */ |
1163 |
{ KEY_RESERVED, 18 }, /* Brightness up */ |
| 1156 |
KEY_UNKNOWN, /* 3 */ |
1164 |
{ KEY_RESERVED, 19 }, /* Brightness up */ |
| 1157 |
KEY_UNKNOWN, /* 4 */ |
1165 |
{ KEY_RESERVED, 20 }, /* Brightness up */ |
| 1158 |
KEY_UNKNOWN, /* 5 */ |
1166 |
{ KEY_RESERVED, 21 }, /* Brightness up */ |
| 1159 |
KEY_UNKNOWN, /* 6 */ |
1167 |
{ KEY_RESERVED, 22 }, /* Brightness up */ |
| 1160 |
KEY_UNKNOWN, /* 7 */ |
1168 |
{ KEY_RESERVED, 23 }, /* Brightness up */ |
| 1161 |
KEY_UNKNOWN, /* 8 */ |
1169 |
{ KEY_RESERVED, 24 }, /* Brightness up */ |
| 1162 |
KEY_UNKNOWN, /* 9 */ |
1170 |
{ KEY_RESERVED, 25 }, /* Brightness up */ |
| 1163 |
KEY_UNKNOWN, /* 10 */ |
1171 |
{ KEY_RESERVED, 26 }, /* Brightness up */ |
| 1164 |
KEY_UNKNOWN, /* 11 */ |
1172 |
{ KEY_RESERVED, 27 }, /* Brightness up */ |
| 1165 |
KEY_UNKNOWN, /* 12 */ |
1173 |
{ KEY_RESERVED, 28 }, /* Brightness up */ |
| 1166 |
KEY_UNKNOWN, /* 13 */ |
1174 |
{ KEY_RESERVED, 29 }, /* Brightness up */ |
| 1167 |
KEY_UNKNOWN, /* 14 */ |
1175 |
{ KEY_RESERVED, 30 }, /* Brightness up */ |
| 1168 |
KEY_UNKNOWN, /* 15 */ |
1176 |
{ KEY_RESERVED, 31 }, /* Brightness up */ |
| 1169 |
KEY_UNKNOWN, /* 16 */ |
1177 |
{ KEY_RESERVED, 32 }, /* Brightness down */ |
| 1170 |
KEY_UNKNOWN, /* 17 */ |
1178 |
{ KEY_RESERVED, 33 }, /* Brightness down */ |
| 1171 |
KEY_UNKNOWN, /* 18 */ |
1179 |
{ KEY_RESERVED, 34 }, /* Brightness down */ |
| 1172 |
KEY_UNKNOWN, /* 19 */ |
1180 |
{ KEY_RESERVED, 35 }, /* Brightness down */ |
| 1173 |
KEY_UNKNOWN, /* 20 */ |
1181 |
{ KEY_RESERVED, 36 }, /* Brightness down */ |
| 1174 |
KEY_UNKNOWN, /* 21 */ |
1182 |
{ KEY_RESERVED, 37 }, /* Brightness down */ |
| 1175 |
KEY_UNKNOWN, /* 22 */ |
1183 |
{ KEY_RESERVED, 38 }, /* Brightness down */ |
| 1176 |
KEY_UNKNOWN, /* 23 */ |
1184 |
{ KEY_RESERVED, 39 }, /* Brightness down */ |
| 1177 |
KEY_UNKNOWN, /* 24 */ |
1185 |
{ KEY_RESERVED, 40 }, /* Brightness down */ |
| 1178 |
KEY_UNKNOWN, /* 25 */ |
1186 |
{ KEY_RESERVED, 41 }, /* Brightness down */ |
| 1179 |
KEY_UNKNOWN, /* 26 */ |
1187 |
{ KEY_RESERVED, 42 }, /* Brightness down */ |
| 1180 |
KEY_UNKNOWN, /* 27 */ |
1188 |
{ KEY_RESERVED, 43 }, /* Brightness down */ |
| 1181 |
KEY_UNKNOWN, /* 28 */ |
1189 |
{ KEY_RESERVED, 44 }, /* Brightness down */ |
| 1182 |
KEY_UNKNOWN, /* 29 */ |
1190 |
{ KEY_RESERVED, 45 }, /* Brightness down */ |
| 1183 |
KEY_UNKNOWN, /* 30 */ |
1191 |
{ KEY_RESERVED, 46 }, /* Brightness down */ |
| 1184 |
KEY_UNKNOWN, /* 31 */ |
1192 |
{ KEY_VOLUMEUP, 48 }, |
| 1185 |
KEY_UNKNOWN, /* 32 */ |
1193 |
{ KEY_VOLUMEDOWN, 49 }, |
| 1186 |
KEY_UNKNOWN, /* 33 */ |
1194 |
{ KEY_MUTE, 50 }, |
| 1187 |
KEY_UNKNOWN, /* 34 */ |
1195 |
{ KEY_RESERVED, 51 }, /* LCD Switch */ |
| 1188 |
KEY_UNKNOWN, /* 35 */ |
1196 |
{ KEY_RESERVED, 52 }, /* LCD Switch */ |
| 1189 |
KEY_UNKNOWN, /* 36 */ |
1197 |
{ KEY_PREVIOUSSONG, 64 }, |
| 1190 |
KEY_UNKNOWN, /* 37 */ |
1198 |
{ KEY_NEXTSONG, 65 }, |
| 1191 |
KEY_UNKNOWN, /* 38 */ |
1199 |
{ KEY_STOP, 67 }, |
| 1192 |
KEY_UNKNOWN, /* 39 */ |
1200 |
{ KEY_PLAYPAUSE,69 }, |
| 1193 |
KEY_UNKNOWN, /* 40 */ |
1201 |
{ KEY_EMAIL, 80 }, |
| 1194 |
KEY_UNKNOWN, /* 41 */ |
1202 |
{ KEY_WWW, 81 }, |
| 1195 |
KEY_UNKNOWN, /* 42 */ |
1203 |
{ BTN_EXTRA, 92 }, /* Performance */ |
| 1196 |
KEY_UNKNOWN, /* 43 */ |
1204 |
{ KEY_WLAN, 93 }, |
| 1197 |
KEY_UNKNOWN, /* 44 */ |
1205 |
{ KEY_SWITCHVIDEOMODE, 97 }, |
| 1198 |
KEY_UNKNOWN, /* 45 */ |
1206 |
{ BTN_TOUCH, 107 }, /* Lock Mouse */ |
| 1199 |
KEY_UNKNOWN, /* 46 */ |
1207 |
{ KEY_BLUETOOTH,125 }, /* Bluetooth up */ |
| 1200 |
KEY_UNKNOWN, /* 47 */ |
1208 |
{ KEY_BLUETOOTH,126 }, /* Bluetooth down */ |
| 1201 |
KEY_UNKNOWN, /* 48 */ |
1209 |
{ KEY_CAMERA, 130 }, |
| 1202 |
KEY_UNKNOWN, /* 49 */ |
1210 |
{ KEY_TV, 138 }, |
| 1203 |
KEY_UNKNOWN, /* 50 */ |
1211 |
{ KEY_MEDIA, 149 }, |
| 1204 |
KEY_UNKNOWN, /* 51 */ |
1212 |
{ KEY_PHONE, 153 } |
| 1205 |
KEY_UNKNOWN, /* 52 */ |
|
|
| 1206 |
KEY_UNKNOWN, /* 53 */ |
| 1207 |
KEY_UNKNOWN, /* 54 */ |
| 1208 |
KEY_UNKNOWN, /* 55 */ |
| 1209 |
KEY_UNKNOWN, /* 56 */ |
| 1210 |
KEY_UNKNOWN, /* 57 */ |
| 1211 |
KEY_UNKNOWN, /* 58 */ |
| 1212 |
KEY_UNKNOWN, /* 59 */ |
| 1213 |
KEY_UNKNOWN, /* 60 */ |
| 1214 |
KEY_UNKNOWN, /* 61 */ |
| 1215 |
KEY_UNKNOWN, /* 62 */ |
| 1216 |
KEY_UNKNOWN, /* 63 */ |
| 1217 |
KEY_PREVIOUSSONG, /* 64 */ |
| 1218 |
KEY_NEXTSONG, /* 65 */ |
| 1219 |
KEY_UNKNOWN, /* 66 */ |
| 1220 |
KEY_STOP, /* 67 */ |
| 1221 |
KEY_UNKNOWN, /* 68 */ |
| 1222 |
KEY_PLAYPAUSE, /* 69 */ |
| 1223 |
KEY_UNKNOWN, /* 70 */ |
| 1224 |
}; |
1213 |
}; |
| 1225 |
|
1214 |
|
| 1226 |
#define ASUS_HOTK_MAP_LEN ARRAY_SIZE(keycode_map_1) |
|
|
| 1227 |
#define ASUS_HOTK_MAP_SIZE sizeof(keycode_map_1) |
| 1228 |
#define ASUS_HOTK_MAP_TYPESIZE sizeof(keycode_map_1[0]) |
| 1229 |
|
| 1230 |
/* Always use first keymap. TODO make this model-specific */ |
| 1231 |
hotk_keycode_map = kmalloc(ASUS_HOTK_MAP_SIZE, GFP_KERNEL); |
1215 |
hotk_keycode_map = kmalloc(ASUS_HOTK_MAP_SIZE, GFP_KERNEL); |
| 1232 |
hotk_keycode_map_size = ASUS_HOTK_MAP_LEN; |
|
|
| 1233 |
if (!hotk_keycode_map) { |
1216 |
if (!hotk_keycode_map) { |
| 1234 |
printk(ASUS_ERR "failed to allocate memory for keymap\n"); |
1217 |
printk(ASUS_ERR "failed to allocate memory for keymap\n"); |
| 1235 |
return -ENOMEM; |
1218 |
return -ENOMEM; |
| 1236 |
} |
1219 |
} |
| 1237 |
printk(ASUS_NOTICE "using keycode_map_1\n"); |
|
|
| 1238 |
memcpy(hotk_keycode_map, &keycode_map_1, ASUS_HOTK_MAP_SIZE); |
| 1239 |
/* TODO make sure no ACPI events are sent on known keycodes */ |
| 1240 |
|
1220 |
|
| 1241 |
asus_hotk_inputdev = input_allocate_device(); |
1221 |
asus_hotk_inputdev = input_allocate_device(); |
| 1242 |
if (!asus_hotk_inputdev) { |
1222 |
if (!asus_hotk_inputdev) { |
| 1243 |
printk(ASUS_ERR "unable to allocate input device\n"); |
1223 |
printk(ASUS_ERR "unable to allocate input device\n"); |
| 1244 |
return -ENOMEM; |
1224 |
return -ENOMEM; |
| 1245 |
} |
1225 |
} |
|
|
1226 |
for (i = 0; i < ASUS_HOTK_MAP_SIZE; i++) |
| 1227 |
hotk_keycode_map[i] = KEY_UNKNOWN; |
| 1228 |
|
| 1229 |
/* Always use first keymap. TODO make this model-specific |
| 1230 |
* (not sure if it's needed more than one) */ |
| 1231 |
printk(ASUS_NOTICE "using map_1\n"); |
| 1232 |
for (i = 0; i < ARRAY_SIZE(map_1); i++) |
| 1233 |
hotk_keycode_map[map_1[i].event] = map_1[i].key; |
| 1234 |
|
| 1235 |
return 0; |
| 1236 |
} |
| 1237 |
|
| 1238 |
static int asus_hotk_init(void) |
| 1239 |
{ |
| 1240 |
int ret, i; |
| 1241 |
|
| 1242 |
if ((ret = set_keycode_map()) != 0) |
| 1243 |
return ret; |
| 1244 |
|
| 1246 |
asus_hotk_inputdev->name = "Asus Extra Buttons"; |
1245 |
asus_hotk_inputdev->name = "Asus Extra Buttons"; |
| 1247 |
asus_hotk_inputdev->phys = ASUS_HOTK_FILE "/input0"; |
1246 |
asus_hotk_inputdev->phys = ASUS_HOTK_FILE "/input0"; |
| 1248 |
asus_hotk_inputdev->id.bustype = BUS_HOST; |
1247 |
asus_hotk_inputdev->id.bustype = BUS_HOST; |
|
Lines 1255-1270
static int asus_hotk_init(void)
Link Here
|
| 1255 |
set_bit(EV_KEY, asus_hotk_inputdev->evbit); |
1254 |
set_bit(EV_KEY, asus_hotk_inputdev->evbit); |
| 1256 |
set_bit(EV_MSC, asus_hotk_inputdev->evbit); |
1255 |
set_bit(EV_MSC, asus_hotk_inputdev->evbit); |
| 1257 |
set_bit(MSC_SCAN, asus_hotk_inputdev->mscbit); |
1256 |
set_bit(MSC_SCAN, asus_hotk_inputdev->mscbit); |
| 1258 |
asus_hotk_inputdev->keycodesize = ASUS_HOTK_MAP_TYPESIZE; |
1257 |
asus_hotk_inputdev->keycodesize = sizeof(hotk_keycode_map[0]); |
| 1259 |
asus_hotk_inputdev->keycodemax = ASUS_HOTK_MAP_LEN; |
1258 |
asus_hotk_inputdev->keycodemax = ASUS_HOTK_MAP_LEN; |
| 1260 |
asus_hotk_inputdev->keycode = hotk_keycode_map; |
1259 |
asus_hotk_inputdev->keycode = hotk_keycode_map; |
| 1261 |
for (i = 0; i < ASUS_HOTK_MAP_LEN; i++) { |
1260 |
for (i = 0; i < ASUS_HOTK_MAP_LEN; i++) { |
| 1262 |
if (hotk_keycode_map[i] != KEY_RESERVED) { |
1261 |
if (hotk_keycode_map[i] != KEY_RESERVED) { |
| 1263 |
set_bit(hotk_keycode_map[i], asus_hotk_inputdev->keybit); |
1262 |
set_bit(hotk_keycode_map[i], asus_hotk_inputdev->keybit); |
| 1264 |
} /*else { |
1263 |
} |
| 1265 |
if (i < sizeof(hotk_reserved_mask)*8) |
|
|
| 1266 |
hotk_reserved_mask |= 1 << i; |
| 1267 |
}*/ |
| 1268 |
} |
1264 |
} |
| 1269 |
|
1265 |
|
| 1270 |
ret = input_register_device(asus_hotk_inputdev); |
1266 |
ret = input_register_device(asus_hotk_inputdev); |
| 1271 |
- |
|
|