Android 按键驱动

#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};#endifstatic 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);elseinput_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);elseinput_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);elseinput_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);elseinput_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);elseinput_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);elseinput_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);elseinput_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);elseinput_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);elseinput_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_SOSs3c_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));#endifs3c_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));#endifinput = 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_PMstatic 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_suspendNULL#define s3c_button_resumeNULL#endifstatic 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


更多相关文章

  1. android用于打开各种文件的intent
  2. Delphi XE5 for android 调用Java类库必看的文件
  3. android带图片的AlertDialog和文件管理器(代码)
  4. android 用代码画虚线边框背景

随机推荐

  1. Android实现微信和QQ“在其他应用打开”
  2. 【源代码】基于Android和蓝牙的单片机温
  3. Android学习笔记2:Hello World程序解析
  4. Android(安卓)studio 3.0安装配置方法图
  5. Android(安卓)Studio下载及安装3.0版本
  6. ViewGroup 的事件分发核心
  7. Android(安卓)实现微信,QQ的程序前后台切
  8. Android学习笔记之反编译工具介绍及下载(C
  9. 让class只有一个实例的例子
  10. android一行显示多个多选框