亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmmd_ata.c

?? STi5518機頂盒ATAPI源代碼!絕對超值!
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************************Source file name : cmmd_ata.cDescription: Implementation of the ATA Command Interface intermediate module            following the API Design Document v0.9.0 of the ATAPI driver.COPYRIGHT (C) STMicroelectronics  200031-08-00  Added an extra 400 ns delay at the end of the PIO in protocol           to allow slow drives as CD-ROM's to update their status           registers. (MV)          ************************************************************************//*Includes-------------------------------------------------------------*/#include <stdio.h>#include <string.h>#include "stlite.h"#include "statapi.h"#include "stsys.h"#include "hal_atapi.h"#include "ata.h"#include "stcommon.h"#include "sttbx.h"/*Private Types--------------------------------------------------------*//*Private Constants----------------------------------------------------*//*Private Variables----------------------------------------------------*/extern U32 intcount;extern U32 inttrace[15];/* Kind of messy, but since we need to get status differently for  * an extended command, and we can't expect the user to tell us what type * a command was... */BOOL LastCommandExtended = FALSE;/*Private Macros-------------------------------------------------------*/#if defined(ST_5512)     #define ATAPI_DATA 0x60080000 #elif defined(ST_5508) || defined(ST_5518)     #define ATAPI_DATA 0x50200000 #endif/*Private functions prototypes-----------------------------------------*/static void GetCmdStatus(ata_ControlBlock_t *Ata_p,                         STATAPI_CmdStatus_t *Stat_p);static void ata_cmd_WriteRegs(ata_ControlBlock_t *Ata_p,                                        ata_Cmd_t *Cmd_p);extern BOOL Trace;/*Functions------------------------------------------------------------*//************************************************************************Name: ata_cmd_WriteRegsDescription: Programs registers for sector count/number, cylinder, etc.Parameters: Two params:            Ata_p : Pointer to the ATA control block            Cmd_p : Pointer to a command structureReturn: none           ************************************************************************/static void ata_cmd_WriteRegs(ata_ControlBlock_t *Ata_p,                                        ata_Cmd_t *Cmd_p){    /* Feature is reserved with extended commands, so don't write. */    if ((Cmd_p->CmdType & ATA_EXT_BIT) == 0)           hal_RegOutByte(Ata_p->HalHndl, ATA_REG_FEATURE, Cmd_p->Feature);#if defined(STTBX_PRINT)    if (Trace == TRUE)    {        STTBX_Print(("Feature: %i\n", Cmd_p->Feature));        STTBX_Print(("SC: 0x%x\nSN: %i\nCL: %i\nCH: %i\n", Cmd_p->SecCount,                 Cmd_p->SecNum, Cmd_p->CylLow, Cmd_p->CylHigh));        STTBX_Print(("DH: %i\n", Cmd_p->DevHead));        STTBX_Print(("CC: 0x%02x\n", Cmd_p->CommandCode));    }#endif    hal_RegOutByte(Ata_p->HalHndl, ATA_REG_SECCOUNT, Cmd_p->SecCount);    hal_RegOutByte(Ata_p->HalHndl, ATA_REG_SECNUM, Cmd_p->SecNum);    hal_RegOutByte(Ata_p->HalHndl, ATA_REG_CYLLOW, Cmd_p->CylLow);    hal_RegOutByte(Ata_p->HalHndl, ATA_REG_CYLHIGH, Cmd_p->CylHigh);        /* "first" write of devhead is also reserved */    if ((Cmd_p->CmdType & ATA_EXT_BIT) == 0)           hal_RegOutByte(Ata_p->HalHndl, ATA_REG_DEVHEAD, Cmd_p->DevHead);    /* If it's an extended command, now write the other bits and head. */    if ((Cmd_p->CmdType & ATA_EXT_BIT) != 0)    {        LastCommandExtended = TRUE;                hal_RegOutByte(Ata_p->HalHndl, ATA_REG_SECCOUNT, Cmd_p->SecCount2);        hal_RegOutByte(Ata_p->HalHndl, ATA_REG_SECNUM, Cmd_p->SecNum2);        hal_RegOutByte(Ata_p->HalHndl, ATA_REG_CYLLOW, Cmd_p->CylLow2);        hal_RegOutByte(Ata_p->HalHndl, ATA_REG_CYLHIGH, Cmd_p->CylHigh2);        hal_RegOutByte(Ata_p->HalHndl, ATA_REG_DEVHEAD, Cmd_p->DevHead);    }    else        LastCommandExtended = FALSE;}/************************************************************************Name: ata_cmd_NoDataDescription: executes a non data command. The device is already selected              no parameters check is performed. We totally trust on the caller Parameters: Two params:            Ata_p : Pointer to the ATA control block            Cmd_p : Pointer to a command structureReturn:     TRUE:  Extended error is set            FALSE: No error                     ************************************************************************/BOOL ata_cmd_NoData(ata_ControlBlock_t *Ata_p, ata_Cmd_t *Cmd_p){    DU8 status;        /* First we write the registers */    ata_cmd_WriteRegs(Ata_p, Cmd_p);       if(WaitForBit(Ata_p->HalHndl, ATA_REG_ALTSTAT, DRDY_BIT_MASK, DRDY_BIT_MASK))    {        STTBX_Print(("Device not ready 0x26\n"));        Ata_p->LastExtendedErrorCode= 0x26;          GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);        return TRUE;    }    /* Finally write the command */    hal_RegOutByte(Ata_p->HalHndl,ATA_REG_COMMAND, Cmd_p->CommandCode);    #if  ATAPI_USING_INTERRUPTS    if(hal_AwaitInt(Ata_p->HalHndl,INT_TIMEOUT))    {        STTBX_Print(("Not interrupt 0x22\n"));        Ata_p->LastExtendedErrorCode= 0x22;        GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);        return TRUE;    }#else    WAIT400NS;    if(WaitForBit(Ata_p->HalHndl,ATA_REG_ALTSTAT,BSY_BIT_MASK,0))    {        STTBX_Print(("BSY not set, 0x23\n"));        Ata_p->LastExtendedErrorCode= 0x23;        GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);        return TRUE;    }#endif /* ATAPI_USING_INTERRUPTS */         /* Now Check the Status */    status= hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);        if( status & (BSY_BIT_MASK | DRQ_BIT_MASK| DF_BIT_MASK | ERR_BIT_MASK))    {        STTBX_Print(("Unwanted bit 0x21\n"));        Ata_p->LastExtendedErrorCode= 0x21;        GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);        return TRUE;     }        GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);    Ata_p->LastExtendedErrorCode= 0x00;    return FALSE;}/************************************************************************Name: ata_cmd_PioInDescription: executes a command with data transfer from the device              to the host via PIO.             The device is already selected, no parameters check             is performed. We totally trust on the caller               Parameters: Two params:            Ata_p : Pointer to the ATA control block            Cmd_p : Pointer to a command structureReturn:     TRUE:  Extended error is set            FALSE: No error                     ************************************************************************/BOOL ata_cmd_PioIn(ata_ControlBlock_t *Ata_p, ata_Cmd_t *Cmd_p){    volatile U8 status;    BOOL Error=FALSE;    U16* Data_p;      U32 loopcount = 0;    *Cmd_p->BytesRW =0;    Data_p= (U16*) Cmd_p->DataBuffer;       /* First we write the registers */     ata_cmd_WriteRegs(Ata_p, Cmd_p);        if(WaitForBit(Ata_p->HalHndl,ATA_REG_ALTSTAT,DRDY_BIT_MASK,DRDY_BIT_MASK))    {        STTBX_Print(("Device not ready 0x36\n"));        Ata_p->LastExtendedErrorCode= 0x36;          GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);                   return TRUE;    }        /* Finally write the command */    hal_RegOutByte(Ata_p->HalHndl, ATA_REG_COMMAND, Cmd_p->CommandCode);    WAIT400NS;     /* Transfering Data: Read Loop*/    while (TRUE)    {   #if  ATAPI_USING_INTERRUPTS        if(hal_AwaitInt(Ata_p->HalHndl, INT_TIMEOUT))        {            STTBX_Print(("No interrupt 0x34\n"));            GetCmdStatus(Ata_p, Cmd_p->Stat.CmdStat);            STTBX_Print(("intcount: %i\n", intcount));            STTBX_Print(("loopcount: %i\n", loopcount));            STTBX_Print(("Sectors remaining: %i\n", Cmd_p->SecCount));            if (1)            {                U32 i;                for (i = 0; i < intcount; i++)                    STTBX_Print(("%i %04x\n", i, inttrace[i]));            }            Ata_p->LastExtendedErrorCode= 0x34;            Error= TRUE;            break;        }        intcount = 0;   #endif        if(WaitForBit(Ata_p->HalHndl, ATA_REG_ALTSTAT, BSY_BIT_MASK, 0))        {            Ata_p->LastExtendedErrorCode= 0x35;              Error= TRUE;            break;        }        /* Now check the status*/        status=hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);        /* Checking if Busy =0 and DRQ=1 in order to           enter into the transfer phase                    */        if ((status & (BSY_BIT_MASK | DRQ_BIT_MASK)) == DRQ_BIT_MASK)        {               /* Read one DRQ sector*/#ifdef BMDMA_ENABLE                                                                 ATA_BMDMA((U8*)ATAPI_DATA,                       (U8*)Data_p,                      Cmd_p->MultiCnt * SECTOR_BSIZE);            *Cmd_p->BytesRW += (Cmd_p->MultiCnt * SECTOR_BSIZE);            Data_p += (Cmd_p->MultiCnt * SECTOR_WSIZE);#else            hal_RegInBlock(Ata_p->HalHndl,                           Data_p,                           SECTOR_BSIZE * Cmd_p->MultiCnt,                           Cmd_p->UseDMA);            Data_p += SECTOR_WSIZE * Cmd_p->MultiCnt;            *Cmd_p->BytesRW += SECTOR_BSIZE * Cmd_p->MultiCnt;#endif            Cmd_p->SecCount = Cmd_p->SecCount - Cmd_p->MultiCnt;            }        else        {            /* BSY 0, DRQ 0 => error */            status=hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);            if((status & (ERR_BIT_MASK | DF_BIT_MASK)) != 0)            {                STTBX_Print(("Unwanted bits; 0x%02x; 0x31\n", status));                STTBX_Print(("Feature: %i\n", Cmd_p->Feature));                STTBX_Print(("SC: 0x%x\nSN: %i\nCL: %i\nCH: %i\n", Cmd_p->SecCount,                     Cmd_p->SecNum, Cmd_p->CylLow, Cmd_p->CylHigh));                STTBX_Print(("DH: %i\n", Cmd_p->DevHead));                STTBX_Print(("CC: 0x%02x\n", Cmd_p->CommandCode));                Ata_p->LastExtendedErrorCode= 0x31;                  Error= TRUE;                break;            }        }                if(Cmd_p->SecCount<1)        {               /* Since the drive has transferred all of the requested sectors               without error, the drive should not have BUSY, DEVICE FAULT,               DATA REQUEST or ERROR active now.*/            WAIT400NS;            status = hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);            if (status & (BSY_BIT_MASK | ERR_BIT_MASK | DF_BIT_MASK | DRQ_BIT_MASK))            {                STTBX_Print(("Unwanted bits; 0x%02x; 0x33\n", status));                Ata_p->LastExtendedErrorCode= 0x33;                  Error= TRUE;                break;            }            /* All sectors have been read without error, exit */            Ata_p->LastExtendedErrorCode= 0x00;            break;        }        /*End of read loop*/        loopcount++;    }    /*read the output registers and store them in the cmd status structure*/    GetCmdStatus(Ata_p, Cmd_p->Stat.CmdStat);    return Error;    }   /************************************************************************Name: ata_cmd_PioOutDescription: executes a command with data transfer from the host              to the device via PIO.             The device is already selected, no parameters check             is performed. We totally trust on the caller               Parameters: Two params:            Ata_p : Pointer to the ATA control block            Cmd_p : Pointer to a command structureReturn:     TRUE:  Extended error is set            FALSE: No error                     ************************************************************************/BOOL ata_cmd_PioOut(ata_ControlBlock_t *Ata_p, ata_Cmd_t *Cmd_p){    volatile U8 status;    BOOL Error=FALSE;    U16* Data_p;       *Cmd_p->BytesRW =0;    Data_p= (U16*) Cmd_p->DataBuffer;    /* First we write the registers */     ata_cmd_WriteRegs(Ata_p, Cmd_p);       if(WaitForBit(Ata_p->HalHndl,ATA_REG_ALTSTAT,DRDY_BIT_MASK,DRDY_BIT_MASK))    {        STTBX_Print(("Device not ready 0x46\n"));        Ata_p->LastExtendedErrorCode= 0x46;          GetCmdStatus(Ata_p,Cmd_p->Stat.CmdStat);        return TRUE;    }    /* Finally write the command */    hal_RegOutByte(Ata_p->HalHndl,ATA_REG_COMMAND, Cmd_p->CommandCode);        WAIT400NS;            if(WaitForBit(Ata_p->HalHndl,ATA_REG_STATUS,BSY_BIT_MASK,0))    {        STTBX_Print(("Device busy 0x45\n"));        Ata_p->LastExtendedErrorCode= 0x45;          return  TRUE;    }    /* Transfering Data: Write Loop*/    while (TRUE)    {                intcount = 0;           /* Check the status*/                status=hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);                /* Checking if Busy =0 and DRQ=1 in order to           enter into the transfer phase                    */        if((status & ( BSY_BIT_MASK | DRQ_BIT_MASK))== DRQ_BIT_MASK)        {   /* Write one DRQ sector*/            #ifdef BMDMA_ENABLE                                  ATA_BMDMA((U8*)Data_p,                      (U8*)ATAPI_DATA,                      Cmd_p->MultiCnt * SECTOR_BSIZE);            *Cmd_p->BytesRW += (Cmd_p->MultiCnt * SECTOR_BSIZE);            Data_p += (Cmd_p->MultiCnt * SECTOR_WSIZE);#else            hal_RegOutBlock(Ata_p->HalHndl,                            Data_p,                            SECTOR_BSIZE * Cmd_p->MultiCnt,                            Cmd_p->UseDMA);            Data_p += SECTOR_WSIZE * Cmd_p->MultiCnt;			               *Cmd_p->BytesRW += SECTOR_BSIZE * Cmd_p->MultiCnt;            #endif                             Cmd_p->SecCount = Cmd_p->SecCount - Cmd_p->MultiCnt;        }        if (Cmd_p->SecCount < 1)        {   #if  ATAPI_USING_INTERRUPTS            if(hal_AwaitInt(Ata_p->HalHndl, INT_TIMEOUT))            {                status = hal_RegInByte(Ata_p->HalHndl, ATA_REG_STATUS);                STTBX_Print(("int timeout; status: 0x%02x; 0x44\n", status));                Ata_p->LastExtendedErrorCode = 0x44;                Error = TRUE;                break;            }#else            WAIT400NS;            if (WaitForBit(Ata_p->HalHndl, ATA_REG_ALTSTAT, BSY_BIT_MASK, 0))            {                Ata_p->LastExtendedErrorCode= 0x45;                  Error= TRUE;                break;            }#endif /* ATAPI_USING_INTERRUPTS */                        /*Since the drive has transferred all of the requested sectors              without error, the drive should not have BUSY, DEVICE FAULT,              DATA REQUEST or ERROR active now.*/            WAIT400NS;            status= hal_RegInByte(Ata_p->HalHndl,ATA_REG_STATUS);            if(status & (BSY_BIT_MASK | ERR_BIT_MASK | DF_BIT_MASK | DRQ_BIT_MASK))            {                STTBX_Print(("Unwanted bits; 0x%02x; 0x43\n", status));                Ata_p->LastExtendedErrorCode= 0x43;                  Error= TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男人操女人的视频在线观看欧美| 91蜜桃网址入口| caoporn国产一区二区| 欧美三级视频在线| 亚洲欧美综合在线精品| 美女视频黄a大片欧美| 欧美亚洲丝袜传媒另类| 国产肉丝袜一区二区| 美女一区二区三区在线观看| 97久久超碰国产精品电影| 欧美成人a视频| 婷婷综合久久一区二区三区| 99精品热视频| 国产精品国产自产拍高清av| 国产尤物一区二区在线| 欧美一级高清片| 亚洲国产人成综合网站| 97精品电影院| 欧美韩国日本不卡| 国产精品系列在线观看| 久久综合中文字幕| 久久国产人妖系列| 日韩美一区二区三区| 视频一区中文字幕国产| 在线观看成人小视频| 亚洲区小说区图片区qvod| av色综合久久天堂av综合| 国产午夜亚洲精品理论片色戒| 美女视频一区在线观看| 91精品国产色综合久久不卡蜜臀| 亚洲午夜在线观看视频在线| 欧美在线三级电影| 亚洲va欧美va人人爽午夜| 欧美性三三影院| 香港成人在线视频| 制服丝袜日韩国产| 精品一区二区三区免费视频| 久久综合色婷婷| 国产精品一区在线| 中文字幕精品一区二区精品绿巨人 | 在线播放亚洲一区| 亚洲成人午夜电影| 在线91免费看| 精品制服美女丁香| 国产欧美日本一区二区三区| 99久久久精品免费观看国产蜜| 亚洲免费av高清| 欧美三级韩国三级日本一级| 日本aⅴ精品一区二区三区| 2023国产精品视频| 91一区一区三区| 亚洲成在人线免费| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲精品va在线观看| 欧美日韩国产小视频在线观看| 日韩av中文在线观看| 久久在线免费观看| 色综合久久久久久久久| 日韩av中文字幕一区二区三区| 久久免费电影网| 91在线国产福利| 日韩成人一区二区三区在线观看| 精品国产一二三| 色偷偷88欧美精品久久久| 午夜成人免费视频| 国产欧美精品区一区二区三区 | 国产呦萝稀缺另类资源| 亚洲人成小说网站色在线| 91麻豆精品国产自产在线| 国产中文一区二区三区| 一区二区三区国产精品| 久久久久久久av麻豆果冻| 欧洲另类一二三四区| 国产精品一二三在| 天天色天天爱天天射综合| 日本一区二区免费在线观看视频| 欧美亚洲精品一区| 成人国产精品免费| 韩国精品一区二区| 亚洲高清免费视频| 1024成人网| 久久精品人人做人人爽97| 欧美日韩一区二区三区四区五区| 国产99久久精品| 久久精品国产精品亚洲红杏| 亚洲精品乱码久久久久久| 久久精品夜色噜噜亚洲a∨| 欧美午夜寂寞影院| a在线欧美一区| 国产91精品精华液一区二区三区 | 在线播放亚洲一区| 91麻豆国产福利在线观看| 国产美女在线精品| 精品一区二区三区在线视频| 亚洲国产中文字幕在线视频综合 | 精品国产乱码久久| 欧美精品777| 欧美系列一区二区| 91玉足脚交白嫩脚丫在线播放| 国产一区二区日韩精品| 美国毛片一区二区| 日本不卡一区二区三区高清视频| 亚洲麻豆国产自偷在线| 亚洲少妇30p| 亚洲欧洲美洲综合色网| 中文子幕无线码一区tr| 国产调教视频一区| 欧美国产一区二区| 国产视频在线观看一区二区三区| 欧美成人精品福利| 亚洲精品在线免费播放| 久久亚洲欧美国产精品乐播| 日韩免费性生活视频播放| 日韩欧美久久久| 久久品道一品道久久精品| xfplay精品久久| 国产视频在线观看一区二区三区| 国产日韩欧美一区二区三区综合| 26uuu国产电影一区二区| 久久久噜噜噜久噜久久综合| 国产午夜亚洲精品不卡| 国产精品色在线| 亚洲视频一区二区在线| 一区二区三区在线观看国产| 亚洲一区视频在线观看视频| 三级在线观看一区二区 | 日韩欧美一区二区三区在线| 日韩精品专区在线影院观看| 精品精品国产高清一毛片一天堂| 2014亚洲片线观看视频免费| 国产日产欧美一区| 亚洲日本青草视频在线怡红院| 亚洲精品国产成人久久av盗摄 | 黑人巨大精品欧美一区| 国产成人精品免费网站| 色综合视频在线观看| 欧美日韩亚州综合| 精品sm捆绑视频| 中文字幕欧美国产| 亚洲地区一二三色| 国产精品系列在线观看| 91丨九色丨尤物| 91麻豆精品91久久久久久清纯| 欧美不卡123| 亚洲人精品一区| 久久草av在线| 色中色一区二区| 日韩欧美你懂的| 亚洲人被黑人高潮完整版| 日韩二区在线观看| 东方aⅴ免费观看久久av| 欧美色图免费看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美亚洲综合网| 久久婷婷综合激情| 洋洋成人永久网站入口| 狠狠色丁香婷婷综合| 欧美在线观看一区| 欧美tk丨vk视频| 亚洲精品视频观看| 国产精品亚洲视频| 777a∨成人精品桃花网| 国产精品国产自产拍在线| 日本不卡一区二区三区| 99国内精品久久| 久久久99久久精品欧美| 亚洲国产精品久久久久婷婷884 | 91碰在线视频| 26uuu欧美日本| 日韩电影在线看| 一本大道av一区二区在线播放| 精品久久久久一区二区国产| 亚洲永久精品国产| www.久久精品| 久久久精品一品道一区| 天堂一区二区在线| 在线免费亚洲电影| 亚洲欧美偷拍卡通变态| 国产精品一区一区| 日韩一区二区电影网| 亚洲高清久久久| 91福利国产精品| 亚洲人成亚洲人成在线观看图片| 国产精品18久久久久久vr| 日韩一区二区三区精品视频 | 欧美男女性生活在线直播观看| 亚洲视频免费看| 色综合中文字幕国产| www一区二区| 国产一区二区三区四区在线观看| 91精品视频网| 日本免费新一区视频 | 99视频国产精品| 亚洲国产成人自拍| 成人av先锋影音| 亚洲人成7777| 欧美视频一区二| 婷婷久久综合九色综合绿巨人 | 亚洲二区在线观看| 欧美在线观看你懂的|