亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
午夜久久久影院| 日韩视频免费观看高清在线视频| 欧美性生活大片视频| 久久久亚洲午夜电影| 日韩精品三区四区| 在线视频欧美区| 国产亚洲欧美色| 免费成人在线视频观看| 色婷婷国产精品| 亚洲视频香蕉人妖| 成人免费视频网站在线观看| 精品国产乱码久久久久久久| 午夜精品在线看| 欧美亚洲精品一区| 亚洲精品中文在线影院| 成人国产免费视频| 日本一区二区动态图| 国产精品一区一区| 精品处破学生在线二十三| 日本va欧美va精品发布| 欧美日韩久久一区| 一卡二卡欧美日韩| 色综合天天狠狠| 亚洲欧美另类综合偷拍| 一本一本大道香蕉久在线精品| 国产精品美女www爽爽爽| 国产91精品入口| 国产精品污污网站在线观看| 国产电影一区在线| 国产亚洲欧美日韩日本| 成人亚洲精品久久久久软件| 国产日产欧美一区二区三区| 狠狠狠色丁香婷婷综合激情| 2023国产精品| 成人a级免费电影| 亚洲人成小说网站色在线| 91丨porny丨蝌蚪视频| 一区二区三区中文字幕精品精品| 一本到三区不卡视频| 亚洲黄色免费网站| 欧美久久久久久久久| 男女男精品视频| 精品少妇一区二区三区在线播放| 黄色日韩网站视频| 国产日本欧美一区二区| proumb性欧美在线观看| 亚洲男同1069视频| 7777精品伊人久久久大香线蕉完整版| 日韩成人免费电影| 久久精品亚洲精品国产欧美 | 欧美午夜在线一二页| 久久99精品久久只有精品| 欧美xxxxxxxx| www.成人在线| 天堂在线一区二区| 欧美精品一区二区三区很污很色的 | 26uuu成人网一区二区三区| 国产精品123| 亚洲一区二三区| 精品久久五月天| 97久久精品人人做人人爽50路| 亚洲宅男天堂在线观看无病毒| 日韩一区二区高清| 99久久免费国产| 婷婷夜色潮精品综合在线| 久久婷婷色综合| 欧美性猛交xxxx乱大交退制版 | 日韩精品一卡二卡三卡四卡无卡| 久久综合九色综合97婷婷| 色综合色综合色综合| 久久精品国产99久久6| 国产精品不卡在线| 日韩欧美黄色影院| 色视频一区二区| 国产一区二区三区蝌蚪| 亚洲国产综合在线| 久久精品一区二区三区四区| 欧美日本高清视频在线观看| 不卡视频一二三| 精品在线一区二区三区| 一区二区久久久久久| 欧美国产1区2区| 精品国产一区二区三区忘忧草 | 99视频热这里只有精品免费| 久久av资源站| 亚洲va欧美va天堂v国产综合| 欧美国产一区二区| 日韩欧美成人激情| 欧美三级日韩在线| 97se亚洲国产综合自在线不卡 | 欧美亚日韩国产aⅴ精品中极品| 久久99精品国产.久久久久 | 亚洲一二三四在线| 国产精品久久久久久久久免费相片| 日韩色在线观看| 91麻豆精品国产自产在线 | 天堂va蜜桃一区二区三区漫画版| 最好看的中文字幕久久| 欧美—级在线免费片| 久久亚洲综合av| 久久人人爽人人爽| 精品国产1区二区| 欧美v日韩v国产v| 日韩欧美在线影院| 日韩视频永久免费| 日韩欧美一区二区三区在线| 欧美一区二区三区免费| 91麻豆精品久久久久蜜臀 | 色综合久久久久综合体 | 国产一区二区伦理片| 久久成人羞羞网站| 狠狠色2019综合网| 国产成a人亚洲| 成人综合在线观看| 成人午夜碰碰视频| 9l国产精品久久久久麻豆| hitomi一区二区三区精品| 成人av在线资源| 91久久精品一区二区三区| 一本大道av一区二区在线播放 | 亚洲国产一区二区a毛片| 亚洲午夜日本在线观看| 首页欧美精品中文字幕| 蜜桃视频免费观看一区| 国产一区二区三区精品视频| 国产成人免费av在线| 不卡av免费在线观看| 在线一区二区三区四区| 欧美美女喷水视频| 日韩欧美www| 中文av一区特黄| 亚洲精品成a人| 日本免费在线视频不卡一不卡二 | 亚洲国产成人高清精品| 蜜臀av性久久久久蜜臀av麻豆| 久久99久久99小草精品免视看| 国产一区999| 在线视频综合导航| 日韩精品中文字幕一区| 国产精品福利av| 亚洲成人av中文| 国产精品99久久久久久久女警 | 色婷婷久久综合| 日韩欧美精品在线视频| 亚洲欧洲另类国产综合| 日韩成人午夜电影| 成人精品一区二区三区中文字幕| 日本韩国精品在线| 久久久不卡网国产精品一区| 亚洲日韩欧美一区二区在线| 日韩av电影免费观看高清完整版在线观看| 精品一区二区久久| 一本色道**综合亚洲精品蜜桃冫| 欧美一区二区三区在| 国产精品福利影院| 久久99热狠狠色一区二区| 91蝌蚪porny九色| 2021中文字幕一区亚洲| 一区二区欧美在线观看| 成人黄页毛片网站| 精品久久人人做人人爰| 一级日本不卡的影视| 国产mv日韩mv欧美| 日韩一级免费一区| 一区二区三区久久| 粉嫩aⅴ一区二区三区四区 | 亚洲欧美偷拍三级| 国产一区二区三区四| 欧美乱妇15p| 亚洲精品你懂的| 不卡一二三区首页| 国产人久久人人人人爽| 毛片基地黄久久久久久天堂| 色综合一区二区| 国产精品国产三级国产a| 国产做a爰片久久毛片 | 欧美精品久久99| 亚洲日本丝袜连裤袜办公室| 国产一区999| 精品粉嫩超白一线天av| 人人精品人人爱| 91精品国产综合久久福利| 亚洲一区精品在线| 欧美中文字幕一二三区视频| 亚洲欧洲日产国产综合网| 成人午夜电影小说| 欧美国产激情二区三区| 国产91综合网| 国产欧美日韩另类视频免费观看| 激情小说欧美图片| 欧美成va人片在线观看| 美女看a上一区| 精品伦理精品一区| 国产一区二区在线影院| 国产亚洲一区二区三区四区 | 国产精品77777| 久久久久久久av麻豆果冻| 激情图片小说一区| 精品国产乱码久久久久久久 | 中文字幕亚洲一区二区va在线|