118 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* drivers/input/misc/dummy_keypad.c
 | |
|  *
 | |
|  * Copyright (C) 2007 HTC Corporation.
 | |
|  *
 | |
|  * This software is licensed under the terms of the GNU General Public
 | |
|  * License version 2, as published by the Free Software Foundation, and
 | |
|  * may be copied, distributed, and modified under those terms.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/gpio.h>
 | |
| #include <linux/gpio_event.h>
 | |
| #include <linux/hrtimer.h>
 | |
| #include <linux/input.h>
 | |
| #include <linux/interrupt.h>
 | |
| #include <linux/wakelock.h>
 | |
| #include <linux/platform_device.h>
 | |
| 
 | |
| #define DRIVER_NAME "dummy_keypad"
 | |
| const unsigned short _usb_hut_keymap[29] = {
 | |
| 	KEY_1, KEY_2, KEY_3, KEY_4,
 | |
| 	KEY_5, KEY_6, KEY_7, KEY_8,
 | |
| 	KEY_9, KEY_0,
 | |
| 	KEY_BACKSPACE, KEY_ENTER, KEY_HOME, KEY_END,
 | |
| 	KEY_POWER, KEY_COMPOSE, KEY_MENU, KEY_BACK,
 | |
| 	KEY_SWITCHVIDEOMODE, KEY_KBDILLUMTOGGLE,
 | |
| 	KEY_UP, KEY_LEFT, KEY_RIGHT, KEY_DOWN,
 | |
| 	KEY_VOLUMEDOWN, KEY_VOLUMEUP,
 | |
| 	KEY_SEND,
 | |
| 	/* STAR(*) and POUND(#) */
 | |
| 	KEY_SWITCHVIDEOMODE, KEY_KBDILLUMTOGGLE
 | |
| };
 | |
| 
 | |
| struct dummy_keypad_struct {
 | |
| 	uint32_t version;
 | |
| 	struct input_dev *input_dev;
 | |
| 	const char *keypad_name;
 | |
| 	const unsigned short *usb_hut_keymap;
 | |
| 	size_t usb_hut_keymap_size;
 | |
| };
 | |
| 
 | |
| static struct dummy_keypad_struct *dummy_keypad;
 | |
| 
 | |
| static int dummy_keypad_init_func(void)
 | |
| {
 | |
| 	u16 loop_i;
 | |
| 	dummy_keypad = kzalloc(sizeof(*dummy_keypad), GFP_KERNEL);
 | |
| 	if (dummy_keypad == NULL) {
 | |
| 		printk(KERN_ERR "%s: Can't allocate memory\n", __func__);
 | |
| 		goto kzalloc_fail;
 | |
| 	}
 | |
| 	dummy_keypad->keypad_name = DRIVER_NAME;
 | |
| 	dummy_keypad->usb_hut_keymap = _usb_hut_keymap;
 | |
| 	dummy_keypad->usb_hut_keymap_size = ARRAY_SIZE(_usb_hut_keymap);
 | |
| 
 | |
| 	dummy_keypad->input_dev = input_allocate_device();
 | |
| 	if (dummy_keypad->input_dev == NULL) {
 | |
| 		printk(KERN_ERR "%s: Failed to allocate input device\n", __func__);
 | |
| 		goto input_allocate_device_fail;
 | |
| 	}
 | |
| 	dummy_keypad->input_dev->name = DRIVER_NAME;
 | |
| 	set_bit(EV_KEY, dummy_keypad->input_dev->evbit);
 | |
| 	/* Setting USB HUT keycode */
 | |
| 	for (loop_i = 0; loop_i < dummy_keypad->usb_hut_keymap_size; loop_i++)	{
 | |
| 		if (dummy_keypad->usb_hut_keymap[loop_i])
 | |
| 			set_bit(dummy_keypad->usb_hut_keymap[loop_i] & KEY_MAX,
 | |
| 				dummy_keypad->input_dev->keybit);
 | |
| 	}
 | |
| 
 | |
| 	if (input_register_device(dummy_keypad->input_dev)) {
 | |
| 		printk(KERN_ERR "%s: Unable to register %s input device\n", __func__,
 | |
| 				dummy_keypad->input_dev->name);
 | |
| 		goto input_register_device_fail;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| input_register_device_fail:
 | |
| 	input_free_device(dummy_keypad->input_dev);
 | |
| input_allocate_device_fail:
 | |
| 	kfree(dummy_keypad);
 | |
| kzalloc_fail:
 | |
| 	return -ENOMEM;
 | |
| }
 | |
| 
 | |
| static int dummy_keypad_exit_func(void)
 | |
| {
 | |
| 	input_unregister_device(dummy_keypad->input_dev);
 | |
| 	input_free_device(dummy_keypad->input_dev);
 | |
| 	kfree(dummy_keypad);
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static int __init dummy_keypad_init(void)
 | |
| {
 | |
| 	pr_info("%s: %s: initial running...\n", __func__, DRIVER_NAME);
 | |
| 	return dummy_keypad_init_func();
 | |
| }
 | |
| 
 | |
| static void __exit dummy_keypad_exit(void)
 | |
| {
 | |
| 	dummy_keypad_exit_func();
 | |
| 	pr_info("%s: %s: exit...\n", __func__, DRIVER_NAME);
 | |
| }
 | |
| 
 | |
| module_init(dummy_keypad_init);
 | |
| module_exit(dummy_keypad_exit);
 | |
| 
 | |
| MODULE_AUTHOR("Anthony Chang<anthony_chang@htc.com>");
 | |
| MODULE_DESCRIPTION("Dummy Keypad Driver. This Driver should be use under test.");
 | |
| MODULE_LICENSE("GPL");
 | |
| 
 |