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:
Joseph Chen 2019-06-11 10:25:01 +08:00 committed by Jianhong Chen
parent 868ca499ba
commit 1a9c8b1b4c
3 changed files with 44 additions and 0 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);