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; }
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; }
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); }