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

📄 diag.c

📁 S3c2510下的VXWORKS的BSP源代码(包括了以太网、串口、USB等等驱动)
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 0x00 */
STATUS diagAll0x00(UINT8 *ptr, int length)
{
    int i, pattern;

    printf("       Pattern 0x00 ..............");
    for (i=0, pattern=0x00; i<length; i++)
    {
        ptr[i] = (UINT8)pattern;
    }
    for (i=0, pattern=0x00; 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 0xFF */
STATUS diagAll0xFF(UINT8 *ptr, int length)
{
    int i, pattern;

    printf("       Pattern 0xFF ..............");
    for (i=0, pattern=0xff; i<length; i++)
    {
        ptr[i] = (UINT8)pattern;
    }
    for (i=0, pattern=0xff; 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;
}

STATUS diagMem(UINT8 *ptr, int length)
{
    if (diagAddress((UINT32 *)ptr, length) != OK)
    {
        return ERROR;
    }

#ifdef  DIAG_ALIGN
    diagAlign1((UINT32 *)ptr, length);
    diagAlign2((UINT32 *)ptr, length);
    diagAlign3((UINT32 *)ptr, length);
#endif  /* DIAG_ALIGN */

    if (diagIncFrom0x00(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagDecFrom0xFF(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagIncWalkingOne(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagDecWalkingOne(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagAll0x55(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagAll0xAA(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagAll0xFF(ptr, length) != OK)
    {
        return ERROR;
    }

    if (diagAll0x00(ptr, length) != OK)
    {
        return ERROR;
    }

    printf("\n");

    return OK;
}

void diagEthMakeHeader(ETH_DRV_CTRL *pDrvCtrl, PETHTBD pTbd)
{
    bcopy(pDrvCtrl->IFADDR.phyAddress, ((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_shost, SIZE_ETH_ADDR);
    bcopy(pDrvCtrl->IFADDR.phyAddress, ((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_dhost, SIZE_ETH_ADDR);
    ((ETH_HDR *)(pTbd->pBuf + SIZE_ETH_WA))->ether_type = htons(ETHERTYPE_IP);
}

STATUS diagEthLoopTest(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat)
{
    int i, j;
    PETHRBD pRbd;
    PETHTBD pTbd;
    UINT32 tickStart;
    ULONG length;


    printf("\nETH%d: Verifying Data Transfer\n", pDrvCtrl1->unit);

    do
    {
        printf("ETH%d: Wait for a few seconds...\n", pDrvCtrl1->unit);

        for (i=0; i<2048; i++)
        {
            for (j=0; j<lengthFrame; j++)
            {
                buffer[j] = (UCHAR)(i + j + j / 256);
            }

            pTbd = ETH_DRV_TBD_GET(pDrvCtrl1);
            if (pTbd)
            {
                diagEthMakeHeader(pDrvCtrl1, pTbd);

                bcopy(buffer, (char *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);

                ETH_DRV_TBD_START(pDrvCtrl1, pTbd, lengthFrame + SIZE_ETH_HDR);

                if (ETH_DRV_TBD_CHECK(pDrvCtrl1, pTbd) != OK)
                {
#ifndef DIAG_QUIET
                    printf("ETH%d: Tx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl1->unit, i + 1, (UINT)pTbd->length, pTbd->status);
                    printf("ETH%d: TBD:%08X, TB:%08X\n", pDrvCtrl1->unit, (UINT32)pTbd, (UINT32)pTbd->pBuf);
#endif  /* DIAG_QUIET */

                    pDrvCtrl1->errTx++;
                }
                else
                {
                    pDrvCtrl1->okTx++;
                }
            }
            else
            {
                printf("ETH%d: Tx busy, sequence %d\n", pDrvCtrl1->unit, i + 1);

                pDrvCtrl1->errTx++;

                return ERROR;
            }

            tickStart = tickGet();
            while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) == NULL)
            {
                if (((tickGet() - tickStart) / sysClkRateGet()) > 5)
                {
                    printf("ETH%d: no receive indication during 5 seconds, sequence %d\n", pDrvCtrl2->unit, i + 1);

                    pDrvCtrl2->errRx++;

                    return ERROR;
                }
            }

            length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);

            if (length == (lengthFrame + SIZE_ETH_HDR))
            {
                for (j=0; j<lengthFrame; j++)
                {
                    if (((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR))[j] != (UCHAR)(i + j + j / 256))
                    {
                        break;
                    }
                }

                if (j < lengthFrame)
                {
#ifndef DIAG_QUIET
                    printf("ETH%d: mismatch, sequence %d, addr %08X\n", pDrvCtrl2->unit, i + 1, pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR + j);
                    printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif  /* DIAG_QUIET */

                    pDrvCtrl2->errRx++;

                    printf("Make Buffer\n");
                    diagHexDump((UCHAR *)buffer, lengthFrame);
                    printf("Tx Buffer\n");
                    diagHexDump((UCHAR *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);
                    printf("Rx Buffer\n");
                    diagHexDump((UCHAR *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);

                    return ERROR;
                }
                else
                {
                    pDrvCtrl2->okRx++;
                }
            }
            else
            {
#ifndef DIAG_QUIET
                printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, i + 1, (UINT)pRbd->length, pRbd->status);
                printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif  /* DIAG_QUIET */

                pDrvCtrl2->errRx++;
            }

            ETH_DRV_RBD_FREE(pDrvCtrl2, pRbd);
        }

        printf("ETH%d: Number of Rx OKs : %d\n", pDrvCtrl2->unit, pDrvCtrl2->okRx);
        printf("ETH%d: Number of Rx ERRs: %d\n", pDrvCtrl2->unit, pDrvCtrl2->errRx);
        printf("ETH%d: Number of Tx OKs : %d\n", pDrvCtrl1->unit, pDrvCtrl1->okTx);
        printf("ETH%d: Number of Tx ERRs: %d\n", pDrvCtrl1->unit, pDrvCtrl1->errTx);

    } while ((repeat == 0) || (--repeat != 0));

#ifdef  DIAG_TASK
    taskDelay(0);
#endif  /* DIAG_TASK */

    return OK;
}

/* temp */
#if 0
STATUS diagEthRateTest(ETH_DRV_CTRL *pDrvCtrl1, ETH_DRV_CTRL *pDrvCtrl2, int repeat)
{
    int i;
    int seqRx;
    int seqTx;
    UINT32 seconds;
    UINT32 busyTx;
    UINT32 okRx;
    UINT32 okTx;
    int errRx;
    int errTx;
    PETHRBD pRbd;
    PETHTBD pTbd;
    UINT32 tickStart;
    ULONG length;


    printf("\nETH%d: Estimate Data Transfer Rate (two copy)\n", pDrvCtrl1->unit);

        printf("ETH%d: Wait for 30 seconds...\n", pDrvCtrl1->unit);

        seqRx   = 0;
        seqTx   = 0;
        seconds = 0;
        busyTx  = 0;
        okRx    = 0;
        okTx    = 0;
        errRx   = 0;
        errTx   = 0;

        for (i=0; i<lengthFrame; i++)
        {
            buffer[i] = (UCHAR)(i % 256);
        }

        tickStart = tickGet();

        while (seconds < 30)
        {
            pTbd = ETH_DRV_TBD_GET(pDrvCtrl1);
            if (pTbd)
            {
                seqTx++;

                if (pTbd->status != 0)
                {
                    if (ETH_DRV_TBD_CHECK(pDrvCtrl1, pTbd) != OK)
                    {
#ifndef DIAG_QUIET
                        printf("ETH%d: Tx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl1->unit, seqTx, (UINT)pTbd->length, pTbd->status);
                        printf("ETH%d: TBD:%08X, TB:%08X\n", pDrvCtrl1->unit, (UINT32)pTbd, (UINT32)pTbd->pBuf);
#endif  /* DIAG_QUIET */

                        pDrvCtrl1->err1Tx++;
                        errTx++;
                    }
                    else
                    {
                        pDrvCtrl1->ok1Tx++;
                        okTx++;
                    }
                }

                buffer[0] = (UCHAR)(i % 256);

                diagEthMakeHeader(pDrvCtrl1, pTbd);

                bcopy(buffer, (char *)(pTbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), lengthFrame);

                ETH_DRV_TBD_START(pDrvCtrl1, pTbd, lengthFrame + SIZE_ETH_HDR);
            }
            else
            {
                busyTx++;
            }

            while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) != NULL)
            {
                seqRx++;

                length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);

                if (length == (lengthFrame + SIZE_ETH_HDR))
                {
                    bcopy((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), buffer, lengthFrame);

                    pDrvCtrl2->ok1Rx++;
                    okRx++;
                }
                else
                {
#ifndef DIAG_QUIET
                    printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, seqRx, (UINT)pRbd->length, pRbd->status);
                    printf("ETH%d: RBD:%08X, RB:%08X\n", pDrvCtrl2->unit, (UINT32)pRbd, (UINT32)pRbd->pBuf);
#endif  /* DIAG_QUIET */

                    pDrvCtrl2->err1Rx++;
                    errRx++;
                }

                /* Advance to next RBD. */
                pDrvCtrl2->rbdIndex++;
                if (pDrvCtrl2->rbdIndex == NUM_RBD_ETH)
                {
                    pDrvCtrl2->rbdIndex = 0;
                }
            }

            seconds = (tickGet() - tickStart) / sysClkRateGet();

            if ((okRx == 0) && (errRx == 0) && (seconds > 5))
            {
                printf("ETH%d: no receive indication during 5 seconds\n", pDrvCtrl2->unit);

                pDrvCtrl2->err1Rx++;
                errRx++;

                return ERROR;
            }

            if (seqTx >= 32)
            {
                break;
            }
        }

        while ((okRx + errRx) != seqTx)
        {
            while ((pRbd = ETH_DRV_RBD_GET(pDrvCtrl2)) != NULL)
            {
                seqRx++;

                length = ETH_DRV_RBD_CHECK(pDrvCtrl2, pRbd);

                if (length == (lengthFrame + SIZE_ETH_HDR))
                {
                    bcopy((char *)(pRbd->pBuf + SIZE_ETH_WA + SIZE_ETH_HDR), buffer, lengthFrame);

                    pDrvCtrl2->ok1Rx++;
                    okRx++;
                }
                else
                {
#ifndef DIAG_QUIET
                    printf("ETH%d: Rx error, sequence %d, length %u, status 0x%04X\n", pDrvCtrl2->unit, seqRx, (UINT)pRbd->length, pRbd->status);

⌨️ 快捷键说明

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