iicps: Removed repeated start feature.
This patch removes the repeated start feature. Signed-off-by: P L Sai Krishna <lakshmis@xilinx.com>
This commit is contained in:
parent
1745f21b76
commit
45db2926b5
4 changed files with 43 additions and 93 deletions
|
@ -47,6 +47,7 @@
|
|||
* 2.1 hk 04/25/14 Explicitly reset CR and clear FIFO in Abort function
|
||||
* and state the same in the comments. CR# 784254.
|
||||
* Fix for CR# 761060 - provision for repeated start.
|
||||
* 2.3 sk 10/07/14 Repeated start feature removed.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -129,9 +130,6 @@ int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config *ConfigPtr,
|
|||
*/
|
||||
InstancePtr->Options = XIicPs_GetOptions(InstancePtr);
|
||||
|
||||
/* Initialize repeated start flag to 0 */
|
||||
InstancePtr->IsRepeatedStart = 0;
|
||||
|
||||
return XST_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -167,6 +167,7 @@
|
|||
* 2.2 hk 08/23/14 Slave monitor mode changes - clear FIFO, enable
|
||||
* read mode and clear transfer size register.
|
||||
* Disable NACK to avoid interrupts on each retry.
|
||||
* 2.3 sk 10/07/14 Repeated start feature deleted.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -199,7 +200,6 @@ extern "C" {
|
|||
#define XIICPS_7_BIT_ADDR_OPTION 0x01 /**< 7-bit address mode */
|
||||
#define XIICPS_10_BIT_ADDR_OPTION 0x02 /**< 10-bit address mode */
|
||||
#define XIICPS_SLAVE_MON_OPTION 0x04 /**< Slave monitor mode */
|
||||
#define XIICPS_REP_START_OPTION 0x08 /**< Repeated Start */
|
||||
/*@}*/
|
||||
|
||||
/** @name Callback events
|
||||
|
@ -275,7 +275,6 @@ typedef struct {
|
|||
|
||||
int UpdateTxSize; /* If tx size register has to be updated */
|
||||
int IsSend; /* Whether master is sending or receiving */
|
||||
int IsRepeatedStart; /* Indicates if user set repeated start */
|
||||
|
||||
XIicPs_IntrHandler StatusHandler; /* Event handler function */
|
||||
void *CallBackRef; /* Callback reference for event handler */
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
* Disable NACK to avoid interrupts on each retry.
|
||||
* 2.3 sk 10/06/14 Fill transmit fifo before address register when sending.
|
||||
* Replaced XIICPS_DATA_INTR_DEPTH with XIICPS_FIFO_DEPTH.
|
||||
* Repeated start feature removed.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -115,21 +116,21 @@ void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
|
|||
InstancePtr->RecvBufferPtr = NULL;
|
||||
InstancePtr->IsSend = 1;
|
||||
|
||||
/*
|
||||
* Set repeated start if sending more than FIFO of data.
|
||||
*/
|
||||
if ((InstancePtr->IsRepeatedStart) ||
|
||||
(ByteCount > XIICPS_FIFO_DEPTH)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) |
|
||||
XIICPS_CR_HOLD_MASK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup as a master sending role.
|
||||
*/
|
||||
XIicPs_SetupMaster(InstancePtr, SENDING_ROLE);
|
||||
|
||||
/*
|
||||
* Set HOLD bit if sending more than FIFO of data.
|
||||
*/
|
||||
if (ByteCount > XIICPS_FIFO_DEPTH) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) |
|
||||
XIICPS_CR_HOLD_MASK);
|
||||
}
|
||||
|
||||
TransmitFifoFill(InstancePtr);
|
||||
|
||||
/*
|
||||
|
@ -180,9 +181,7 @@ void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
|
|||
InstancePtr->IsSend = 0;
|
||||
InstancePtr->UpdateTxSize = 0;
|
||||
|
||||
if ((ByteCount > XIICPS_FIFO_DEPTH) ||
|
||||
(InstancePtr->IsRepeatedStart))
|
||||
{
|
||||
if (ByteCount > XIICPS_FIFO_DEPTH) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) |
|
||||
XIICPS_CR_HOLD_MASK);
|
||||
|
@ -258,8 +257,7 @@ int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
InstancePtr->SendBufferPtr = MsgPtr;
|
||||
InstancePtr->SendByteCount = ByteCount;
|
||||
|
||||
if ((InstancePtr->IsRepeatedStart) ||
|
||||
(ByteCount > XIICPS_FIFO_DEPTH)) {
|
||||
if (ByteCount > XIICPS_FIFO_DEPTH) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) |
|
||||
XIICPS_CR_HOLD_MASK);
|
||||
|
@ -325,11 +323,9 @@ int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
}
|
||||
}
|
||||
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
|
||||
return XST_SUCCESS;
|
||||
}
|
||||
|
@ -376,17 +372,15 @@ int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
InstancePtr->RecvBufferPtr = MsgPtr;
|
||||
InstancePtr->RecvByteCount = ByteCount;
|
||||
|
||||
if((ByteCount > XIICPS_FIFO_DEPTH) ||
|
||||
(InstancePtr->IsRepeatedStart))
|
||||
{
|
||||
XIicPs_SetupMaster(InstancePtr, RECVING_ROLE);
|
||||
|
||||
if(ByteCount > XIICPS_FIFO_DEPTH) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) |
|
||||
XIICPS_CR_HOLD_MASK);
|
||||
IsHold = 1;
|
||||
}
|
||||
|
||||
XIicPs_SetupMaster(InstancePtr, RECVING_ROLE);
|
||||
|
||||
/*
|
||||
* Clear the interrupt status register before use it to monitor.
|
||||
*/
|
||||
|
@ -425,8 +419,7 @@ int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
|
||||
while (StatusReg & XIICPS_SR_RXDV_MASK) {
|
||||
if ((InstancePtr->RecvByteCount <
|
||||
XIICPS_DATA_INTR_DEPTH) && IsHold &&
|
||||
(!(InstancePtr->IsRepeatedStart))) {
|
||||
XIICPS_DATA_INTR_DEPTH) && IsHold) {
|
||||
IsHold = 0;
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
|
@ -472,11 +465,9 @@ int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET);
|
||||
}
|
||||
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
|
||||
if (IntrStatusReg & Intrs) {
|
||||
return XST_FAILURE;
|
||||
|
@ -683,8 +674,7 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
while (XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET) &
|
||||
XIICPS_SR_RXDV_MASK) {
|
||||
if ((InstancePtr->RecvByteCount <
|
||||
XIICPS_DATA_INTR_DEPTH) && IsHold &&
|
||||
(!(InstancePtr->IsRepeatedStart))) {
|
||||
XIICPS_DATA_INTR_DEPTH) && IsHold) {
|
||||
IsHold = 0;
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
|
@ -734,12 +724,10 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
* If all done, tell the application.
|
||||
*/
|
||||
if (InstancePtr->RecvByteCount == 0){
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
StatusEvent |= XIICPS_EVENT_COMPLETE_RECV;
|
||||
}
|
||||
}
|
||||
|
@ -753,12 +741,10 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
}
|
||||
|
||||
if (0 != (IntrStatusReg & XIICPS_IXR_NACK_MASK)) {
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
StatusEvent |= XIICPS_EVENT_NACK;
|
||||
}
|
||||
|
||||
|
@ -768,12 +754,10 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
if (0 != (IntrStatusReg & (XIICPS_IXR_NACK_MASK |
|
||||
XIICPS_IXR_ARB_LOST_MASK | XIICPS_IXR_RX_UNF_MASK |
|
||||
XIICPS_IXR_TX_OVR_MASK | XIICPS_IXR_RX_OVR_MASK))) {
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_CR_OFFSET) &
|
||||
(~XIICPS_CR_HOLD_MASK));
|
||||
StatusEvent |= XIICPS_EVENT_ERROR;
|
||||
}
|
||||
|
||||
|
@ -816,7 +800,7 @@ static int XIicPs_SetupMaster(XIicPs *InstancePtr, int Role)
|
|||
|
||||
|
||||
/*
|
||||
* Only check if bus is busy when repeated start option is not set.
|
||||
* Only check if bus is busy when HOLD bit is not set.
|
||||
*/
|
||||
if ((ControlReg & XIICPS_CR_HOLD_MASK) == 0) {
|
||||
if (XIicPs_BusIsBusy(InstancePtr)) {
|
||||
|
@ -865,18 +849,10 @@ static void MasterSendData(XIicPs *InstancePtr)
|
|||
* Clear hold bit if done, so stop can be sent out.
|
||||
*/
|
||||
if (InstancePtr->SendByteCount == 0) {
|
||||
|
||||
/*
|
||||
* If user has enabled repeated start as an option,
|
||||
* do not disable it.
|
||||
*/
|
||||
if (!(InstancePtr->IsRepeatedStart)) {
|
||||
|
||||
XIicPs_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XIICPS_CR_OFFSET) & ~ XIICPS_CR_HOLD_MASK);
|
||||
}
|
||||
XIicPs_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XIICPS_CR_OFFSET) & ~ XIICPS_CR_HOLD_MASK);
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
* 2.0 hk 03/07/14 Limited frequency set when 100KHz or 400KHz is
|
||||
* selected. This is a hardware limitation. CR#779290.
|
||||
* 2.1 hk 04/24/14 Fix for CR# 761060 - provision for repeated start.
|
||||
* 2.3 sk 10/07/14 Repeated start feature removed.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -86,7 +87,6 @@ static OptionsMap OptionsTable[] = {
|
|||
{XIICPS_7_BIT_ADDR_OPTION, XIICPS_CR_NEA_MASK},
|
||||
{XIICPS_10_BIT_ADDR_OPTION, XIICPS_CR_NEA_MASK},
|
||||
{XIICPS_SLAVE_MON_OPTION, XIICPS_CR_SLVMON_MASK},
|
||||
{XIICPS_REP_START_OPTION, XIICPS_CR_HOLD_MASK},
|
||||
};
|
||||
|
||||
#define XIICPS_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(OptionsMap))
|
||||
|
@ -124,16 +124,6 @@ int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options)
|
|||
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 (Options & XIICPS_REP_START_OPTION) {
|
||||
InstancePtr->IsRepeatedStart = 1;
|
||||
Options = Options & (~XIICPS_REP_START_OPTION);
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop through the options table, turning the option on.
|
||||
*/
|
||||
|
@ -203,16 +193,6 @@ int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options)
|
|||
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.
|
||||
*/
|
||||
|
@ -296,9 +276,6 @@ u32 XIicPs_GetOptions(XIicPs *InstancePtr)
|
|||
}
|
||||
}
|
||||
|
||||
if (InstancePtr->IsRepeatedStart) {
|
||||
OptionsFlag |= XIICPS_REP_START_OPTION;
|
||||
}
|
||||
return OptionsFlag;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue