static BT_HANDLE gpio_probe(const BT_I2C_BUS *pBus, const BT_DEVICE *pDevice, BT_ERROR *pError) { BT_ERROR Error = BT_ERR_NONE; BT_HANDLE hGPIO = BT_CreateHandle(&oHandleInterface, sizeof(struct _BT_OPAQUE_HANDLE), pError); if(!hGPIO) { Error = BT_ERR_NO_MEMORY; goto err_out; } hGPIO->oClient.pBus = pBus; const BT_RESOURCE *pResource = BT_GetDeviceResource(pDevice, BT_RESOURCE_BUSID, 0); if(!pResource) { Error = BT_ERR_INVALID_RESOURCE; goto err_free_out; } hGPIO->oClient.addr = pResource->ulStart; pResource = BT_GetDeviceResource(pDevice, BT_RESOURCE_IO, 0); if(!pResource) { Error = BT_ERR_INVALID_RESOURCE; goto err_free_out; } BT_u32 base = pResource->ulStart; BT_u32 total = (pResource->ulEnd - pResource->ulStart) + 1; Error = BT_RegisterGpioController(base, total, hGPIO); if(Error) { goto err_free_out; } BT_kPrint("MAX7312 : Initialising GPIO Port Expander."); BT_u8 in1, in2; in1 = gpio_read_register(hGPIO, 0x00, &Error); in2 = gpio_read_register(hGPIO, 0x01, &Error); BT_kPrint("MAX7312 : in1 : %02X", in1); BT_kPrint("MAX7312 : in2 : %02X", in2); return hGPIO; err_free_out: BT_DestroyHandle(hGPIO); err_out: if(pError) { *pError = Error; } return NULL; }
BT_HANDLE gpio_probe(const BT_INTEGRATED_DEVICE *pDevice, BT_ERROR *pError) { BT_ERROR Error; if(pError) { *pError = BT_ERR_NONE; } BT_HANDLE hGPIO = BT_CreateHandle(&oHandleInterface, sizeof(struct _BT_OPAQUE_HANDLE), pError); if(!hGPIO) { goto err_out; } const BT_RESOURCE *pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IO, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } BT_u32 base = pResource->ulStart; BT_u32 total = (pResource->ulEnd - pResource->ulStart) + 1; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_MEM, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } hGPIO->pRegs = (LPC11Axx_GPIO_REGS *) pResource->ulStart; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IRQ, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } //Error = BT_EnableInterrupt(pResource->ulStart); Error = BT_RegisterGpioController(base, total, hGPIO); if(Error) { goto err_free_out; } return hGPIO; err_free_out: BT_DestroyHandle(hGPIO); if(pError) { *pError = Error; } err_out: return NULL; }
static BT_HANDLE gpio_probe(const BT_INTEGRATED_DEVICE *pDevice, BT_ERROR *pError) { BT_u32 i; BT_ERROR Error; if(pError) { *pError = BT_ERR_NONE; } BT_HANDLE hGPIO = BT_CreateHandle(&oHandleInterface, sizeof(struct _BT_OPAQUE_HANDLE), pError); if(!hGPIO) { goto err_out; } const BT_RESOURCE *pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IO, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } BT_u32 base = pResource->ulStart; BT_u32 total = (pResource->ulEnd - pResource->ulStart) + 1; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_MEM, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } hGPIO->pRegs = (ZYNQ_GPIO_REGS *) pResource->ulStart; pResource = BT_GetIntegratedResource(pDevice, BT_RESOURCE_IRQ, 0); if(!pResource) { Error = BT_ERR_GENERIC; goto err_free_out; } Error = BT_RegisterInterrupt(pResource->ulStart, gpio_irq_handler, hGPIO); if(Error) { goto err_free_out; } // Prevent Pending Interrupts for(i = 0; i < total; i += 32) { hGPIO->pRegs->bank[i/32].INT_DIS = 0xFFFFFFFF; } Error = BT_EnableInterrupt(pResource->ulStart); Error = BT_RegisterGpioController(base, total, hGPIO); if(Error) { goto err_free_irq; } return hGPIO; err_free_irq: BT_UnregisterInterrupt(pResource->ulStart, gpio_irq_handler, hGPIO); err_free_out: BT_DestroyHandle(hGPIO); if(pError) { *pError = Error; } err_out: return NULL; }