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

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

?? plx9054.c

?? Vxworks 下PLX 9054 的驅動
?? C
?? 第 1 頁 / 共 4 頁
字號:
        return ERROR;
    }

    if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
    {
        printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
        return ERROR;
    }

    if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
    {
        printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
        return ERROR;
    }
    
    if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
    {
        dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
        *(UINT32 *)dwAddr = data;
        return OK;
    }
    else
    {/* 暫不支持I/O空間*/
        return ERROR;
    }
}

/*
PLX9054_EEPROM_Valid
判斷PLX9054 的EEPROM 是否存在
*/
BOOL PLX9054_EEPROM_Valid(int index)
{
    UINT32 data;
    PLX9054_DRVCTRL * pDrvCtrl;

    pDrvCtrl = pPlxDrvCtrl;
   
    /* 輸入參數判斷*/
    if( (index < 0)  || (index > (pDrvCtrl->plxCardNum - 1)))
    {
        printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
        return ERROR;
    }
   
    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &data);
    return((data & BIT28)==BIT28);
}



/******************************************************************************
 *
 * Function   :  PLX9054_EepromReadDword
 *
 * Description:  Read a Dword from the EEPROM at a specified offset
 *
 */
STATUS PLX9054_EepromReadDword(int index, EEPROM_TYPE EepromType, UINT32 offset, UINT32 *pValue)
{
    UCHAR   BitPos;
    UCHAR   CommandShift;
    UCHAR   CommandLength;
    UINT16  count;
    UINT32  RegisterValue;


    switch (EepromType)
    {
        case Eeprom93CS46:
            CommandShift  = 0;
            CommandLength = EE46_CMD_LEN;
            break;

        case Eeprom93CS56:
            CommandShift  = 2;
            CommandLength = EE56_CMD_LEN;
            break;

        case Eeprom93CS66:
            CommandShift  = 2;
            CommandLength = EE66_CMD_LEN;
            break;

        default:
            *pValue = (UINT32)-1;
            return ERROR;
    }

    /*Send EEPROM read command and offset to EEPROM*/
    PLX9054_EepromSendCommand(index, (EE_READ << CommandShift) | (offset / 2), CommandLength);

    /*****************************************************
     * Note: The EEPROM write ouput bit (26) is set here
     *       because it is required before EEPROM read
     *       operations on the 9054.  It does not affect
     *       behavior of non-9054 chips.
     *
     *       The EEDO Input enable bit (31) is required for
     *       some chips.  Since it is a reserved bit in older
     *       chips, there is no harm in setting it for all.
     ****************************************************/

    /* Set EEPROM write output bit*/
    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);

    /* Set EEDO Input enable for some PLX chips*/
    RegisterValue |= (1 << 31);

    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue | (1 << 26));

    /* Get 32-bit value from EEPROM - one bit at a time*/
    for (BitPos = 0; BitPos < 32; BitPos++)
    {
        /* Trigger the EEPROM clock*/
        PLX9054_EepromClock(index);

        /*****************************************************
         * Note: After the EEPROM clock, a delay is sometimes
         *       needed to let the data bit propagate from the
         *       EEPROM to the PLX chip.  If a sleep mechanism
         *       is used, the result is an extremely slow EEPROM
         *       access since the delay resolution is large and
         *       is required for every data bit read.
         *
         *       Rather than using the standard sleep mechanism,
         *       the code, instead, reads the PLX register
         *       multiple times.  This is harmless and provides
         *       enough delay for the EEPROM data to propagate.
         ****************************************************/

        for (count=0; count < 1; count++)
        {
            /* Get the result bit*/
            PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);
        }

        /* Get bit value and shift into result*/
        if (RegisterValue & (1 << 27))
        {
            *pValue = (*pValue << 1) | 1;
        }
        else
        {
            *pValue = (*pValue << 1);
        }
    }

    /* Clear EEDO Input enable for some PLX chips*/
    RegisterValue &= ~(1 << 31);

    /* Clear Chip Select and all other EEPROM bits*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue & ~(0xF << 24));

    return OK;
}


/******************************************************************************
 Function   :  PLX9054_EepromWriteDword
 Description:  Write a value to the EEPROM at a specified offset

 author: wang.qi
 data: 2006-10-18
*/
STATUS PLX9054_EepromWriteDword(int index, EEPROM_TYPE EepromType, UINT32 offset, UINT32 value)
{
    char   i;
    char   BitPos;
    char   CommandShift;
    char   CommandLength;
    UINT16  EepromValue;
    int  Timeout;
    UINT32  RegisterValue;


    switch (EepromType)
    {
        case Eeprom93CS46:
            CommandShift  = 0;
            CommandLength = EE46_CMD_LEN;
            break;

        case Eeprom93CS56:
            CommandShift  = 2;
            CommandLength = EE56_CMD_LEN;
            break;

        case Eeprom93CS66:
            CommandShift  = 2;
            CommandLength = EE66_CMD_LEN;
            break;

        default:
            return ERROR;
    }

    /* Write EEPROM 16-bits at a time*/
    for (i=0; i<2; i++)
    {
        /* Set 16-bit value to write*/
        if (i == 0)
        {
            EepromValue = (UINT16)(value >> 16);
        }
        else
        {
            EepromValue = (UINT16)value;

            /*Update offset*/
            offset = offset + sizeof(UINT16);
        }
        printf("0ffset=0x%02x, value=0x%04x\n", offset, (UINT16)EepromValue);
        /* Send Write_Enable command to EEPROM */
        PLX9054_EepromSendCommand(index, (EE_WREN << CommandShift), CommandLength);

        /* Send EEPROM Write command and offset to EEPROM */
        PLX9054_EepromSendCommand(index,  (EE_WRITE << CommandShift) | (offset / 2), CommandLength);

        PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);

        /* Clear all EEPROM bits */
        RegisterValue &= ~(0xF << 24);

        /* Make sure EEDO Input is disabled for some PLX chips */
        RegisterValue &= ~(1 << 31);

        /* Enable EEPROM Chip Select */
        RegisterValue |= (1 << 25);

        /* Write 16-bit value to EEPROM - one bit at a time */
        for (BitPos = 15; BitPos >= 0; BitPos--)
        {
            /* Get bit value and shift into result */
            if (EepromValue & (1 << BitPos))
            {
                PLX9054_Local_Reg_Write(index, P9054_CNTRL,  RegisterValue | (1 << 26));
            }
            else
            {
                PLX9054_Local_Reg_Write(index, P9054_CNTRL,  RegisterValue);
            }

            /* Trigger the EEPROM clock */
            PLX9054_EepromClock(index);
        }

        /* Deselect Chip */
        PLX9054_Local_Reg_Write(index, P9054_CNTRL,  RegisterValue & ~(1 << 25));

        /* Re-select Chip */
        PLX9054_Local_Reg_Write(index, P9054_CNTRL,  RegisterValue | (1 << 25));

        /*****************************************************
         * Note: After the clocking in the last data bit, a
         *       delay is needed to let the EEPROM internally
         *       complete the write operation.  If a sleep
         *       mechanism is used, the result is an extremely
         *       slow EEPROM access since the delay resolution
         *       is too large.
         *
         *       Rather than using the standard sleep mechanism,
         *       the code, instead, reads the PLX register
         *       multiple times.  This is harmless and provides
         *       enough delay for the EEPROM write to complete.
         ****************************************************/

        /* A small delay is needed to let EEPROM complete*/
        Timeout = 0;
        do
        {
            PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);

            Timeout++;
        }
        while (((RegisterValue & (1 << 27)) == 0) && (Timeout < 20000));

        /* Send Write_Disable command to EEPROM */
        PLX9054_EepromSendCommand(index, EE_WDS << CommandShift, CommandLength);

        /* Clear Chip Select and all other EEPROM bits */
        PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue & ~(0xF << 24));
    }

    return OK;
}



/******************************************************************************
 *
 * Function   :  PLX9054_EepromSendCommand
 *
 * Description:  Sends a Command to the EEPROM
 *
*/
void PLX9054_EepromSendCommand(int index, UINT32 EepromCommand, UCHAR DataLengthInBits)
{
    char  BitPos;
    UINT32 RegisterValue;


    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);

    /* 清所有與EEPROM 相關的位 */
    RegisterValue &= ~(0xF << 24);

    /* Toggle EEPROM's Chip select to get it out of Shift Register Mode*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue);

    /* Enable EEPROM Chip Select */
    RegisterValue |= (1 << 25);

    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue);

    /* Send EEPROM command - one bit at a time*/
    for (BitPos = (char)(DataLengthInBits-1); BitPos >= 0; BitPos--)
    {
        /* Check if current bit is 0 or 1*/
        if (EepromCommand & (1 << BitPos))
        {
             PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue | (1 << 26));
        }
        else
        {
            PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue);
        }

        PLX9054_EepromClock(index);
    }
}




/******************************************************************************
 *
 * Function   :  PLX9054_EepromClock
 *
 * Description:  輸出EEPROM 時鐘信號
 *
*/
void PLX9054_EepromClock(int index)
{
    UCHAR  i;
    UINT32 RegisterValue;


    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);

    /* Set EEPROM clock High, EESK(pin165)輸出高電平*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue | (1 << 24));

    /* 保持高電平一段時間Need a small delay, perform dummy register reads */
    for (i=0; i<5; i++)
    {
        PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);
    }

    /* Set EEPROM clock Low, EESK(pin165)輸出低電平*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, RegisterValue & ~(1 << 24));
    /* 保持低電平一段時間*/
    for (i=0; i<5; i++)
    {
        PLX9054_Local_Reg_Read(index, P9054_CNTRL, &RegisterValue);
    }
}


/*****************************************************************************
PLX9054_SoftReset
軟復位PLX9054 擴展卡,并通過LReseto#引腳復位CPLD
*/
void PLX9054_SoftReset(int index)
{
    PLX9054_DRVCTRL * pDrvCtrl;
    UINT32 dwData;
    UCHAR EepromPresent;
    UINT32 RegInterrupt;

    if(0 != index)
    {
        index =0;
    }
    
    pDrvCtrl = PLX9054_GetDrvCtrl();
    
    /* 輸入參數判斷*/
    if( (index < 0)  || (index > (pDrvCtrl->plxCardNum - 1)))
    {
        printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
        return;
    }

    /* Clear any PCI errors */
    PLX9054_Pci_Reg_Read(index, PCI_CR, &dwData, DATA_DWORD);

    if (dwData & (0xf8 << 24))
    {
        /* Write value back to clear aborts */
        PLX9054_Pci_Reg_Write(index, PCI_CR, dwData, DATA_DWORD);
    }

    /* Determine if an EEPROM is present */
    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &dwData);
  
    /* Make sure S/W Reset & EEPROM reload bits are clear */
    dwData &= ~((1 << 30) | (1 << 29));

    /* Remember if EEPROM is present */
    EepromPresent = (UCHAR)((dwData >> 28) & (1 << 0));

    /* Save interrupt line */
    PLX9054_Pci_Reg_Read(index, PCI_ILR, &RegInterrupt, DATA_BYTE);

    /* Save some registers if EEPROM present */
    #if 0
    if (EepromPresent)
    {
        PLX9054_Pci_Reg_Read(index, 
        PLX_PCI_REG_READ(
            pdx,
            PCI9054_HS_CAP_ID,
            &RegHotSwap
            );

        PLX_PCI_REG_READ(
            pdx,
            PCI9054_PM_CSR,
            &RegPowerMgmnt
            );
    }
    #endif

    PLX9054_Local_Reg_Read(index, P9054_CNTRL, &dwData);

    /* 復位*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, dwData |(1 << 30));
    taskDelay(1);
    /* 清復位*/
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, dwData);

    /* 重新加載EEPROM */
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, dwData |(1 << 29));
    taskDelay(1);
    PLX9054_Local_Reg_Write(index, P9054_CNTRL, dwData);

    /* restore interrupt line */
    PLX9054_Pci_Reg_Write(index, PCI_ILR, RegInterrupt, DATA_BYTE);
}

/*************************************************************************
向DSP 寫一個字節的數據
*/
void PLX9054_WriteByteToDsp(int index, UINT8 data)
{
    PLX9054_DRVCTRL * pDrvCtrl;
    
    pDrvCtrl = PLX9054_GetDrvCtrl( );

    /* 按32 位輸出數據,低8 位有效*/
    *(UINT32 *)(pDrvCtrl->pDevice[index]->spaceDesc[AD_PCI_BAR3].dwPciBar) = (UINT32)data;
}

/*
PLX9054_GetDrvCtrl
獲取設備驅動控制結構體指針
*/
PLX9054_DRVCTRL * PLX9054_GetDrvCtrl(void)
{
    return(pPlxDrvCtrl);
}

/*
PLX9054_SetDrvCtrl
設置設備驅動控制結構體指針
*/
void PLX9054_SetDrvCtrl(PLX9054_DRVCTRL * pDrvCtrl)
{
    pPlxDrvCtrl = pDrvCtrl;
}


#ifdef __cplusplus
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆午夜三级精品| 亚洲一卡二卡三卡四卡五卡| 麻豆成人在线观看| 日韩午夜在线播放| 国产一区二区美女| 日本一区二区电影| 91视频国产资源| 亚洲小说欧美激情另类| 欧美系列日韩一区| 天堂蜜桃91精品| 欧美zozo另类异族| 大陆成人av片| 亚洲综合久久av| 欧美一区二区视频在线观看| 精品制服美女丁香| 亚洲国产高清aⅴ视频| 在线欧美日韩国产| 免费一区二区视频| 国产欧美一区二区精品性色| 日本精品一区二区三区高清| 日韩精品电影在线| 国产日韩精品一区二区三区在线| 暴力调教一区二区三区| 亚洲电影第三页| 久久久国产一区二区三区四区小说 | 一区二区久久久久| 欧美一区二区免费| 成人av在线网站| 五月天激情综合网| 中文字幕成人在线观看| 在线观看亚洲一区| 国产一区91精品张津瑜| 亚洲天堂网中文字| 亚洲精品在线观看网站| 91麻豆swag| 韩国av一区二区三区| 一区二区国产视频| 国产午夜精品一区二区三区嫩草| 欧美伊人久久大香线蕉综合69| 免费观看在线综合色| 亚洲欧美色图小说| 久久精品人人做人人爽97| 欧美日韩国产高清一区二区三区 | 欧美日本在线看| 国产91综合网| 免费成人你懂的| 亚洲一区二区三区中文字幕在线| 国产日产欧美一区| 日韩欧美一级二级| 欧美日韩大陆在线| 97久久超碰国产精品| 国产成人在线色| 麻豆国产精品视频| 亚洲 欧美综合在线网络| 国产精品久久一级| 久久美女艺术照精彩视频福利播放 | 国产欧美一区二区三区鸳鸯浴| 51午夜精品国产| 91论坛在线播放| 成人自拍视频在线观看| 九一久久久久久| 天堂蜜桃91精品| 天天爽夜夜爽夜夜爽精品视频| 亚洲欧洲精品一区二区三区 | 国产精品久久久久影院色老大| 精品毛片乱码1区2区3区| 欧美肥妇free| 欧美色区777第一页| 色香蕉久久蜜桃| 93久久精品日日躁夜夜躁欧美| 成人一级片在线观看| 国产电影一区二区三区| 国产精品一区二区视频| 国产在线一区二区综合免费视频| 男男视频亚洲欧美| 麻豆成人综合网| 国产在线播精品第三| 久久不见久久见免费视频1| 久久国产日韩欧美精品| 免费的国产精品| 极品少妇xxxx偷拍精品少妇| 久久91精品国产91久久小草| 久久国产视频网| 国产精品自拍毛片| 成人免费高清在线| 91在线观看免费视频| 一本大道综合伊人精品热热 | 91精品国产综合久久久久久| 日韩一级精品视频在线观看| 日韩欧美一区二区不卡| 精品国产一区久久| 久久精品一区蜜桃臀影院| 国产欧美日韩三区| 亚洲美女免费在线| 亚洲影院久久精品| 日韩不卡一二三区| 精品一区二区三区影院在线午夜 | 欧美在线制服丝袜| 7777精品伊人久久久大香线蕉完整版 | 亚洲老司机在线| 视频在线观看91| 国产又黄又大久久| www.亚洲精品| 欧美亚洲国产bt| 日韩女优av电影| 国产女同性恋一区二区| 亚洲永久免费av| 狠狠色丁香久久婷婷综合_中 | 国产精品1区2区| 色婷婷狠狠综合| 日韩一本二本av| 国产精品毛片高清在线完整版| 樱桃国产成人精品视频| 六月丁香综合在线视频| 成人ar影院免费观看视频| 欧美日韩精品是欧美日韩精品| 久久综合视频网| 亚洲欧美偷拍三级| 久久成人久久爱| 91免费精品国自产拍在线不卡| 欧美一级视频精品观看| 国产精品午夜免费| 三级一区在线视频先锋| 粉嫩一区二区三区在线看| 欧美人xxxx| 久久久99精品久久| 丝袜美腿亚洲一区| av网站一区二区三区| 日韩精品一区二| 一区二区三区久久久| 久久电影国产免费久久电影| 色婷婷综合久久久| 国产三级精品三级在线专区| 亚洲18女电影在线观看| 99国产精品久久久久久久久久久| 欧美一级免费观看| 亚洲精品国产成人久久av盗摄 | 99久久久精品免费观看国产蜜| 欧美精品日韩一本| 自拍偷拍亚洲欧美日韩| 国产米奇在线777精品观看| 欧美亚洲另类激情小说| 亚洲视频资源在线| 国产不卡在线视频| 久久这里只精品最新地址| 日韩高清不卡一区二区三区| 色婷婷av一区二区三区大白胸 | 亚洲免费观看在线观看| 国产成人精品网址| 欧美不卡一二三| 青青草精品视频| 欧美午夜片在线看| 亚洲男人天堂av网| 99精品偷自拍| 中文一区二区完整视频在线观看| 国产一区二区免费视频| 精品剧情v国产在线观看在线| 婷婷久久综合九色综合伊人色| 99精品久久免费看蜜臀剧情介绍| 欧美激情在线看| 国产成人鲁色资源国产91色综 | 国产女同性恋一区二区| 久久不见久久见中文字幕免费| 欧美电影一区二区| 午夜视频一区二区| 欧美日韩精品一区二区三区四区| 一区二区三区四区激情| 91免费看片在线观看| 亚洲精品乱码久久久久久| 一本一道久久a久久精品综合蜜臀| 国产精品美女视频| 99久久精品免费看| 亚洲女同ⅹxx女同tv| 色老头久久综合| 亚洲成人高清在线| 欧美浪妇xxxx高跟鞋交| 奇米色777欧美一区二区| 日韩一区二区三区免费观看| 奇米精品一区二区三区在线观看| 日韩欧美高清dvd碟片| 美女网站在线免费欧美精品| 亚洲精品一区二区三区精华液| 久久97超碰国产精品超碰| 国产亚洲精品福利| 91免费看片在线观看| 亚洲一区二区三区四区的| 在线播放中文一区| 精品夜夜嗨av一区二区三区| 国产欧美一区二区精品性色超碰 | 国产一区二区在线观看视频| 久久久国产综合精品女国产盗摄| 成人激情视频网站| 一区二区三区四区高清精品免费观看| 欧美日韩亚洲丝袜制服| 久久av资源网| 国产精品福利一区二区三区| 欧美日韩一区二区不卡| 国产精品一区二区男女羞羞无遮挡| 国产午夜精品一区二区三区视频| 色综合久久66|