コード例 #1
0
ファイル: i2c.c プロジェクト: BitThunder/bitthunder
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;
}
コード例 #2
0
ファイル: i2c.c プロジェクト: jbinkleyj/bitthunder
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;
}