From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 07:23:06 +0000 Subject: [PATCH] rk3568 rt uboot init --- u-boot/drivers/input/key-uclass.c | 83 +++++++++++++++++++++++++++++++---------- 1 files changed, 63 insertions(+), 20 deletions(-) diff --git a/u-boot/drivers/input/key-uclass.c b/u-boot/drivers/input/key-uclass.c index f28869a..c4f85da 100644 --- a/u-boot/drivers/input/key-uclass.c +++ b/u-boot/drivers/input/key-uclass.c @@ -6,6 +6,7 @@ #include <common.h> #include <adc.h> +#include <div64.h> #include <dm.h> #include <irq-generic.h> #include <key.h> @@ -37,11 +38,42 @@ return (cntpct > base) ? (cntpct - base) : 0; } -static int key_adc_event(struct dm_key_uclass_platdata *uc_key, int adcval) +#ifdef CONFIG_ADC +static int adc_raw_to_mV(struct udevice *dev, unsigned int raw, int *mV) { - return (adcval <= uc_key->max && adcval >= uc_key->min) ? + unsigned int data_mask; + int ret, vref = 1800000; + u64 raw64 = raw; + + ret = adc_data_mask(dev, &data_mask); + if (ret) + return ret; + + raw64 *= vref; + do_div(raw64, data_mask); + *mV = raw64; + + return 0; +} + +static int key_adc_event(struct udevice *dev, + struct dm_key_uclass_platdata *uc_key, int adcval) +{ + int val = adcval; + + if (uc_key->in_volt) { + if (adc_raw_to_mV(dev, adcval, &val)) + return KEY_PRESS_NONE; + } + + debug("[%s] <%d, %d, %d>: adcval=%d -> mV=%d\n", + uc_key->name, uc_key->min, uc_key->center, uc_key->max, + adcval, val); + + return (val <= uc_key->max && val >= uc_key->min) ? KEY_PRESS_DOWN : KEY_PRESS_NONE; } +#endif static int key_gpio_event(struct dm_key_uclass_platdata *uc_key) { @@ -108,16 +140,34 @@ static int key_core_read(struct dm_key_uclass_platdata *uc_key) { - unsigned int adcval; - if (uc_key->type == ADC_KEY) { - if (adc_channel_single_shot("saradc", - uc_key->channel, &adcval)) { - KEY_ERR("%s failed to read saradc\n", uc_key->name); +#ifdef CONFIG_ADC + struct udevice *dev; + unsigned int adcval; + int ret; + + ret = uclass_get_device_by_name(UCLASS_ADC, "saradc", &dev); + if (ret) { + KEY_ERR("%s: No saradc\n", uc_key->name); return KEY_NOT_EXIST; } - return key_adc_event(uc_key, adcval); + ret = adc_start_channel(dev, uc_key->channel); + if (ret) { + KEY_ERR("%s: Failed to start saradc\n", uc_key->name); + return KEY_NOT_EXIST; + } + + ret = adc_channel_data(dev, uc_key->channel, &adcval); + if (ret) { + KEY_ERR("%s: Failed to read saradc, %d\n", uc_key->name, ret); + return KEY_NOT_EXIST; + } + + return key_adc_event(dev, uc_key, adcval); +#else + return KEY_NOT_EXIST; +#endif } return (uc_key->code == KEY_POWER) ? @@ -273,11 +323,7 @@ { struct dm_key_uclass_platdata *uc_key; int ret; -#ifdef CONFIG_SARADC_ROCKCHIP_V2 - int margin = 120; -#else - int margin = 30; -#endif + uc_key = dev_get_uclass_platdata(dev); if (!uc_key) return -ENXIO; @@ -286,11 +332,7 @@ uc_key->pre_reloc = dev_read_bool(dev, "u-boot,dm-pre-reloc") || dev_read_bool(dev, "u-boot,dm-spl"); - if (uc_key->type == ADC_KEY) { - uc_key->max = uc_key->adcval + margin; - uc_key->min = uc_key->adcval > margin ? - uc_key->adcval - margin : 0; - } else { + if (uc_key->type != ADC_KEY) { if (uc_key->code == KEY_POWER) { #if CONFIG_IS_ENABLED(IRQ) int irq; @@ -337,8 +379,9 @@ dev->parent->name); if (uc_key->type == ADC_KEY) { - printf(" adcval: %d (%d, %d)\n", uc_key->adcval, - uc_key->min, uc_key->max); + printf(" %s: %d (%d, %d)\n", + uc_key->in_volt ? "volt" : " adc", + uc_key->center, uc_key->min, uc_key->max); printf(" channel: %d\n\n", uc_key->channel); } else { const char *gpio_name = -- Gitblit v1.6.2