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
|
depends on DM_KEY
|
||||||
help
|
help
|
||||||
This adds a driver for the rk keys support.
|
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
|
#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)
|
static void gpio_irq_handler(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct udevice *dev = data;
|
struct udevice *dev = data;
|
||||||
|
|
@ -188,6 +213,12 @@ static void gpio_irq_handler(int irq, void *data)
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
irq_revert_irq_type(irq);
|
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
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ struct dm_key_uclass_platdata {
|
||||||
u64 rise_ms;
|
u64 rise_ms;
|
||||||
u64 fall_ms;
|
u64 fall_ms;
|
||||||
|
|
||||||
|
u32 trig_cnt;
|
||||||
|
|
||||||
/* Only for pwrkey gpio irq */
|
/* Only for pwrkey gpio irq */
|
||||||
void (*irq_thread)(int irq, struct udevice *dev);
|
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 */
|
/* Confirm if your key value is a press event */
|
||||||
int key_is_pressed(int keyval);
|
int key_is_pressed(int keyval);
|
||||||
|
|
||||||
|
/* Pwrkey download mode init */
|
||||||
|
int pwrkey_download_init(void);
|
||||||
|
|
||||||
/* Read key */
|
/* Read key */
|
||||||
int key_read(int code);
|
int key_read(int code);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue