1
0
uboot-1.1.4-kirkwood/board/mv_feroceon/USP/mvDiag.c
2024-01-09 13:43:28 +01:00

131 lines
2.9 KiB
C

#include "uart/mvUart.h"
#include "rtc/integ_rtc/mvRtc.h"
/* UART timeout = UART_TIMEOUT * 100 usec */
#define UART_TIMEOUT 500
/* Function prototypes */
MV_VOID mvBoardEnvInit(MV_VOID);
MV_STATUS mvCtrlEnvInit(MV_VOID);
MV_VOID mvCpuIfInit(MV_VOID);
MV_U32 mvGppValueGet(MV_U32 group, MV_U32 mask);
MV_U32 mvDramIfBankBaseGet(MV_U32 bankNum);
MV_U32 mvDramIfSizeGet(MV_VOID);
/* Global variables */
extern unsigned int _TEXT_BASE;
/* Source code */
void diag_board_init(char *board_name)
{
mvBoardEnvInit();
mvCtrlEnvInit();
mvCpuIfInit();
mvBoardNameGet(board_name);
}
void diag_get_mem_detail(unsigned int **mem_test_start_offset,
unsigned int **mem_test_end_offset)
{
unsigned int start_offset, end_offset;
/* Get the base address of memory bank 0 */
end_offset = start_offset = mvDramIfBankBaseGet(0);
/* Start from the location where u-boot ends
* FIXME: Additional _1M is added for heap size
*/
start_offset += _TEXT_BASE + _1M + _1M;
/* TODO: If we are using same DRAM register init file for base and
* client, we need to hard-code end-offset for base to be 256M */
end_offset += mvDramIfSizeGet();
*mem_test_start_offset = (unsigned int *)start_offset;
*mem_test_end_offset = (unsigned int *)end_offset;
}
void diag_serial_init(int port, int baud_rate)
{
mvUartInit(port, CFG_TCLK / (16 * baud_rate), mvUartBase(port));
#if defined(LCP_88F6281)
unsigned int reg_val = 0;
if(port)
{
/* Change MPP settings for UART1 */
reg_val = MV_REG_READ(mvCtrlMppRegGet(1));
reg_val &= ~(0xFF << 20);
reg_val |= (0x33 << 20);
MV_REG_WRITE(mvCtrlMppRegGet(1), reg_val);
/* Select UART from SD/UART selection switch - MPP34 */
MV_REG_WRITE(0x10140, MV_REG_READ(0x10140) | BIT2);
/* Output enable */
MV_REG_WRITE(0x10144, MV_REG_READ(0x10144) & ~(BIT2));
}
#endif
}
void diag_int_lpbk(int port, int set)
{
volatile MV_UART_PORT *pUartPort = (volatile MV_UART_PORT *)mvUartBase(port);
if(set)
pUartPort->mcr |= 0x10;
else
pUartPort->mcr &= ~(0x10);
}
void diag_uart_putc(int port, unsigned char c)
{
mvUartPutc(port, c);
}
int diag_uart_getc(int port, unsigned char *c)
{
volatile MV_UART_PORT *pUartPort = (volatile MV_UART_PORT *)mvUartBase(port);
int timeout = 0;
while ( ((pUartPort->lsr & LSR_DR) == 0) && (++timeout < UART_TIMEOUT) )
{
udelay(100);
}
if (timeout == UART_TIMEOUT)
return 1;
*c = pUartPort->rbr;
return 0;
}
void diag_get_rtc_time(int *hour, int *minute, int *second)
{
MV_RTC_TIME mvRtcTime;
mvRtcTimeGet(&mvRtcTime);
*hour = mvRtcTime.hours;
*minute = mvRtcTime.minutes;
*second = mvRtcTime.seconds;
}
void diag_set_rtc_time(int hour, int minute, int second)
{
MV_RTC_TIME mvRtcTime;
mvRtcTime.hours = hour;
mvRtcTime.minutes = minute;
mvRtcTime.seconds = second;
mvRtcTimeSet(&mvRtcTime);
}