/** * * Initializes a specific XIicPs instance such that the driver is ready to use. * * The state of the device after initialization is: * - Device is disabled * - Slave mode * * @param InstancePtr is a pointer to the XIicPs instance. * @param ConfigPtr is a reference to a structure containing information * about a specific IIC device. This function initializes an * InstancePtr object for a specific device specified by the * contents of Config. * @param EffectiveAddr is the device base address in the virtual memory * address space. The caller is responsible for keeping the address * mapping from EffectiveAddr to the device physical base address * unchanged once this function is invoked. Unexpected errors may * occur if the address mapping changes after this function is * called. If address translation is not used, use * ConfigPtr->BaseAddress for this parameter, passing the physical * address instead. * * @return The return value is XST_SUCCESS if successful. * * @note None. * ******************************************************************************/ int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config *ConfigPtr, u32 EffectiveAddr) { /* * Assert validates the input arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(ConfigPtr != NULL); /* * Set some default values. */ InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; InstancePtr->Config.BaseAddress = EffectiveAddr; InstancePtr->Config.InputClockHz = ConfigPtr->InputClockHz; InstancePtr->StatusHandler = StubHandler; InstancePtr->CallBackRef = NULL; InstancePtr->IsReady = XIL_COMPONENT_IS_READY; /* * Reset the IIC device to get it into its initial state. It is expected * that device configuration will take place after this initialization * is done, but before the device is started. */ XIicPs_Reset(InstancePtr); /* * Keep a copy of what options this instance has. */ InstancePtr->Options = XIicPs_GetOptions(InstancePtr); return XST_SUCCESS; }
/** * * This function clears the options for the IIC device driver. The options * control how the device behaves relative to the IIC bus. The device must be * idle rather than busy transferring data before setting these device options. * * @param InstancePtr is a pointer to the XIicPs instance. * @param Options contains the specified options to be cleared. This is a * bit mask where a 1 means to turn the option off. One or more bit * values may be contained in the mask. See the bit definitions * named XIICPS_*_OPTION in xiicps.h. * * @return * - XST_SUCCESS if options are successfully set. * - XST_DEVICE_IS_STARTED if the device is currently transferring * data. The transfer must complete or be aborted before setting * options. * * @note None * ******************************************************************************/ int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options) { u32 ControlReg; unsigned int Index; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET); /* * If repeated start option is cleared, set the flag. * The hold bit in CR will be cleared by driver when the * following transfer ends. */ if (Options & XIICPS_REP_START_OPTION) { InstancePtr->IsRepeatedStart = 0; Options = Options & (~XIICPS_REP_START_OPTION); } /* * Loop through the options table and clear the specified options. */ for (Index = 0; Index < XIICPS_NUM_OPTIONS; Index++) { if (Options & OptionsTable[Index].Option) { /* * 10-bit option is specially treated, because it is * using the 7-bit option, so clearing it means turning * 7-bit option on. */ if (OptionsTable[Index].Option & XIICPS_10_BIT_ADDR_OPTION) { /* Turn 7-bit on */ ControlReg |= OptionsTable[Index].Mask; } else { /* Turn 7-bit off */ ControlReg &= ~OptionsTable[Index].Mask; } } } /* * Now write the control register. Leave it to the upper layers * to restart the device. */ XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, ControlReg); /* * Keep a copy of what options this instance has. */ InstancePtr->Options = XIicPs_GetOptions(InstancePtr); return XST_SUCCESS; }
/** * * This function sets the options for the IIC device driver. The options control * how the device behaves relative to the IIC bus. The device must be idle * rather than busy transferring data before setting these device options. * * @param InstancePtr is a pointer to the XIicPs instance. * @param Options contains the specified options to be set. This is a bit * mask where a 1 means to turn the option on. One or more bit * values may be contained in the mask. See the bit definitions * named XIICPS_*_OPTION in xiicps.h. * * @return * - XST_SUCCESS if options are successfully set. * - XST_DEVICE_IS_STARTED if the device is currently transferring * data. The transfer must complete or be aborted before setting * options. * * @note None. * ******************************************************************************/ s32 XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options) { u32 ControlReg; u32 Index; u32 OptionsVar = Options; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET); /* * If repeated start option is requested, set the flag. * The hold bit in CR will be written by driver when the next transfer * is initiated. */ if ((OptionsVar & (u32)XIICPS_REP_START_OPTION) != (u32)0 ) { InstancePtr->IsRepeatedStart = 1; OptionsVar = OptionsVar & (~XIICPS_REP_START_OPTION); } /* * Loop through the options table, turning the option on. */ for (Index = 0U; Index < XIICPS_NUM_OPTIONS; Index++) { if ((OptionsVar & OptionsTable[Index].Option) != (u32)0x0U) { /* * 10-bit option is specially treated, because it is * using the 7-bit option, so turning it on means * turning 7-bit option off. */ if ((OptionsTable[Index].Option & XIICPS_10_BIT_ADDR_OPTION) != (u32)0x0U) { /* Turn 7-bit off */ ControlReg &= ~OptionsTable[Index].Mask; } else { /* Turn 7-bit on */ ControlReg |= OptionsTable[Index].Mask; } } } /* * Now write to the control register. Leave it to the upper layers * to restart the device. */ XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, ControlReg); /* * Keep a copy of what options this instance has. */ InstancePtr->Options = XIicPs_GetOptions(InstancePtr); return (s32)XST_SUCCESS; }
/** * * This function sets the options for the IIC device driver. The options control * how the device behaves relative to the IIC bus. The device must be idle * rather than busy transferring data before setting these device options. * * @param InstancePtr is a pointer to the XIicPs instance. * @param Options contains the specified options to be set. This is a bit * mask where a 1 means to turn the option on. One or more bit * values may be contained in the mask. See the bit definitions * named XIICPS_*_OPTION in xiicps.h. * * @return * - XST_SUCCESS if options are successfully set. * - XST_DEVICE_IS_STARTED if the device is currently transferring * data. The transfer must complete or be aborted before setting * options. * * @note None. * ******************************************************************************/ int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options) { u32 ControlReg; unsigned int Index; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET); /* * Loop through the options table, turning the option on. */ for (Index = 0; Index < XIICPS_NUM_OPTIONS; Index++) { if (Options & OptionsTable[Index].Option) { /* * 10-bit option is specially treated, because it is * using the 7-bit option, so turning it on means * turning 7-bit option off. */ if (OptionsTable[Index].Option & XIICPS_10_BIT_ADDR_OPTION) { /* Turn 7-bit off */ ControlReg &= ~OptionsTable[Index].Mask; } else { /* Turn 7-bit on */ ControlReg |= OptionsTable[Index].Mask; } } } /* * Now write to the control register. Leave it to the upper layers * to restart the device. */ XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, ControlReg); /* * Keep a copy of what options this instance has. */ InstancePtr->Options = XIicPs_GetOptions(InstancePtr); return XST_SUCCESS; }