2 * linux/drivers/input/keyboard/rk28_adckey.c
4 * This driver program support to AD key which use for rk28 chip
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/interrupt.h>
16 #include <linux/input.h>
17 #include <linux/device.h>
18 #include <linux/platform_device.h>
19 #include <linux/clk.h>
20 #include <linux/err.h>
21 #include <linux/delay.h>
23 #include <asm/mach-types.h>
24 #include <asm/mach/arch.h>
25 #include <asm/mach/map.h>
26 #include <mach/gpio.h>
28 #include <mach/board.h>
30 extern struct adc_key_data rk2818_adc_key;
33 #define DBG(x...) printk(x)
38 #define KEY_PHYS_NAME "rk2818_adckey/input0"
40 volatile int gADSampleTimes = 0;
41 volatile int gStatePlaykey = 0;
42 volatile unsigned int gCodeCount = 0;
43 volatile unsigned int gThisCode = 0;
44 volatile unsigned int gLastCode = 0;
45 volatile unsigned int gFlagShortPlay = 0;
46 volatile unsigned int gFlagLongPlay = 0;
47 volatile unsigned int gPlayCount = 0;
52 struct semaphore lock;
53 struct rk28_adc_client *client;
54 struct input_dev *input_dev;
55 struct timer_list timer;
56 unsigned char * keycodes;
57 void __iomem *mmio_base;
60 struct rk28_adckey *pRk28AdcKey;
62 unsigned int rk28_get_keycode(unsigned int advalue,pADC_keyst ptab)
64 while(ptab->adc_value != 0)
66 if((advalue > ptab->adc_value - rk2818_adc_key.adc_drift) && (advalue < ptab->adc_value + rk2818_adc_key.adc_drift))
67 return ptab->adc_keycode;
74 static irqreturn_t rk28_playkey_irq(int irq, void *handle)
78 //DBG("Enter::%s,LINE=%d,KEY_PLAY_SHORT_PRESS=%d\n",__FUNCTION__,__LINE__,KEY_PLAY_SHORT_PRESS);
83 void rk28_send_wakeup_key( void )
85 input_report_key(pRk28AdcKey->input_dev,KEY_WAKEUP,1);
86 input_sync(pRk28AdcKey->input_dev);
87 input_report_key(pRk28AdcKey->input_dev,KEY_WAKEUP,0);
88 input_sync(pRk28AdcKey->input_dev);
89 DBG("Wake up system\n");
92 static int rk28_adckey_open(struct input_dev *dev)
94 //struct rk28_adckey *adckey = input_get_drvdata(dev);
99 static void rk28_adckey_close(struct input_dev *dev)
101 //struct rk28_adckey *adckey = input_get_drvdata(dev);
106 static int rk28_adckey_suspend(struct platform_device *pdev, pm_message_t state)
108 //struct rk28_adckey *adckey = platform_get_drvdata(pdev);
113 static int rk28_adckey_resume(struct platform_device *pdev)
115 //struct rk28_adckey *adckey = platform_get_drvdata(pdev);
116 //struct input_dev *input_dev = adckey->input_dev;
118 mutex_lock(&input_dev->mutex);
120 mutex_unlock(&input_dev->mutex);
125 #define rk28_adckey_suspend NULL
126 #define rk28_adckey_resume NULL
128 static void rk28_adkeyscan_timer(unsigned long data)
130 unsigned int adcvalue = -1, code;
132 pRk28AdcKey->timer.expires = jiffies + msecs_to_jiffies(10);
133 add_timer(&pRk28AdcKey->timer);
135 /*handle long press of play key*/
136 if(gpio_get_value(rk2818_adc_key.pin_playon) == rk2818_adc_key.playon_level)
138 if(++gPlayCount > 20000)
140 if((2 == gPlayCount) && (0 == gFlagShortPlay))
144 else if((100 == gPlayCount) && (0 == gFlagLongPlay))
148 input_report_key(pRk28AdcKey->input_dev,KEY_PLAY_LONG_PRESS,1);
149 input_sync(pRk28AdcKey->input_dev);
150 DBG("Enter::%s,LINE=%d,KEY_PLAY_LONG_PRESS=%d,1\n",__FUNCTION__,__LINE__,KEY_PLAY_LONG_PRESS);
155 if (1 == gFlagShortPlay)
157 input_report_key(pRk28AdcKey->input_dev,ENDCALL,1);
158 input_sync(pRk28AdcKey->input_dev);
159 input_report_key(pRk28AdcKey->input_dev,ENDCALL,0);
160 input_sync(pRk28AdcKey->input_dev);
161 DBG("Wake up system,ENDCALL=%d\n",ENDCALL);
163 input_report_key(pRk28AdcKey->input_dev,KEY_PLAY_SHORT_PRESS,1);
164 input_sync(pRk28AdcKey->input_dev);
165 DBG("Enter::%s,LINE=%d,KEY_PLAY_SHORT_PRESS=%d,1\n",__FUNCTION__,__LINE__,KEY_PLAY_SHORT_PRESS);
166 input_report_key(pRk28AdcKey->input_dev,KEY_PLAY_SHORT_PRESS,0);
167 input_sync(pRk28AdcKey->input_dev);
168 DBG("Enter::%s,LINE=%d,KEY_PLAY_SHORT_PRESS=%d,0\n",__FUNCTION__,__LINE__,KEY_PLAY_SHORT_PRESS);
170 else if(1 == gFlagLongPlay)
172 input_report_key(pRk28AdcKey->input_dev,KEY_PLAY_LONG_PRESS,0);
173 input_sync(pRk28AdcKey->input_dev);
174 DBG("Enter::%s,LINE=%d,KEY_PLAY_LONG_PRESS=%d,0\n",__FUNCTION__,__LINE__,KEY_PLAY_LONG_PRESS);
182 /*handle long press of adc key*/
183 if (gADSampleTimes < 4)
191 //rk28_read_adc(pRk28AdcKey);
192 adcvalue = gAdcValue[rk2818_adc_key.adc_chn];
193 //DBG("=========== adcvalue=0x%x ===========\n",adcvalue);
195 if((adcvalue > rk2818_adc_key.adc_empty) || (adcvalue < rk2818_adc_key.adc_invalid))
197 //DBG("adcvalue invalid !!!\n");
203 if(gLastCode == KEYMENU)
207 input_report_key(pRk28AdcKey->input_dev,ENDCALL,0);
208 input_sync(pRk28AdcKey->input_dev);
209 DBG("Enter::%s,LINE=%d,code=%d,ENDCALL,0\n",__FUNCTION__,__LINE__,gLastCode);
211 input_report_key(pRk28AdcKey->input_dev,gLastCode,1);
212 input_sync(pRk28AdcKey->input_dev);
213 DBG("Enter::%s,LINE=%d,code=%d,1\n",__FUNCTION__,__LINE__,gLastCode);
216 input_report_key(pRk28AdcKey->input_dev,gLastCode,0);
217 input_sync(pRk28AdcKey->input_dev);
218 DBG("Enter::%s,LINE=%d,code=%d,0\n",__FUNCTION__,__LINE__,gLastCode);
225 //DBG("adcvalue=0x%x\n",adcvalue);
227 code=rk28_get_keycode(adcvalue,rk2818_adc_key.adc_key_table);
233 if(++gCodeCount == 31)//40ms * 30 =1.2s
235 input_report_key(pRk28AdcKey->input_dev,ENDCALL,1);
236 input_sync(pRk28AdcKey->input_dev);
237 DBG("Enter::%s,LINE=%d,code=%d,ENDCALL,1\n",__FUNCTION__,__LINE__,code);
243 if(++gCodeCount == 2)//only one event once one touch
245 input_report_key(pRk28AdcKey->input_dev,code,1);
246 input_sync(pRk28AdcKey->input_dev);
247 DBG("Enter::%s,LINE=%d,code=%d,1\n",__FUNCTION__,__LINE__,code);
256 static int __devinit rk28_adckey_probe(struct platform_device *pdev)
258 struct rk28_adckey *adckey;
259 struct input_dev *input_dev;
262 adckey = kzalloc(sizeof(struct rk28_adckey), GFP_KERNEL);
263 if (adckey == NULL) {
264 dev_err(&pdev->dev, "failed to allocate driver data\n");
268 //memcpy(adckey->keycodes, gInitKeyCode, sizeof(adckey->keycodes));
269 adckey->keycodes = rk2818_adc_key.initKeyCode;
271 /* Create and register the input driver. */
272 input_dev = input_allocate_device();
274 dev_err(&pdev->dev, "failed to allocate input device\n");
279 input_dev->name = pdev->name;
280 //input_dev->id.bustype = BUS_HOST;
281 input_dev->open = rk28_adckey_open;
282 input_dev->close = rk28_adckey_close;
283 input_dev->dev.parent = &pdev->dev;
284 input_dev->phys = KEY_PHYS_NAME;
285 input_dev->id.vendor = 0x0001;
286 input_dev->id.product = 0x0001;
287 input_dev->id.version = 0x0100;
289 input_dev->keycode = adckey->keycodes;
290 input_dev->keycodesize = sizeof(unsigned char);
291 input_dev->keycodemax = rk2818_adc_key.adc_key_cnt;
292 for (i = 0; i < rk2818_adc_key.adc_key_cnt; i++)
293 set_bit(rk2818_adc_key.initKeyCode[i], input_dev->keybit);
294 clear_bit(0, input_dev->keybit);
296 adckey->input_dev = input_dev;
297 input_set_drvdata(input_dev, adckey);
299 input_dev->evbit[0] = BIT_MASK(EV_KEY);
301 // rk28_adckey_build_keycode(adckey);
302 platform_set_drvdata(pdev, adckey);
304 pRk28AdcKey = adckey;
306 /* Register the input device */
307 error = input_register_device(input_dev);
309 dev_err(&pdev->dev, "failed to register input device\n");
310 goto failed_free_dev;
313 error = gpio_request(rk2818_adc_key.pin_playon, "play key gpio");
315 dev_err(&pdev->dev, "failed to request play key gpio\n");
318 if(rk2818_adc_key.playon_level)
320 gpio_pull_updown(rk2818_adc_key.pin_playon,GPIOPullDown);
321 error = request_irq(gpio_to_irq(rk2818_adc_key.pin_playon),rk28_playkey_irq,IRQF_TRIGGER_RISING,NULL,NULL);
324 printk("unable to request play key irq\n");
330 gpio_pull_updown(rk2818_adc_key.pin_playon,GPIOPullUp);
331 error = request_irq(gpio_to_irq(rk2818_adc_key.pin_playon),rk28_playkey_irq,IRQF_TRIGGER_FALLING,NULL,NULL);
334 printk("unable to request play key irq\n");
339 enable_irq_wake(gpio_to_irq(rk2818_adc_key.pin_playon)); // so play/wakeup key can wake up system
341 error = gpio_direction_input(rk2818_adc_key.pin_playon);
344 printk("failed to set gpio rk2818_adc_key.pin_playon input\n");
348 setup_timer(&adckey->timer, rk28_adkeyscan_timer, (unsigned long)adckey);
349 adckey->timer.expires = jiffies+50;
350 add_timer(&adckey->timer);
351 printk(KERN_INFO "rk2818_adckey: driver initialized\n");
355 free_irq(gpio_to_irq(rk2818_adc_key.pin_playon),NULL);
357 gpio_free(rk2818_adc_key.pin_playon);
359 platform_set_drvdata(pdev, NULL);
360 input_free_device(input_dev);
366 static int __devexit rk28_adckey_remove(struct platform_device *pdev)
368 struct rk28_adckey *adckey = platform_get_drvdata(pdev);
370 input_unregister_device(adckey->input_dev);
371 input_free_device(adckey->input_dev);
372 platform_set_drvdata(pdev, NULL);
374 free_irq(gpio_to_irq(rk2818_adc_key.pin_playon),NULL);
375 gpio_free(rk2818_adc_key.pin_playon);
379 static struct platform_driver rk28_adckey_driver =
381 .probe = rk28_adckey_probe,
382 .remove = __devexit_p(rk28_adckey_remove),
383 .suspend = rk28_adckey_suspend,
384 .resume = rk28_adckey_resume,
386 .name = "rk2818-adckey",
387 .owner = THIS_MODULE,
391 int __init rk28_adckey_init(void)
393 return platform_driver_register(&rk28_adckey_driver);
396 static void __exit rk28_adckey_exit(void)
398 platform_driver_unregister(&rk28_adckey_driver);
401 module_init(rk28_adckey_init);
402 module_exit(rk28_adckey_exit);
404 MODULE_DESCRIPTION("rk2818 adc Key Controller Driver");
405 MODULE_AUTHOR("luowei lw@rock-chips.com");
406 MODULE_LICENSE("GPL");