uboot/board/renesas/sh7785lcr/selfcheck.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License as
   6 * published by the Free Software Foundation; either version 2 of
   7 * the License, or (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  17 * MA 02111-1307 USA
  18 */
  19
  20#include <common.h>
  21#include <asm/io.h>
  22#include <asm/processor.h>
  23#include <asm/pci.h>
  24
  25#if defined(CONFIG_CPU_32BIT)
  26#define NOCACHE_OFFSET          0x00000000
  27#else
  28#define NOCACHE_OFFSET          0xa0000000
  29#endif
  30#define PLD_LEDCR               (0x04000008 + NOCACHE_OFFSET)
  31#define PLD_SWSR                (0x0400000a + NOCACHE_OFFSET)
  32#define PLD_VERSR               (0x0400000c + NOCACHE_OFFSET)
  33
  34#define SM107_DEVICEID          (0x13e00060 + NOCACHE_OFFSET)
  35
  36static void wait_ms(unsigned long time)
  37{
  38        while (time--)
  39                udelay(1000);
  40}
  41
  42static void test_pld(void)
  43{
  44        printf("PLD version = %04x\n", readb(PLD_VERSR));
  45}
  46
  47static void test_sm107(void)
  48{
  49        printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID));
  50}
  51
  52static void test_led(void)
  53{
  54        printf("turn on LEDs 3, 5, 7, 9\n");
  55        writeb(0x55, PLD_LEDCR);
  56        wait_ms(2000);
  57        printf("turn on LEDs 4, 6, 8, 10\n");
  58        writeb(0xaa, PLD_LEDCR);
  59        wait_ms(2000);
  60        writeb(0x00, PLD_LEDCR);
  61}
  62
  63static void test_dipsw(void)
  64{
  65        printf("Please DIPSW set = B'0101\n");
  66        while (readb(PLD_SWSR) != 0x05) {
  67                if (ctrlc())
  68                        return;
  69        }
  70        printf("Please DIPSW set = B'1010\n");
  71        while (readb(PLD_SWSR) != 0x0A) {
  72                if (ctrlc())
  73                        return;
  74        }
  75        printf("DIPSW OK\n");
  76}
  77
  78static void test_net(void)
  79{
  80        unsigned long data;
  81
  82        writel(0x80000000, 0xfe0401c0);
  83        data = readl(0xfe040220);
  84        if (data == 0x816910ec)
  85                printf("Ethernet OK\n");
  86        else
  87                printf("Ethernet NG, data = %08x\n", (unsigned int)data);
  88}
  89
  90static void test_sata(void)
  91{
  92        unsigned long data;
  93
  94        writel(0x80000800, 0xfe0401c0);
  95        data = readl(0xfe040220);
  96        if (data == 0x35121095)
  97                printf("SATA OK\n");
  98        else
  99                printf("SATA NG, data = %08x\n", (unsigned int)data);
 100}
 101
 102static void test_pci(void)
 103{
 104        writel(0x80001800, 0xfe0401c0);
 105        printf("PCI CN1 ID = %08x\n", readl(0xfe040220));
 106
 107        writel(0x80001000, 0xfe0401c0);
 108        printf("PCI CN2 ID = %08x\n", readl(0xfe040220));
 109}
 110
 111int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 112{
 113        char *cmd;
 114
 115        if (argc != 2) {
 116                cmd_usage(cmdtp);
 117                return 1;
 118        }
 119
 120        cmd = argv[1];
 121        switch (cmd[0]) {
 122        case 'a':       /* all */
 123                test_pld();
 124                test_led();
 125                test_dipsw();
 126                test_sm107();
 127                test_net();
 128                test_sata();
 129                test_pci();
 130                break;
 131        case 'p':       /* pld or pci */
 132                if (cmd[1] == 'l')
 133                        test_pld();
 134                else
 135                        test_pci();
 136                break;
 137        case 'l':       /* led */
 138                test_led();
 139                break;
 140        case 'd':       /* dipsw */
 141                test_dipsw();
 142                break;
 143        case 's':       /* sm107 or sata */
 144                if (cmd[1] == 'm')
 145                        test_sm107();
 146                else
 147                        test_sata();
 148                break;
 149        case 'n':       /* net */
 150                test_net();
 151                break;
 152        default:
 153                cmd_usage(cmdtp);
 154                return 1;
 155        }
 156
 157        return 0;
 158}
 159
 160U_BOOT_CMD(
 161        hwtest, 2,      1,      do_hw_test,
 162        "hardware test for R0P7785LC0011RL board",
 163        "\n"
 164        "hwtest all   - test all hardware\n"
 165        "hwtest pld   - output PLD version\n"
 166        "hwtest led   - turn on LEDs\n"
 167        "hwtest dipsw - test DIP switch\n"
 168        "hwtest sm107 - output SM107 version\n"
 169        "hwtest net   - check RTL8110 ID\n"
 170        "hwtest sata  - check SiI3512 ID\n"
 171        "hwtest pci   - output PCI slot device ID"
 172);
 173