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实现回车键的监听
  2. android计算器布局(TableLayout)
  3. android秒表计时代码
  4. Android利用tcpdump抓包
  5. android ndk 入门 - 一个简单的ndk工程
  6. Delphi XE5 for android 调用Java类库必看的文件
  7. android带图片的AlertDialog和文件管理器(代码)
  8. android的文件操作
  9. Android中隐藏ActionBar的方法

随机推荐

  1. android 优化文章
  2. Android开发 了解android系统的架构
  3. Android SDK无法更新问题解决
  4. Android结束进程的方法
  5. Android中的searchView去掉前面的搜索圈
  6. 异常android.os.NetworkOnMainThreadExce
  7. Android 编译环境搭建
  8. android Ant 批量多渠道打包!
  9. android studio 日期选择DatePickerDialo
  10. Android 制定的ROM包(文件系统根目录结构