nbhw18: fix set_console to allow actually switching it

This commit is contained in:
Stefan Eichenberger 2018-01-09 14:48:48 +01:00
parent b5b6a3c344
commit 865c49bcf9
9 changed files with 185 additions and 49 deletions

View File

@ -24,10 +24,6 @@
ethernet3 = &eth2; ethernet3 = &eth2;
}; };
chosen {
stdout-path = "serial0:115200n8";
};
memory { memory {
device_type = "memory"; device_type = "memory";
reg = <0x00000000 0x40000000>; /* 1 GB */ reg = <0x00000000 0x40000000>; /* 1 GB */
@ -141,7 +137,6 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&uart0_pins>; pinctrl-0 = <&uart0_pins>;
status = "okay"; status = "okay";
u-boot,dm-pre-reloc;
}; };
serial@12100 { serial@12100 {

View File

@ -0,0 +1,48 @@
/*
* Device Tree file for the NetModule NBHW17 (NB2800) base variant
*
* Copyright (C) 2016 NetModule
*
* Stefan Eichenberger <stefan.eichenberger@netmodule.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
/dts-v1/;
#include "armada-385-nbhw18-common.dtsi"
/ {
model = "NetModule Router NBHW18 with Armada A385 (NB2800)";
chosen {
stdout-path = "serial0:115200n8";
};
soc {
internal-regs {
serial@12000 {
u-boot,dm-spl;
};
};
};
};
&eth0 {
status = "okay";
};
// SFP-Port
&eth1 {
status = "disabled";
fixed-link {
speed = <1000>;
full-duplex;
};
};
&eth2 {
status = "okay";
};

View File

@ -1,6 +1,6 @@
#include <common.h> #include <common.h>
#include "fs.h" #include "nbhw_fileaccess.h"
#include "nbhw_bd.h" #include "nbhw_bd.h"
#define MAX_PARTITION_ENTRIES 8 #define MAX_PARTITION_ENTRIES 8
@ -18,41 +18,23 @@ void find_and_set_active_partition(void)
void set_console(void) void set_console(void)
{ {
char buf[50] = "\n"; char buf[50] = "\0";
char *defaultconsole = env_get("defaultconsole"); char *defaultconsole = env_get("defaultconsole");
int len = 0;
if (defaultconsole == 0) {
/* This is the default console that should be used for e.g. recovery boot */
#if 0
/* TODO: fix this */
sprintf(buf, "ttyS%d", CONFIG_SYS_DUART_CHAN);
#endif
env_set("defaultconsole", buf);
}
#if defined(CONFIG_PRE_CONSOLE_BUFFER) #if defined(CONFIG_PRE_CONSOLE_BUFFER)
/* If consoldev is set take this as productive conosle instead of default console */ read_file_set_blk_dev("mmc", "0:3", FS_TYPE_EXT);
if (fs_set_blk_dev("mmc", "0:3", FS_TYPE_EXT) != 0) {
puts("Error, can not set blk device\n");
goto use_default_console;
}
len = fs_read("/root/boot/consoledev", (ulong)buf, 0, 5); len = read_file("/root/boot/consoledev", buf, 16);
if ((len != 5) || (strstr(buf, "tty")!=buf) || ((buf[4]<'0') && (buf[4]>'1'))) { if ((len != 5) || (strstr(buf, "tty")!=buf) || ((buf[4]<'0') && (buf[4]>'1'))) {
puts("Using default console\n"); buf[0] = 0;
goto use_default_console;
}
if (buf[4]=='1') {
CONFIG_SYS_DUART_CHAN = 1;
} else {
CONFIG_SYS_DUART_CHAN = 0;
} }
use_default_console: use_default_console:
if (buf[0] == 0) {
sprintf(buf, "ttyS%d", CONFIG_SYS_DUART_CHAN); strncpy(buf, defaultconsole, sizeof(buf));
}
printf("consoledev: %s\n", buf);
env_set("consoledev", buf); env_set("consoledev", buf);
#endif #endif
} }

View File

@ -1,19 +1,47 @@
#include <fs.h> #include <fs.h>
#include <common.h> #include <common.h>
char l_ifname[32];
char l_dev_part_str[32];
int l_fstype;
void read_file_set_blk_dev(const char *ifname,
const char *dev_part_str, int fstype)
{
strncpy(l_ifname, ifname, sizeof(l_ifname));
strncpy(l_dev_part_str, dev_part_str, sizeof(l_dev_part_str));
l_fstype = fstype;
}
int read_file(const char* filename, char *buf, int size) int read_file(const char* filename, char *buf, int size)
{ {
loff_t filesize = 0; loff_t filesize = 0;
loff_t len; loff_t len;
int ret; int ret;
if (fs_set_blk_dev("mmc", "0:3", FS_TYPE_EXT) != 0) {
puts("Error, can not set blk device\n");
return -1;
}
/* U-Boot returns an error if size != len therefore
* get first the length... */
if (fs_size(filename, &filesize)) { if (fs_size(filename, &filesize)) {
puts("Can't get filesize\n"); puts("Can't get filesize\n");
return -1; return -1;
} }
if (filesize < size) if (filesize < size){
size = filesize; size = filesize;
len = filesize;
}
/* U-Boot forgets the block device after an action, so do it again ...*/
if (fs_set_blk_dev("mmc", "0:3", FS_TYPE_EXT) != 0) {
puts("Error, can not set blk device\n");
return -1;
}
if ((ret = fs_read(filename, (ulong)buf, 0, size, &len))) { if ((ret = fs_read(filename, (ulong)buf, 0, size, &len))) {
printf("Can't read file %s (size %d, len %lld, ret %d)\n", filename, size, len, ret); printf("Can't read file %s (size %d, len %lld, ret %d)\n", filename, size, len, ret);

View File

@ -10,5 +10,7 @@
#include <fs.h> #include <fs.h>
int read_file(const char* filename, char *buf, int size); int read_file(const char* filename, char *buf, int size);
void read_file_set_blk_dev(const char *ifname,
const char *dev_part_str, int fstype);
#endif // FILEACCESS_H #endif // FILEACCESS_H

View File

@ -25,4 +25,3 @@ obj-y := board.o nbhw_gpio.o \
../common/nbhw_bd.o ../common/nbhw_bd.o
endif endif

View File

@ -16,6 +16,7 @@
#include <linux/mbus.h> #include <linux/mbus.h>
#include <environment.h> #include <environment.h>
#include <fdt_support.h> #include <fdt_support.h>
#include <dm.h>
#include <asm/gpio.h> #include <asm/gpio.h>
@ -86,6 +87,45 @@ static inline int __maybe_unused read_eeprom(void)
return _bd_init(); return _bd_init();
} }
extern int console_init_f(void);
static int init_console(void)
{
int ret;
struct udevice *dev;
char *consoledev;
char buf[16] = "serial@12100";
debug("init console\n");
/* Make sure all devices are probed, it seems
* that this stuff is buggy in U-Boot */
ret = uclass_first_device(UCLASS_SERIAL, &dev);
if (ret) {
printf("Could not find any serial device\n");
return ret;
}
while (list_is_last(&dev->uclass_node, &dev->uclass->dev_head) == 0) {
uclass_next_device(&dev);
}
set_console();
consoledev = env_get("consoledev");
if (strncmp(consoledev, "ttyS0", 5) == 0) {
strncpy(buf, "serial@12000", sizeof(buf));
}
env_set("stdin", buf);
env_set("stdout", buf);
env_set("stderr", buf);
return 0;
}
int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count) int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
{ {
int i; int i;
@ -199,13 +239,13 @@ void spl_board_init(void)
if (err) if (err)
return; return;
puts("SPL: select partition\n"); debug("SPL: select partition\n");
mmcp = find_mmc_device(0); mmcp = find_mmc_device(0);
mmc_init(mmcp); mmc_init(mmcp);
printf("Partition found: %p\n", mmcp); printf("Partition found: %p\n", mmcp);
/* select boot0 as bootpart */ /* select boot0 as bootpart */
mmcp->part_config |= (1 << 3); mmcp->part_config |= (1 << 3);
puts("Partition switched to boot0\n"); debug("Partition switched to boot0\n");
} }
static void set_gpios(void) static void set_gpios(void)
@ -250,8 +290,6 @@ int board_init(void)
if (read_eeprom() < 0) if (read_eeprom() < 0)
puts("Could not get board ID.\n"); puts("Could not get board ID.\n");
set_console();
set_gpios(); set_gpios();
/* @@se: With this call we disable a debug feature, that allows one to read out the memory /* @@se: With this call we disable a debug feature, that allows one to read out the memory
@ -265,6 +303,29 @@ int board_init(void)
return 0; return 0;
} }
int board_early_init_r(void)
{
/* We need to force mmc_initialization here, so that
* we have mmc available for read of /boot/consoledev */
mmc_initialize(gd->bd);
/* We need to force the env relocation so that it won't overwritte the
* serial devices that we set in init_console */
env_relocate();
gd->env_valid = ENV_VALID;
init_console();
return 0;
}
int misc_init_r(void)
{
/* Because U-Boot is buggy, we need to call this funktion again
* it will print the pre console buffer */
console_init_f();
return 0;
}
static void set_phy_page(const char *miidev, int phy_addr, int page) static void set_phy_page(const char *miidev, int phy_addr, int page)
{ {
miiphy_write(miidev, phy_addr, 22, page); miiphy_write(miidev, phy_addr, 22, page);
@ -284,7 +345,6 @@ static void set_phy_fast_blink_mode(int phy_addr)
int board_late_init(void) int board_late_init(void)
{ {
gpio_request(21, "RST_ETH_PHY_N"); gpio_request(21, "RST_ETH_PHY_N");
gpio_direction_output(21, 0); gpio_direction_output(21, 0);
@ -313,18 +373,30 @@ int board_network_enable(struct mii_dev *bus)
int checkboard(void) int checkboard(void)
{ {
puts("Board: NetModule NBHW18\n"); debug("Board: NetModule NBHW18\n");
return 0; return 0;
} }
int board_fit_config_name_match(const char *name) int board_fit_config_name_match(const char *name)
{ {
#ifdef CONFIG_SPL_BUILD
/* SPL has enabled serial0 per default and will output everything
* independend of /boot/consoledev */
#define DEFAULT_DTB_NAME "armada-385-nbhw18-spl"
#else
/* U-Boot will read /boot/consoledev and based on that it
* enables its own serial console */
#define DEFAULT_DTB_NAME "armada-385-nbhw18-v1"
#endif
/* Check if name fits our dts */ /* Check if name fits our dts */
return 0; return strcmp(DEFAULT_DTB_NAME, name);
} }
#ifdef CONFIG_OF_BOARD_FIXUP #ifdef CONFIG_OF_BOARD_FIXUP
int fdt_enable_by_ofname(void *rw_fdt_blob, char *ofname) int fdt_enable_by_ofname(void *rw_fdt_blob, char *ofname)
{ {
int offset = fdt_path_offset(rw_fdt_blob, ofname); int offset = fdt_path_offset(rw_fdt_blob, ofname);
@ -334,7 +406,9 @@ int fdt_enable_by_ofname(void *rw_fdt_blob, char *ofname)
int board_fix_fdt(void *fdt_blob) int board_fix_fdt(void *fdt_blob)
{ {
puts("Enable SFP Port\n"); debug("Enable SFP Port\n");
return fdt_enable_by_ofname(fdt_blob, "/soc/internal-regs/ethernet@30000"); return fdt_enable_by_ofname(fdt_blob, "/soc/internal-regs/ethernet@30000");
} }
#endif #endif

View File

@ -1,4 +1,4 @@
#define DEBUG #undef DEBUG
#include <common.h> #include <common.h>
#include <dm.h> #include <dm.h>
#include <dm/device.h> #include <dm/device.h>

View File

@ -89,7 +89,7 @@
"eth2addr=00:11:22:33:44:56\0" \ "eth2addr=00:11:22:33:44:56\0" \
"eth3addr=00:11:22:33:44:57\0" \ "eth3addr=00:11:22:33:44:57\0" \
"ethact=ethernet@34000\0" \ "ethact=ethernet@34000\0" \
"add_sd_bootargs=setenv bootargs $bootargs root=/dev/mmcblk0p$root_part rootfstype=ext4 console=ttyS1,115200 rootwait loglevel=4\0" \ "add_sd_bootargs=setenv bootargs $bootargs root=/dev/mmcblk0p$root_part rootfstype=ext4 console=$consoledev,115200 rootwait loglevel=4\0" \
"add_version_bootargs=setenv bootargs $bootargs\0" \ "add_version_bootargs=setenv bootargs $bootargs\0" \
"fdt_skip_update=yes\0" \ "fdt_skip_update=yes\0" \
"sdbringup=echo Try bringup boot && ext4load mmc 0:$root_part $kernel_addr /boot/zImage && " \ "sdbringup=echo Try bringup boot && ext4load mmc 0:$root_part $kernel_addr /boot/zImage && " \
@ -114,7 +114,8 @@
"tftptimeoutcountmax=5\0" \ "tftptimeoutcountmax=5\0" \
"bootpretryperiod=2000\0" \ "bootpretryperiod=2000\0" \
"autoload=false\0" \ "autoload=false\0" \
"tftp_recovery=tftpboot $kernel_addr recovery-image; tftpboot $fdt_addr recovery-dtb; setenv bootargs rdinit=/etc/preinit console=ttyO1,115200 debug; bootz $kernel_addr - $fdt_addr\0" \ "defaultconsole=ttyS1\0" \
"tftp_recovery=tftpboot $kernel_addr recovery-image; tftpboot $fdt_addr recovery-dtb; setenv bootargs rdinit=/etc/preinit console=$defaultconsole,115200 debug; bootz $kernel_addr - $fdt_addr\0" \
"pxe_recovery=sleep 3 && dhcp && pxe get && pxe boot\0" \ "pxe_recovery=sleep 3 && dhcp && pxe get && pxe boot\0" \
"load_fpga=ext4load mmc 0:$root_part $kernel_addr /logic/LG00000000 && nbhw_fpga program lattice 0xffffffff $kernel_addr $filesize && nbhw_fpga configure\0" \ "load_fpga=ext4load mmc 0:$root_part $kernel_addr /logic/LG00000000 && nbhw_fpga program lattice 0xffffffff $kernel_addr $filesize && nbhw_fpga configure\0" \
"recovery=run pxe_recovery || setenv ipaddr $ipaddr; setenv serverip $serverip; run tftp_recovery\0" /* setenv ipaddr and serverip is necessary, because dhclient can destroy the IPs inernally */ "recovery=run pxe_recovery || setenv ipaddr $ipaddr; setenv serverip $serverip; run tftp_recovery\0" /* setenv ipaddr and serverip is necessary, because dhclient can destroy the IPs inernally */
@ -145,6 +146,7 @@
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
#define CONFIG_SYS_MALLOC_SIMPLE #define CONFIG_SYS_MALLOC_SIMPLE
#define CONFIG_OF_STDOUT_VIA_ALIAS
#endif #endif
#define CONFIG_SPL_STACK (0x40000000 + ((192 - 16) << 10)) #define CONFIG_SPL_STACK (0x40000000 + ((192 - 16) << 10))
@ -189,6 +191,12 @@
#undef CONFIG_AUTOBOOT_DELAY_STR #undef CONFIG_AUTOBOOT_DELAY_STR
#define CONFIG_AUTOBOOT_STOP_STR "s" #define CONFIG_AUTOBOOT_STOP_STR "s"
#define CONFIG_OF_BOARD_FIXUP #ifndef CONFIG_SPL_BUILD
#undef CONFIG_REQUIRE_SERIAL_CONSOLE
/* Wee need early init r to actually print the pre console buffer
* because u-boot is buggy */
#define CONFIG_BOARD_EARLY_INIT_R
#define CONFIG_MISC_INIT_R
#endif
#endif /* _CONFIG_DB_88F6820_GP_H */ #endif /* _CONFIG_DB_88F6820_GP_H */