📄 hal.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 + -