📄 kitl.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-2006,2007 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: kitl.c
//
// Support routines for KITL.
//
// Note: These routines are stubbed out in the kern image.
//
//-----------------------------------------------------------------------------
#include <bsp.h>
#include <kitl_cfg.h>
//-----------------------------------------------------------------------------
#define BSP_PREV_ARGS_COOKIE 0x8C020800
#define BSP_PREV_ARGS_MAC 0x8C02080C
#define USE_DHCP_RENEW 1
static PCSP_GPT_REGS g_pGPT;
#ifdef FORCE_KITL_SERIAL
#define BSP_UART_KITL_SERIAL_BAUD 115200
void OALEnableKitlSerial(void)
{
extern PCSP_PLLCRC_REGS g_pPLLCRC;
extern PCSP_GPIO_REGS g_pGPIO;
// Configure Pins(PE12 ~ PE15) for UART1 as primary function
OAL_IOMUX_PRI_PINS(g_pGPIO, GPIO_PORT_E, 0x0000F000 );
// Enable HWClock to UART1
SETREG32(&g_pPLLCRC->PCCR1, CSP_BITFMASK(PLLCRC_PCCR1_UART1_EN));
}
#endif
//-----------------------------------------------------------------------------
BOOL OALKitlStart()
{
BOOL rc;
OAL_KITL_ARGS *pArgs, args;
CHAR *szDeviceId;
OAL_KITL_DEVICE *pKitlDevice = NULL;
#ifndef FORCE_KITL_SERIAL
// UINT32 *kitlFlags;
BOOT_CFG bootConfig;
CHAR buffer[OAL_KITL_ID_SIZE];
#endif
OALMSG(OAL_KITL&&OAL_FUNC, (L"+OALKitlStart\r\n"));
// Get uncached virtual addresses for timer used in OALGetTickCount
g_pGPT = (PCSP_GPT_REGS) OALPAtoUA(CSP_BASE_REG_PA_GPT1);
if (g_pGPT == NULL)
{
OALMSG(OAL_ERROR, (L"+OALKitlStart: GPT null pointer!\r\n"));
rc = FALSE;
goto cleanUp;
}
#ifdef FORCE_KITL_SERIAL
// Set pointer to KITL transport device to Serial
//
pKitlDevice = &g_kitlDevices[OAL_KITL_SERIAL_INDEX];
args.flags = OAL_KITL_FLAGS_ENABLED|OAL_KITL_FLAGS_POLL;
args.baudRate = BSP_UART_KITL_SERIAL_BAUD;
args.dataBits = UART_UCR2_WS_8BIT;
args.stopBits = UART_UCR2_STPB_1STOP;
args.parity = UART_UCR2_PREN_DISBLE;
args.devLoc.LogicalLoc = BSP_BASE_REG_PA_SERIALKITL;
args.devLoc.IfcType = Internal;
szDeviceId = "MX27UART1";
OALEnableKitlSerial();
pArgs = &args;
#else
// Look for bootargs left by the bootloader or left over from an earlier boot.
//
pArgs = (OAL_KITL_ARGS*)OALArgsQuery(OAL_ARGS_QUERY_KITL);
szDeviceId = (CHAR*)OALArgsQuery(OAL_ARGS_QUERY_DEVID);
// If we don't get kitl arguments use default
if (pArgs == NULL)
{
OALMSG(OAL_WARN, (L"WARN: Boot arguments not found, use defaults\r\n"));
memset(&args, 0, sizeof(args));
// args.flags = *kitlFlags;
#ifdef FORCE_KITL_ETHFEC
pKitlDevice = &g_kitlDevices[OAL_KITL_ETH_FEC_INDEX];
#else
pKitlDevice = &g_kitlDevices[OAL_KITL_ETH_CS8900_INDEX];
#endif
OALReadBootCFG(&bootConfig);
args.flags |= OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI;
if(bootConfig.ConfigFlags & CONFIG_FLAGS_DHCP)
args.flags |= OAL_KITL_FLAGS_DHCP;
args.ipAddress = bootConfig.IPAddr;
args.ipMask = bootConfig.SubnetMask;
memcpy(args.mac, bootConfig.MACAddr, sizeof(args.mac));
#ifdef FORCE_KITL_ETHFEC
args.devLoc.LogicalLoc = CSP_BASE_REG_PA_FEC;
// Force KITL to run in polled mode
args.flags |= OAL_KITL_FLAGS_POLL;
#else
args.devLoc.LogicalLoc = BSP_BASE_REG_PA_CS8900A_IOBASE;
#endif
args.devLoc.IfcType = Internal;
args.devLoc.BusNumber = 0;
pArgs = &args;
}
#ifndef USE_DHCP_RENEW
else if (pArgs->flags & OAL_KITL_FLAGS_DHCP)
{
// Reset IP address to force DHCP request instead of renew which
// is acknowleged much sooner from the DHCP server
pArgs->ipAddress = 0;
}
#endif
// If there isn't device id from bootloader create some.
//
if (szDeviceId == NULL)
{
OALKitlCreateName(BSP_DEVICE_PREFIX, args.mac, buffer);
szDeviceId = buffer;
}
// If we have not configured pointer to KITL transport device,
// set it to Ethernet
if (pKitlDevice == NULL)
{
#ifdef FORCE_KITL_ETHFEC
pKitlDevice = &g_kitlDevices[OAL_KITL_ETH_FEC_INDEX];
#else
pKitlDevice = &g_kitlDevices[OAL_KITL_ETH_CS8900_INDEX];
#endif
}
#endif // FORCE_KITL_SERIA
// Finally call KITL library.
//
rc = OALKitlInit(szDeviceId, pArgs, pKitlDevice);
cleanUp:
OALMSG(OAL_KITL&&OAL_FUNC, (L"-OALKitlStart(rc = %d)\r\n", rc));
return(rc);
}
//------------------------------------------------------------------------------
//
// Function: OALGetTickCount
//
// This function is called by some KITL libraries to obtain relative time
// since device boot. It is mostly used to implement timeout in network
// protocol.
//
//------------------------------------------------------------------------------
UINT32 OALGetTickCount()
{
UINT32 ticks;
// Calculate GPT ticks since we started the system
ticks = INREG32(&g_pGPT->TCN);
// Return the number of 1ms ticks that have elapsed
return ticks / g_oalTimer.countsPerMSec;
}
//-----------------------------------------------------------------------------
//
// Function: OEMEthGetSecs
//
// Function returns a free-running seconds count.
//
// Parameters:
//
// Returns:
// DWORD dwSeconds - the count of seconds
//
//-----------------------------------------------------------------------------
DWORD OEMEthGetSecs(void)
{
SYSTEMTIME st;
OEMGetRealTime( &st );
return ((60UL * (60UL * (24UL * (31UL * st.wMonth + st.wDay) + st.wHour) + st.wMinute)) + st.wSecond);
}
//-----------------------------------------------------------------------------
//
// Function: OALGetSerialRefClock
//
// Function returns reference clock for UART1
//
// Parameters:
//
// Returns:
// DWORD PERCLK1 for UART1
//
//-----------------------------------------------------------------------------
UINT OALGetSerialRefClock(void)
{
extern PBSP_ARGS g_pBSPARGS;
return g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV1];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -