summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9557286)
raw | patch | inline | side by side (parent: 9557286)
author | Sajesh Kumar Saran <sajesh@ti.com> | |
Mon, 28 Nov 2011 17:38:32 +0000 (12:38 -0500) | ||
committer | Sajesh Kumar Saran <sajesh@ti.com> | |
Mon, 28 Nov 2011 17:38:32 +0000 (12:38 -0500) |
post/src/post.c | [changed mode: 0644->0755] | patch | blob | history |
diff --git a/post/src/post.c b/post/src/post.c
--- a/post/src/post.c
+++ b/post/src/post.c
-/******************************************************************************
- * Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the
- * distribution.
- *
- * Neither the name of Texas Instruments Incorporated nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *****************************************************************************/
-
-#include <string.h>
-#include "platform.h"
-#include "types.h"
-#include "post.h"
-#include "net.h"
-#include "cpmacdrv.h"
-#include "target.h"
-#include "qm_api.h"
-#include "cpdma_api.h"
-#include "pscapi.h"
-
-/* CSL EMAC include */
-#include <ti/csl/csl_cpsw.h>
-#include <ti/csl/csl_cpsgmii.h>
-#include <ti/csl/csl_cpsgmiiAux.h>
-#include <ti/csl/cslr_cpsgmii.h>
-#include <ti/csl/csl_mdio.h>
-#include <ti/csl/csl_mdioAux.h>
-
-/* BootCfg module include */
-#include <ti/csl/csl_bootcfg.h>
-#include <ti/csl/csl_bootcfgAux.h>
-
-/* The version string */
-#pragma DATA_SECTION(post_version, ".version")
-#pragma DATA_ALIGN(post_version, 16)
-char post_version[] = POST_VERSION;
-
-/* OSAL functions for Platform Library */
-uint8_t *Osal_platformMalloc (uint32_t num_bytes, uint32_t alignment)
-{
- return malloc(num_bytes);
-}
-
-void Osal_platformFree (uint8_t *dataPtr, uint32_t num_bytes)
-{
- /* Free up the memory */
- if (dataPtr)
- {
- free(dataPtr);
- }
-}
-
-/******************************************************************************
- * Function: post_display_led_error
- ******************************************************************************/
-void
-post_display_led_error
-(
- POST_TEST_ID test_id
-)
-{
- uint8_t led_status[POST_MAX_NUM_LED];
- uint32_t i;
-
- memset(led_status, POST_LED_ON, POST_MAX_NUM_LED);
- while (TRUE)
- {
- for (i = 0; i < POST_MAX_NUM_LED; i++)
- {
- if (post_led_status[test_id][i] == POST_LED_BLINK)
- {
- if (led_status[i] == POST_LED_ON)
- {
- led_status[i] = POST_LED_OFF;
- }
- else
- {
- led_status[i] = POST_LED_ON;
- }
- platform_led(i, (PLATFORM_LED_OP)led_status[i], PLATFORM_USER_LED_CLASS);
- }
- else
- {
- platform_led(i, (PLATFORM_LED_OP)post_led_status[test_id][i], PLATFORM_USER_LED_CLASS);
- }
- }
- platform_delay(POST_LED_BLINK_DELAY);
- /* POST in the while(1) loop to display the LED error status */
- }
-}
-
-/******************************************************************************
- * Function: post_write_uart
- ******************************************************************************/
-Bool
-post_write_uart
-(
- char* msg
-)
-{
- uint32_t i;
- uint32_t msg_len = strlen(msg);
-
- /* Write the message to the UART */
- for (i = 0; i < msg_len; i++)
- {
- if (platform_uart_write(msg[i]) != Platform_EOK)
- {
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-/******************************************************************************
- * Function: post_display_status
- ******************************************************************************/
-void
-post_display_status
-(
- POST_TEST_ID test_id,
- POST_TEST_RESULT test_result
-)
-{
- uint32_t i;
- char *msg;
- char msg1[40] = "\r\n\r\nPOST ";
- char msg2[] = " test passed!";
- char msg3[] = " test failed!";
- char msg4[] = " test started!";
-
- msg = strcat(msg1, post_status[test_id]);
- switch (test_id)
- {
- case POST_TEST_IN_PROGRESS:
- case POST_TEST_COMPLETE:
- /* Form the POST status message to write to the UART */
- if (post_write_uart(msg) != TRUE)
- {
- post_display_led_error(POST_TEST_UART); /* Never return from this function */
- }
-
- for (i = 0; i < POST_MAX_NUM_LED; i++)
- {
- if (platform_led(i, (PLATFORM_LED_OP)post_led_status[test_id][i], PLATFORM_USER_LED_CLASS) != Platform_EOK)
- {
- post_write_uart("POST LED test failed \r\n");
- }
- }
- break;
-
- default:
- /* Form the POST status message to write to the UART */
- if (test_result == POST_TEST_RESULT_PASSED)
- {
- msg = strcat(msg, msg2);
- if (post_write_uart(msg) != TRUE)
- {
- post_display_led_error(POST_TEST_UART); /* Never return from this function */
- }
- }
- else if (test_result == POST_TEST_RESULT_FAILED)
- {
- msg = strcat(msg, msg3);
- if (post_write_uart(msg) != TRUE)
- {
- post_display_led_error(POST_TEST_UART); /* Never return from this function */
- }
- post_display_led_error(test_id); /* Never return from this function */
- }
- else
- {
- msg = strcat(msg, msg4);
- if (post_write_uart(msg) != TRUE)
- {
- post_display_led_error(POST_TEST_UART); /* Never return from this function */
- }
- }
- break;
- }
-}
-
-/******************************************************************************
- * Function: post_test_external_memory
- ******************************************************************************/
-POST_TEST_RESULT
-post_test_external_memory
-(
- void
-)
-{
- POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;
-
- if(platform_external_memory_test(0, 0) != Platform_EOK)
- {
- test_result = POST_TEST_RESULT_FAILED;
- }
-
- return test_result;
-}
-
-/******************************************************************************
- * Function: post_test_eeprom
- ******************************************************************************/
-POST_TEST_RESULT
-post_test_eeprom
-(
- void
-)
-{
- uint8_t test_buf[POST_EEPROM_TEST_READ_LENGTH];
- POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;
- PLATFORM_DEVICE_info *p_device;
-
- p_device = platform_device_open(POST_EEPROM_TEST_DEVICE_ID, 0);
- if (p_device == NULL)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- if(platform_device_read(p_device->handle,
- POST_EEPROM_TEST_READ_ADDRESS,
- test_buf,
- POST_EEPROM_TEST_READ_LENGTH) != Platform_EOK)
- {
- test_result = POST_TEST_RESULT_FAILED;
- }
-
- platform_device_close(p_device->handle);
- return test_result;
-}
-
-/******************************************************************************
- * Function: post_test_nand
- ******************************************************************************/
-POST_TEST_RESULT
-post_test_nand
-(
- void
-)
-{
- uint8_t test_buf[POST_NAND_TEST_READ_LENGTH];
- POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;
- uint32_t addr;
- PLATFORM_DEVICE_info *p_device;
-
- p_device = platform_device_open(POST_NAND_TEST_DEVICE_ID, 0);
- if (p_device == NULL)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- addr = (POST_NAND_TEST_READ_BLOCK_NUM * p_device->page_count + POST_NAND_TEST_READ_PAGE_NUM) * p_device->page_size;
- if(platform_device_read(p_device->handle,
- addr,
- test_buf,
- POST_NAND_TEST_READ_LENGTH) != Platform_EOK)
- {
- test_result = POST_TEST_RESULT_FAILED;
- }
-
- platform_device_close(p_device->handle);
- return test_result;
-}
-
-/******************************************************************************
- * Function: post_test_nor
- ******************************************************************************/
-POST_TEST_RESULT
-post_test_nor
-(
- void
-)
-{
- uint8_t test_buf[POST_NOR_TEST_READ_LENGTH];
- POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;
- PLATFORM_DEVICE_info *p_device;
-
- p_device = platform_device_open(POST_NOR_TEST_DEVICE_ID, 0);
- if (p_device == NULL)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- if(platform_device_read(p_device->handle,
- POST_NOR_TEST_READ_ADDR,
- test_buf,
- POST_NOR_TEST_READ_LENGTH) != Platform_EOK)
- {
- test_result = POST_TEST_RESULT_FAILED;
- }
-
- platform_device_close(p_device->handle);
- return test_result;
-}
-
-/** Number of ports in the ethernet subsystem */
-#define NUM_PORTS 3u
-
-/** Number of MAC/GMII ports in the ethernet switch */
-#define NUM_MAC_PORTS 2u
-
-/* Define LoopBack modes */
-#define CPSW_LOOPBACK_NONE 0
-#define CPSW_LOOPBACK_INTERNAL 1
-#define CPSW_LOOPBACK_EXTERNAL 2
-
-#ifdef SIMULATOR_SUPPORT
-int32_t cpswSimTest = 1;
-int32_t cpswLpbkMode = CPSW_LOOPBACK_EXTERNAL;
-#else
-int32_t cpswSimTest = 0;
-int32_t cpswLpbkMode = CPSW_LOOPBACK_INTERNAL;
-#endif
-int32_t cpswEvm6678 = 0;
-
-/** ============================================================================
- * @n@b Init_SGMII
- *
- * @b Description
- * @n SGMII peripheral initialization code.
- *
- * @param[in]
- * @n macPortNum MAC port number for which the SGMII port setup must
- * be performed.
- *
- * @return
- * @n None
- * =============================================================================
- */
-int32_t Init_sgmii (uint32_t macPortNum)
-{
- CSL_SGMII_ADVABILITY sgmiiCfg;
- CSL_SGMII_STATUS sgmiiStatus;
-
- if ((macPortNum == 0) && (cpswEvm6678))
- {
- /* EVM6678 back end: MAC-to-MAC force link */
-
- /* Reset the port before configuring it */
- CSL_SGMII_doSoftReset (macPortNum);
- while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0);
-
- /* Hold the port in soft reset and set up
- * the SGMII control register:
- * (1) Enable Master Mode (default)
- */
- CSL_SGMII_startRxTxSoftReset (macPortNum);
- CSL_SGMII_enableMasterMode (macPortNum);
- if (cpswLpbkMode != CPSW_LOOPBACK_NONE)
- {
- CSL_SGMII_enableLoopback (macPortNum);
- }
-
- /* Setup the Advertised Ability register for this port:
- * (1) Enable Full duplex mode
- * (2) Speed = 1000M
- * (3) Force the Link
- */
- sgmiiCfg.bLinkUp = 1;
- sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS;
- sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX;
- CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);
-
- CSL_SGMII_endRxTxSoftReset (macPortNum);
-
- /* Wait for SGMII Link */
- do
- {
- CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
- } while (sgmiiStatus.bIsLinkUp != 1);
- }
- else
- {
- /* Reset the port before configuring it */
- CSL_SGMII_doSoftReset (macPortNum);
- while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0);
-
- /* Hold the port in soft reset and set up
- * the SGMII control register:
- * (1) Enable Master Mode (default)
- * (2) Enable Auto-negotiation
- */
- CSL_SGMII_startRxTxSoftReset (macPortNum);
- if (cpswLpbkMode == CPSW_LOOPBACK_NONE)
- {
- CSL_SGMII_disableMasterMode (macPortNum);
- }
- else
- {
- CSL_SGMII_enableMasterMode (macPortNum);
-
- if (cpswLpbkMode == CPSW_LOOPBACK_INTERNAL)
- {
- CSL_SGMII_enableLoopback (macPortNum);
- }
- }
-
- /* Setup the Advertised Ability register for this port:
- * (1) Enable Full duplex mode
- * (2) Enable Auto Negotiation
- */
- sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS;
- sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX;
- CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);
-
- CSL_SGMII_enableAutoNegotiation (macPortNum);
- CSL_SGMII_endRxTxSoftReset (macPortNum);
-
- /* Wait for SGMII Link */
- if (!cpswSimTest && ((cpswLpbkMode == CPSW_LOOPBACK_EXTERNAL) || (cpswLpbkMode == CPSW_LOOPBACK_NONE)))
- {
- do
- {
- CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
- } while (sgmiiStatus.bIsLinkUp != 1);
-
- /* Wait for SGMII Autonegotiation to complete without error */
- do
- {
- CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);
- if (sgmiiStatus.bIsAutoNegError != 0)
- return -1;
- } while (sgmiiStatus.bIsAutoNegComplete != 1);
- }
- }
-
- /* All done with configuration. Return Now. */
- return 0;
-}
-
-int Init_MAC (uint32_t macPortNum, uint8_t macAddress[6], uint32_t mtu)
-{
- /* Reset MAC Sliver 0 */
- CSL_CPGMAC_SL_resetMac (macPortNum);
- while (CSL_CPGMAC_SL_isMACResetDone (macPortNum) != TRUE);
-
- /* Setup the MAC Control Register for this port:
- * (1) Enable Full duplex
- * (2) Enable GMII
- * (3) Enable Gigabit
- * (4) Enable External Configuration. This enables
- * the "Full duplex" and "Gigabit" settings to be
- * controlled externally from SGMII
- * (5) Don't enable any control/error/short frames
- */
- CSL_CPGMAC_SL_enableFullDuplex (macPortNum);
- CSL_CPGMAC_SL_enableGMII (macPortNum);
- CSL_CPGMAC_SL_enableGigabit (macPortNum);
- CSL_CPGMAC_SL_enableExtControl (macPortNum);
-
- /* Configure the MAC address for this port */
- CSL_CPSW_3GF_setPortMACAddress (macPortNum, macAddress);
-
- /* Configure VLAN ID/CFI/Priority.
- *
- * For now, we are not using VLANs so just configure them
- * to all zeros.
- */
- CSL_CPSW_3GF_setPortVlanReg (macPortNum, 0, 0, 0);
-
- /* Configure the Receive Maximum length on this port,
- * i.e., the maximum size the port can receive without
- * any errors.
- *
- * Set the Rx Max length to the MTU configured for the
- * interface.
- */
- CSL_CPGMAC_SL_setRxMaxLen (macPortNum, mtu);
-
- /* Done setting up the MAC port */
- return 0;
-}
-
-void Init_Switch (uint32_t mtu)
-{
- CSL_CPSW_3GF_PORTSTAT portStatCfg;
-
- /* Enable the CPPI port, i.e., port 0 that does all
- * the data streaming in/out of EMAC.
- */
- CSL_CPSW_3GF_enablePort0 ();
- CSL_CPSW_3GF_disableVlanAware ();
- CSL_CPSW_3GF_setPort0VlanReg (0, 0, 0);
- CSL_CPSW_3GF_setPort0RxMaxLen (mtu);
-
- /* Enable statistics on both the port groups:
- *
- * MAC Sliver ports - Port 1, Port 2
- * CPPI Port - Port 0
- */
- portStatCfg.p0AStatEnable = 1;
- portStatCfg.p0BStatEnable = 1;
- portStatCfg.p1StatEnable = 1;
- portStatCfg.p2StatEnable = 1;
- CSL_CPSW_3GF_setPortStatsEnableReg (&portStatCfg);
-
- /* Setup the Address Lookup Engine (ALE) Configuration:
- * (1) Enable ALE.
- * (2) Clear stale ALE entries.
- * (3) Disable VLAN Aware lookups in ALE since
- * we are not using VLANs by default.
- * (4) No Flow control
- * (5) Configure the Unknown VLAN processing
- * properties for the switch, i.e., which
- * ports to send the packets to.
- */
- CSL_CPSW_3GF_enableAle ();
- CSL_CPSW_3GF_clearAleTable ();
-
- CSL_CPSW_3GF_disableAleVlanAware ();
- CSL_CPSW_3GF_disableAleTxRateLimit ();
- CSL_CPSW_3GF_setAlePrescaleReg (125000000u/1000u);
- CSL_CPSW_3GF_setAleUnkownVlanReg (7, 3, 3, 7);
-
- if(cpswLpbkMode != CPSW_LOOPBACK_NONE)
- CSL_CPSW_3GF_enableAleBypass();
-
- /* Done with switch configuration */
- return;
-}
-
-int Switch_update_addr (uint32_t portNum, uint8_t macAddress[6], Uint16 add)
-{
- uint32_t i;
- CSL_CPSW_3GF_ALE_PORTCONTROL alePortControlCfg;
- CSL_CPSW_3GF_ALE_UNICASTADDR_ENTRY ucastAddrCfg;
-
-
- /* Configure the address in "Learning"/"Forward" state */
- alePortControlCfg.portState = ALE_PORTSTATE_FORWARD;
- alePortControlCfg.dropUntaggedEnable = 0;
- alePortControlCfg.vidIngressCheckEnable = 0;
- alePortControlCfg.noLearnModeEnable = (cpswLpbkMode != CPSW_LOOPBACK_NONE)?1:0;
- alePortControlCfg.mcastLimit = 0;
- alePortControlCfg.bcastLimit = 0;
-
- CSL_CPSW_3GF_setAlePortControlReg (portNum, &alePortControlCfg);
-
- if (cpswLpbkMode != CPSW_LOOPBACK_NONE)
- {
- /* Program the ALE with the MAC address.
- *
- * The ALE entries determine the switch port to which any
- * matching received packet must be forwarded to.
- */
- /* Get the next free ALE entry to program */
- for (i = 0; i < CSL_CPSW_3GF_NUMALE_ENTRIES; i++)
- {
- if (CSL_CPSW_3GF_getALEEntryType (i) == ALE_ENTRYTYPE_FREE)
- {
- /* Found a free entry */
- break;
- }
- }
- if (i == CSL_CPSW_3GF_NUMALE_ENTRIES)
- {
- /* No free ALE entry found. return error. */
- return -1;
- }
- else
- {
- /* Found a free ALE entry to program our MAC address */
- memcpy (ucastAddrCfg.macAddress, macAddress, 6); // Set the MAC address
- ucastAddrCfg.ucastType = ALE_UCASTTYPE_UCAST_NOAGE; // Add a permanent unicast address entryALE_UCASTTYPE_UCAST_NOAGE.
- ucastAddrCfg.secureEnable = FALSE;
- ucastAddrCfg.blockEnable = FALSE;
- ucastAddrCfg.portNumber = portNum; // Add the ALE entry for this port
-
- /* Setup the ALE entry for this port's MAC address */
- CSL_CPSW_3GF_setAleUnicastAddrEntry (i, &ucastAddrCfg);
- }
- }
-
- /* Done with upading address */
- return 0;
-}
-
-int32_t Init_SGMII_SERDES(void)
-{
- if (cpswSimTest)
- {
-
- /* Unlock the chip configuration registers to allow SGMII SERDES registers to
- * be written */
- CSL_BootCfgUnlockKicker();
-
- CSL_BootCfgSetSGMIIConfigPLL (0x00000041);
- CSL_BootCfgSetSGMIIRxConfig (0, 0x00700621);
- CSL_BootCfgSetSGMIITxConfig (0, 0x000108A1);
- CSL_BootCfgSetSGMIIRxConfig (1, 0x00700621);
- CSL_BootCfgSetSGMIITxConfig (1, 0x000108A1);
-
- /* Re-lock the chip configuration registers to prevent unintentional writes */
- CSL_BootCfgLockKicker();
-
- }
-
- /* SGMII SERDES Configuration complete. Return. */
- return 0;
-}
-
-int32_t Init_Cpsw (void)
-{
- uint32_t macPortNum, mtu = 1518;
- uint8_t mac_address[6];
- uint8_t sw_port0_mac_addr[6] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
-
- /* Initialize the SERDES modules */
- Init_SGMII_SERDES();
-
- platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_address);
-
- /* Initialize the SGMII/Sliver submodules for the
- * two corresponding MAC ports.
- */
- for (macPortNum = 0; macPortNum < NUM_MAC_PORTS; macPortNum++)
- {
- if (Init_sgmii (macPortNum))
- return -1;
- mac_address[5] += macPortNum;
- Init_MAC (macPortNum, mac_address, mtu);
- mac_address[5] -= macPortNum;
- }
-
- /* Setup the Ethernet switch finally. */
- Init_Switch (mtu);
-
- Switch_update_addr(0, sw_port0_mac_addr, 0);
- Switch_update_addr(1, mac_address, 0);
- mac_address[5] += 1;
- Switch_update_addr(2, mac_address, 0);
-
- /* CPSW subsystem setup done. Return success */
- return 0;
-}
-
-
-/******************************************************************************
- * Function: post_test_emac_loopback
- ******************************************************************************/
-POST_TEST_RESULT
-post_test_emac_loopback
-(
- void
-)
-{
- uint8_t test_buf[POST_EMAC_TEST_PKT_LENGTH+14];
- uint8_t sw_port0_mac_addr[6] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
- uint8_t mac_address[6];
- NET_DRV_DEVICE nDevice;
- uint32_t modNum;
- int32_t ret;
-
- /* Note that if the sgmii power enable is requested the PA must be
- * powered up first */
- modNum = 8;
- if (modNum == TARGET_PWR_ETH(x)) {
- ret = (int32_t)pscEnableModule (TARGET_PWR_PA);
- if (ret != 0)
- return (POST_TEST_RESULT_FAILED);
- }
-
- ret = (int32_t)pscEnableModule(modNum);
- if (ret != 0)
- return (POST_TEST_RESULT_FAILED);
-
- Init_Cpsw();
-
- /* Queue manager configuration */
- hwQmSetup ((qmConfig_t *)(targetGetQmConfig()));
- targetInitQs ();
-
-
- /* Cpdma configuration. */
- hwCpdmaRxConfig ((cpdmaRxCfg_t *)targetGetCpdmaRxConfig());
- hwCpdmaTxConfig ((cpdmaTxCfg_t *)targetGetCpdmaTxConfig());
-
-
- /* Packet accelerator configuration. If PA is not present this statement is defined
- * to void in target.h */
- targetPaConfig(sw_port0_mac_addr);
-
- /* Streaming switch configuration. If not present this statement is defined to void
- * in target.h. If present this is usually defined to a series of register writes */
- hwConfigStreamingSwitch();
-
- /* Initialize the network device driver */
- memset (&nDevice, 0, sizeof(nDevice));
-
- /* Start the networking device */
- if (cpmac_drv_start(&nDevice) < 0)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- /* Get the MAC address from efuse */
- platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_address);
-
- /* Set the dest MAC address to be broadcast, so that PA firmware will not filter out */
- memset(test_buf, 0xff, 6);
- memcpy(&test_buf[6], sw_port0_mac_addr, 6);
-
- /* set the payload length to 256 bytes */
- test_buf[12] = 0x01;
- test_buf[13] = 0x00;
-
- /* Send the Ethernet packet */
- if (cpmac_drv_send (&nDevice, test_buf, POST_EMAC_TEST_PKT_LENGTH+14) < 0)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- platform_delay(100);
-
- /* Receive the loopback packet */
- if (ret = cpmac_drv_receive (&nDevice, test_buf) < 0)
- {
- return POST_TEST_RESULT_FAILED;
- }
-
- return POST_TEST_RESULT_PASSED;
-}
-
-void
-post_hex_to_string
-(
- uint32_t hex,
- uint32_t nibbles,
- char *msg
-)
-{
- int32_t i;
- uint8_t nibble;
-
- for (i = (nibbles-1); i >= 0; i--)
- {
- nibble = hex & 0xf;
- if (nibble <= 0x9)
- {
- nibble += '0';
- }
- else
- {
- nibble += ('A' - 0xa);
- }
-
- msg[i] = nibble;
- hex = hex >> 4;
- }
- msg[nibbles] = 0;
-}
-
-Bool
-post_serial_num_isvalid
-(
- char c
-)
-{
- if (
- ((c >= '0') && (c <= '9')) ||
- ((c >= 'a') && (c <= 'z')) ||
- ((c >= 'A') && (c <= 'Z'))
- )
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-}
-
-/******************************************************************************
- * Function: post_write_serial_no
- ******************************************************************************/
-void
-post_write_serial_no
-(
- void
-)
-{
- uint32_t i, j;
- uint8_t msg[20], msg2[2];
- PLATFORM_DEVICE_info *p_device;
-
- /* Check if user key in the passcode "ti" to enter board serial number */
- if (platform_uart_read(msg, POST_UART_READ_TIMEOUT) != Platform_EOK)
- {
- return;
- }
- if (msg[0] != 't')
- {
- return;
- }
-
- if (platform_uart_read(msg, POST_UART_READ_TIMEOUT) != Platform_EOK)
- {
- return;
- }
- if (msg[0] != 'i')
- {
- return;
- }
-
- /* Passcode verified, prompt the user to enter serial number */
- p_device = platform_device_open(PLATFORM_DEVID_EEPROM50, 0);
- if (p_device == NULL)
- {
- return;
- }
-
- post_write_uart("\r\n\r\nPlease enter the 10 digit serial number for this board, and then press ENTER key:\r\n\r\n");
-
- i = 0;
- msg2[1] = 0;
- while (TRUE)
- {
- if (platform_uart_read(&msg[i], POST_UART_READ_TIMEOUT) != Platform_EOK)
- {
- platform_device_close(p_device->handle);
- post_write_uart("\r\n\r\nSerial number input time out!");
- return;
- }
-
- if (msg[i] == '\r')
- {
- break;
- }
- if ((i < POST_MAX_SN_SIZE) && post_serial_num_isvalid(msg[i]))
- {
- msg2[0] = msg[i];
- post_write_uart((char *)msg2);
- i++;
- }
- }
-
- if (i < POST_MAX_SN_SIZE)
- {
- for (j = i; j < POST_MAX_SN_SIZE; j++)
- {
- msg[j] = 0xff;
- }
- }
-
- if(platform_device_write(p_device->handle, POST_SERIAL_NUM_ADDR, msg, 16) == Platform_EOK)
- {
- post_write_uart("\r\n\r\nSerial number programmed to EEPROM successfully! ");
- }
- else
- {
- post_write_uart("\r\n\r\nFailed to program the serial number to EEPROM!");
- }
- platform_device_close(p_device->handle);
-
-}
-
-/******************************************************************************
- * Function: main function for POST
- ******************************************************************************/
-void
-main
-(
- void
-)
-{
- platform_init_flags init_flags;
- platform_init_config init_config;
- POST_TEST_ID test_id = POST_TEST_IN_PROGRESS;
- POST_TEST_RESULT test_result;
- uint32_t reset_type;
- int32_t i;
- char msg[9];
- uint8_t mac_addr[6];
- platform_info info;
- uint32_t sa_enable;
-
- /* Turn on all the platform initialize flags */
- memset(&init_config, 0, sizeof(platform_init_config));
- memset(&init_flags, 0x01, sizeof(platform_init_flags));
-
- init_flags.phy = 0;
-
- /* Initialize the platform */
- if (platform_init(&init_flags, &init_config) != Platform_EOK)
- {
- switch (platform_errno)
- {
- case PLATFORM_ERRNO_PLL_SETUP:
- test_id = POST_TEST_PLL_INIT;
- break;
- case PLATFORM_ERRNO_NAND:
- test_id = POST_TEST_NAND_INIT;
- break;
- case PLATFORM_ERRNO_NOR:
- test_id = POST_TEST_NOR_INIT;
- break;
- default:
- test_id = POST_TEST_GENERAL;
- break;
- }
- test_result = POST_TEST_RESULT_FAILED;
- }
-
- platform_uart_init();
- platform_uart_set_baudrate(POST_UART_BAUDRATE);
- if (test_id != POST_TEST_PLL_INIT)
- {
- if (post_write_uart("\r\n\r\n") != TRUE)
- {
- post_display_led_error(POST_TEST_UART); /* Never return from this function */
- }
-
- platform_get_info(&info);
-
- /* Display the board name */
- post_write_uart(info.board_name);
-
- /* Display the POST version */
- post_write_uart(POST_EVM_VERSION_MSG);
- post_write_uart(post_version);
-
- post_hex_to_string(info.board_rev, 4, msg);
- post_write_uart("\r\n\r\nFPGA Version: ");
- post_write_uart(msg);
-
- if (info.serial_nbr[0] != 0)
- {
- post_write_uart("\r\n\r\nBoard Serial Number: ");
- post_write_uart(info.serial_nbr);
- }
-
- /* Display the EFUSE MAC address */
- platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_addr);
- post_write_uart("\r\n\r\nEFUSE MAC ID is: ");
- for (i = 0; i < 6; i++)
- {
- post_hex_to_string(info.emac.efuse_mac_address[i], 2, msg);
- msg[2] = ' ';
- msg[3] = 0;
- post_write_uart(msg);
- }
-
- sa_enable = *(volatile uint32_t *)0x20c0004;
- sa_enable &= 0x1;
-
- if (sa_enable)
- {
- post_write_uart("\r\n\r\nSA is enabled on this board.");
- }
- else
- {
- post_write_uart("\r\n\r\nSA is disabled on this board.");
- }
-
- /* Read the PLL Reset Type Status register and display on UART */
- reset_type = PLL_CTRL_REG_RSTYPE;
- post_hex_to_string(reset_type, 8, msg);
- post_write_uart("\r\n\r\nPLL Reset Type Status Register: 0x");
- post_write_uart(msg);
- }
-
- /* Display test in progress UART/LED status or init error */
- post_display_status(test_id, POST_TEST_RESULT_STARTED);
-
- post_display_status(POST_TEST_EEPROM, POST_TEST_RESULT_STARTED);
- test_result = post_test_eeprom();
- post_display_status(POST_TEST_EEPROM, test_result);
-
- post_display_status(POST_TEST_NOR, POST_TEST_RESULT_STARTED);
- test_result = post_test_nor();
- post_display_status(POST_TEST_NOR, test_result);
-
- post_display_status(POST_TEST_NAND, POST_TEST_RESULT_STARTED);
- test_result = post_test_nand();
- post_display_status(POST_TEST_NAND, test_result);
-
- post_display_status(POST_TEST_EMAC_LOOPBACK, POST_TEST_RESULT_STARTED);
- test_result = post_test_emac_loopback();
- post_display_status(POST_TEST_EMAC_LOOPBACK, test_result);
-
- post_display_status(POST_TEST_DDR, POST_TEST_RESULT_STARTED);
- test_result = post_test_external_memory();
- post_display_status(POST_TEST_DDR, test_result);
-
- post_display_status(POST_TEST_COMPLETE, POST_TEST_RESULT_PASSED);
-
- post_write_serial_no();
-}
-
+/******************************************************************************\r
+ * Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ *\r
+ * Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the\r
+ * distribution.\r
+ *\r
+ * Neither the name of Texas Instruments Incorporated nor the names of\r
+ * its contributors may be used to endorse or promote products derived\r
+ * from this software without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ *****************************************************************************/\r
+\r
+#include <string.h>\r
+#include "platform.h"\r
+#include "types.h"\r
+#include "post.h"\r
+#include "net.h"\r
+#include "cpmacdrv.h"\r
+#include "target.h"\r
+#include "qm_api.h"\r
+#include "cpdma_api.h"\r
+#include "pscapi.h"\r
+\r
+/* CSL EMAC include */\r
+#include <ti/csl/csl_cpsw.h>\r
+#include <ti/csl/csl_cpsgmii.h>\r
+#include <ti/csl/csl_cpsgmiiAux.h>\r
+#include <ti/csl/cslr_cpsgmii.h>\r
+#include <ti/csl/csl_mdio.h>\r
+#include <ti/csl/csl_mdioAux.h>\r
+\r
+/* BootCfg module include */\r
+#include <ti/csl/csl_bootcfg.h>\r
+#include <ti/csl/csl_bootcfgAux.h>\r
+\r
+/* The version string */\r
+#pragma DATA_SECTION(post_version, ".version")\r
+#pragma DATA_ALIGN(post_version, 16)\r
+char post_version[] = POST_VERSION;\r
+\r
+/* OSAL functions for Platform Library */\r
+uint8_t *Osal_platformMalloc (uint32_t num_bytes, uint32_t alignment)\r
+{\r
+ return malloc(num_bytes);\r
+}\r
+\r
+void Osal_platformFree (uint8_t *dataPtr, uint32_t num_bytes)\r
+{\r
+ /* Free up the memory */\r
+ if (dataPtr)\r
+ {\r
+ free(dataPtr);\r
+ }\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_display_led_error\r
+ ******************************************************************************/\r
+void\r
+post_display_led_error\r
+(\r
+ POST_TEST_ID test_id\r
+)\r
+{\r
+ uint8_t led_status[POST_MAX_NUM_LED];\r
+ uint32_t i;\r
+\r
+ memset(led_status, POST_LED_ON, POST_MAX_NUM_LED);\r
+ while (TRUE)\r
+ {\r
+ for (i = 0; i < POST_MAX_NUM_LED; i++)\r
+ {\r
+ if (post_led_status[test_id][i] == POST_LED_BLINK)\r
+ {\r
+ if (led_status[i] == POST_LED_ON)\r
+ {\r
+ led_status[i] = POST_LED_OFF;\r
+ }\r
+ else\r
+ {\r
+ led_status[i] = POST_LED_ON;\r
+ }\r
+ platform_led(i, (PLATFORM_LED_OP)led_status[i], PLATFORM_USER_LED_CLASS);\r
+ }\r
+ else\r
+ {\r
+ platform_led(i, (PLATFORM_LED_OP)post_led_status[test_id][i], PLATFORM_USER_LED_CLASS);\r
+ }\r
+ }\r
+ platform_delay(POST_LED_BLINK_DELAY);\r
+ /* POST in the while(1) loop to display the LED error status */\r
+ }\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_write_uart\r
+ ******************************************************************************/\r
+Bool\r
+post_write_uart\r
+(\r
+ char* msg\r
+)\r
+{\r
+ uint32_t i;\r
+ uint32_t msg_len = strlen(msg);\r
+\r
+ /* Write the message to the UART */\r
+ for (i = 0; i < msg_len; i++)\r
+ {\r
+ if (platform_uart_write(msg[i]) != Platform_EOK)\r
+ {\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_display_status\r
+ ******************************************************************************/\r
+void\r
+post_display_status\r
+(\r
+ POST_TEST_ID test_id,\r
+ POST_TEST_RESULT test_result\r
+)\r
+{\r
+ uint32_t i;\r
+ char *msg;\r
+ char msg1[40] = "\r\n\rPOST ";\r
+ char msg2[] = " test passed!";\r
+ char msg3[] = " test failed!";\r
+ char msg4[] = " test started!";\r
+\r
+ msg = strcat(msg1, post_status[test_id]);\r
+ switch (test_id)\r
+ {\r
+ case POST_TEST_IN_PROGRESS:\r
+ case POST_TEST_COMPLETE:\r
+ /* Form the POST status message to write to the UART */\r
+ if (post_write_uart(msg) != TRUE)\r
+ {\r
+ post_display_led_error(POST_TEST_UART); /* Never return from this function */\r
+ }\r
+\r
+ for (i = 0; i < POST_MAX_NUM_LED; i++)\r
+ {\r
+ if (platform_led(i, (PLATFORM_LED_OP)post_led_status[test_id][i], PLATFORM_USER_LED_CLASS) != Platform_EOK)\r
+ {\r
+ post_write_uart("POST LED test failed \r\n");\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ /* Form the POST status message to write to the UART */\r
+ if (test_result == POST_TEST_RESULT_PASSED)\r
+ {\r
+ msg = strcat(msg, msg2);\r
+ if (post_write_uart(msg) != TRUE)\r
+ {\r
+ post_display_led_error(POST_TEST_UART); /* Never return from this function */\r
+ }\r
+ }\r
+ else if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ msg = strcat(msg, msg3);\r
+ if (post_write_uart(msg) != TRUE)\r
+ {\r
+ post_display_led_error(POST_TEST_UART); /* Never return from this function */\r
+ }\r
+ post_display_led_error(test_id); /* Never return from this function */\r
+ }\r
+ else\r
+ {\r
+ msg = strcat(msg, msg4);\r
+ if (post_write_uart(msg) != TRUE)\r
+ {\r
+ post_display_led_error(POST_TEST_UART); /* Never return from this function */\r
+ }\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_test_external_memory\r
+ ******************************************************************************/\r
+POST_TEST_RESULT\r
+post_test_external_memory\r
+(\r
+ void\r
+)\r
+{\r
+ POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;\r
+\r
+ if(platform_external_memory_test(0, 0) != Platform_EOK)\r
+ {\r
+ test_result = POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ return test_result;\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_test_eeprom\r
+ ******************************************************************************/\r
+POST_TEST_RESULT\r
+post_test_eeprom\r
+(\r
+ void\r
+)\r
+{\r
+ uint8_t test_buf[POST_EEPROM_TEST_READ_LENGTH];\r
+ POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;\r
+ PLATFORM_DEVICE_info *p_device;\r
+\r
+ p_device = platform_device_open(POST_EEPROM_TEST_DEVICE_ID, 0);\r
+ if (p_device == NULL)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ if(platform_device_read(p_device->handle,\r
+ POST_EEPROM_TEST_READ_ADDRESS,\r
+ test_buf,\r
+ POST_EEPROM_TEST_READ_LENGTH) != Platform_EOK)\r
+ {\r
+ test_result = POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ platform_device_close(p_device->handle);\r
+ return test_result;\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_test_nand\r
+ ******************************************************************************/\r
+POST_TEST_RESULT\r
+post_test_nand\r
+(\r
+ void\r
+)\r
+{\r
+ uint8_t test_buf[POST_NAND_TEST_READ_LENGTH];\r
+ POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;\r
+ uint32_t addr;\r
+ PLATFORM_DEVICE_info *p_device;\r
+\r
+ p_device = platform_device_open(POST_NAND_TEST_DEVICE_ID, 0);\r
+ if (p_device == NULL)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ addr = (POST_NAND_TEST_READ_BLOCK_NUM * p_device->page_count + POST_NAND_TEST_READ_PAGE_NUM) * p_device->page_size;\r
+ if(platform_device_read(p_device->handle,\r
+ addr,\r
+ test_buf,\r
+ POST_NAND_TEST_READ_LENGTH) != Platform_EOK)\r
+ {\r
+ test_result = POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ platform_device_close(p_device->handle);\r
+ return test_result;\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_test_nor\r
+ ******************************************************************************/\r
+POST_TEST_RESULT\r
+post_test_nor\r
+(\r
+ void\r
+)\r
+{\r
+ uint8_t test_buf[POST_NOR_TEST_READ_LENGTH];\r
+ POST_TEST_RESULT test_result = POST_TEST_RESULT_PASSED;\r
+ PLATFORM_DEVICE_info *p_device;\r
+\r
+ p_device = platform_device_open(POST_NOR_TEST_DEVICE_ID, 0);\r
+ if (p_device == NULL)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ if(platform_device_read(p_device->handle,\r
+ POST_NOR_TEST_READ_ADDR,\r
+ test_buf,\r
+ POST_NOR_TEST_READ_LENGTH) != Platform_EOK)\r
+ {\r
+ test_result = POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ platform_device_close(p_device->handle);\r
+ return test_result;\r
+}\r
+\r
+/** Number of ports in the ethernet subsystem */\r
+#define NUM_PORTS 3u\r
+\r
+/** Number of MAC/GMII ports in the ethernet switch */\r
+#define NUM_MAC_PORTS 2u\r
+\r
+/* Define LoopBack modes */\r
+#define CPSW_LOOPBACK_NONE 0\r
+#define CPSW_LOOPBACK_INTERNAL 1\r
+#define CPSW_LOOPBACK_EXTERNAL 2\r
+\r
+#ifdef SIMULATOR_SUPPORT\r
+int32_t cpswSimTest = 1;\r
+int32_t cpswLpbkMode = CPSW_LOOPBACK_EXTERNAL;\r
+#else\r
+int32_t cpswSimTest = 0;\r
+int32_t cpswLpbkMode = CPSW_LOOPBACK_INTERNAL;\r
+#endif\r
+int32_t cpswEvm6678 = 0;\r
+\r
+/** ============================================================================\r
+ * @n@b Init_SGMII\r
+ *\r
+ * @b Description\r
+ * @n SGMII peripheral initialization code.\r
+ *\r
+ * @param[in]\r
+ * @n macPortNum MAC port number for which the SGMII port setup must\r
+ * be performed.\r
+ *\r
+ * @return\r
+ * @n None\r
+ * =============================================================================\r
+ */\r
+int32_t Init_sgmii (uint32_t macPortNum)\r
+{\r
+ CSL_SGMII_ADVABILITY sgmiiCfg;\r
+ CSL_SGMII_STATUS sgmiiStatus;\r
+\r
+ if ((macPortNum == 0) && (cpswEvm6678))\r
+ {\r
+ /* EVM6678 back end: MAC-to-MAC force link */\r
+\r
+ /* Reset the port before configuring it */\r
+ CSL_SGMII_doSoftReset (macPortNum);\r
+ while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0);\r
+\r
+ /* Hold the port in soft reset and set up\r
+ * the SGMII control register:\r
+ * (1) Enable Master Mode (default)\r
+ */\r
+ CSL_SGMII_startRxTxSoftReset (macPortNum);\r
+ CSL_SGMII_enableMasterMode (macPortNum);\r
+ if (cpswLpbkMode != CPSW_LOOPBACK_NONE)\r
+ {\r
+ CSL_SGMII_enableLoopback (macPortNum);\r
+ }\r
+\r
+ /* Setup the Advertised Ability register for this port:\r
+ * (1) Enable Full duplex mode\r
+ * (2) Speed = 1000M\r
+ * (3) Force the Link\r
+ */\r
+ sgmiiCfg.bLinkUp = 1;\r
+ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS;\r
+ sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX;\r
+ CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);\r
+\r
+ CSL_SGMII_endRxTxSoftReset (macPortNum);\r
+\r
+ /* Wait for SGMII Link */\r
+ do\r
+ {\r
+ CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);\r
+ } while (sgmiiStatus.bIsLinkUp != 1);\r
+ }\r
+ else\r
+ {\r
+ /* Reset the port before configuring it */\r
+ CSL_SGMII_doSoftReset (macPortNum);\r
+ while (CSL_SGMII_getSoftResetStatus (macPortNum) != 0);\r
+\r
+ /* Hold the port in soft reset and set up\r
+ * the SGMII control register:\r
+ * (1) Enable Master Mode (default)\r
+ * (2) Enable Auto-negotiation\r
+ */\r
+ CSL_SGMII_startRxTxSoftReset (macPortNum);\r
+ if (cpswLpbkMode == CPSW_LOOPBACK_NONE)\r
+ {\r
+ CSL_SGMII_disableMasterMode (macPortNum);\r
+ }\r
+ else\r
+ {\r
+ CSL_SGMII_enableMasterMode (macPortNum);\r
+\r
+ if (cpswLpbkMode == CPSW_LOOPBACK_INTERNAL)\r
+ {\r
+ CSL_SGMII_enableLoopback (macPortNum);\r
+ }\r
+ }\r
+\r
+ /* Setup the Advertised Ability register for this port:\r
+ * (1) Enable Full duplex mode\r
+ * (2) Enable Auto Negotiation\r
+ */\r
+ sgmiiCfg.linkSpeed = CSL_SGMII_1000_MBPS;\r
+ sgmiiCfg.duplexMode = CSL_SGMII_FULL_DUPLEX;\r
+ CSL_SGMII_setAdvAbility (macPortNum, &sgmiiCfg);\r
+\r
+ CSL_SGMII_enableAutoNegotiation (macPortNum);\r
+ CSL_SGMII_endRxTxSoftReset (macPortNum);\r
+\r
+ /* Wait for SGMII Link */\r
+ if (!cpswSimTest && ((cpswLpbkMode == CPSW_LOOPBACK_EXTERNAL) || (cpswLpbkMode == CPSW_LOOPBACK_NONE)))\r
+ {\r
+ do\r
+ {\r
+ CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);\r
+ } while (sgmiiStatus.bIsLinkUp != 1);\r
+\r
+ /* Wait for SGMII Autonegotiation to complete without error */\r
+ do\r
+ {\r
+ CSL_SGMII_getStatus(macPortNum, &sgmiiStatus);\r
+ if (sgmiiStatus.bIsAutoNegError != 0)\r
+ return -1;\r
+ } while (sgmiiStatus.bIsAutoNegComplete != 1);\r
+ }\r
+ }\r
+\r
+ /* All done with configuration. Return Now. */\r
+ return 0;\r
+}\r
+\r
+int Init_MAC (uint32_t macPortNum, uint8_t macAddress[6], uint32_t mtu)\r
+{\r
+ /* Reset MAC Sliver 0 */\r
+ CSL_CPGMAC_SL_resetMac (macPortNum);\r
+ while (CSL_CPGMAC_SL_isMACResetDone (macPortNum) != TRUE);\r
+\r
+ /* Setup the MAC Control Register for this port:\r
+ * (1) Enable Full duplex\r
+ * (2) Enable GMII\r
+ * (3) Enable Gigabit\r
+ * (4) Enable External Configuration. This enables\r
+ * the "Full duplex" and "Gigabit" settings to be\r
+ * controlled externally from SGMII\r
+ * (5) Don't enable any control/error/short frames\r
+ */\r
+ CSL_CPGMAC_SL_enableFullDuplex (macPortNum);\r
+ CSL_CPGMAC_SL_enableGMII (macPortNum);\r
+ CSL_CPGMAC_SL_enableGigabit (macPortNum);\r
+ CSL_CPGMAC_SL_enableExtControl (macPortNum);\r
+\r
+ /* Configure the MAC address for this port */\r
+ CSL_CPSW_3GF_setPortMACAddress (macPortNum, macAddress);\r
+\r
+ /* Configure VLAN ID/CFI/Priority.\r
+ *\r
+ * For now, we are not using VLANs so just configure them\r
+ * to all zeros.\r
+ */\r
+ CSL_CPSW_3GF_setPortVlanReg (macPortNum, 0, 0, 0);\r
+\r
+ /* Configure the Receive Maximum length on this port,\r
+ * i.e., the maximum size the port can receive without\r
+ * any errors.\r
+ *\r
+ * Set the Rx Max length to the MTU configured for the\r
+ * interface.\r
+ */\r
+ CSL_CPGMAC_SL_setRxMaxLen (macPortNum, mtu);\r
+\r
+ /* Done setting up the MAC port */\r
+ return 0;\r
+}\r
+\r
+void Init_Switch (uint32_t mtu)\r
+{\r
+ CSL_CPSW_3GF_PORTSTAT portStatCfg;\r
+\r
+ /* Enable the CPPI port, i.e., port 0 that does all\r
+ * the data streaming in/out of EMAC.\r
+ */\r
+ CSL_CPSW_3GF_enablePort0 ();\r
+ CSL_CPSW_3GF_disableVlanAware ();\r
+ CSL_CPSW_3GF_setPort0VlanReg (0, 0, 0);\r
+ CSL_CPSW_3GF_setPort0RxMaxLen (mtu);\r
+\r
+ /* Enable statistics on both the port groups:\r
+ *\r
+ * MAC Sliver ports - Port 1, Port 2\r
+ * CPPI Port - Port 0\r
+ */\r
+ portStatCfg.p0AStatEnable = 1;\r
+ portStatCfg.p0BStatEnable = 1;\r
+ portStatCfg.p1StatEnable = 1;\r
+ portStatCfg.p2StatEnable = 1;\r
+ CSL_CPSW_3GF_setPortStatsEnableReg (&portStatCfg);\r
+\r
+ /* Setup the Address Lookup Engine (ALE) Configuration:\r
+ * (1) Enable ALE.\r
+ * (2) Clear stale ALE entries.\r
+ * (3) Disable VLAN Aware lookups in ALE since\r
+ * we are not using VLANs by default.\r
+ * (4) No Flow control\r
+ * (5) Configure the Unknown VLAN processing\r
+ * properties for the switch, i.e., which\r
+ * ports to send the packets to.\r
+ */\r
+ CSL_CPSW_3GF_enableAle ();\r
+ CSL_CPSW_3GF_clearAleTable ();\r
+\r
+ CSL_CPSW_3GF_disableAleVlanAware ();\r
+ CSL_CPSW_3GF_disableAleTxRateLimit ();\r
+ CSL_CPSW_3GF_setAlePrescaleReg (125000000u/1000u);\r
+ CSL_CPSW_3GF_setAleUnkownVlanReg (7, 3, 3, 7);\r
+\r
+ if(cpswLpbkMode != CPSW_LOOPBACK_NONE)\r
+ CSL_CPSW_3GF_enableAleBypass();\r
+\r
+ /* Done with switch configuration */\r
+ return;\r
+}\r
+\r
+int Switch_update_addr (uint32_t portNum, uint8_t macAddress[6], Uint16 add)\r
+{\r
+ uint32_t i;\r
+ CSL_CPSW_3GF_ALE_PORTCONTROL alePortControlCfg;\r
+ CSL_CPSW_3GF_ALE_UNICASTADDR_ENTRY ucastAddrCfg;\r
+\r
+\r
+ /* Configure the address in "Learning"/"Forward" state */\r
+ alePortControlCfg.portState = ALE_PORTSTATE_FORWARD;\r
+ alePortControlCfg.dropUntaggedEnable = 0;\r
+ alePortControlCfg.vidIngressCheckEnable = 0;\r
+ alePortControlCfg.noLearnModeEnable = (cpswLpbkMode != CPSW_LOOPBACK_NONE)?1:0;\r
+ alePortControlCfg.mcastLimit = 0;\r
+ alePortControlCfg.bcastLimit = 0;\r
+\r
+ CSL_CPSW_3GF_setAlePortControlReg (portNum, &alePortControlCfg);\r
+\r
+ if (cpswLpbkMode != CPSW_LOOPBACK_NONE)\r
+ {\r
+ /* Program the ALE with the MAC address.\r
+ *\r
+ * The ALE entries determine the switch port to which any\r
+ * matching received packet must be forwarded to.\r
+ */\r
+ /* Get the next free ALE entry to program */\r
+ for (i = 0; i < CSL_CPSW_3GF_NUMALE_ENTRIES; i++)\r
+ {\r
+ if (CSL_CPSW_3GF_getALEEntryType (i) == ALE_ENTRYTYPE_FREE)\r
+ {\r
+ /* Found a free entry */\r
+ break;\r
+ }\r
+ }\r
+ if (i == CSL_CPSW_3GF_NUMALE_ENTRIES)\r
+ {\r
+ /* No free ALE entry found. return error. */\r
+ return -1;\r
+ }\r
+ else\r
+ {\r
+ /* Found a free ALE entry to program our MAC address */\r
+ memcpy (ucastAddrCfg.macAddress, macAddress, 6); // Set the MAC address\r
+ ucastAddrCfg.ucastType = ALE_UCASTTYPE_UCAST_NOAGE; // Add a permanent unicast address entryALE_UCASTTYPE_UCAST_NOAGE.\r
+ ucastAddrCfg.secureEnable = FALSE;\r
+ ucastAddrCfg.blockEnable = FALSE;\r
+ ucastAddrCfg.portNumber = portNum; // Add the ALE entry for this port\r
+\r
+ /* Setup the ALE entry for this port's MAC address */\r
+ CSL_CPSW_3GF_setAleUnicastAddrEntry (i, &ucastAddrCfg);\r
+ }\r
+ }\r
+\r
+ /* Done with upading address */\r
+ return 0;\r
+}\r
+\r
+int32_t Init_SGMII_SERDES(void)\r
+{\r
+ if (cpswSimTest)\r
+ {\r
+\r
+ /* Unlock the chip configuration registers to allow SGMII SERDES registers to\r
+ * be written */\r
+ CSL_BootCfgUnlockKicker();\r
+\r
+ CSL_BootCfgSetSGMIIConfigPLL (0x00000041);\r
+ CSL_BootCfgSetSGMIIRxConfig (0, 0x00700621);\r
+ CSL_BootCfgSetSGMIITxConfig (0, 0x000108A1);\r
+ CSL_BootCfgSetSGMIIRxConfig (1, 0x00700621);\r
+ CSL_BootCfgSetSGMIITxConfig (1, 0x000108A1);\r
+\r
+ /* Re-lock the chip configuration registers to prevent unintentional writes */\r
+ CSL_BootCfgLockKicker();\r
+\r
+ }\r
+\r
+ /* SGMII SERDES Configuration complete. Return. */\r
+ return 0;\r
+}\r
+\r
+int32_t Init_Cpsw (void)\r
+{\r
+ uint32_t macPortNum, mtu = 1518;\r
+ uint8_t mac_address[6];\r
+ uint8_t sw_port0_mac_addr[6] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15};\r
+\r
+ /* Initialize the SERDES modules */\r
+ Init_SGMII_SERDES();\r
+\r
+ platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_address);\r
+\r
+ /* Initialize the SGMII/Sliver submodules for the\r
+ * two corresponding MAC ports.\r
+ */\r
+ for (macPortNum = 0; macPortNum < NUM_MAC_PORTS; macPortNum++)\r
+ {\r
+ if (Init_sgmii (macPortNum))\r
+ return -1;\r
+ mac_address[5] += macPortNum;\r
+ Init_MAC (macPortNum, mac_address, mtu);\r
+ mac_address[5] -= macPortNum;\r
+ }\r
+\r
+ /* Setup the Ethernet switch finally. */\r
+ Init_Switch (mtu);\r
+\r
+ Switch_update_addr(0, sw_port0_mac_addr, 0);\r
+ Switch_update_addr(1, mac_address, 0);\r
+ mac_address[5] += 1;\r
+ Switch_update_addr(2, mac_address, 0);\r
+\r
+ /* CPSW subsystem setup done. Return success */\r
+ return 0;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * Function: post_test_emac_loopback\r
+ ******************************************************************************/\r
+POST_TEST_RESULT\r
+post_test_emac_loopback\r
+(\r
+ void\r
+)\r
+{\r
+ uint8_t test_buf[POST_EMAC_TEST_PKT_LENGTH+14];\r
+ uint8_t sw_port0_mac_addr[6] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15};\r
+ uint8_t mac_address[6];\r
+ NET_DRV_DEVICE nDevice;\r
+ uint32_t modNum;\r
+ int32_t ret;\r
+\r
+ /* Note that if the sgmii power enable is requested the PA must be\r
+ * powered up first */\r
+ modNum = 8;\r
+ if (modNum == TARGET_PWR_ETH(x)) {\r
+ ret = (int32_t)pscEnableModule (TARGET_PWR_PA);\r
+ if (ret != 0)\r
+ return (POST_TEST_RESULT_FAILED);\r
+ }\r
+\r
+ ret = (int32_t)pscEnableModule(modNum);\r
+ if (ret != 0)\r
+ return (POST_TEST_RESULT_FAILED);\r
+\r
+ Init_Cpsw();\r
+\r
+ /* Queue manager configuration */\r
+ hwQmSetup ((qmConfig_t *)(targetGetQmConfig()));\r
+ targetInitQs ();\r
+\r
+\r
+ /* Cpdma configuration. */\r
+ hwCpdmaRxConfig ((cpdmaRxCfg_t *)targetGetCpdmaRxConfig());\r
+ hwCpdmaTxConfig ((cpdmaTxCfg_t *)targetGetCpdmaTxConfig());\r
+\r
+\r
+ /* Packet accelerator configuration. If PA is not present this statement is defined\r
+ * to void in target.h */\r
+ targetPaConfig(sw_port0_mac_addr);\r
+\r
+ /* Streaming switch configuration. If not present this statement is defined to void\r
+ * in target.h. If present this is usually defined to a series of register writes */\r
+ hwConfigStreamingSwitch();\r
+\r
+ /* Initialize the network device driver */\r
+ memset (&nDevice, 0, sizeof(nDevice));\r
+\r
+ /* Start the networking device */\r
+ if (cpmac_drv_start(&nDevice) < 0)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ /* Get the MAC address from efuse */\r
+ platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_address);\r
+\r
+ /* Set the dest MAC address to be broadcast, so that PA firmware will not filter out */\r
+ memset(test_buf, 0xff, 6);\r
+ memcpy(&test_buf[6], sw_port0_mac_addr, 6);\r
+\r
+ /* set the payload length to 256 bytes */\r
+ test_buf[12] = 0x01;\r
+ test_buf[13] = 0x00;\r
+\r
+ /* Send the Ethernet packet */\r
+ if (cpmac_drv_send (&nDevice, test_buf, POST_EMAC_TEST_PKT_LENGTH+14) < 0)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+ \r
+ platform_delay(100);\r
+ \r
+ /* Receive the loopback packet */\r
+ if (ret = cpmac_drv_receive (&nDevice, test_buf) < 0)\r
+ {\r
+ return POST_TEST_RESULT_FAILED;\r
+ }\r
+\r
+ return POST_TEST_RESULT_PASSED;\r
+}\r
+\r
+void\r
+post_hex_to_string\r
+(\r
+ uint32_t hex,\r
+ uint32_t nibbles,\r
+ char *msg\r
+)\r
+{\r
+ int32_t i;\r
+ uint8_t nibble;\r
+\r
+ for (i = (nibbles-1); i >= 0; i--)\r
+ {\r
+ nibble = hex & 0xf;\r
+ if (nibble <= 0x9)\r
+ {\r
+ nibble += '0';\r
+ }\r
+ else\r
+ {\r
+ nibble += ('A' - 0xa);\r
+ }\r
+\r
+ msg[i] = nibble;\r
+ hex = hex >> 4;\r
+ }\r
+ msg[nibbles] = 0;\r
+}\r
+\r
+Bool\r
+post_serial_num_isvalid\r
+(\r
+ char c\r
+)\r
+{\r
+ if (\r
+ ((c >= '0') && (c <= '9')) ||\r
+ ((c >= 'a') && (c <= 'z')) ||\r
+ ((c >= 'A') && (c <= 'Z'))\r
+ )\r
+ {\r
+ return TRUE;\r
+ }\r
+ else\r
+ {\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_write_serial_no\r
+ ******************************************************************************/\r
+void\r
+post_write_serial_no\r
+(\r
+ void\r
+)\r
+{\r
+ uint32_t i, j;\r
+ uint8_t msg[20], msg2[2];\r
+ PLATFORM_DEVICE_info *p_device;\r
+\r
+ /* Check if user key in the passcode "ti" to enter board serial number */\r
+ if (platform_uart_read(msg, POST_UART_READ_TIMEOUT) != Platform_EOK)\r
+ {\r
+ return;\r
+ }\r
+ if (msg[0] != 't')\r
+ {\r
+ return;\r
+ }\r
+\r
+ if (platform_uart_read(msg, POST_UART_READ_TIMEOUT) != Platform_EOK)\r
+ {\r
+ return;\r
+ }\r
+ if (msg[0] != 'i')\r
+ {\r
+ return;\r
+ }\r
+\r
+ /* Passcode verified, prompt the user to enter serial number */\r
+ p_device = platform_device_open(PLATFORM_DEVID_EEPROM50, 0);\r
+ if (p_device == NULL)\r
+ {\r
+ return;\r
+ }\r
+\r
+ post_write_uart("\r\n\r\nPlease enter the 10 digit serial number for this board, and then press ENTER key:\r\n\r\n");\r
+\r
+ i = 0;\r
+ msg2[1] = 0;\r
+ while (TRUE)\r
+ {\r
+ if (platform_uart_read(&msg[i], POST_UART_READ_TIMEOUT) != Platform_EOK)\r
+ {\r
+ platform_device_close(p_device->handle);\r
+ post_write_uart("\r\n\r\nSerial number input time out!");\r
+ return;\r
+ }\r
+\r
+ if (msg[i] == '\r')\r
+ {\r
+ break;\r
+ }\r
+ if ((i < POST_MAX_SN_SIZE) && post_serial_num_isvalid(msg[i]))\r
+ {\r
+ msg2[0] = msg[i];\r
+ post_write_uart((char *)msg2);\r
+ i++;\r
+ }\r
+ }\r
+\r
+ if (i < POST_MAX_SN_SIZE)\r
+ {\r
+ for (j = i; j < POST_MAX_SN_SIZE; j++)\r
+ {\r
+ msg[j] = 0xff;\r
+ }\r
+ }\r
+\r
+ if(platform_device_write(p_device->handle, POST_SERIAL_NUM_ADDR, msg, 16) == Platform_EOK)\r
+ {\r
+ post_write_uart("\r\n\r\nSerial number programmed to EEPROM successfully! ");\r
+ }\r
+ else\r
+ {\r
+ post_write_uart("\r\n\r\nFailed to program the serial number to EEPROM!");\r
+ }\r
+ platform_device_close(p_device->handle);\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * Function: post_dump_register_val\r
+ ******************************************************************************/\r
+void\r
+post_dump_register_val\r
+(\r
+ uint32_t reg_addr,\r
+ char* desc_string\r
+)\r
+{\r
+ char msg[10];\r
+ uint32_t reg_val;\r
+\r
+ reg_val = *(volatile uint32_t *)reg_addr;\r
+ post_write_uart(desc_string);\r
+ post_hex_to_string(reg_val, 8, msg);\r
+ msg[8] = ' ';\r
+ msg[9] = 0;\r
+ post_write_uart(msg); \r
+}\r
+\r
+/******************************************************************************\r
+ * Function: main function for POST\r
+ ******************************************************************************/\r
+void\r
+main\r
+(\r
+ void\r
+)\r
+{\r
+ platform_init_flags init_flags;\r
+ platform_init_config init_config;\r
+ POST_TEST_ID test_id = POST_TEST_IN_PROGRESS;\r
+ POST_TEST_RESULT test_result;\r
+ uint32_t reset_type;\r
+ int32_t i;\r
+ char msg[9];\r
+ uint8_t mac_addr[6];\r
+ platform_info info;\r
+ uint32_t sa_enable;\r
+ uint32_t acc_fail;\r
+ extern uint32_t platform_init_return_code;\r
+\r
+ /* Turn on all the platform initialize flags */\r
+ memset(&init_config, 0, sizeof(platform_init_config));\r
+ memset(&init_flags, 0x01, sizeof(platform_init_flags));\r
+\r
+ init_flags.phy = 0;\r
+ acc_fail = 0;\r
+\r
+ /* Initialize the platform */\r
+ if (platform_init(&init_flags, &init_config) != Platform_EOK)\r
+ {\r
+ switch (platform_errno)\r
+ {\r
+ case PLATFORM_ERRNO_PLL_SETUP:\r
+ test_id = POST_TEST_PLL_INIT;\r
+ break;\r
+ case PLATFORM_ERRNO_NAND:\r
+ test_id = POST_TEST_NAND_INIT;\r
+ break;\r
+ case PLATFORM_ERRNO_NOR:\r
+ test_id = POST_TEST_NOR_INIT;\r
+ break;\r
+ default:\r
+ test_id = POST_TEST_GENERAL;\r
+ break;\r
+ }\r
+ test_result = POST_TEST_RESULT_FAILED;\r
+ }\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ platform_uart_init();\r
+ platform_uart_set_baudrate(POST_UART_BAUDRATE);\r
+ if (test_id != POST_TEST_PLL_INIT)\r
+ {\r
+ if (post_write_uart("\r\n\r\n") != TRUE)\r
+ {\r
+ post_display_led_error(POST_TEST_UART); /* Never return from this function */\r
+ }\r
+\r
+ platform_get_info(&info);\r
+\r
+ /* Display the board name */\r
+ post_write_uart(info.board_name);\r
+\r
+ /* Display the POST version */\r
+ post_write_uart(POST_EVM_VERSION_MSG);\r
+ post_write_uart(post_version);\r
+\r
+ post_write_uart("\r\n\r------------------------------------------");\r
+ post_write_uart("\r\n\rSOC Information");\r
+ post_hex_to_string(info.board_rev, 4, msg);\r
+ post_write_uart("\r\n\r\nFPGA Version: ");\r
+ post_write_uart(msg);\r
+\r
+ if (info.serial_nbr[0] != 0)\r
+ {\r
+ post_write_uart("\r\n\rBoard Serial Number: ");\r
+ post_write_uart(info.serial_nbr);\r
+ }\r
+\r
+ /* Display the EFUSE MAC address */\r
+ platform_get_macaddr(PLATFORM_MAC_TYPE_EFUSE, mac_addr);\r
+ post_write_uart("\r\n\rEFUSE MAC ID is: ");\r
+ for (i = 0; i < 6; i++)\r
+ {\r
+ post_hex_to_string(info.emac.efuse_mac_address[i], 2, msg);\r
+ msg[2] = ' ';\r
+ msg[3] = 0;\r
+ post_write_uart(msg);\r
+ }\r
+\r
+ sa_enable = *(volatile uint32_t *)0x20c0004;\r
+ sa_enable &= 0x1;\r
+\r
+ if (sa_enable)\r
+ {\r
+ post_write_uart("\r\n\rSA is enabled on this board.");\r
+ }\r
+ else\r
+ {\r
+ post_write_uart("\r\n\rSA is disabled on this board.");\r
+ }\r
+ /* Read the PLL Reset Type Status register and display on UART */\r
+ reset_type = PLL_CTRL_REG_RSTYPE;\r
+ post_hex_to_string(reset_type, 8, msg);\r
+ post_write_uart("\r\n\rPLL Reset Type Status Register: 0x");\r
+ post_write_uart(msg);\r
+\r
+ /* Dump Additional Information */\r
+ post_dump_register_val ((uint32_t)&platform_init_return_code, "\r\n\rPlatform init return code: 0x");\r
+ post_write_uart("\r\n\rAdditional Information: ");\r
+ post_dump_register_val (0x02350014, "\r\n\r (0x02350014) :");\r
+ post_dump_register_val (0x02350624, "\r\n\r (0x02350624) :");\r
+ post_dump_register_val (0x02350678, "\r\n\r (0x02350678) :");\r
+ post_dump_register_val (0x0235063C, "\r\n\r (0x0235063C) :");\r
+ post_dump_register_val (0x02350640, "\r\n\r (0x02350640) :");\r
+ post_dump_register_val (0x02350644, "\r\n\r (0x02350644) :");\r
+ post_dump_register_val (0x02350648, "\r\n\r (0x02350648) :");\r
+ post_dump_register_val (0x0235064C, "\r\n\r (0x0235064C) :");\r
+ post_dump_register_val (0x02350650, "\r\n\r (0x02350650) :");\r
+ post_dump_register_val (0x02350654, "\r\n\r (0x02350654) :");\r
+ post_dump_register_val (0x02350658, "\r\n\r (0x02350658) :");\r
+ post_dump_register_val (0x0235065C, "\r\n\r (0x0235065C) :");\r
+ post_dump_register_val (0x02350660, "\r\n\r (0x02350660) :");\r
+ post_dump_register_val (0x02350668, "\r\n\r (0x02350668) :");\r
+ post_dump_register_val (0x02350670, "\r\n\r (0x02350670) :");\r
+\r
+ post_dump_register_val (0x02620008, "\r\n\r (0x02620008) :");\r
+ post_dump_register_val (0x0262000c, "\r\n\r (0x0262000c) :");\r
+ post_dump_register_val (0x02620010, "\r\n\r (0x02620010) :");\r
+ post_dump_register_val (0x02620014, "\r\n\r (0x02620014) :");\r
+ post_dump_register_val (0x02620018, "\r\n\r (0x02620018) :");\r
+ post_dump_register_val (0x02620180, "\r\n\r (0x02620180) :");\r
+\r
+ post_write_uart("\r\n\r------------------------------------------");\r
+ }\r
+\r
+ post_write_uart("\r\n\r\nPower On Self Test\n");\r
+\r
+ /* Display test in progress UART/LED status or init error */\r
+ post_display_status(test_id, POST_TEST_RESULT_STARTED);\r
+\r
+ post_display_status(POST_TEST_EEPROM, POST_TEST_RESULT_STARTED);\r
+ test_result = post_test_eeprom();\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ post_display_status(POST_TEST_EEPROM, test_result);\r
+\r
+ post_display_status(POST_TEST_NOR, POST_TEST_RESULT_STARTED);\r
+ test_result = post_test_nor();\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ post_display_status(POST_TEST_NOR, test_result);\r
+\r
+ post_display_status(POST_TEST_NAND, POST_TEST_RESULT_STARTED);\r
+ test_result = post_test_nand();\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ post_display_status(POST_TEST_NAND, test_result);\r
+\r
+ post_display_status(POST_TEST_EMAC_LOOPBACK, POST_TEST_RESULT_STARTED);\r
+ test_result = post_test_emac_loopback();\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ post_display_status(POST_TEST_EMAC_LOOPBACK, test_result);\r
+\r
+ post_display_status(POST_TEST_DDR, POST_TEST_RESULT_STARTED);\r
+ test_result = post_test_external_memory();\r
+ if (test_result == POST_TEST_RESULT_FAILED)\r
+ {\r
+ acc_fail++;\r
+ }\r
+ post_display_status(POST_TEST_DDR, test_result);\r
+\r
+ post_display_status(POST_TEST_COMPLETE, POST_TEST_RESULT_PASSED);\r
+\r
+ if (acc_fail == 0)\r
+ {\r
+ post_write_uart("\r\n\r\nPOST result: PASS");\r
+ }\r
+ else\r
+ {\r
+ post_write_uart("\r\n\r\nPOST result: FAIL");\r
+ }\r
+\r
+ post_write_serial_no();\r
+}\r
+\r