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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? omap730iic.c

?? OMAP730 I^2C驅(qū)動(dòng)源碼
?? C
字號(hào):
//------------------------------------------------------------------------------
//
//  Function:  I2C_Open
//
//  Called by device manager to open a device for reading and/or writing.
//
DWORD I2C_Open()
{
    DWORD rc = (DWORD)NULL;
    I2C_INSTANCE *pInstance = &g_Instance;

    // Set cookie
    g_Instance.pDevice = &g_device;
    
    // Done...
    rc = (DWORD)pInstance;    
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  I2C_Init
//
//  Called by device manager to initialize device.
//
DWORD I2C_Init()
{
    DWORD rc = (DWORD)NULL;
    I2C_DEVICE *pDevice = &g_device;
    g_pTimerRegs = OALPAtoUA(OMAP730_TIMER32K_REGS_PA);
    OUTREG32(&g_pTimerRegs->TVR, 0xFFFFFF);
    SETREG32(&g_pTimerRegs->CR, CR_TRB);
    while ((INREG32(&g_pTimerRegs->CR) & CR_TRB) != 0);
    SETREG32(&g_pTimerRegs->CR, CR_TSS|CR_INT_EN|CR_ARL);
    // Map I2C controller
    pDevice->pI2CRegs = OALPAtoUA(OMAP730_I2C_REGS_PA);
    
    // Check if we get correct context
    if (pDevice->pI2CRegs == NULL) {
        OALMSG(OAL_ERROR, (L"ERROR: I2C_Init: pDevice->pI2CRegs == NULL\r\n"));
        goto clean;
    }
    I2C_Reset(pDevice);
    I2C_Open();

    // Return non-null value
    rc = (DWORD)pDevice;
   	OALMSG(0, (L"-I2C_Init(rc = 0x%08x)\r\n", rc));
    
clean:	
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  I2C_Close
//
//  This function closes the device context.
//
BOOL I2C_Close(DWORD context)
{
    BOOL rc = FALSE;
    I2C_INSTANCE *pInstance = (I2C_INSTANCE*)context;

    // Check if we get correct context
    if (pInstance == NULL) {
        DEBUGMSG (ZONE_ERROR, (L"ERROR: I2C_Read: "
            L"Incorrect context paramer\r\n"
        ));
        goto cleanUp;
    }

    // Done...
    rc = TRUE;

cleanUp:
    OALMSG(OAL_INFO, (L"-I2C_Close(rc = %d)\r\n", rc));
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  I2C_Deinit
//
//  Called by device manager to uninitialize device.
//
BOOL I2C_Deinit(DWORD context)
{
    BOOL rc = FALSE;
    I2C_DEVICE *pDevice = (I2C_DEVICE*)context;

    // Check if we get correct context
    if (pDevice == NULL ) {
        DEBUGMSG (ZONE_ERROR, (L"ERROR: I2C_Deinit: "
            L"Incorrect context paramer\r\n"
        ));
        goto cleanUp;
    }
   
    I2C_Close(context);

    // Done
    rc = TRUE;

cleanUp:
    OALMSG(OAL_ERROR, (L"-I2C_Deinit(rc = %d)\r\n", rc));
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  I2C_Read
//
//  This function reads data from the device identified by the open context.
//
DWORD I2C_Read(DWORD context, PVOID pBuffer, DWORD size)
{
    DWORD rc = 0;    
    I2C_INSTANCE *pInstance = &g_Instance;
    I2C_DEVICE *pDevice;
    OMAP730_I2C_REGS *pI2CRegs;
    DWORD base;
    UCHAR *pData;
    USHORT count;
    USHORT con, stat;

    DEBUGMSG(ZONE_I2C&&ZONE_FUNCTION, (
        L"+I2C_Read(0x%08x, 0x%08x, %d\r\n", context, pBuffer, size
        ));
   
    // Check if we get correct context
    if (pInstance == NULL)
        {
        DEBUGMSG (ZONE_ERROR, (L"ERROR: I2C_Read: "
            L"Incorrect context paramer\r\n"
            ));
            goto clean;
        }

    pDevice = &g_device;
    pI2CRegs = pDevice->pI2CRegs;

    // Make sure I2C device is enabled...
    if ((INREG16(&pI2CRegs->CON) & I2C_CON_EN) == 0)
    {
        // after a NACK the only way to recover
        OUTREG16(&pI2CRegs->CON, I2C_CON_EN|I2C_CON_MST);
        // Wait until resetting is done
        while ((INREG16(&pI2CRegs->SYSS) & I2C_SYSS_RDONE) == 0);
        // Clear all interrupts
        SETREG16(&pI2CRegs->STAT, 0x3F);
    }

    // I2C slave address
    OUTREG16(&pI2CRegs->SA, pInstance->address);

    // Set up CON register
    con = I2C_CON_EN | I2C_CON_MST | I2C_CON_STP | I2C_CON_STT;
    if (pInstance->addrSize == 10) con |= I2C_CON_XA;

retry:
    // Start transaction
    pData = (UCHAR*)pBuffer;
    count = (USHORT)size;

    // Wait until bus isn't free - don't set CNT register before this.
    // When CNT register is set when bus is busy it holds busy bit high.
    base = OALGetTickCount();
    while ((INREG16(&pI2CRegs->STAT) & I2C_STAT_BB) != 0) 
    {   
        if ((OALGetTickCount() - base) > I2C_TimeOut)
        {
            I2C_Reset(pDevice);
            OALMSG(OAL_ERROR, (L"ERROR: I2C_Read: "
                L"Bus remains locked -- resetting I2C controller 0x%02x\r\n",
                pInstance->address
                ));
            goto clean;
        }
        OALStall(1000);
    }

    // Number of buffer to be transmitted
    OUTREG16(&pI2CRegs->CNT, count);
    // Clear bits
    OUTREG16(&pI2CRegs->STAT, I2C_STAT_AL|I2C_STAT_NACK|I2C_STAT_RRDY);
    // Start transaction
    OUTREG16(&pI2CRegs->CON, con);

    // Receive all expected data
    while (count > 0)
    {
        do
        {
            // Get status
            stat = INREG16(&pI2CRegs->STAT);
            // Clear bits
            OUTREG16(&pI2CRegs->STAT, I2C_STAT_AL|I2C_STAT_NACK|I2C_STAT_RRDY);
            // Lost arbitration? Wait for empty bus...
            if ((stat & I2C_STAT_AL) != 0) goto retry;
            // No ACK? Exit... device may not be on the bus
            if ((stat & I2C_STAT_NACK) != 0)
            {
                I2C_Reset(pDevice);
                OALMSG(OAL_ERROR, (L"ERROR: I2C_Read: "
                    L"No ACK from slave device with address 0x%02x\r\n",
                        pInstance->address
                    ));
                goto clean;
            }
            
            // This should not happen
            if ((stat & I2C_STAT_RRDY) == 0)
            {
                OALMSG(OAL_ERROR, (L"I2C_Read: --325-----This should not happen---------\r\n" ));
            }
            else
            {
                break;
            }
            
        }while(1);
        
        // Clear the bit
        OUTREG16(&pI2CRegs->STAT, I2C_STAT_RRDY);
        // Depending on amount of data remaining
        if (count > 1)
        {
            *(USHORT*)pData = INREG16(&pI2CRegs->DATA);
            count -= 2;
            pData += 2;
        }
        else 
        {
            *pData = (UCHAR)INREG16(&pI2CRegs->DATA);
            count -= 1;
            pData += 1;
        }
       if( count > dcount)
	       OALStall(8000);
    }  
    
    // We read all buffer
    rc = size;

clean:
   return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  I2C_Write
//
//  This function writes data to the device.
//
DWORD I2C_Write(DWORD context, PVOID pBuffer, DWORD size)
{
    DWORD rc = -1;
    I2C_DEVICE *pDevice;
    I2C_INSTANCE *pInstance = &g_Instance;
    OMAP730_I2C_REGS *pI2CRegs;
    DWORD base;
    UCHAR *pData;
    USHORT count;
    USHORT con, stat;

     // Check if we get correct context
    if (pInstance == NULL)
    {
    DEBUGMSG (ZONE_ERROR, (L"ERROR: I2C_Read: "
        L"Incorrect context paramer\r\n"
    ));
    goto clean;
    }
    
    pDevice = &g_device;
    pI2CRegs = pDevice->pI2CRegs;
    OALMSG(0, (L"I2C_Write: correct context paramer, pDevice = 0x%x\r\n", pDevice));
  
    // Make sure I2C device is enabled...
    if ((INREG16(&pI2CRegs->CON) & I2C_CON_EN) == 0)
        {
            // after a NACK the only way to recover
            OUTREG16(&pI2CRegs->CON, I2C_CON_EN|I2C_CON_MST);
            // Wait until resetting is done
            while ((INREG16(&pI2CRegs->SYSS) & I2C_SYSS_RDONE) == 0);
            // Clear all interrupts
            SETREG16(&pI2CRegs->STAT, 0x3F);
        }

    // I2C slave address
    OUTREG16(&pI2CRegs->SA, pInstance->address);

    // Set up CON register
    con = I2C_CON_EN | I2C_CON_MST | I2C_CON_TRX | I2C_CON_STP | I2C_CON_STT;
    if (pInstance->addrSize == 10) con |= I2C_CON_XA;

retry:
    OALMSG(0, (L"I2C_Write: ----------retry-----------\r\n" ));

    pData = (UCHAR*)pBuffer;
    count = (USHORT)size;

    // Wait until bus isn't free - don't set CNT register before this.
    // When CNT register is set when bus is busy it holds busy bit high.
    base = OALGetTickCount();
    while ((INREG16(&pI2CRegs->STAT) & I2C_STAT_BB) != 0) 
    {
        if ((OALGetTickCount() - base) > I2C_TimeOut)
        {
            I2C_Reset(pDevice);
            OALMSG(OAL_ERROR, (L"ERROR: I2C_Write: "
                L"Bus remains locked -- resetting I2C controller 0x%02x\r\n",
                pInstance->address
                ));
            goto clean;
        }
        OALStall(1000);
    }

    // Number of buffer to be transmitted
    OUTREG16(&pI2CRegs->CNT, count);

    // Clear bit
    OUTREG16(&pI2CRegs->STAT, I2C_STAT_AL|I2C_STAT_NACK|I2C_STAT_XRDY);

    // Start transaction
    OUTREG16(&pI2CRegs->CON, con);

    // Send all data
    while (count > 0)
    {
        do
        {
            // Get status
            stat = INREG16(&pI2CRegs->STAT); 
            
            // Clear bits
            OUTREG16(&pI2CRegs->STAT, I2C_STAT_AL|I2C_STAT_NACK|I2C_STAT_XRDY);
            
            // Lost arbitration? Retry...
            if ((stat & I2C_STAT_AL) != 0)
    			{
    				OALMSG(OAL_ERROR,(L"I2C:AL failed\r\n"));
    				goto retry;
            	}
            // No ACK? Exit... device may not be on the bus
            if ((stat & I2C_STAT_NACK) != 0)
            {
                I2C_Reset(pDevice);
                OALMSG(OAL_ERROR, (L"ERROR: I2C_Write: "
                    L"No ACK from slave device with address 0x%02x\r\n",
                    pInstance->address
                ));
                goto clean;
            }

            // This should not happen...
            if ((stat & I2C_STAT_XRDY) == 0) 
            {
                OALMSG(OAL_ERROR, (L"ERROR:I2C_Write: -------This should not happen...-------\r\n" ));
            }
            else
            {
                break;
            }
        }while(1);
        
        // Clear the bit
        OUTREG16(&pI2CRegs->STAT, I2C_STAT_XRDY);
        
        // Depending on data amount
        if (count > 1) {
            OUTREG16(&pI2CRegs->DATA, *(USHORT*)pData);
            count -= 2;
            pData += 2;
        } else {
            OUTREG16(&pI2CRegs->DATA, *pData);
            count -= 1;
            pData += 1;
        }
	
    	if( count> dcount)
    		OALStall(500);
    }

    // We wrote all buffer
    rc = size;
clean:
    return rc;
}

//------------------------------------------------------------------------------

BOOL I2C_SetSlaveAddress(DWORD context, DWORD size, DWORD address)
{
    BOOL rc = FALSE;
    I2C_INSTANCE *pInstance = (I2C_INSTANCE *)context;
    g_Instance = *pInstance;

    // Check if we get correct context
    if (pInstance == NULL) {
        OALMSG(OAL_ERROR, (L"ERROR: I2C_SetSlaveAddress: "
            L"Incorrect context paramer 0x%x\r\n", pInstance
        ));
        goto cleanUp;
    }

    if (size != 7 && size != 10) {
        OALMSG(OAL_ERROR, (L"ERROR: I2C_SetSlaveAddress: "
            L"Incorrect address size %d (valid values are 7 & 10 bits\r\n", size
        ));
        goto cleanUp;
    }
    g_Instance.addrSize = size;
    g_Instance.address = address;

    rc = TRUE;

cleanUp:
    return rc;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美天堂一区二区三区| 婷婷丁香激情综合| 亚洲超碰精品一区二区| 极品少妇xxxx精品少妇偷拍| 国产不卡在线一区| 91国偷自产一区二区三区成为亚洲经典| 欧美色偷偷大香| 精品国产3级a| 亚洲欧美日韩综合aⅴ视频| 五月天网站亚洲| 国产成人综合自拍| 在线看日本不卡| 欧美精品一区二区三区很污很色的| 国产精品嫩草影院com| 三级久久三级久久久| 国产高清不卡一区二区| 欧美视频一区二区在线观看| 欧美大片在线观看一区二区| 中文字幕中文字幕一区| 日本少妇一区二区| 91在线porny国产在线看| 在线播放亚洲一区| 中文字幕中文在线不卡住| 日韩av一区二| kk眼镜猥琐国模调教系列一区二区| 欧美探花视频资源| 国产欧美一区二区精品性| 亚洲大片一区二区三区| 国产成人精品免费网站| 91精品国产综合久久香蕉的特点| 国产精品无遮挡| 老色鬼精品视频在线观看播放| 91丨porny丨蝌蚪视频| 久久亚洲一区二区三区明星换脸| 一区二区三区久久久| 国产精品99久久久久久似苏梦涵 | 亚洲欧美偷拍卡通变态| 久久精品国产澳门| 欧美日韩一区三区四区| 国产精品女人毛片| 国精产品一区一区三区mba视频| 欧美午夜片在线观看| 国产精品久久久久久久久动漫| 毛片不卡一区二区| 欧美日韩久久久一区| 一区二区中文视频| 国产很黄免费观看久久| 欧美电影一区二区三区| 亚洲综合网站在线观看| www.99精品| 国产精品午夜久久| 国产成人在线视频网站| 精品91自产拍在线观看一区| 午夜精品福利一区二区三区av| 91久久线看在观草草青青| 国产精品免费视频网站| 国产精品123| 久久在线观看免费| 开心九九激情九九欧美日韩精美视频电影| 91成人免费电影| 亚洲精品一二三| 99久久99精品久久久久久| 中文字幕av一区二区三区| 国产一区二区视频在线| 精品国产制服丝袜高跟| 看片的网站亚洲| 精品美女一区二区| 久久国产精品72免费观看| 91精品在线观看入口| 亚洲午夜三级在线| 国产成人免费高清| 精品国产乱码久久久久久久| 青青青爽久久午夜综合久久午夜| 91精品啪在线观看国产60岁| 亚洲线精品一区二区三区八戒| 精品视频一区三区九区| 亚洲精品中文在线观看| 欧美视频在线播放| 午夜精品一区二区三区免费视频 | 自拍偷拍亚洲激情| 国产凹凸在线观看一区二区| 亚洲国产精品99久久久久久久久| 国产一区在线观看视频| 国产亚洲精久久久久久| 国产成人99久久亚洲综合精品| 欧美国产欧美综合| 成人涩涩免费视频| 18成人在线观看| 91猫先生在线| 午夜欧美一区二区三区在线播放| 在线观看一区二区精品视频| 亚洲免费观看高清完整| 色欧美乱欧美15图片| 亚洲精品国产一区二区三区四区在线| 色噜噜夜夜夜综合网| 亚洲欧美日韩久久| 欧美精品vⅰdeose4hd| 亚洲国产日韩a在线播放| 在线综合亚洲欧美在线视频| 五月天网站亚洲| 久久夜色精品一区| 99久久精品免费看| 一区二区激情小说| 日韩一级片在线播放| 国产乱妇无码大片在线观看| 国产精品免费av| 日本高清不卡aⅴ免费网站| 五月婷婷综合激情| 日韩你懂的在线观看| 成人午夜视频在线观看| 亚洲嫩草精品久久| 日韩一区二区免费在线电影| 国产美女av一区二区三区| 亚洲日本护士毛茸茸| 欧洲生活片亚洲生活在线观看| 日本vs亚洲vs韩国一区三区 | 中文字幕在线免费不卡| 91久久精品网| 日本sm残虐另类| 久久久久久久综合日本| 欧洲一区二区av| 精品在线亚洲视频| 亚洲精品视频观看| 日本精品一级二级| 国内成人自拍视频| 日韩欧美高清dvd碟片| 成人久久18免费网站麻豆| 成人欧美一区二区三区小说| 欧美日产国产精品| 成人理论电影网| 污片在线观看一区二区 | 成人精品国产一区二区4080 | 在线观看一区二区视频| 精品一区二区三区久久| 自拍av一区二区三区| 欧美刺激午夜性久久久久久久| 丁香婷婷综合激情五月色| 日本不卡一区二区三区 | 日本福利一区二区| 黄一区二区三区| 亚洲成人资源网| 亚洲国产精品二十页| 欧美成人性战久久| 欧美在线观看视频在线| 成人在线一区二区三区| 亚洲一区自拍偷拍| 久久精品一区蜜桃臀影院| 色综合一区二区三区| 激情欧美一区二区三区在线观看| 亚洲第一会所有码转帖| 国产精品视频线看| 精品日韩欧美一区二区| 欧美中文字幕亚洲一区二区va在线| 国产99久久久国产精品免费看| 亚洲成av人片观看| 一区二区三区四区视频精品免费 | 亚洲人成影院在线观看| 久久亚洲春色中文字幕久久久| 91福利社在线观看| 成人免费高清视频| 精品一区二区三区蜜桃| 另类的小说在线视频另类成人小视频在线 | 国产亚洲欧美激情| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美高清视频www夜色资源网| 成人自拍视频在线| 国产精品资源站在线| 一区二区在线观看视频在线观看| 国产午夜精品久久久久久久| 日韩精品一区二区三区三区免费 | 亚洲中国最大av网站| 中文字幕av免费专区久久| 久久亚洲影视婷婷| 欧美一区午夜视频在线观看| 欧美日韩精品一区二区三区四区| 在线区一区二视频| av一区二区三区| 波多野结衣欧美| 福利电影一区二区| www.欧美日韩| 波多野结衣精品在线| av一本久道久久综合久久鬼色| 国产精品一区二区久久精品爱涩| 久久精品国产亚洲aⅴ| 看片的网站亚洲| 香蕉成人啪国产精品视频综合网| 国产精品污污网站在线观看| 精品国内二区三区| 精品国产一区二区三区久久久蜜月| 欧美日韩国产高清一区| 99精品欧美一区二区蜜桃免费| 狠狠色丁香久久婷婷综| 免费观看在线综合| 看电影不卡的网站| 久久av老司机精品网站导航| 老司机午夜精品| 久久激情五月激情| 日韩精品高清不卡| 日韩成人精品在线| 日本在线不卡视频|