dm: key: add pwrkey download support
User can press and release pwrkey for times to enter download mode, set it disabled by default. Change-Id: Id2fd9d12756bb1584a4d25b6df0c16a8a85d1e9a Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
parent
868ca499ba
commit
1a9c8b1b4c
|
|
@ -68,3 +68,11 @@ config RK_KEY
|
|||
depends on DM_KEY
|
||||
help
|
||||
This adds a driver for the rk keys support.
|
||||
|
||||
config PWRKEY_DNL_TRIGGER_NUM
|
||||
int "Enter download mode by pwrkey trigger count"
|
||||
default 0
|
||||
depends on DM_KEY && IRQ
|
||||
help
|
||||
This support enter download mode by press and release pwrkey for times
|
||||
over the trigger count. The default value 0 means disabled.
|
||||
|
|
|
|||
|
|
@ -163,6 +163,31 @@ try_again:
|
|||
}
|
||||
|
||||
#ifdef CONFIG_IRQ
|
||||
#if defined(CONFIG_PWRKEY_DNL_TRIGGER_NUM) && \
|
||||
(CONFIG_PWRKEY_DNL_TRIGGER_NUM > 0)
|
||||
static void power_key_download(struct dm_key_uclass_platdata *uc_key)
|
||||
{
|
||||
int trig_cnt = CONFIG_PWRKEY_DNL_TRIGGER_NUM;
|
||||
static u64 old_rise_ms;
|
||||
|
||||
if (uc_key->code == KEY_POWER && old_rise_ms != uc_key->rise_ms) {
|
||||
old_rise_ms = uc_key->rise_ms;
|
||||
uc_key->trig_cnt++;
|
||||
if (uc_key->trig_cnt >= trig_cnt) {
|
||||
printf("\nEnter download mode by pwrkey\n");
|
||||
irq_handler_disable(uc_key->irq);
|
||||
run_command("rockusb 0 $devtype $devnum", 0);
|
||||
run_command("rbrom", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int pwrkey_download_init(void)
|
||||
{
|
||||
return (KEY_NOT_EXIST == key_read(KEY_POWER));
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gpio_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct udevice *dev = data;
|
||||
|
|
@ -188,6 +213,12 @@ static void gpio_irq_handler(int irq, void *data)
|
|||
mdelay(10);
|
||||
irq_revert_irq_type(irq);
|
||||
}
|
||||
|
||||
/* Hook event: enter download mode by pwrkey */
|
||||
#if defined(CONFIG_PWRKEY_DNL_TRIGGER_NUM) && \
|
||||
(CONFIG_PWRKEY_DNL_TRIGGER_NUM > 0)
|
||||
power_key_download(uc_key);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ struct dm_key_uclass_platdata {
|
|||
u64 rise_ms;
|
||||
u64 fall_ms;
|
||||
|
||||
u32 trig_cnt;
|
||||
|
||||
/* Only for pwrkey gpio irq */
|
||||
void (*irq_thread)(int irq, struct udevice *dev);
|
||||
};
|
||||
|
|
@ -55,6 +57,9 @@ uint64_t key_timer(uint64_t base);
|
|||
/* Confirm if your key value is a press event */
|
||||
int key_is_pressed(int keyval);
|
||||
|
||||
/* Pwrkey download mode init */
|
||||
int pwrkey_download_init(void);
|
||||
|
||||
/* Read key */
|
||||
int key_read(int code);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue