static BT_HANDLE i2c_probe(const BT_INTEGRATED_DEVICE *pDevice, BT_ERROR *pError) { BT_ERROR Error = BT_ERR_NONE; BT_HANDLE hI2C = NULL; const BT_RESOURCE *pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_MEM, 0); if(!pResource) { Error = BT_ERR_NO_MEMORY; goto err_free_out; } hI2C = BT_CreateHandle(&oHandleInterface, sizeof(struct _BT_OPAQUE_HANDLE), pError); if(!hI2C) { goto err_out; } hI2C->pRegs = (LPC11xx_I2C_REGS *) pResource->ulStart; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_ENUM, 0); if(!pResource) { Error = BT_ERR_NO_MEMORY; goto err_free_out; } hI2C->i2c_master.pDevice = pDevice; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_INTEGER, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } i2cSetPowerState(hI2C, BT_POWER_STATE_AWAKE); // Reset all registers to their defaults! ResetI2C(hI2C); i2cEnable(hI2C); i2c_set_clock_rate(hI2C, pResource->ulStart); pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IRQ, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } /* On NVIC we don't need to register interrupts, LINKER has patched vector for us * Error = BT_RegisterInterrupt(pResource->ulStart, I2C_irq_handler, hI2C); if(Error) { goto err_free_out; }*/ //@@Error = BT_EnableInterrupt(pResource->ulStart); pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_BUSID, 0); if(!pResource) { goto err_free_out; } BT_u32 ulBusID = pResource->ulStart; hI2C->i2c_master.ulBusID = ulBusID; hI2C->i2c_master.hBus = hI2C; // Save pointer to bus's private data. hI2C->i2c_master.pDevice = pDevice; BT_I2C_RegisterBus(&hI2C->i2c_master); if(pError) { *pError = Error; } return hI2C; err_free_out: BT_DestroyHandle(hI2C); err_out: if(pError) { *pError = Error; } return NULL; }
static BT_HANDLE i2c_probe(const BT_INTEGRATED_DEVICE *pDevice, BT_ERROR *pError) { BT_ERROR Error = BT_ERR_NONE; BT_HANDLE hI2C = NULL; const BT_RESOURCE *pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_MEM, 0); if(!pResource) { Error = BT_ERR_INVALID_RESOURCE; goto err_out; } hI2C = BT_CreateHandle(&oHandleInterface, sizeof(struct _BT_OPAQUE_HANDLE), pError); if(!hI2C) { Error = BT_ERR_NO_MEMORY; goto err_out; } hI2C->pRegs = (ZYNQ_I2C_REGS *) bt_ioremap((void *)pResource->ulStart, BT_SIZE_4K); pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IRQ, 0); if(!pResource) { Error = BT_ERR_INVALID_RESOURCE; goto err_free_out; } BT_u32 ulIRQ = pResource->ulStart; Error = BT_RegisterInterrupt(ulIRQ, i2c_irq_handler, hI2C); if(Error) { Error = BT_ERR_GENERIC; // Device already in use! goto err_free_out; } BT_EnableInterrupt(ulIRQ); hI2C->pDevice = pDevice; i2c_set_clock_rate(hI2C, BT_I2C_CLOCKRATE_400kHz); hI2C->pMutex = BT_kMutexCreate(); if(!hI2C->pMutex) { Error = BT_ERR_NO_MEMORY; goto err_free_int_out; } BT_kMutexPend(hI2C->pMutex, 0); pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_BUSID, 0); if(!pResource) { Error = BT_ERR_INVALID_RESOURCE; goto err_free_int_out; } BT_u32 ulBusID = pResource->ulStart; hI2C->pRegs->CONTROL |= 0x0000000E; BT_I2C_RegisterBusWithID(hI2C, ulBusID); if(pError) { *pError = Error; } return hI2C; err_free_int_out: BT_UnregisterInterrupt(ulIRQ, i2c_irq_handler, hI2C); err_free_out: BT_DestroyHandle(hI2C); err_out: if(pError) { *pError = Error; } return NULL; }