#define USE_SOS 1 #if USE_SOS #define MAX_BUTTON_CNT (9) static int s3c_Keycode[MAX_BUTTON_CNT] = {KEY_POWER, KEY_MEDIA, KEY_HOME, KEY_VOLUMEDOWN, KEY_VOLUMEUP, KEY_DOWN, KEY_UP, KEY_MENU, KEY_END}; #else #define MAX_BUTTON_CNT (7) static int s3c_Keycode[MAX_BUTTON_CNT] = {KEY_POWER, KEY_MEDIA, KEY_HOME, KEY_VOLUMEDOWN, KEY_VOLUMEUP, KEY_DOWN, KEY_UP}; #endif static struct timer_list timer; static struct input_dev * input; //static int s3c_Keycode[MAX_BUTTON_CNT] = {KEY_POWER, KEY_MEDIA, KEY_HOME, KEY_MENU, KEY_VOLUMEDOWN, KEY_VOLUMEUP, KEY_DOWN, KEY_UP}; static int s3c_button_history[MAX_BUTTON_CNT] = { 0 }; static void s3cbutton_timer_handler(unsigned long data) { int flag; /* power ok */ flag = gpio_get_value(S5PV210_GPH0(1)); if(flag != s3c_button_history[0]) { if(flag) input_report_key(input, s3c_Keycode[0], 0); else input_report_key(input, s3c_Keycode[0], 1); input_sync(input); s3c_button_history[0] = flag; } /* media */ flag = gpio_get_value(S5PV210_GPH0(2)); if(flag != s3c_button_history[1]) { if(flag) input_report_key(input, s3c_Keycode[1], 0); else input_report_key(input, s3c_Keycode[1], 1); input_sync(input); s3c_button_history[1] = flag; } /* home */ flag = gpio_get_value(S5PV210_GPH0(3)); if(flag != s3c_button_history[2]) { if(flag) input_report_key(input, s3c_Keycode[2], 0); else input_report_key(input, s3c_Keycode[2], 1); input_sync(input); s3c_button_history[2] = flag; } /* vol- */ flag = gpio_get_value(S5PV210_GPH1(0)); if(flag != s3c_button_history[3]) { if(flag) input_report_key(input, s3c_Keycode[3], 0); else input_report_key(input, s3c_Keycode[3], 1); input_sync(input); s3c_button_history[3] = flag; } /* vol+ */ flag = gpio_get_value(S5PV210_GPH1(1)); if(flag != s3c_button_history[4]) { if(flag) input_report_key(input, s3c_Keycode[4], 0); else input_report_key(input, s3c_Keycode[4], 1); input_sync(input); s3c_button_history[4] = flag; } /* up */ flag = gpio_get_value(S5PV210_GPH1(3)); if(flag != s3c_button_history[5]) { if(flag) input_report_key(input, s3c_Keycode[5], 0); else input_report_key(input, s3c_Keycode[5], 1); input_sync(input); s3c_button_history[5] = flag; } /* down */ flag = gpio_get_value(S5PV210_GPH1(7)); if(flag != s3c_button_history[6]) { if(flag) input_report_key(input, s3c_Keycode[6], 0); else input_report_key(input, s3c_Keycode[6], 1); input_sync(input); s3c_button_history[6] = flag; } #if USE_SOS /* sos */ flag = gpio_get_value(S5PV210_GPH0(4)); if(flag != s3c_button_history[7]) { if(flag) input_report_key(input, s3c_Keycode[7], 0); else input_report_key(input, s3c_Keycode[7], 1); input_sync(input); s3c_button_history[7] = flag; } /* end */ flag = gpio_get_value(S5PV210_GPH1(4)); if(flag != s3c_button_history[8]) { if(flag) input_report_key(input, s3c_Keycode[8], 0); else input_report_key(input, s3c_Keycode[8], 1); input_sync(input); s3c_button_history[8] = flag; } #endif /* Kernel Timer restart */ mod_timer(&timer,jiffies + HZ/100); } static int s3c_button_probe(struct platform_device *pdev) { int i; int ret; /* gph0_1 (power) */ ret = gpio_request(S5PV210_GPH0(1), "GPH0"); if(ret) printk("button-smdkv210: request gpio GPH0(1) fail"); /* gph2_0 (media) */ ret = gpio_request(S5PV210_GPH0(2), "GPH0"); if(ret) printk("button-smdkv210: request gpio GPH0(2) fail"); /* gph0_3 (home) */ ret = gpio_request(S5PV210_GPH0(3), "GPH0"); if(ret) printk("button-smdkv210: request gpio GPH0(3) fail"); #if USE_SOS /* gph0_2 (sos) */ ret = gpio_request(S5PV210_GPH0(4), "GPH0"); if(ret) printk("button-smdkv210: request gpio GPH0(4) fail"); /* gph0_2 (end) */ ret = gpio_request(S5PV210_GPH1(4), "GPH1"); if(ret) printk("button-smdkv210: request gpio GPH1(4) fail"); #endif /* gph2_1 (vol-) */ ret = gpio_request(S5PV210_GPH1(0), "GPH1"); if(ret) printk("button-smdkv210: request gpio GPH1(0) fail"); /* gph2_3 (vol+) */ ret = gpio_request(S5PV210_GPH1(1), "GPH1"); if(ret) printk("button-smdkv210: request gpio GPH1(1) fail"); /* gph2_2 (up) */ ret = gpio_request(S5PV210_GPH1(3), "GPH1"); if(ret) printk("button-smdkv210: request gpio GPH1(3) fail"); /* gph2_2 (down) */ ret = gpio_request(S5PV210_GPH1(7), "GPH1"); if(ret) printk("button-smdkv210: request gpio GPH1(7) fail"); s3c_gpio_setpull(S5PV210_GPH0(1), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH0(1), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH0(2), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH0(3), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH0(3), S3C_GPIO_SFN(0)); #if USE_SOS s3c_gpio_setpull(S5PV210_GPH0(4), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH0(4), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH1(4), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH1(4), S3C_GPIO_SFN(0)); #endif s3c_gpio_setpull(S5PV210_GPH1(0), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH1(0), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH1(1), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH1(1), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH1(3), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH1(3), S3C_GPIO_SFN(0)); s3c_gpio_setpull(S5PV210_GPH1(7), S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(S5PV210_GPH1(7), S3C_GPIO_SFN(0)); s3c_button_history[0] = gpio_get_value(S5PV210_GPH0(1)); s3c_button_history[1] = gpio_get_value(S5PV210_GPH0(2)); s3c_button_history[2] = gpio_get_value(S5PV210_GPH0(3)); s3c_button_history[3] = gpio_get_value(S5PV210_GPH1(0)); s3c_button_history[4] = gpio_get_value(S5PV210_GPH1(1)); s3c_button_history[5] = gpio_get_value(S5PV210_GPH1(3)); s3c_button_history[6] = gpio_get_value(S5PV210_GPH1(7)); #if USE_SOS s3c_button_history[7] = gpio_get_value(S5PV210_GPH0(4)); s3c_button_history[8] = gpio_get_value(S5PV210_GPH1(4)); #endif input = input_allocate_device(); if(!input) return -ENOMEM; set_bit(EV_KEY, input->evbit); //set_bit(EV_REP, input->evbit); /* Repeat Key */ for(i = 0; i < MAX_BUTTON_CNT; i++) set_bit(s3c_Keycode[i], input->keybit); input->name = "s3c-button"; input->phys = "s3c-button/input0"; input->id.bustype = BUS_HOST; input->id.vendor = 0x0001; input->id.product = 0x0001; input->id.version = 0x0100; input->keycode = s3c_Keycode; if(input_register_device(input) != 0) { printk("s3c-button input register device fail!!\n"); input_free_device(input); return -ENODEV; } /* Scan timer init */ init_timer(&timer); timer.function = s3cbutton_timer_handler; timer.expires = jiffies + (HZ/100); add_timer(&timer); printk("s3c button Initialized!!\n"); return 0; } static int s3c_button_remove(struct platform_device *pdev) { input_unregister_device(input); del_timer(&timer); return 0; } #ifdef CONFIG_PM static int s3c_button_suspend(struct platform_device *pdev, pm_message_t state) { return 0; } static int s3c_button_resume(struct platform_device *pdev) { return 0; } #else #define s3c_button_suspend NULL #define s3c_button_resume NULL #endif static struct platform_driver s3c_button_device_driver = { .probe = s3c_button_probe, .remove = s3c_button_remove, .suspend = s3c_button_suspend, .resume = s3c_button_resume, .driver = { .name = "s3c-button", .owner = THIS_MODULE, } }; static struct platform_device s3c_device_button = { .name = "s3c-button", .id = -1, }; static int __init s3c_button_init(void) { platform_device_register(&s3c_device_button); return platform_driver_register(&s3c_button_device_driver); } static void __exit s3c_button_exit(void) { platform_driver_unregister(&s3c_button_device_driver); platform_device_unregister(&s3c_device_button); } module_init(s3c_button_init); module_exit(s3c_button_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("jvaemape"); MODULE_DESCRIPTION("Keyboard driver"); MODULE_ALIAS("platform:s3c-button");
在平台目录下添加button.c文件, 把以上代码粘贴到其中, 在 Makefile文件中添加一下代码
obj-$(CONFIG_MACH_SMDKV210) += button-x210.o