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

📄 hal.c

📁 ST5518机顶盒系统文件系统源代码!绝对超值!
💻 C
字号:
/******************************************************************************    File Name   : hal.c    Description : Unit test for the STAVFS HAL layer******************************************************************************//* Includes ---------------------------------------------------------------- */#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include <string.h>#include "wrapper.h"#include "hal.h"/* Private Types ----------------------------------------------------------- *//* Private Constants ------------------------------------------------------- *//* for BitsTest */char BitsTestPattern[DISK_SECTOR_SIZE] ={0X00, 0X00, 0X00, 0X00, 0XFA, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XFD, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XFB, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XF7, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XEF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XDF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XBF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0X7F, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFB, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XEA, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XDA, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XBA, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7A, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,0X00, 0X00, 0X00, 0X00, 0XFA, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,};/* Private Variables ------------------------------------------------------- *//* Private Macros ---------------------------------------------------------- *//* Private Function Prototypes --------------------------------------------- */static TestResult_t DiskExist(int TestNo, TestVariant_t Variant);static TestResult_t DiskInit (int TestNo, TestVariant_t Variant);static TestResult_t ReadWrite(int TestNo, TestVariant_t Variant);static TestResult_t BitsTest (int TestNo, TestVariant_t Variant);static TestResult_t BadBlock(stavfs_HAL_t *Obj, U32 Block, BOOL DoStreaming, U32  NbSectors);/* Functions --------------------------------------------------------------- *//******************************************************************************Function Name : HAL  Description : HAL test section function.   Parameters :******************************************************************************/BOOL HAL (parse_t * pars_p, char *result_sym_p){    char *Description = "Unit Test for the HAL Layer";        TestCall_t TestList[] =    {        DiskExist, /* Test 001 */        DiskInit,  /* Test 002 */        ReadWrite, /* Test 003 */        ReadWrite, /* Test 004 */        BitsTest,  /* Test 005 (TestNo == 4) */    };        GenericTest (pars_p, result_sym_p,                 Description,                 TestList, TABLE_LEN(TestList)-1,		 TEST_VARIANT_A);                     return (FALSE);}/******************************************************************************Function Name : DiskExist  Description : Unit test for stavfs_HalDiskExist(). Test for functionality only.   Parameters :******************************************************************************/static TestResult_t DiskExist(int TestNo, TestVariant_t Variant){    TestResult_t Result = TEST_PASSED;    stavfs_HAL_t Obj;        Obj.Initialised = 0;    Obj.Protocol    = !PROTOCOL_ATA; /* Wrong protocol */    Obj.UnitNumber  = 0;        strcpy(Obj.EVTName,   EVT_DEVICE_NAME);    strcpy(Obj.ATAPIName, ATAPI_DEVICE_NAME);        if (stavfs_HalDiskExist(&Obj))    {        STTBX_Print(("Found a fantom disk\n"));        Result = TEST_FAILED;    }        Obj.Protocol = PROTOCOL_ATA; /* Correct protocol */        if (!stavfs_HalDiskExist(&Obj))    {        STTBX_Print(("Failed to find the disk\n"));        Result = TEST_FAILED;    }        if (ST_NO_ERROR != stavfs_HalInit(&Obj))    {        Result = TEST_FAILED;    }    else    {        if (!stavfs_HalDiskExist(&Obj))        {            STTBX_Print(("Failed to find the disk\n"));            Result = TEST_FAILED;        }            if (ST_NO_ERROR != stavfs_HalTerm(&Obj))        {            STTBX_Print(("Failed to close the disk\n"));            Result = TEST_FAILED;        }    }        return (Result);}/******************************************************************************Function Name : DiskInit  Description : Unit test for stavfs_HalInit(). Test for functionality only.   Parameters :******************************************************************************/static TestResult_t DiskInit(int TestNo, TestVariant_t Variant){    TestResult_t Result = TEST_PASSED;    stavfs_HAL_t Obj;        Obj.Initialised = TRUE;    Obj.Protocol    = PROTOCOL_ATA;    Obj.UnitNumber  = 0;        strcpy(Obj.EVTName,   EVT_DEVICE_NAME);    strcpy(Obj.ATAPIName, ATAPI_DEVICE_NAME);        Obj.a.ata.AtapiHandle = 0;    if (ST_NO_ERROR != stavfs_HalInit(&Obj))    {        STTBX_Print(("Error when openning an open HAL device\n"));        Result = TEST_FAILED;    }    else if (Obj.a.ata.AtapiHandle != 0)    {        STTBX_Print(("Re-openning an open HAL device\n"));        Result = TEST_FAILED;    }        Obj.Initialised = FALSE;        if (ST_NO_ERROR != stavfs_HalInit(&Obj))    {        STTBX_Print(("Error when openning a closed HAL device\n"));        Result = TEST_FAILED;    }    else if (Obj.a.ata.AtapiHandle == 0)    {        STTBX_Print(("Failed to open a closed HAL device\n"));        Result = TEST_FAILED;    }    else    {        if (ST_NO_ERROR != stavfs_HalTerm(&Obj))        {            STTBX_Print(("Failed to closed HAL device\n"));            Result = TEST_FAILED;        }    }        return (Result);}/******************************************************************************Function Name : ReadWrite  Description : Test the disk read/write functionality.   Parameters :******************************************************************************/static TestResult_t ReadWrite(int TestNo, TestVariant_t Variant){    TestResult_t Result = TEST_PASSED;    stavfs_HAL_t Obj;        Obj.Initialised = FALSE;    Obj.Protocol    = PROTOCOL_ATA;    Obj.UnitNumber  = 0;        strcpy(Obj.EVTName,   EVT_DEVICE_NAME);    strcpy(Obj.ATAPIName, ATAPI_DEVICE_NAME);        if (ST_NO_ERROR != stavfs_HalInit(&Obj))    {        STTBX_Print(("Error when openning a closed HAL device\n"));        Result = TEST_FAILED;    }    else    {        int i;        BOOL DoStreaming = FALSE;                /* Do the test */                switch (TestNo)        {            case 2 : DoStreaming = TRUE; break;                        case 3 : DoStreaming = FALSE; break;                        default : return(TEST_NOT_WRITTEN); /* This is an unexpected test number */        }                if (TEST_PASSED != BadBlock(&Obj, 0X100, DoStreaming, 0X200))        {            STTBX_Print(("Master block bad\n"));            Result = TEST_FAILED;        }                for (i = 0; (i < 0X200); i++)        {            if (TEST_PASSED != BadBlock(&Obj, 0X100+i, DoStreaming, 1))            {                STTBX_Print(("Sector bad 0X%02X\n", i));                Result = TEST_FAILED;            }        }            if (ST_NO_ERROR != stavfs_HalTerm(&Obj))        {            STTBX_Print(("Failed to closed HAL device\n"));            Result = TEST_FAILED;        }    }        return (Result);}/******************************************************************************Function Name : BadBlock  Description : Test the disk read/write functionality.   Parameters :******************************************************************************/static TestResult_t BadBlock(stavfs_HAL_t *Obj, U32 Block, BOOL DoStreaming, U32  NbSectors){    TestResult_t Result = TEST_PASSED;        char R_Buffer[512*1024];    char W_Buffer[512*1024];    U64  FirstSector;    int  i;        I64_SetValue(Block, 0, FirstSector); /* Arbitary location */        /* Read a block of the disk */        if (ST_NO_ERROR != stavfs_HalRead (Obj, &FirstSector, NbSectors, R_Buffer, DoStreaming))    {        STTBX_Print(("Read failed\n"));        Result = TEST_FAILED;    }        /* Invert the bits for the write back */        for (i = 0; (i < NbSectors*DISK_SECTOR_SIZE); i++)        W_Buffer[i] = ~R_Buffer[i];        /* Write back the interted block */        if (ST_NO_ERROR != stavfs_HalWrite (Obj, &FirstSector, NbSectors, W_Buffer, DoStreaming))    {        STTBX_Print(("Write failed\n"));        Result = TEST_FAILED;    }        /* Read the inverted block */        if (ST_NO_ERROR != stavfs_HalRead (Obj, &FirstSector, NbSectors, R_Buffer, DoStreaming))    {        STTBX_Print(("Read failed\n"));        Result = TEST_FAILED;    }        /* Check the read/write */        if (memcmp(W_Buffer, R_Buffer, NbSectors*DISK_SECTOR_SIZE))    {        STTBX_Print(("Error at byte in block\n"));        Result = TEST_FAILED;        for (i = 0; (i < NbSectors*DISK_SECTOR_SIZE); i++)        {            if (W_Buffer[i] != R_Buffer[i])            {                STTBX_Print(("Error at byte %d of block\n", i));                Result = TEST_FAILED;                break;            }        }    }        return (Result);}/******************************************************************************Function Name : BitsTest  Description : Test hardware response to specific bit patterns   Parameters :******************************************************************************/static TestResult_t BitsTest(int TestNo, TestVariant_t Variant){    /* Init the same as ReadWrite above */    TestResult_t Result = TEST_PASSED;    stavfs_HAL_t Obj;        Obj.Initialised = FALSE;    Obj.Protocol    = PROTOCOL_ATA;    Obj.UnitNumber  = 0;        strcpy(Obj.EVTName,   EVT_DEVICE_NAME);    strcpy(Obj.ATAPIName, ATAPI_DEVICE_NAME);        if (ST_NO_ERROR != stavfs_HalInit(&Obj))    {        STTBX_Print(("Error when opening a closed HAL device\n"));        Result = TEST_FAILED;    }    else    {        U32 uSect;        U64 TargetSector;        char R_Buffer[DISK_SECTOR_SIZE];        int i; /* used if memcmp fails */                /* test 5 sectors at 0x100 intervals */        for(uSect=0x100; uSect <= 0x500; uSect += 0x100)        {            I64_SetValue(uSect, 0, TargetSector);                        /* Write the test block. Do not use streaming, because we want to be sure we get              the disk's best effort. */                          if (ST_NO_ERROR != stavfs_HalWrite (&Obj, &TargetSector, 1, BitsTestPattern, FALSE))            {                STTBX_Print(("Write failed to sector 0X%02X\n", uSect));                Result = TEST_FAILED;            }                /* Read it back again */            else if (ST_NO_ERROR != stavfs_HalRead (&Obj, &TargetSector, 1, R_Buffer, FALSE))            {                STTBX_Print(("Read failed from sector 0X%02X\n", uSect));                Result = TEST_FAILED;            }            /* Check the read/write */            else if (memcmp(BitsTestPattern, R_Buffer, DISK_SECTOR_SIZE))            {                STTBX_Print(("Write-Read mismatch with sector 0X%02X\n", uSect));                Result = TEST_FAILED;                for (i = 0; (i < DISK_SECTOR_SIZE); ++i)                {                    if (BitsTestPattern[i] != R_Buffer[i])                    {                        STTBX_Print(("First error is at byte offset %d within block\n", i));                        break;                    }                }            }        } /* for loop */        if (ST_NO_ERROR != stavfs_HalTerm(&Obj))        {            STTBX_Print(("Failed to closed HAL device\n"));            Result = TEST_FAILED;        }    }        return (Result);}

⌨️ 快捷键说明

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