static struct rk29_keys_button key_button[] = {
{
- .desc = "menu",
- .code = EV_MENU,
+ .desc = "esc",
+ .code = KEY_BACK,
.gpio = RK29_PIN6_PA0,
.active_low = PRESS_LEV_LOW,
},
.active_low = PRESS_LEV_LOW,
},
{
- .desc = "home",
- .code = KEY_HOME,
+ .desc = "menu",
+ .code = KEY_MENU,
.gpio = RK29_PIN6_PA3,
.active_low = PRESS_LEV_LOW,
},
+
{
- .desc = "search",
- .code = KEY_SEARCH,
+ .desc = "home",
+ .code = KEY_HOME,
.gpio = RK29_PIN6_PA4,
.active_low = PRESS_LEV_LOW,
},
+
{
- .desc = "esc",
- .code = KEY_BACK,
+ .desc = "play",
+ .code = KEY_POWER,
.gpio = RK29_PIN6_PA5,
.active_low = PRESS_LEV_LOW,
},
+
{
.desc = "sensor",
.code = KEY_CAMERA,
.gpio = RK29_PIN6_PA6,
.active_low = PRESS_LEV_LOW,
},
+#if 0
{
.desc = "play",
.code = KEY_POWER,
.active_low = PRESS_LEV_LOW,
.wakeup = 1,
},
+#endif
#if 0
{
.desc = "vol+",
static struct input_dev *input_dev;
-void rk29_send_power_key(void)
+void rk29_send_power_key(int state)
{
if (!input_dev)
return;
-
- input_report_key(input_dev, KEY_POWER, 1);
- input_sync(input_dev);
- input_report_key(input_dev, KEY_POWER, 0);
- input_sync(input_dev);
+ if(state)
+ {
+ input_report_key(input_dev, KEY_POWER, 1);
+ input_sync(input_dev);
+ }
+ else
+ {
+ input_report_key(input_dev, KEY_POWER, 0);
+ input_sync(input_dev);
+ }
}
void rk28_send_wakeup_key(void)
}
-extern void rk29_send_power_key(void);
-static int gNumInt = 0;
+extern void rk29_send_power_key(int state);
+static int gNumInt = 0, gNumTimer = 0;
+static struct timer_list irq_timer;
+static struct wm831x *gwm831x;
-static void wm831x_irq_worker(struct work_struct *work)
+void wm831x_power_off(void)
{
- struct wm831x *wm831x = container_of(work, struct wm831x, irq_work);
- wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_1, 0xffff);//clear all intterupt
+ wm831x_reg_write(gwm831x, WM831X_POWER_STATE, 0);//power off
+}
- if(++ gNumInt >= 2)
+static void wm831x_irq_timer(unsigned long data)
+{
+ struct wm831x *wm831x = (struct wm831x *)data;
+ int pin = irq_to_gpio(wm831x->irq);
+
+ if(gNumInt >0)
{
- rk29_send_power_key();
- //wake_lock_timeout(&wm831x->irq_wake,msecs_to_jiffies(2000));
- gNumInt = 0;
+ if(gpio_get_value(pin) > 0)
+ gNumTimer++;
+ else
+ gNumTimer = 0;
+
+ if(gNumTimer >20)
+ {
+ rk29_send_power_key(0);
+ gNumTimer = 0;
+ gNumInt = 0;
+ }
}
+
+ irq_timer.expires = jiffies + msecs_to_jiffies(20);
+ add_timer(&irq_timer);
+
+}
+
+static void wm831x_irq_worker(struct work_struct *work)
+{
+ struct wm831x *wm831x = container_of(work, struct wm831x, irq_work);
+ wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_1, 0xffff);//clear all intterupt
+ gNumInt++;
+ rk29_send_power_key(1);
enable_irq(wm831x->irq);
wake_unlock(&wm831x->irq_wake);
//printk("%s,irq=%d\n",__FUNCTION__,wm831x->irq);
wm831x->control_data = spi;
wm831x->read_dev = wm831x_spi_read_device;
wm831x->write_dev = wm831x_spi_write_device;
-
+ gwm831x = wm831x;
mutex_init(&wm831x->io_lock);
wm831x_init(wm831x);
wm831x_reg_write(wm831x, WM831X_SYSTEM_INTERRUPTS_MASK, 0xefff);
wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_1_MASK, 0xefff);
+ setup_timer(&irq_timer, wm831x_irq_timer, (unsigned long)wm831x);
+ irq_timer.expires = jiffies+2000;
+ add_timer(&irq_timer);
+
return 0;
//return wm831x_device_init(wm831x, type, irq);
}