hal.c

来自「ST5518机顶盒系统文件系统源代码!绝对超值!」· C语言 代码 · 共 243 行

C
243
字号
/******************************************************************************    File Name   :     Description : ******************************************************************************//* Includes ---------------------------------------------------------------- */#ifdef STAVFS_HAL_SIMULATION#undef STAVFS_HAL_SIMULATION#endif#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include <assert.h>#include "hal.h"#include "internal.h"#include "sttbx.h"/* Private Types ----------------------------------------------------------- *//* Private Constants ------------------------------------------------------- */#define   ENABLE_WRITE_CACHE                      (0x02)#define   DISABLE_REVERTING_TO_POWER_ON_DEFAULT   (0x66)#define   BLOCK_ACCESS_SIZE  (128)static U64 const Max28BitsValue = { 0X0FFFFFFF, 0 }; /* Maximum 28 bit value */#define   HAL_MAGIC_NUM       ((void*)&Magic) /* Unique value to HAL *//* Private Variables ------------------------------------------------------- *//* Private Macros ---------------------------------------------------------- *//* Private Function Prototypes --------------------------------------------- */static ST_ErrorCode_t SetupTheEvents (stavfs_HAL_t * HALData_p);static ST_ErrorCode_t IdentifyDevice (stavfs_HAL_t * HALData_p, U16 * Info, U8 StartIndex, U8 Length);static void Callback (STEVT_CallReason_t Reason, const ST_DeviceName_t RegName, STEVT_EventConstant_t Event,                      const void *EventData, const void *SubscriberData_p);static int Magic; /* This variable exists soly to provide a unique adddress *//************************************************************************* * * This code is used for crash testing only * * DO NOT COMPILE WITH "STAVFS_CRASH_TEST" DEFINED FOR A LIVE SYSTEM * *************************************************************************/#ifdef STAVFS_CRASH_TESTvoid stavfs_Crash(stavfs_HAL_t * HALData_p, U64 * FirstSector_p);/* from crash test module */#endif/* Functions --------------------------------------------------------------- *//******************************************************************************Function Name : stavfs_HalDiskExist  Description : Does the specified volume exist in the physical world.   Parameters : ******************************************************************************/BOOL stavfs_HalDiskExist (stavfs_HAL_t * HALData_p){    ST_ErrorCode_t Error;    assert (NULL != HALData_p);    if (HALData_p->Initialised)    {        return (TRUE);          /* Already up and running */    }    else if (HALData_p->Protocol == PROTOCOL_ATA) /* ATA protocol */    {        STATAPI_Handle_t AtapiHandle;        STATAPI_OpenParams_t AtapiOpenParams;        STATAPI_DriveType_t Type = STATAPI_UNKNOWN_DRIVE;        switch (HALData_p->UnitNumber)        {            case 0:                AtapiOpenParams.DeviceAddress = STATAPI_DEVICE_0;                break;            case 1:                AtapiOpenParams.DeviceAddress = STATAPI_DEVICE_1;                break;            default:                return (FALSE); /* Invalid unit number */        }        /* The code here can test a HDD is present, on TheBoard */        if (ST_NO_ERROR == (Error = STATAPI_Open (HALData_p->ATAPIName, &AtapiOpenParams, &AtapiHandle)))        {            STATAPI_GetDriveType (AtapiHandle, &Type);            STATAPI_Close (AtapiHandle);        }        return (Type == STATAPI_ATAPI_DRIVE) || (Type == STATAPI_ATA_DRIVE);    }    else    {        /* Unknown protocol */        return (FALSE);    }}/******************************************************************************Function Name : stavfs_HalInit  Description : Initialise the disk volume.   Parameters : The stavfs_HAL_t structure passed will be completed by the                initialisation and must be passed to subsequent calls.******************************************************************************/ST_ErrorCode_t stavfs_HalInit (stavfs_HAL_t * HALData_p){    ST_ErrorCode_t Error = ST_NO_ERROR;    BOOL GotHandles = FALSE; /* flags how failure should be dealt with */    assert (NULL != HALData_p);    task_lock();    if (HALData_p->Initialised)    {        task_unlock();        STTBX_Print(("Hal already initialised\n"));        return (Error);         /* Already up and running */    }    else    {        HALData_p->a.ata.EVTHandle   = 0;        HALData_p->a.ata.AtapiHandle = NULL;        HALData_p->Initialised       = TRUE;        HALData_p->MagicNumber       = HAL_MAGIC_NUM;                 /* Set up the semaphores */        semaphore_init_fifo_timeout (&(HALData_p->CMDSemaphore), 0);        task_unlock();    }        if (HALData_p->Protocol == PROTOCOL_ATA) /* ATA protocol */    {        STATAPI_OpenParams_t   AtapiOpenParams;        STATAPI_DriveType_t    Type;                STATAPI_Cmd_t          Cmd;        STATAPI_CmdStatus_t    CmdStatus;                U16 Word;                switch (HALData_p->UnitNumber)        {            case 0:                AtapiOpenParams.DeviceAddress = STATAPI_DEVICE_0;                break;            case 1:                AtapiOpenParams.DeviceAddress = STATAPI_DEVICE_1;                break;            default:                Error = ST_ERROR_BAD_PARAMETER; /* Invalid unit number */        }        /* The code here can test a HDD is present, on the board */        if (Error != ST_NO_ERROR)        {            STTBX_Print (("Bad unit number\n"));        }        else if (ST_NO_ERROR != (Error = STATAPI_Open (HALData_p->ATAPIName, &AtapiOpenParams, &(HALData_p->a.ata.AtapiHandle))))        {            STTBX_Print (("Failed to open STATAPI: error 0X%08X\n", Error));        }        else if ((ST_NO_ERROR != STATAPI_GetDriveType (HALData_p->a.ata.AtapiHandle, &Type)) &&                 (Type != STATAPI_ATAPI_DRIVE) && (Type != STATAPI_ATA_DRIVE))        {            /* Bad drive type */            STTBX_Print (("Bad drive type\n"));            STATAPI_Close (HALData_p->a.ata.AtapiHandle);            Error = ST_ERROR_BAD_PARAMETER;        }        else if (ST_NO_ERROR != (Error = SetupTheEvents (HALData_p)))        {            /* Initialisation failed */            STTBX_Print (("Failed to setup the drive events\n"));            STATAPI_Close (HALData_p->a.ata.AtapiHandle);        }        else        {            GotHandles = TRUE; /* use stavfs_HalTerm if we go wrong from now on */                        if (ST_NO_ERROR != (Error = STATAPI_SetPioMode (HALData_p->a.ata.AtapiHandle, STATAPI_PIO_MODE_4)))            {                /* Initialisation failed */                STTBX_Print (("Failed to setup the PIO Mode\n"));            }        }        if (Error == ST_NO_ERROR)        {            Cmd.Features = DISABLE_REVERTING_TO_POWER_ON_DEFAULT;            Cmd.SectorCount = 0;            Cmd.CmdCode = STATAPI_CMD_SET_FEATURES;            if (ST_NO_ERROR ==                    (Error = STATAPI_CmdNoData (HALData_p->a.ata.AtapiHandle, &Cmd, &CmdStatus)))            {                semaphore_wait (&(HALData_p->CMDSemaphore));                STTBX_Report ((STTBX_REPORT_LEVEL_INFO, "FEATURE DISABLE_REVERTING_TO_POWER_ON_DEFAULT ACTIVED"));            }        }        if (Error == ST_NO_ERROR)        {            Cmd.Features = ENABLE_WRITE_CACHE;            Cmd.SectorCount = 0;            Cmd.CmdCode = STATAPI_CMD_SET_FEATURES;            if (ST_NO_ERROR ==                (Error = STATAPI_CmdNoData (HALData_p->a.ata.AtapiHandle, &Cmd, &CmdStatus)))            {                semaphore_wait (&(HALData_p->CMDSemaphore));                STTBX_Report ((STTBX_REPORT_LEVEL_INFO, "FEATURE ENABLE_WRITE_CACHE ACTIVED"));            }        }        if (Error == ST_NO_ERROR)        {            /* 1

⌨️ 快捷键说明

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