Message ID | 20230510155550.2871505-1-macroalpha82@gmail.com |
---|---|
State | Accepted |
Commit | 3c057b4c6c38aa60fcb1fceb46bcc441a8065116 |
Delegated to: | Kever Yang |
Headers | show |
Series | rockchip: board: Update Odroid Go2 to Support Additional Revisions | expand |
On 2023/5/10 23:55, Chris Morgan wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > Update the board.c file for the Odroid Go Advance to support the > Black Edition and the Odroid Go Super. The Odroid Go Advance Black > Edition differs from the original model with the addition of 2 > extra buttons and an ESP8266 WiFi module. The Odroid Go Super > adds an additional 2 buttons compared to the Black Edition, along > with a larger panel and larger battery. > > This change uses the value of ADC0 to determine which of these > 3 models it is, and then changes the ${fdtfile} environment variable > to match the proper devicetree name in mainline Linux. > > Tested on an Odroid Go Advance (first revision) and an Odroid Go Super. > The correct ${fdtfile} variable was set for each device. > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> Thanks, - Kever > --- > board/hardkernel/odroid_go2/go2.c | 103 ++++++++++++++++++++++++++++++ > configs/odroid-go2_defconfig | 1 + > 2 files changed, 104 insertions(+) > > diff --git a/board/hardkernel/odroid_go2/go2.c b/board/hardkernel/odroid_go2/go2.c > index 29464ae63e..a0338ead3b 100644 > --- a/board/hardkernel/odroid_go2/go2.c > +++ b/board/hardkernel/odroid_go2/go2.c > @@ -2,3 +2,106 @@ > /* > * (C) Copyright 2019 Rockchip Electronics Co., Ltd > */ > + > +#include <linux/stddef.h> > +#include <adc.h> > +#include <asm/io.h> > +#include <dm.h> > +#include <env.h> > +#include <stdlib.h> > + > +#define DTB_DIR "rockchip/" > + > +struct oga_model { > + const u16 adc_value; > + const char *board; > + const char *board_name; > + const char *fdtfile; > +}; > + > +enum oga_device_id { > + OGA, > + OGA_V11, > + OGS, > +}; > + > +/* > + * All ADC values from schematic of Odroid Go Advance Black Edition. > + * Value for OGS is inferred based on schematic and observed values. > + */ > +static const struct oga_model oga_model_details[] = { > + [OGA] = { > + 856, > + "rk3326-odroid-go2", > + "ODROID-GO Advance", > + DTB_DIR "rk3326-odroid-go2.dtb", > + }, > + [OGA_V11] = { > + 677, > + "rk3326-odroid-go2-v11", > + "ODROID-GO Advance Black Edition", > + DTB_DIR "rk3326-odroid-go2-v11.dtb", > + }, > + [OGS] = { > + 85, > + "rk3326-odroid-go3", > + "ODROID-GO Super", > + DTB_DIR "rk3326-odroid-go3.dtb", > + }, > +}; > + > +/* Detect which Odroid Go Advance device we are using so as to load the > + * correct devicetree for Linux. Set an environment variable once > + * found. The detection depends on the value of ADC channel 0. > + */ > +int oga_detect_device(void) > +{ > + u32 adc_info; > + int ret, i; > + int board_id = -ENXIO; > + > + ret = adc_channel_single_shot("saradc@ff288000", 0, &adc_info); > + if (ret) { > + printf("Read SARADC failed with error %d\n", ret); > + return ret; > + } > + > + /* > + * Get the correct device from the table. The ADC value is > + * determined by a resistor on ADC channel 0. The manufacturer > + * accounted for this with a 5% tolerance, so assume a +- value > + * of 50 should be enough. > + */ > + for (i = 0; i < ARRAY_SIZE(oga_model_details); i++) { > + u32 adc_min = oga_model_details[i].adc_value - 50; > + u32 adc_max = oga_model_details[i].adc_value + 50; > + > + if (adc_min < adc_info && adc_max > adc_info) { > + board_id = i; > + break; > + } > + } > + > + if (board_id < 0) > + return board_id; > + > + env_set("board", oga_model_details[board_id].board); > + env_set("board_name", > + oga_model_details[board_id].board_name); > + env_set("fdtfile", oga_model_details[board_id].fdtfile); > + > + return 0; > +} > + > +int rk_board_late_init(void) > +{ > + int ret; > + > + ret = oga_detect_device(); > + if (ret) { > + printf("Unable to detect device type: %d\n", ret); > + return ret; > + } > + > + return 0; > +} > diff --git a/configs/odroid-go2_defconfig b/configs/odroid-go2_defconfig > index 459ae3d59c..bdc2288af6 100644 > --- a/configs/odroid-go2_defconfig > +++ b/configs/odroid-go2_defconfig > @@ -35,6 +35,7 @@ CONFIG_DEFAULT_FDT_FILE="rockchip/rk3326-odroid-go2.dtb" > # CONFIG_CONSOLE_MUX is not set > # CONFIG_DISPLAY_CPUINFO is not set > CONFIG_DISPLAY_BOARDINFO_LATE=y > +CONFIG_BOARD_LATE_INIT=y > CONFIG_MISC_INIT_R=y > CONFIG_SPL_MAX_SIZE=0x20000 > CONFIG_SPL_PAD_TO=0x7f8000
diff --git a/board/hardkernel/odroid_go2/go2.c b/board/hardkernel/odroid_go2/go2.c index 29464ae63e..a0338ead3b 100644 --- a/board/hardkernel/odroid_go2/go2.c +++ b/board/hardkernel/odroid_go2/go2.c @@ -2,3 +2,106 @@ /* * (C) Copyright 2019 Rockchip Electronics Co., Ltd */ + +#include <linux/stddef.h> +#include <adc.h> +#include <asm/io.h> +#include <dm.h> +#include <env.h> +#include <stdlib.h> + +#define DTB_DIR "rockchip/" + +struct oga_model { + const u16 adc_value; + const char *board; + const char *board_name; + const char *fdtfile; +}; + +enum oga_device_id { + OGA, + OGA_V11, + OGS, +}; + +/* + * All ADC values from schematic of Odroid Go Advance Black Edition. + * Value for OGS is inferred based on schematic and observed values. + */ +static const struct oga_model oga_model_details[] = { + [OGA] = { + 856, + "rk3326-odroid-go2", + "ODROID-GO Advance", + DTB_DIR "rk3326-odroid-go2.dtb", + }, + [OGA_V11] = { + 677, + "rk3326-odroid-go2-v11", + "ODROID-GO Advance Black Edition", + DTB_DIR "rk3326-odroid-go2-v11.dtb", + }, + [OGS] = { + 85, + "rk3326-odroid-go3", + "ODROID-GO Super", + DTB_DIR "rk3326-odroid-go3.dtb", + }, +}; + +/* Detect which Odroid Go Advance device we are using so as to load the + * correct devicetree for Linux. Set an environment variable once + * found. The detection depends on the value of ADC channel 0. + */ +int oga_detect_device(void) +{ + u32 adc_info; + int ret, i; + int board_id = -ENXIO; + + ret = adc_channel_single_shot("saradc@ff288000", 0, &adc_info); + if (ret) { + printf("Read SARADC failed with error %d\n", ret); + return ret; + } + + /* + * Get the correct device from the table. The ADC value is + * determined by a resistor on ADC channel 0. The manufacturer + * accounted for this with a 5% tolerance, so assume a +- value + * of 50 should be enough. + */ + for (i = 0; i < ARRAY_SIZE(oga_model_details); i++) { + u32 adc_min = oga_model_details[i].adc_value - 50; + u32 adc_max = oga_model_details[i].adc_value + 50; + + if (adc_min < adc_info && adc_max > adc_info) { + board_id = i; + break; + } + } + + if (board_id < 0) + return board_id; + + env_set("board", oga_model_details[board_id].board); + env_set("board_name", + oga_model_details[board_id].board_name); + env_set("fdtfile", oga_model_details[board_id].fdtfile); + + return 0; +} + +int rk_board_late_init(void) +{ + int ret; + + ret = oga_detect_device(); + if (ret) { + printf("Unable to detect device type: %d\n", ret); + return ret; + } + + return 0; +} diff --git a/configs/odroid-go2_defconfig b/configs/odroid-go2_defconfig index 459ae3d59c..bdc2288af6 100644 --- a/configs/odroid-go2_defconfig +++ b/configs/odroid-go2_defconfig @@ -35,6 +35,7 @@ CONFIG_DEFAULT_FDT_FILE="rockchip/rk3326-odroid-go2.dtb" # CONFIG_CONSOLE_MUX is not set # CONFIG_DISPLAY_CPUINFO is not set CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_BOARD_LATE_INIT=y CONFIG_MISC_INIT_R=y CONFIG_SPL_MAX_SIZE=0x20000 CONFIG_SPL_PAD_TO=0x7f8000