uboot/board/ti/beagle/beagle.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2004-2011
   4 * Texas Instruments, <www.ti.com>
   5 *
   6 * Author :
   7 *      Sunil Kumar <sunilsaini05@gmail.com>
   8 *      Shashi Ranjan <shashiranjanmca05@gmail.com>
   9 *
  10 * Derived from Beagle Board and 3430 SDP code by
  11 *      Richard Woodruff <r-woodruff2@ti.com>
  12 *      Syed Mohammed Khasim <khasim@ti.com>
  13 *
  14 */
  15#include <common.h>
  16#include <bootstage.h>
  17#include <dm.h>
  18#include <env.h>
  19#include <init.h>
  20#include <net.h>
  21#include <ns16550.h>
  22#include <serial.h>
  23#ifdef CONFIG_LED_STATUS
  24#include <status_led.h>
  25#endif
  26#include <twl4030.h>
  27#include <asm/global_data.h>
  28#include <linux/mtd/rawnand.h>
  29#include <asm/io.h>
  30#include <asm/arch/mmc_host_def.h>
  31#include <asm/arch/mux.h>
  32#include <asm/arch/mem.h>
  33#include <asm/arch/sys_proto.h>
  34#include <asm/gpio.h>
  35#include <asm/mach-types.h>
  36#include <asm/omap_musb.h>
  37#include <linux/errno.h>
  38#include <linux/usb/ch9.h>
  39#include <linux/usb/gadget.h>
  40#include <linux/usb/musb.h>
  41#include "beagle.h"
  42#include <command.h>
  43
  44#define TWL4030_I2C_BUS                 0
  45#define EXPANSION_EEPROM_I2C_BUS        1
  46#define EXPANSION_EEPROM_I2C_ADDRESS    0x50
  47
  48#define TINCANTOOLS_ZIPPY               0x01000100
  49#define TINCANTOOLS_ZIPPY2              0x02000100
  50#define TINCANTOOLS_TRAINER             0x04000100
  51#define TINCANTOOLS_SHOWDOG             0x03000100
  52#define KBADC_BEAGLEFPGA                0x01000600
  53#define LW_BEAGLETOUCH                  0x01000700
  54#define BRAINMUX_LCDOG                  0x01000800
  55#define BRAINMUX_LCDOGTOUCH             0x02000800
  56#define BBTOYS_WIFI                     0x01000B00
  57#define BBTOYS_VGA                      0x02000B00
  58#define BBTOYS_LCD                      0x03000B00
  59#define BCT_BRETTL3                     0x01000F00
  60#define BCT_BRETTL4                     0x02000F00
  61#define LSR_COM6L_ADPT                  0x01001300
  62#define BEAGLE_NO_EEPROM                0xffffffff
  63
  64DECLARE_GLOBAL_DATA_PTR;
  65
  66static struct {
  67        unsigned int device_vendor;
  68        unsigned char revision;
  69        unsigned char content;
  70        char fab_revision[8];
  71        char env_var[16];
  72        char env_setting[64];
  73} expansion_config;
  74
  75/*
  76 * Routine: board_init
  77 * Description: Early hardware init.
  78 */
  79int board_init(void)
  80{
  81        gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
  82        /* board id for Linux */
  83        gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE;
  84        /* boot param addr */
  85        gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
  86
  87#if defined(CONFIG_LED_STATUS) && defined(CONFIG_LED_STATUS_BOOT_ENABLE)
  88        status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_ON);
  89#endif
  90
  91        return 0;
  92}
  93
  94#if defined(CONFIG_SPL_OS_BOOT)
  95int spl_start_uboot(void)
  96{
  97        /* break into full u-boot on 'c' */
  98        if (serial_tstc() && serial_getc() == 'c')
  99                return 1;
 100
 101        return 0;
 102}
 103#endif /* CONFIG_SPL_OS_BOOT */
 104
 105/*
 106 * Routine: get_board_revision
 107 * Description: Detect if we are running on a Beagle revision Ax/Bx,
 108 *              C1/2/3, C4, xM Ax/Bx or xM Cx. This can be done by reading
 109 *              the level of GPIO173, GPIO172 and GPIO171. This should
 110 *              result in
 111 *              GPIO173, GPIO172, GPIO171: 1 1 1 => Ax/Bx
 112 *              GPIO173, GPIO172, GPIO171: 1 1 0 => C1/2/3
 113 *              GPIO173, GPIO172, GPIO171: 1 0 1 => C4
 114 *              GPIO173, GPIO172, GPIO171: 0 1 0 => xM Cx
 115 *              GPIO173, GPIO172, GPIO171: 0 0 0 => xM Ax/Bx
 116 */
 117static int get_board_revision(void)
 118{
 119        static int revision = -1;
 120
 121        if (revision == -1) {
 122                if (!gpio_request(171, "rev0") &&
 123                    !gpio_request(172, "rev1") &&
 124                    !gpio_request(173, "rev2")) {
 125                        gpio_direction_input(171);
 126                        gpio_direction_input(172);
 127                        gpio_direction_input(173);
 128
 129                        revision = gpio_get_value(173) << 2 |
 130                                gpio_get_value(172) << 1 |
 131                                gpio_get_value(171);
 132                } else {
 133                        printf("Error: unable to acquire board revision GPIOs\n");
 134                }
 135        }
 136
 137        return revision;
 138}
 139
 140#ifdef CONFIG_SPL_BUILD
 141/*
 142 * Routine: get_board_mem_timings
 143 * Description: If we use SPL then there is no x-loader nor config header
 144 * so we have to setup the DDR timings ourself on both banks.
 145 */
 146void get_board_mem_timings(struct board_sdrc_timings *timings)
 147{
 148        int pop_mfr, pop_id;
 149
 150        /*
 151         * We need to identify what PoP memory is on the board so that
 152         * we know what timings to use.  If we can't identify it then
 153         * we know it's an xM.  To map the ID values please see nand_ids.c
 154         */
 155        identify_nand_chip(&pop_mfr, &pop_id);
 156
 157        timings->mr = MICRON_V_MR_165;
 158        switch (get_board_revision()) {
 159        case REVISION_C4:
 160                if (pop_mfr == NAND_MFR_STMICRO && pop_id == 0xba) {
 161                        /* 512MB DDR */
 162                        timings->mcfg = NUMONYX_V_MCFG_165(512 << 20);
 163                        timings->ctrla = NUMONYX_V_ACTIMA_165;
 164                        timings->ctrlb = NUMONYX_V_ACTIMB_165;
 165                        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
 166                        break;
 167                } else if (pop_mfr == NAND_MFR_MICRON && pop_id == 0xba) {
 168                        /* Beagleboard Rev C4, 512MB Nand/256MB DDR*/
 169                        timings->mcfg = MICRON_V_MCFG_165(128 << 20);
 170                        timings->ctrla = MICRON_V_ACTIMA_165;
 171                        timings->ctrlb = MICRON_V_ACTIMB_165;
 172                        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
 173                        break;
 174                } else if (pop_mfr == NAND_MFR_MICRON && pop_id == 0xbc) {
 175                        /* Beagleboard Rev C5, 256MB DDR */
 176                        timings->mcfg = MICRON_V_MCFG_200(256 << 20);
 177                        timings->ctrla = MICRON_V_ACTIMA_200;
 178                        timings->ctrlb = MICRON_V_ACTIMB_200;
 179                        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
 180                        break;
 181                }
 182        case REVISION_XM_AB:
 183        case REVISION_XM_C:
 184                if (pop_mfr == 0) {
 185                        /* 256MB DDR */
 186                        timings->mcfg = MICRON_V_MCFG_200(256 << 20);
 187                        timings->ctrla = MICRON_V_ACTIMA_200;
 188                        timings->ctrlb = MICRON_V_ACTIMB_200;
 189                        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
 190                } else {
 191                        /* 512MB DDR */
 192                        timings->mcfg = NUMONYX_V_MCFG_165(512 << 20);
 193                        timings->ctrla = NUMONYX_V_ACTIMA_165;
 194                        timings->ctrlb = NUMONYX_V_ACTIMB_165;
 195                        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
 196                }
 197                break;
 198        default:
 199                /* Assume 128MB and Micron/165MHz timings to be safe */
 200                timings->mcfg = MICRON_V_MCFG_165(128 << 20);
 201                timings->ctrla = MICRON_V_ACTIMA_165;
 202                timings->ctrlb = MICRON_V_ACTIMB_165;
 203                timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
 204        }
 205}
 206#endif
 207
 208/*
 209 * Routine: get_expansion_id
 210 * Description: This function checks for expansion board by checking I2C
 211 *              bus 1 for the availability of an AT24C01B serial EEPROM.
 212 *              returns the device_vendor field from the EEPROM
 213 */
 214static unsigned int get_expansion_id(void)
 215{
 216        i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
 217
 218        /* return BEAGLE_NO_EEPROM if eeprom doesn't respond */
 219        if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
 220                i2c_set_bus_num(TWL4030_I2C_BUS);
 221                return BEAGLE_NO_EEPROM;
 222        }
 223
 224        /* read configuration data */
 225        i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
 226                 sizeof(expansion_config));
 227
 228        /* retry reading configuration data with 16bit addressing */
 229        if ((expansion_config.device_vendor == 0xFFFFFF00) ||
 230            (expansion_config.device_vendor == 0xFFFFFFFF)) {
 231                printf("EEPROM is blank or 8bit addressing failed: retrying with 16bit:\n");
 232                i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 2, (u8 *)&expansion_config,
 233                         sizeof(expansion_config));
 234        }
 235
 236        i2c_set_bus_num(TWL4030_I2C_BUS);
 237
 238        return expansion_config.device_vendor;
 239}
 240
 241#ifdef CONFIG_VIDEO_OMAP3
 242/*
 243 * Configure DSS to display background color on DVID
 244 * Configure VENC to display color bar on S-Video
 245 */
 246static void beagle_display_init(void)
 247{
 248        omap3_dss_venc_config(&venc_config_std_tv, VENC_HEIGHT, VENC_WIDTH);
 249        switch (get_board_revision()) {
 250        case REVISION_AXBX:
 251        case REVISION_CX:
 252        case REVISION_C4:
 253                omap3_dss_panel_config(&dvid_cfg);
 254                break;
 255        case REVISION_XM_AB:
 256        case REVISION_XM_C:
 257        default:
 258                omap3_dss_panel_config(&dvid_cfg_xm);
 259                break;
 260        }
 261}
 262
 263/*
 264 * Enable DVI power
 265 */
 266static void beagle_dvi_pup(void)
 267{
 268        uchar val;
 269
 270        switch (get_board_revision()) {
 271        case REVISION_AXBX:
 272        case REVISION_CX:
 273        case REVISION_C4:
 274                gpio_request(170, "dvi");
 275                gpio_direction_output(170, 0);
 276                gpio_set_value(170, 1);
 277                break;
 278        case REVISION_XM_AB:
 279        case REVISION_XM_C:
 280        default:
 281                #define GPIODATADIR1 (TWL4030_BASEADD_GPIO+3)
 282                #define GPIODATAOUT1 (TWL4030_BASEADD_GPIO+6)
 283
 284                i2c_read(TWL4030_CHIP_GPIO, GPIODATADIR1, 1, &val, 1);
 285                val |= 4;
 286                i2c_write(TWL4030_CHIP_GPIO, GPIODATADIR1, 1, &val, 1);
 287
 288                i2c_read(TWL4030_CHIP_GPIO, GPIODATAOUT1, 1, &val, 1);
 289                val |= 4;
 290                i2c_write(TWL4030_CHIP_GPIO, GPIODATAOUT1, 1, &val, 1);
 291                break;
 292        }
 293}
 294#endif
 295
 296/*
 297 * Routine: misc_init_r
 298 * Description: Configure board specific parts
 299 */
 300int misc_init_r(void)
 301{
 302        struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE;
 303        struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE;
 304        struct control_prog_io *prog_io_base = (struct control_prog_io *)OMAP34XX_CTRL_BASE;
 305        bool generate_fake_mac = false;
 306        u32 value;
 307
 308        /* Enable i2c2 pullup resisters */
 309        value = readl(&prog_io_base->io1);
 310        value &= ~(PRG_I2C2_PULLUPRESX);
 311        writel(value, &prog_io_base->io1);
 312
 313        switch (get_board_revision()) {
 314        case REVISION_AXBX:
 315                printf("Beagle Rev Ax/Bx\n");
 316                env_set("beaglerev", "AxBx");
 317                break;
 318        case REVISION_CX:
 319                printf("Beagle Rev C1/C2/C3\n");
 320                env_set("beaglerev", "Cx");
 321                MUX_BEAGLE_C();
 322                break;
 323        case REVISION_C4:
 324                printf("Beagle Rev C4\n");
 325                env_set("beaglerev", "C4");
 326                MUX_BEAGLE_C();
 327                /* Set VAUX2 to 1.8V for EHCI PHY */
 328                twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
 329                                        TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
 330                                        TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
 331                                        TWL4030_PM_RECEIVER_DEV_GRP_P1);
 332                break;
 333        case REVISION_XM_AB:
 334                printf("Beagle xM Rev A/B\n");
 335                env_set("beaglerev", "xMAB");
 336                MUX_BEAGLE_XM();
 337                /* Set VAUX2 to 1.8V for EHCI PHY */
 338                twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
 339                                        TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
 340                                        TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
 341                                        TWL4030_PM_RECEIVER_DEV_GRP_P1);
 342                generate_fake_mac = true;
 343                break;
 344        case REVISION_XM_C:
 345                printf("Beagle xM Rev C\n");
 346                env_set("beaglerev", "xMC");
 347                MUX_BEAGLE_XM();
 348                /* Set VAUX2 to 1.8V for EHCI PHY */
 349                twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
 350                                        TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
 351                                        TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
 352                                        TWL4030_PM_RECEIVER_DEV_GRP_P1);
 353                generate_fake_mac = true;
 354                break;
 355        default:
 356                printf("Beagle unknown 0x%02x\n", get_board_revision());
 357                MUX_BEAGLE_XM();
 358                /* Set VAUX2 to 1.8V for EHCI PHY */
 359                twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
 360                                        TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
 361                                        TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
 362                                        TWL4030_PM_RECEIVER_DEV_GRP_P1);
 363                generate_fake_mac = true;
 364        }
 365
 366        switch (get_expansion_id()) {
 367        case TINCANTOOLS_ZIPPY:
 368                printf("Recognized Tincantools Zippy board (rev %d %s)\n",
 369                        expansion_config.revision,
 370                        expansion_config.fab_revision);
 371                MUX_TINCANTOOLS_ZIPPY();
 372                env_set("buddy", "zippy");
 373                break;
 374        case TINCANTOOLS_ZIPPY2:
 375                printf("Recognized Tincantools Zippy2 board (rev %d %s)\n",
 376                        expansion_config.revision,
 377                        expansion_config.fab_revision);
 378                MUX_TINCANTOOLS_ZIPPY();
 379                env_set("buddy", "zippy2");
 380                break;
 381        case TINCANTOOLS_TRAINER:
 382                printf("Recognized Tincantools Trainer board (rev %d %s)\n",
 383                        expansion_config.revision,
 384                        expansion_config.fab_revision);
 385                MUX_TINCANTOOLS_ZIPPY();
 386                MUX_TINCANTOOLS_TRAINER();
 387                env_set("buddy", "trainer");
 388                break;
 389        case TINCANTOOLS_SHOWDOG:
 390                printf("Recognized Tincantools Showdow board (rev %d %s)\n",
 391                        expansion_config.revision,
 392                        expansion_config.fab_revision);
 393                /* Place holder for DSS2 definition for showdog lcd */
 394                env_set("defaultdisplay", "showdoglcd");
 395                env_set("buddy", "showdog");
 396                break;
 397        case KBADC_BEAGLEFPGA:
 398                printf("Recognized KBADC Beagle FPGA board\n");
 399                MUX_KBADC_BEAGLEFPGA();
 400                env_set("buddy", "beaglefpga");
 401                break;
 402        case LW_BEAGLETOUCH:
 403                printf("Recognized Liquidware BeagleTouch board\n");
 404                env_set("buddy", "beagletouch");
 405                break;
 406        case BRAINMUX_LCDOG:
 407                printf("Recognized Brainmux LCDog board\n");
 408                env_set("buddy", "lcdog");
 409                break;
 410        case BRAINMUX_LCDOGTOUCH:
 411                printf("Recognized Brainmux LCDog Touch board\n");
 412                env_set("buddy", "lcdogtouch");
 413                break;
 414        case BBTOYS_WIFI:
 415                printf("Recognized BeagleBoardToys WiFi board\n");
 416                MUX_BBTOYS_WIFI()
 417                env_set("buddy", "bbtoys-wifi");
 418                break;
 419        case BBTOYS_VGA:
 420                printf("Recognized BeagleBoardToys VGA board\n");
 421                break;
 422        case BBTOYS_LCD:
 423                printf("Recognized BeagleBoardToys LCD board\n");
 424                break;
 425        case BCT_BRETTL3:
 426                printf("Recognized bct electronic GmbH brettl3 board\n");
 427                break;
 428        case BCT_BRETTL4:
 429                printf("Recognized bct electronic GmbH brettl4 board\n");
 430                break;
 431        case LSR_COM6L_ADPT:
 432                printf("Recognized LSR COM6L Adapter Board\n");
 433                MUX_BBTOYS_WIFI()
 434                env_set("buddy", "lsr-com6l-adpt");
 435                break;
 436        case BEAGLE_NO_EEPROM:
 437                printf("No EEPROM on expansion board\n");
 438                env_set("buddy", "none");
 439                break;
 440        default:
 441                printf("Unrecognized expansion board: %x\n",
 442                        expansion_config.device_vendor);
 443                env_set("buddy", "unknown");
 444        }
 445
 446        if (expansion_config.content == 1)
 447                env_set(expansion_config.env_var, expansion_config.env_setting);
 448
 449        twl4030_power_init();
 450        switch (get_board_revision()) {
 451        case REVISION_XM_AB:
 452                twl4030_led_init(TWL4030_LED_LEDEN_LEDBON);
 453                break;
 454        default:
 455                twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
 456                break;
 457        }
 458
 459        /* Set GPIO states before they are made outputs */
 460        writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1,
 461                &gpio6_base->setdataout);
 462        writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
 463                GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout);
 464
 465        /* Configure GPIOs to output */
 466        writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe);
 467        writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
 468                GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe);
 469
 470        omap_die_id_display();
 471
 472#ifdef CONFIG_VIDEO_OMAP3
 473        beagle_dvi_pup();
 474        beagle_display_init();
 475        omap3_dss_enable();
 476#endif
 477
 478        if (generate_fake_mac)
 479                omap_die_id_usbethaddr();
 480
 481#if defined(CONFIG_MTDIDS_DEFAULT) && defined(CONFIG_MTDPARTS_DEFAULT)
 482        if (strlen(CONFIG_MTDIDS_DEFAULT))
 483                env_set("mtdids", CONFIG_MTDIDS_DEFAULT);
 484
 485        if (strlen(CONFIG_MTDPARTS_DEFAULT))
 486                env_set("mtdparts", CONFIG_MTDPARTS_DEFAULT);
 487#endif
 488
 489        return 0;
 490}
 491
 492/*
 493 * Routine: set_muxconf_regs
 494 * Description: Setting up the configuration Mux registers specific to the
 495 *              hardware. Many pins need to be moved from protect to primary
 496 *              mode.
 497 */
 498void set_muxconf_regs(void)
 499{
 500        MUX_BEAGLE();
 501}
 502
 503#if defined(CONFIG_MMC)
 504int board_mmc_init(struct bd_info *bis)
 505{
 506        return omap_mmc_init(0, 0, 0, -1, -1);
 507}
 508#endif
 509
 510#if defined(CONFIG_MMC)
 511void board_mmc_power_init(void)
 512{
 513        twl4030_power_mmc_init(0);
 514}
 515#endif
 516