示例#1
0
文件: i2c_mcux.c 项目: kraj/zephyr
static int i2c_mcux_init(struct device *dev)
{
	I2C_Type *base = DEV_BASE(dev);
	const struct i2c_mcux_config *config = DEV_CFG(dev);
	struct i2c_mcux_data *data = DEV_DATA(dev);
	u32_t clock_freq, bitrate_cfg;
	i2c_master_config_t master_config;
	int error;

	k_sem_init(&data->device_sync_sem, 0, UINT_MAX);

	clock_freq = CLOCK_GetFreq(config->clock_source);
	I2C_MasterGetDefaultConfig(&master_config);
	I2C_MasterInit(base, &master_config, clock_freq);
	I2C_MasterTransferCreateHandle(base, &data->handle,
			i2c_mcux_master_transfer_callback, dev);

	bitrate_cfg = _i2c_map_dt_bitrate(config->bitrate);

	error = i2c_mcux_configure(dev, I2C_MODE_MASTER | bitrate_cfg);
	if (error) {
		return error;
	}

	config->irq_config_func(dev);

	return 0;
}
示例#2
0
status_t I2C_RTOS_Init(i2c_rtos_handle_t *handle,
                       I2C_Type *base,
                       const i2c_master_config_t *masterConfig,
                       uint32_t srcClock_Hz)
{
    if (handle == NULL)
    {
        return kStatus_InvalidArgument;
    }

    if (base == NULL)
    {
        return kStatus_InvalidArgument;
    }

    memset(handle, 0, sizeof(i2c_rtos_handle_t));
#if (configSUPPORT_STATIC_ALLOCATION == 1)
    handle->mutex = xSemaphoreCreateMutexStatic(&handle->mutexBuffer);
#else
    handle->mutex = xSemaphoreCreateMutex();
#endif
    if (handle->mutex == NULL)
    {
        return kStatus_Fail;
    }
#if (configSUPPORT_STATIC_ALLOCATION == 1)
    handle->semaphore = xSemaphoreCreateBinaryStatic(&handle->semaphoreBuffer);
#else
    handle->semaphore = xSemaphoreCreateBinary();
#endif
    if (handle->semaphore == NULL)
    {
        vSemaphoreDelete(handle->mutex);
        return kStatus_Fail;
    }

    handle->base = base;

    I2C_MasterInit(handle->base, masterConfig, srcClock_Hz);
    I2C_MasterTransferCreateHandle(base, &handle->drv_handle, I2C_RTOS_Callback, (void *)handle);

    return kStatus_Success;
}
示例#3
0
static OsStatus_t KL25Z_I2CConfig(Device_t *dev, uint32_t expectedSpeed, uint32_t *actualSpeed, uint32_t configMask, uint16_t slaveAddr)
{
	OsStatus_t ret = kStatusOk;
	KL25ZI2CDevData_t *dat =  (KL25ZI2CDevData_t *)dev->config->devConfigData;
	KL25ZCustomI2CData_t *custom = (KL25ZCustomI2CData_t *)dev->deviceData;
	DeviceConfig_t *dcfg = (DeviceConfig_t *)dev->config;

	(void)actualSpeed;

	if(custom->busy) {
		/* device busy, exit */
		ret = kDeviceBusy;
		goto cleanup;
	}

	custom->busy = true;

	/* select the mode of I2C operation */
	if(configMask & I2C_DEVICE_SLAVE) {
		custom->master = false;
		I2C_SlaveTransferCreateHandle(dat->I2C, &custom->shnadle,KL25Z_SlaveI2CIsr , dev);

		custom->enabled = false;

		i2c_slave_config_t cfg;
		I2C_SlaveGetDefaultConfig(&cfg);

		cfg.enableHighDrive = false;

		/* perform addressing mode setup */
		if(configMask & I2C_10BIT_ADDR) {
			cfg.addressingMode = kI2C_Address7bit;
		} else {
			cfg.addressingMode = kI2C_RangeMatch;
		}
		cfg.slaveAddress = slaveAddr;


		/* perfom I2C configuration */
		I2C_SlaveInit(dat->I2C,&cfg,OS_CPU_RATE/2);


	} else {
		custom->master = true;
		I2C_MasterTransferCreateHandle(dat->I2C, &custom->mhandle, KL25Z_MasterI2CIsr, dev);
		custom->enabled = false;

		i2c_master_config_t cfg;
		I2C_MasterGetDefaultConfig(&cfg);
		cfg.baudRate_Bps = expectedSpeed;
		cfg.enableMaster = false;

		/* perfom I2C configuration */
		I2C_MasterInit(dat->I2C,&cfg,OS_CPU_RATE/2);
	}


	/* keeps the I2C disabled */
	NVIC_ClearPendingIRQ(dcfg->irqOffset);
	NVIC_DisableIRQ(dcfg->irqOffset);
	I2C_SlaveClearStatusFlags(dat->I2C, 0xFFFFFFFF);
	I2C_DisableInterrupts(dat->I2C, 0xFFFFFFFF);
	custom->busy = false;


cleanup:
	return(ret);
}