⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 args.c

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 C
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004-2008, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//
// File: args.c
//
// This file implements the BSP args passed to kernel from EBoot.
//
//------------------------------------------------------------------------------
#include <bsp.h>

//------------------------------------------------------------------------------
// External Variables
extern PBSP_ARGS g_pBSPARGS;        // From debug.c

//------------------------------------------------------------------------------
// Local Variables
//
// TODO: UUID could be based memory chip ID.  For now we keep it simple and
// use the MAC.
static UUID gUUID = { ((BSP_ARGS_DEFAULT_MAC_BYTE3 << 24) | // Data1
                       (BSP_ARGS_DEFAULT_MAC_BYTE2 << 16) |
                       (BSP_ARGS_DEFAULT_MAC_BYTE1 << 8) |
                       (BSP_ARGS_DEFAULT_MAC_BYTE0)),
                      ((BSP_ARGS_DEFAULT_MAC_BYTE5 << 8) |  // Data2
                       (BSP_ARGS_DEFAULT_MAC_BYTE4)),
                       0,                                   // Data 3
                       0, 0, 0, 0                           // Data 4
                    };

//------------------------------------------------------------------------------
//
// Function: OALArgsQuery
//
// This function is called from other OAL modules to return boot arguments.
// Boot arguments are typically placed in fixed memory location and they are
// filled by boot loader. In case that boot arguments can't be located
// the function should return NULL. The OAL module then must use default
// values.
//
// Parameters:
//      type
//          [in] The type of args.
//
// Returns:
//      Pointer to VOID.
//
//------------------------------------------------------------------------------
VOID* OALArgsQuery(UINT32 type)
{
    VOID *pData = NULL;
    
    OALMSG(OAL_ARGS&&OAL_FUNC, (L"+OALArgsQuery(%d)\r\n", type));
    
    // Check if there is expected signature
    if (
        g_pBSPARGS->header.signature  != OAL_ARGS_SIGNATURE ||
        g_pBSPARGS->header.oalVersion != OAL_ARGS_VERSION   ||
        g_pBSPARGS->header.bspVersion != BSP_ARGS_VERSION
        ) goto cleanUp;
    
    // Depending on required args
    switch (type) {
        case OAL_ARGS_QUERY_DEVID:
            pData = &g_pBSPARGS->deviceId;
            break;
        
        case OAL_ARGS_QUERY_KITL:
            g_pBSPARGS->kitl.flags |= (OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI);
            
            // Has the bootloader provided a non-zero IP address and subnet mask?
            // If not, use DHCP to obtain this information.
            if ((g_pBSPARGS->kitl.ipAddress == 0) || (g_pBSPARGS->kitl.ipMask == 0)) {
                g_pBSPARGS->kitl.flags |= OAL_KITL_FLAGS_DHCP;
            }
            
            // Has the bootloader provided information about which NIC it was using?
            // If not, choose the CS8900A as the default.
            if (g_pBSPARGS->kitl.devLoc.LogicalLoc == 0) {
                g_pBSPARGS->kitl.devLoc.IfcType     = Internal;
                g_pBSPARGS->kitl.devLoc.BusNumber   = 0;
#ifdef FORCE_KITL_ETHFEC
                g_pBSPARGS->kitl.devLoc.PhysicalLoc = (PVOID)(CSP_BASE_REG_PA_FEC);
#else
                g_pBSPARGS->kitl.devLoc.PhysicalLoc = (PVOID)(BSP_BASE_REG_PA_CS8900A_IOBASE);
#endif
                g_pBSPARGS->kitl.devLoc.LogicalLoc  = (DWORD)g_pBSPARGS->kitl.devLoc.PhysicalLoc;
            }
            
            pData = &g_pBSPARGS->kitl;
            break;

        // Check if this is a UUID request
        case OAL_ARGS_QUERY_UUID:
            // Return pointer to global UUID
            pData = &gUUID;
            break;
    }
    
cleanUp:
    
    OALMSG(OAL_ARGS&&OAL_FUNC, (L"-OALArgsQuery(pData = 0x%08x)\r\n", pData));
    return pData;
}

//------------------------------------------------------------------------------
//
// Function: OALBspArgsInit
//
// This function initialize global BSP args.
//
// Parameters:
//      None.
//
// Returns:
//      TRUE if boot successfully, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALBspArgsInit()
{
    //
    // Set up the DDK_CLOCK_SIGNAL in BSP_ARGS
    //
#ifdef MX27TO2
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL]    = BSP_MPLL_CLK_FREQ * 2 / 3;
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL]    = BSP_SPLL_CLK_FREQ;
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_ARM]     = (BSP_MPLL_CLK_FREQ * 2 / ((BSP_CSCR_ARMSRC)? 2:3)) / (BSP_CSCR_ARMDIV+ 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_AHB]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_CSCR_AHBDIV+ 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_IPG]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_AHB] / (BSP_CSCR_IPDIV + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_NFC]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_AHB] / (BSP_PCDR0_NFCDIV + 1);
    //
    // SSI1 must agree with source selected by PLLCRC_CSCR_SSI1_SEL bits in oal_startup.c
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI1]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL] / (2 + (BSP_PCDR0_SSI1DIV >> 1));
    //
    // SSI2 must agree with source selected by PLLCRC_CSCR_SSI2_SEL bits in oal_startup.c
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI2]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL] / (2 + (BSP_PCDR0_SSI2DIV >> 1));
    //
    // H264 must agree with source selected by PLLCRC_CSCR_H264_SEL bits in oal_startup.c
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_H264]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (2 + (BSP_PCDR0_H264DIV >> 1));
#else
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL]    = BSP_MPLL_CLK_FREQ;
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL]    = BSP_SPLL_CLK_FREQ;
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_ARM]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_CSCR_PRESC + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_AHB]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_ARM] / (BSP_CSCR_BCLKDIV + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_IPG]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_AHB] / (BSP_CSCR_IPDIV + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_NFC]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_ARM] / (BSP_PCDR0_NFCDIV + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI1]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL];
    if ( (BSP_PCDR0_SSI1DIV>>1) > 0 )
    {
        g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI1]    /= (BSP_PCDR0_SSI1DIV>>1);
    }
    else
    {
        OALMSG(OAL_ERROR,(TEXT("%s: Invalid BSP_PCDR0_SSI1DIV value (%d)\r\n"),
                    TEXT(__FUNCTION__),
                    BSP_PCDR0_SSI1DIV));
    }
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI2]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL];
    if ( (BSP_PCDR0_SSI2DIV>>1) > 0 )
    {
        g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SSI2]    /= (BSP_PCDR0_SSI2DIV>>1);
    }
    else
    {
        OALMSG(OAL_ERROR,(TEXT("%s: Invalid BSP_PCDR0_SSI2DIV value (%d)\r\n"),
                    TEXT(__FUNCTION__),
                    BSP_PCDR0_SSI2DIV));
    }
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_H264]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL];
    if ( (BSP_PCDR0_H264DIV>>1) > 0 )
    {
        g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_H264]    /= (BSP_PCDR0_H264DIV>>1);
    }
    else
    {
        OALMSG(OAL_ERROR,(TEXT("%s: Invalid BSP_PCDR0_H264DIV value (%d)\r\n"),
                    TEXT(__FUNCTION__),
                    BSP_PCDR0_H264DIV));
    }
#endif
    
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV1] = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_PCDR1_PERDIV1 + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV2] = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_PCDR1_PERDIV2 + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV3] = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_PCDR1_PERDIV3 + 1);
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV4] = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_PCDR1_PERDIV4 + 1);

    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_USB]     = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL] / (BSP_CSCR_USB_DIV + 1);
    // 
    // MSHC must agree with source selected by PLLCRC_CSCR_MSHC_SEL bits in oal_startup.c
    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MSHC]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_SPLL] / (BSP_PCDR0_MSHCDIV + 1);

    g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_CSI]    = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_MPLL] / (BSP_PCDR1_PERDIV4 + 1);

    //
    // Init driver globals
    //
    g_pBSPARGS->emma.usingStatus = 0;
    
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -