📄 diag.c
字号:
/* diag.c - Diagnostic test */
/* Copyright 2002 TAEBAEK Soft Corp. */
/*
modification history
--------------------
01a,08feb02,jmLee created.
*/
#include "vxWorks.h"
#include "config.h"
#include "string.h"
#include "intLib.h"
#include "logLib.h"
#include "stdio.h"
#include "time.h"
#include "taskLib.h"
#include "wdLib.h"
#include "vxLib.h"
#include "tyLib.h"
#include "drv/timer/timerDev.h"
#include "tickLib.h"
#include "etherLib.h"
#include "muxLib.h"
#include "drv/multi/s3c2510.h"
#include "s3c2510Eth.h"
#include "diag.h"
#define DIAG_BUF_SIZE 2048
#define DIAG_TASK
#undef DIAG_QUIET
LOCAL STATUS diagAddress(UINT32 *ptr32, int length);
#ifdef DIAG_ALIGN
LOCAL STATUS diagAlign1(UINT32 *ptr32, int length);
LOCAL STATUS diagAlign2(UINT32 *ptr32, int length);
LOCAL STATUS diagAlign3(UINT32 *ptr32, int length);
#endif /* DIAG_ALIGN */
LOCAL STATUS diagIncFrom0x00(UINT8 *ptr, int length);
LOCAL STATUS diagDecFrom0xFF(UINT8 *ptr, int length);
LOCAL STATUS diagIncWalkingOne(UINT8 *ptr, int length);
LOCAL STATUS diagDecWalkingOne(UINT8 *ptr, int length);
LOCAL STATUS diagAll0x55(UINT8 *ptr, int length);
LOCAL STATUS diagAll0xAA(UINT8 *ptr, int length);
LOCAL STATUS diagAll0x00(UINT8 *ptr, int length);
LOCAL STATUS diagAll0xFF(UINT8 *ptr, int length);
LOCAL STATUS diagMem(UINT8 *ptr, int length);
LOCAL void diagEthMakeHeader(ETH_DRV_CTRL *pDrvCtrl, PETHTBD pTbd);
LOCAL STATUS diagEthLoopTest(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagEthRateTest1(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagEthRateTest2(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagEthRateTest3(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL void taskDiagEth(int unit, int repeat);
LOCAL void taskDiagEth2(int unit1, int unit2, int repeat);
/*
LOCAL void diagSarMakeHeader(SAR_DRV_CTRL *pDrvCtrl, PSARTBD pTbd);
LOCAL STATUS diagSarLoopTest(SAR_DRV_CTRL *pDrvCtrl1, SAR_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagSarRateTest1(SAR_DRV_CTRL *pDrvCtrl1, SAR_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagSarRateTest2(SAR_DRV_CTRL *pDrvCtrl1, SAR_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL STATUS diagSarRateTest3(SAR_DRV_CTRL *pDrvCtrl1, SAR_DRV_CTRL *pDrvCtrl2, int repeat);
LOCAL void taskDiagSar(int unit, int repeat);
LOCAL void taskDiagSar2(int unit1, int unit2, int repeat);
*/
LOCAL int lengthFrame = 46;
LOCAL UCHAR buffer[DIAG_BUF_SIZE];
void diagHexDump(UCHAR *p, ULONG l)
{
ULONG i;
while (l)
{
printf("%08X: ", (UINT32)p);
for (i=0; i<16; i++)
{
printf("%02X ", *p++);
if (--l == 0)
{
break;
}
}
printf("\n");
}
}
/* Address */
STATUS diagAddress(UINT32 *ptr32, int length)
{
int i;
printf(" Address ...................");
for (i=0; i<length/4; i++)
{
ptr32[i] = (UINT32)(ptr32 + i);
}
for (i=0; i<length/4; i++)
{
if (ptr32[i] != (UINT32)(ptr32 + i))
{
printf("Mismatch\n (offset 0x%08X, read 0x%08X, expect 0x%08X)\n\n",
(UINT32)(i * 4),
ptr32[i],
(UINT32)(ptr32 + i)
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
#ifdef DIAG_ALIGN
/* Align 1 */
STATUS diagAlign1(UINT32 *ptr32, int length)
{
int i;
printf(" Align 1....................");
for (i=0; i<length/4; i+=2)
{
ptr32[i+0] = 0x01234567;
ptr32[i+1] = 0x89abcdef;
}
ptr32 = (UINT32 *)(((UCHAR *)ptr32) + 1);
for (i=0; i<length/4; i+=2)
{
#if _BYTE_ORDER==_BIG_ENDIAN
if (ptr32[i] != 0x23456789)
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
if (ptr32[i] != 0xef012345)
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
{
printf("Mismatch\n (offset 0x%08X, read 0x%08X, expect 0x%08X)\n\n",
(UINT32)(i * 4),
ptr32[i],
#if _BYTE_ORDER==_BIG_ENDIAN
0x23456789
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
0xef012345
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* Align 2 */
STATUS diagAlign2(UINT32 *ptr32, int length)
{
int i;
printf(" Align 2....................");
for (i=0; i<length/4; i+=2)
{
ptr32[i+0] = 0x01234567;
ptr32[i+1] = 0x89abcdef;
}
ptr32 = (UINT32 *)(((UCHAR *)ptr32) + 2);
for (i=0; i<length/4; i+=2)
{
#if _BYTE_ORDER==_BIG_ENDIAN
if (ptr32[i] != 0x456789ab)
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
if (ptr32[i] != 0xcdef0123)
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
{
printf("Mismatch\n (offset 0x%08X, read 0x%08X, expect 0x%08X)\n\n",
(UINT32)(i * 4),
ptr32[i],
#if _BYTE_ORDER==_BIG_ENDIAN
0x456789ab
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
0xcdef0123
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* Align 3 */
STATUS diagAlign3(UINT32 *ptr32, int length)
{
int i;
printf(" Align 3....................");
for (i=0; i<length/4; i+=2)
{
ptr32[i+0] = 0x01234567;
ptr32[i+1] = 0x89abcdef;
}
ptr32 = (UINT32 *)(((UCHAR *)ptr32) + 3);
for (i=0; i<length/4; i+=2)
{
#if _BYTE_ORDER==_BIG_ENDIAN
if (ptr32[i] != 0x6789abcd)
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
if (ptr32[i] != 0xabcdef01)
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
{
printf("Mismatch\n (offset 0x%08X, read 0x%08X, expect 0x%08X)\n\n",
(UINT32)(i * 4),
ptr32[i],
#if _BYTE_ORDER==_BIG_ENDIAN
0x6789abcd
#else /* #if _BYTE_ORDER==_BIG_ENDIAN */
0xabcdef01
#endif /* #if _BYTE_ORDER==_BIG_ENDIAN */
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
#endif /* DIAG_ALIGN */
/* Increment from 0x00 */
STATUS diagIncFrom0x00(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Increment from 0x00 .......");
for (i=0, pattern=0x00; i<length; i++, pattern++)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0x00; i<length; i++, pattern++)
{
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* Decrement from 0xFF */
STATUS diagDecFrom0xFF(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Decrement from 0xFF .......");
for (i=0, pattern=0xff; i<length; i++, pattern--)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0xff; i<length; i++, pattern--)
{
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* Increasing walking ones */
STATUS diagIncWalkingOne(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Increasing walking ones ...");
for (i=0, pattern=0x01; i<length; i++, pattern<<=1)
{
if (pattern == 0x100)
{
pattern = 0x01;
}
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0x01; i<length; i++, pattern<<=1)
{
if (pattern == 0x100)
{
pattern = 0x01;
}
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* Decreasing walking ones */
STATUS diagDecWalkingOne(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Decreasing walking ones ...");
for (i=0, pattern=0x80; i<length; i++, pattern>>=1)
{
if (pattern == 0x00)
{
pattern = 0x80;
}
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0x80; i<length; i++, pattern>>=1)
{
if (pattern == 0x00)
{
pattern = 0x80;
}
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* All 0x55 */
STATUS diagAll0x55(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Pattern 0x55 ..............");
for (i=0, pattern=0x55; i<length; i++)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0x55; i<length; i++)
{
if (ptr[i] != (UINT8)pattern)
{
printf("Mismatch\n (offset 0x%08X, read 0x%02X, expect 0x%02X)\n\n",
(UINT32)i,
ptr[i],
(UINT8)pattern
);
return ERROR;
}
}
printf("OK\n");
return OK;
}
/* All 0xAA */
STATUS diagAll0xAA(UINT8 *ptr, int length)
{
int i, pattern;
printf(" Pattern 0xAA ..............");
for (i=0, pattern=0xaa; i<length; i++)
{
ptr[i] = (UINT8)pattern;
}
for (i=0, pattern=0xaa; i<length; i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -