uboot/board/cm5200/cmd_cm5200.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2007 Markus Kappeler <markus.kappeler@objectxp.com>
   3 *
   4 * Adapted for U-Boot 1.2 by Piotr Kruszynski <ppk@semihalf.com>
   5 *
   6 * See file CREDITS for list of people who contributed to this
   7 * project.
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License as
  11 * published by the Free Software Foundation; either version 2 of
  12 * the License, or (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22 * MA 02111-1307 USA
  23 */
  24
  25#include <common.h>
  26#include <command.h>
  27#include <i2c.h>
  28#include <usb.h>
  29
  30#ifdef CONFIG_CMD_BSP
  31
  32static int do_i2c_test(char *argv[])
  33{
  34        unsigned char temp, temp1;
  35
  36        printf("Starting I2C Test\n"
  37                "Please set Jumper:\nI2C SDA 2-3\nI2C SCL 2-3\n\n"
  38                "Please press any key to start\n\n");
  39        getc();
  40
  41        temp = 0xf0; /* set io 0-4 as output */
  42        i2c_write(CONFIG_SYS_I2C_IO, 3, 1, (uchar *)&temp, 1);
  43
  44        printf("Press I2C4-7. LED I2C0-3 should have the same state\n\n"
  45                "Press any key to stop\n\n");
  46
  47        while (!tstc()) {
  48                i2c_read(CONFIG_SYS_I2C_IO, 0, 1, (uchar *)&temp, 1);
  49                temp1 = (temp >> 4) & 0x03;
  50                temp1 |= (temp >> 3) & 0x08; /* S302 -> LED303 */
  51                temp1 |= (temp >> 5) & 0x04; /* S303 -> LED302 */
  52                temp = temp1;
  53                i2c_write(CONFIG_SYS_I2C_IO, 1, 1, (uchar *)&temp, 1);
  54        }
  55        getc();
  56
  57        return 0;
  58}
  59
  60static int do_usb_test(char *argv[])
  61{
  62        int i;
  63        static int usb_stor_curr_dev = -1; /* current device */
  64
  65        printf("Starting USB Test\n"
  66                "Please insert USB Memmory Stick\n\n"
  67                "Please press any key to start\n\n");
  68        getc();
  69
  70        usb_stop();
  71        printf("(Re)start USB...\n");
  72        i = usb_init();
  73#ifdef CONFIG_USB_STORAGE
  74                /* try to recognize storage devices immediately */
  75                if (i >= 0)
  76                        usb_stor_curr_dev = usb_stor_scan(1);
  77#endif /* CONFIG_USB_STORAGE */
  78        if (usb_stor_curr_dev >= 0)
  79                printf("Found USB Storage Dev continue with Test...\n");
  80        else {
  81                printf("No USB Storage Device detected.. Stop Test\n");
  82                return 1;
  83        }
  84
  85        usb_stor_info();
  86
  87        printf("stopping USB..\n");
  88        usb_stop();
  89
  90        return 0;
  91}
  92
  93static int do_led_test(char *argv[])
  94{
  95        int i = 0;
  96        struct mpc5xxx_gpt_0_7 *gpt = (struct mpc5xxx_gpt_0_7 *)MPC5XXX_GPT;
  97
  98        printf("Starting LED Test\n"
  99                "Please set Switch S500 all off\n\n"
 100                "Please press any key to start\n\n");
 101        getc();
 102
 103        /* configure timer 2-3 for simple GPIO output High */
 104        gpt->gpt2.emsr |= 0x00000034;
 105        gpt->gpt3.emsr |= 0x00000034;
 106
 107        (*(vu_long *)MPC5XXX_WU_GPIO_ENABLE) |= 0x80000000;
 108        (*(vu_long *)MPC5XXX_WU_GPIO_DIR) |= 0x80000000;
 109        printf("Please press any key to stop\n\n");
 110        while (!tstc()) {
 111                if (i == 1) {
 112                        (*(vu_long *)MPC5XXX_WU_GPIO_DATA_O) |= 0x80000000;
 113                        gpt->gpt2.emsr &= ~0x00000010;
 114                        gpt->gpt3.emsr &= ~0x00000010;
 115                } else if (i == 2) {
 116                        (*(vu_long *)MPC5XXX_WU_GPIO_DATA_O) &= ~0x80000000;
 117                        gpt->gpt2.emsr &= ~0x00000010;
 118                        gpt->gpt3.emsr |= 0x00000010;
 119                } else if (i >= 3) {
 120                        (*(vu_long *)MPC5XXX_WU_GPIO_DATA_O) &= ~0x80000000;
 121                        gpt->gpt3.emsr &= ~0x00000010;
 122                        gpt->gpt2.emsr |= 0x00000010;
 123                        i = 0;
 124                }
 125                i++;
 126                udelay(200000);
 127        }
 128        getc();
 129
 130        (*(vu_long *)MPC5XXX_WU_GPIO_DATA_O) |= 0x80000000;
 131        gpt->gpt2.emsr |= 0x00000010;
 132        gpt->gpt3.emsr |= 0x00000010;
 133
 134        return 0;
 135}
 136
 137static int do_rs232_test(char *argv[])
 138{
 139        int error_status = 0;
 140        struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
 141        struct mpc5xxx_psc *psc1 = (struct mpc5xxx_psc *)MPC5XXX_PSC1;
 142
 143        /* Configure PSC 2-3-6 as GPIO */
 144        gpio->port_config &= 0xFF0FF80F;
 145
 146        switch (simple_strtoul(argv[2], NULL, 10)) {
 147        case 1:
 148                /* check RTS <-> CTS loop */
 149                /* set rts to 0 */
 150                printf("Uart 1 test: RX TX tested by using U-Boot\n"
 151                        "Please connect RTS with CTS on Uart1 plug\n\n"
 152                        "Press any key to start\n\n");
 153                getc();
 154
 155                psc1->op1 |= 0x01;
 156
 157                /* wait some time before requesting status */
 158                udelay(10);
 159
 160                /* check status at cts */
 161                if ((psc1->ip & 0x01) != 0) {
 162                        error_status = 3;
 163                        printf("%s: failure at rs232_1, cts status is %d "
 164                                "(should be 0)\n",
 165                                __FUNCTION__, (psc1->ip & 0x01));
 166                }
 167
 168                /* set rts to 1 */
 169                psc1->op0 |= 0x01;
 170
 171                /* wait some time before requesting status */
 172                udelay(10);
 173
 174                /* check status at cts */
 175                if ((psc1->ip & 0x01) != 1) {
 176                        error_status = 3;
 177                        printf("%s: failure at rs232_1, cts status is %d "
 178                                "(should be 1)\n",
 179                                __FUNCTION__, (psc1->ip & 0x01));
 180                }
 181                break;
 182        case 2:
 183                /* set PSC2_0, PSC2_2 as output and PSC2_1, PSC2_3 as input */
 184                printf("Uart 2 test: Please use RS232 Loopback plug on UART2\n"
 185                        "\nPress any key to start\n\n");
 186                getc();
 187
 188                gpio->simple_gpioe &= ~(0x000000F0);
 189                gpio->simple_gpioe |= 0x000000F0;
 190                gpio->simple_ddr &= ~(0x000000F0);
 191                gpio->simple_ddr |= 0x00000050;
 192
 193                /* check TXD <-> RXD loop */
 194                /* set TXD to 1 */
 195                gpio->simple_dvo |= (1 << 4);
 196
 197                /* wait some time before requesting status */
 198                udelay(10);
 199
 200                if ((gpio->simple_ival & 0x00000020) != 0x00000020) {
 201                        error_status = 2;
 202                        printf("%s: failure at rs232_2, rxd status is %d "
 203                                "(should be 1)\n", __FUNCTION__,
 204                                (gpio->simple_ival & 0x00000020) >> 5);
 205                }
 206
 207                /* set TXD to 0 */
 208                gpio->simple_dvo &= ~(1 << 4);
 209
 210                /* wait some time before requesting status */
 211                udelay(10);
 212
 213                if ((gpio->simple_ival & 0x00000020) != 0x00000000) {
 214                        error_status = 2;
 215                        printf("%s: failure at rs232_2, rxd status is %d "
 216                                "(should be 0)\n", __FUNCTION__,
 217                                (gpio->simple_ival & 0x00000020) >> 5);
 218                }
 219
 220                /* check RTS <-> CTS loop */
 221                /* set RTS to 1 */
 222                gpio->simple_dvo |= (1 << 6);
 223
 224                /* wait some time before requesting status */
 225                udelay(10);
 226
 227                if ((gpio->simple_ival & 0x00000080) != 0x00000080) {
 228                        error_status = 3;
 229                        printf("%s: failure at rs232_2, cts status is %d "
 230                                "(should be 1)\n", __FUNCTION__,
 231                                (gpio->simple_ival & 0x00000080) >> 7);
 232                }
 233
 234                /* set RTS to 0 */
 235                gpio->simple_dvo &= ~(1 << 6);
 236
 237                /* wait some time before requesting status */
 238                udelay(10);
 239
 240                if ((gpio->simple_ival & 0x00000080) != 0x00000000) {
 241                        error_status = 3;
 242                        printf("%s: failure at rs232_2, cts status is %d "
 243                                "(should be 0)\n", __FUNCTION__,
 244                                (gpio->simple_ival & 0x00000080) >> 7);
 245                }
 246                break;
 247        case 3:
 248                /* set PSC3_0, PSC3_2 as output and PSC3_1, PSC3_3 as input */
 249                printf("Uart 3 test: Please use RS232 Loopback plug on UART2\n"
 250                        "\nPress any key to start\n\n");
 251                getc();
 252
 253                gpio->simple_gpioe &= ~(0x00000F00);
 254                gpio->simple_gpioe |= 0x00000F00;
 255
 256                gpio->simple_ddr &= ~(0x00000F00);
 257                gpio->simple_ddr |= 0x00000500;
 258
 259                /* check TXD <-> RXD loop */
 260                /* set TXD to 1 */
 261                gpio->simple_dvo |= (1 << 8);
 262
 263                /* wait some time before requesting status */
 264                udelay(10);
 265
 266                if ((gpio->simple_ival & 0x00000200) != 0x00000200) {
 267                        error_status = 2;
 268                        printf("%s: failure at rs232_3, rxd status is %d "
 269                                "(should be 1)\n", __FUNCTION__,
 270                                (gpio->simple_ival & 0x00000200) >> 9);
 271                }
 272
 273                /* set TXD to 0 */
 274                gpio->simple_dvo &= ~(1 << 8);
 275
 276                /* wait some time before requesting status */
 277                udelay(10);
 278
 279                if ((gpio->simple_ival & 0x00000200) != 0x00000000) {
 280                        error_status = 2;
 281                        printf("%s: failure at rs232_3, rxd status is %d "
 282                                "(should be 0)\n", __FUNCTION__,
 283                                (gpio->simple_ival & 0x00000200) >> 9);
 284                }
 285
 286                /* check RTS <-> CTS loop */
 287                /* set RTS to 1 */
 288                gpio->simple_dvo |= (1 << 10);
 289
 290                /* wait some time before requesting status */
 291                udelay(10);
 292
 293                if ((gpio->simple_ival & 0x00000800) != 0x00000800) {
 294                        error_status = 3;
 295                        printf("%s: failure at rs232_3, cts status is %d "
 296                                "(should be 1)\n", __FUNCTION__,
 297                                (gpio->simple_ival & 0x00000800) >> 11);
 298                }
 299
 300                /* set RTS to 0 */
 301                gpio->simple_dvo &= ~(1 << 10);
 302
 303                /* wait some time before requesting status */
 304                udelay(10);
 305
 306                if ((gpio->simple_ival & 0x00000800) != 0x00000000) {
 307                        error_status = 3;
 308                        printf("%s: failure at rs232_3, cts status is %d "
 309                                "(should be 0)\n", __FUNCTION__,
 310                                (gpio->simple_ival & 0x00000800) >> 11);
 311                }
 312                break;
 313        case 4:
 314                /* set PSC6_2, PSC6_3 as output and PSC6_0, PSC6_1 as input */
 315                printf("Uart 4 test: Please use RS232 Loopback plug on UART2\n"
 316                        "\nPress any key to start\n\n");
 317                getc();
 318
 319                gpio->simple_gpioe &= ~(0xF0000000);
 320                gpio->simple_gpioe |= 0x30000000;
 321
 322                gpio->simple_ddr &= ~(0xf0000000);
 323                gpio->simple_ddr |= 0x30000000;
 324
 325                (*(vu_long *)MPC5XXX_WU_GPIO_ENABLE) |= 0x30000000;
 326                (*(vu_long *)MPC5XXX_WU_GPIO_DIR) &= ~(0x30000000);
 327
 328                /* check TXD <-> RXD loop */
 329                /* set TXD to 1 */
 330                gpio->simple_dvo |= (1 << 28);
 331
 332                /* wait some time before requesting status */
 333                udelay(10);
 334
 335                if (((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) & 0x10000000) !=
 336                                0x10000000) {
 337                        error_status = 2;
 338                        printf("%s: failure at rs232_4, rxd status is %lu "
 339                                "(should be 1)\n", __FUNCTION__,
 340                                ((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) &
 341                                        0x10000000) >> 28);
 342                }
 343
 344                /* set TXD to 0 */
 345                gpio->simple_dvo &= ~(1 << 28);
 346
 347                /* wait some time before requesting status */
 348                udelay(10);
 349
 350                if (((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) & 0x10000000) !=
 351                                0x00000000) {
 352                        error_status = 2;
 353                        printf("%s: failure at rs232_4, rxd status is %lu "
 354                                "(should be 0)\n", __FUNCTION__,
 355                                ((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) &
 356                                        0x10000000) >> 28);
 357                }
 358
 359                /* check RTS <-> CTS loop */
 360                /* set RTS to 1 */
 361                gpio->simple_dvo |= (1 << 29);
 362
 363                /* wait some time before requesting status */
 364                udelay(10);
 365
 366                if (((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) & 0x20000000) !=
 367                                0x20000000) {
 368                        error_status = 3;
 369                        printf("%s: failure at rs232_4, cts status is %lu "
 370                                "(should be 1)\n", __FUNCTION__,
 371                                ((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) &
 372                                        0x20000000) >> 29);
 373                }
 374
 375                /* set RTS to 0 */
 376                gpio->simple_dvo &= ~(1 << 29);
 377
 378                /* wait some time before requesting status */
 379                udelay(10);
 380
 381                if (((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) & 0x20000000) !=
 382                                0x00000000) {
 383                        error_status = 3;
 384                        printf("%s: failure at rs232_4, cts status is %lu "
 385                                "(should be 0)\n", __FUNCTION__,
 386                                ((*(vu_long *)MPC5XXX_WU_GPIO_DATA_I) &
 387                                        0x20000000) >> 29);
 388                }
 389                break;
 390        default:
 391                printf("%s: invalid rs232 number %s\n", __FUNCTION__, argv[2]);
 392                error_status = 1;
 393                break;
 394        }
 395        gpio->port_config |= (CONFIG_SYS_GPS_PORT_CONFIG & 0xFF0FF80F);
 396
 397        return error_status;
 398}
 399
 400static int cmd_fkt(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 401{
 402        int rcode = -1;
 403
 404        switch (argc) {
 405        case 2:
 406                if (strncmp(argv[1], "i2c", 3) == 0)
 407                        rcode = do_i2c_test(argv);
 408                else if (strncmp(argv[1], "led", 3) == 0)
 409                        rcode = do_led_test(argv);
 410                else if (strncmp(argv[1], "usb", 3) == 0)
 411                        rcode = do_usb_test(argv);
 412                break;
 413        case 3:
 414                if (strncmp(argv[1], "rs232", 3) == 0)
 415                        rcode = do_rs232_test(argv);
 416                break;
 417        }
 418
 419        switch (rcode) {
 420        case -1:
 421                printf("Usage:\n"
 422                        "fkt { i2c | led | usb }\n"
 423                        "fkt rs232 number\n");
 424                rcode = 1;
 425                break;
 426        case 0:
 427                printf("Test passed\n");
 428                break;
 429        default:
 430                printf("Test failed with code: %d\n", rcode);
 431        }
 432
 433        return rcode;
 434}
 435
 436U_BOOT_CMD(
 437        fkt,    4,      1,      cmd_fkt,
 438        "Function test routines",
 439        "i2c\n"
 440        "     - Test I2C communication\n"
 441        "fkt led\n"
 442        "     - Test LEDs\n"
 443        "fkt rs232 number\n"
 444        "     - Test RS232 (loopback plug(s) for RS232 required)\n"
 445        "fkt usb\n"
 446        "     - Test USB communication"
 447);
 448#endif /* CONFIG_CMD_BSP */
 449