From d799d21b6ea0d9fb6034cb8a3569e6b34cfbccd0 Mon Sep 17 00:00:00 2001 From: Marcel Reichmuth Date: Mon, 11 Jul 2016 16:16:43 +0200 Subject: [PATCH] nbhw16: fixed auto boot for sdprod script nbhw16: added nbsw style u-boot environment settings nbhw16: added factory reset and recovery boot support via reset button nbhw16: set hardware version on kernel command line nbhw16: removed dummy u-boot partition --- board/nm/netbird/board.c | 96 ++++++++++++++++++++++++++++- board/nm/netbird/board_descriptor.c | 29 ++++++++- board/nm/netbird/board_descriptor.h | 1 + include/configs/am335x_netbird.h | 12 ++-- 4 files changed, 129 insertions(+), 9 deletions(-) diff --git a/board/nm/netbird/board.c b/board/nm/netbird/board.c index 7edeaacd90..2fa606b459 100644 --- a/board/nm/netbird/board.c +++ b/board/nm/netbird/board.c @@ -56,6 +56,7 @@ DECLARE_GLOBAL_DATA_PTR; #define NETBIRD_GPIO_EN_GPS_ANT GPIO_TO_PIN(2, 24) #define NETBIRD_GPIO_LED_A GPIO_TO_PIN(1, 14) #define NETBIRD_GPIO_LED_B GPIO_TO_PIN(1, 15) +#define NETBIRD_GPIO_RESET_BUTTON GPIO_TO_PIN(1, 13) #if defined(CONFIG_SPL_BUILD) || \ (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_DM_ETH)) @@ -214,6 +215,81 @@ err_free_gpio: #define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N, 1); #define REQUEST_AND_CLEAR_GPIO(N) request_and_set_gpio(N, #N, 0); + +int check_reset_button(void) +{ + int counter = 0; + int ret; + + ret = gpio_request(NETBIRD_GPIO_RESET_BUTTON, "reset button"); + if (ret < 0) { + printf("Unable to request reset button gpio\n"); + return -1; + } + + ret = gpio_direction_input(NETBIRD_GPIO_RESET_BUTTON); + if (ret < 0) { + printf("Unable to set reset button as input\n"); + return -1; + } + + /* Check if reset button is pressed for at least 3 seconds */ + do { + if (gpio_get_value(NETBIRD_GPIO_RESET_BUTTON) != 0) break; + udelay(100000); /* 100ms */ + counter++; + + if (counter==30) {/* Indicate factory reset threshold */ + /* let LED blink up once */ + gpio_set_value(NETBIRD_GPIO_LED_B, 1); + udelay(400000); /* 400ms */ + gpio_set_value(NETBIRD_GPIO_LED_B, 0); + } else if (counter==150) { /* Indicate recovery boot threshold */ + /* let LED blink up twice */ + gpio_set_value(NETBIRD_GPIO_LED_B, 1); + udelay(400000); /* 400ms */ + gpio_set_value(NETBIRD_GPIO_LED_B, 0); + udelay(400000); /* 400ms */ + gpio_set_value(NETBIRD_GPIO_LED_B, 1); + udelay(400000); /* 400ms */ + gpio_set_value(NETBIRD_GPIO_LED_B, 0); + } + } while (counter<150); + + if (counter < 30) return 0; /* Don't do anything for duration < 3s */ + + if (counter < 150) /* Do factory reset for duration between 3s and 15s */ + { + char new_bootargs[512]; + char *bootargs = getenv("bootargs"); + + if (bootargs==0) bootargs=""; + + printf("Do factory reset during boot...\n"); + + strncpy(new_bootargs, bootargs, sizeof(new_bootargs)); + strncat(new_bootargs, " factory-reset", sizeof(new_bootargs)); + + setenv("bootargs", new_bootargs); + + printf("bootargs = %s\n", new_bootargs); + + return 1; + } else { /* Boot into recovery for duration > 15s */ + + /* set consoledev to external port */ + setenv("consoledev", "ttyO0"); + + printf("Booting recovery image...\n"); + + /* Set bootcmd to run recovery */ + setenv("bootcmd", "run recovery"); + + return 0; + } + return 0; +} + /* * Basic board specific setup. Pinmux has been handled already. */ @@ -233,7 +309,8 @@ int board_init(void) REQUEST_AND_SET_GPIO(NETBIRD_GPIO_PWR_GSM); mdelay(1200); gpio_set_value(NETBIRD_GPIO_PWR_GSM, 0); - REQUEST_AND_SET_GPIO(NETBIRD_GPIO_LED_A); + REQUEST_AND_CLEAR_GPIO(NETBIRD_GPIO_LED_A); + REQUEST_AND_CLEAR_GPIO(NETBIRD_GPIO_LED_B); REQUEST_AND_SET_GPIO(NETBIRD_GPIO_RST_PHY_N); REQUEST_AND_CLEAR_GPIO(NETBIRD_GPIO_WLAN_EN); REQUEST_AND_CLEAR_GPIO(NETBIRD_GPIO_BT_EN); @@ -334,6 +411,7 @@ static void set_mac_address(int index, uchar mac[6]) */ int board_eth_init(bd_t *bis) { + int hw_ver, hw_rev; int rv, n = 0; uint8_t mac_addr0[6] = {02,00,00,00,00,01}; uint8_t mac_addr1[6] = {02,00,00,00,00,02}; @@ -355,13 +433,25 @@ int board_eth_init(bd_t *bis) bd_get_mac_address(1, mac_addr1, sizeof(mac_addr1)); set_mac_address(1, mac_addr1); + /* add active root partition to environment */ boot_partition = bd_get_boot_partition(); if (boot_partition > 1) { boot_partition = 0; } - /* mmcblk0p1 => u-boot, mmcblk0p2 => root0 so +2 */ - setenv_ulong("root_part", boot_partition + 2); + /* mmcblk0p1 => root0, mmcblk0p2 => root1 so +1 */ + setenv_ulong("root_part", boot_partition + 1); + + /* add hardware versions to environment */ + if (bd_get_hw_version(&hw_ver, &hw_rev)==0) { + char hw_versions[128]; + char new_env[256]; + snprintf(hw_versions, sizeof(hw_versions), "CP=%d.%d", hw_ver, hw_rev); + snprintf(new_env, sizeof(new_env), "setenv bootargs $bootargs %s", hw_versions); + setenv("add_version_bootargs", new_env); + } + + check_reset_button(); writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel); cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII; diff --git a/board/nm/netbird/board_descriptor.c b/board/nm/netbird/board_descriptor.c index 080298a9ed..ee05c0c8c8 100644 --- a/board/nm/netbird/board_descriptor.c +++ b/board/nm/netbird/board_descriptor.c @@ -160,7 +160,7 @@ static u8 try_partition_read(void) partition_count++; if (((partition.flags & BD_Partition_Flags_Active) != 0) && (i > 0)) { - boot_partition = i - 1; /* The first one is a dummy partition for u-boot */ + boot_partition = i; } } } @@ -211,3 +211,30 @@ int bd_get_mac_address(uint index, u8 *mac, u32 len) else return -1; } + +int bd_get_hw_version(int* pVer, int* pRev) +{ + u8 bdCpHwVer = 0; + u8 bdCpHwRev = 0; + + if (bd_board_info == 0) { + puts("Board info not valid, can not get hw version\n"); + return -1; + } + /* Hardware version/revision */ + if ( !BD_GetUInt8( bd_board_info, BD_Hw_Ver, 0, &bdCpHwVer) ) { + printf("no Hw version found\n"); + return -1; + } + /* Hardware version/revision */ + if ( !BD_GetUInt8( bd_board_info, BD_Hw_Rel, 0, &bdCpHwRev) ) { + printf("no Hw release found\n"); + return -1; + } + + *pVer = bdCpHwVer; + *pRev = bdCpHwRev; + + return 0; +} + diff --git a/board/nm/netbird/board_descriptor.h b/board/nm/netbird/board_descriptor.h index 1a5c4cb79b..a62b1a9567 100644 --- a/board/nm/netbird/board_descriptor.h +++ b/board/nm/netbird/board_descriptor.h @@ -12,5 +12,6 @@ int bd_read(int bus_addr, int dev_addr); u8 bd_get_boot_partition(void); int bd_get_mac_address(uint index, u8 *mac_address, u32 len); +int bd_get_hw_version(int* pVer, int* pRev); #endif /* __BOARD_DESCRIPTOR_H */ diff --git a/include/configs/am335x_netbird.h b/include/configs/am335x_netbird.h index d4e892808f..10299b1b3d 100644 --- a/include/configs/am335x_netbird.h +++ b/include/configs/am335x_netbird.h @@ -57,12 +57,14 @@ "ext4load mmc 1:$root_part $fdt_addr /boot/am335x-nbhw16.dtb && setenv bootargs $bootargs rw;\0" \ "sdprod=ext4load mmc 1:$root_part $kernel_addr /boot/$kernel_image && " \ "ext4load mmc 1:$root_part $fdt_addr /boot/$fdt_image && setenv bootargs $bootargs ro;\0" \ - "sdboot=if mmc dev 1; then " \ - "echo Copying Linux from SD to RAM... && " \ - "run sdprod || run sdbringup && " \ - "run add_sd_bootargs && run add_version_bootargs && bootz $kernel_addr - $fdt_addr; " \ - "fi\0" \ + "sdboot=if mmc dev 1; then echo Copying Linux from SD to RAM...; "\ + "if test -e mmc 1:$root_part /boot/$kernel_image; then run sdprod; " \ + "else run sdbringup; fi; " \ + "run add_sd_bootargs; run add_version_bootargs; " \ + "bootz $kernel_addr - $fdt_addr; fi\0" \ "bootcmd=run sdboot\0" \ + "ipaddr=192.168.1.1\0" \ + "serverip=192.168.1.254\0" \ "recovery=tftpboot $kernel_addr recovery-image; tftpboot $fdt_addr recovery-dtb; setenv bootargs rdinit=/etc/preinit console=ttyO0,115200 debug; bootz $kernel_addr - $fdt_addr\0" #endif