📄 stm32100b_eval_cec.c
字号:
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[5][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Tuner 2 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x6);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[6][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Tuner 3 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x7);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[7][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Playback device 2 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x8);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[8][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Recording device 3 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x9);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[9][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Tuner 4 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0xA);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[10][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Playback device 3 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0xB);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[11][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
CECDevicesNumber = i - 1;
return errorstatus;
}
/**
* @brief Physical address discovery.
* @param None
* @retval HDMI_CEC_Error: CEC Error code.
*/
static HDMI_CEC_Error PhysicalAddressDiscovery(void)
{
HDMI_CEC_Error errorstatus = HDMI_CEC_OK;
#ifdef HDMI_CEC_USE_DDC
uint32_t index = 0, i = 0;
#endif
/*------------------------------ Physical address discovery -----------------*/
if (HDMI_CEC_ROOT == 0x1)
{
MyPhysicalAddress = 0x0000;
/* The HDMI-CEC here is configured as sink or as a repeater. The configuration
of the +5V power signal and the HPD should be well configured.
Implement here the EDID Structure to be sent to the HDMI source.
For more details please refer to the HDMI specification.
The EDID structure should be sent to the device source using the DDC Channel
and using the HPD signal. */
}
else
{
#ifdef HDMI_CEC_USE_DDC
/* The HDMI-CEC here is configured as source or as a repeater. The configuration
of the +5V power signal and the HPD should be well configured.
The source should wait for HPD and then read the EDID structure. */
while(GPIO_ReadInputDataBit(HDMI_CEC_HPD_GPIO_PORT, HDMI_CEC_HPD_PIN) == RESET)
{
}
/* Wait for 100 ms after HPD was received */
for(i = 0; i < 0x5FFFF; i++)
{
}
/* Return the physical address using the I2C by reading the 2 bytes 24 and
25 form the EDID */
/* Read the EDID Block 0 and EDID Block 1 at address 0xA0 */
/*!< While the bus is busy */
while(I2C_GetFlagStatus(HDMI_CEC_I2C, I2C_FLAG_BUSY))
{
}
/*!< Send START condition */
I2C_GenerateSTART(HDMI_CEC_I2C, ENABLE);
/*!< Test on EV5 and clear it */
while(!I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_MODE_SELECT))
{
}
/*!< Send EEPROM address for write */
I2C_Send7bitAddress(HDMI_CEC_I2C, 0xA0, I2C_Direction_Transmitter);
/*!< Test on EV6 and clear it */
while(!I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
}
/*!< Send the EEPROM's internal address to read from: Only one byte address */
I2C_SendData(HDMI_CEC_I2C, 0x00);
/*!< Test on EV8 and clear it */
while(!I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
}
/*!< Send STRAT condition a second time */
I2C_GenerateSTART(HDMI_CEC_I2C, ENABLE);
/*!< Test on EV5 and clear it */
while(!I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_MODE_SELECT))
{
}
/*!< Send EEPROM address for read */
I2C_Send7bitAddress(HDMI_CEC_I2C, 0xA1, I2C_Direction_Receiver);
/*!< Test on EV6 and clear it */
while(!I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
}
/* While there is data to be read */
while (NumByteToRead-- > 1)
{
while(I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
}
for(i = 0; i < 0xFFF; i++)
{
}
pBuffer[index++] = I2C_ReceiveData(HDMI_CEC_I2C);
}
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(HDMI_CEC_I2C, DISABLE);
/* Send STOP Condition */
I2C_GenerateSTOP(HDMI_CEC_I2C, ENABLE);
while(I2C_CheckEvent(HDMI_CEC_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED));
pBuffer[index] = I2C_ReceiveData(HDMI_CEC_I2C);
/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(HDMI_CEC_I2C, ENABLE);
MyPhysicalAddress = ((pBuffer[138] << 8) | pBuffer[137]);
#else
MyPhysicalAddress = 0x1000;
#endif
}
return errorstatus;
}
/**
* @brief Allocate the logical address.
* @param None
* @retval HDMI_CEC_Error: CEC Error code.
*/
static HDMI_CEC_Error LogicalAddressAllocation(void)
{
HDMI_CEC_Error errorstatus = HDMI_CEC_OK;
uint32_t count = 0;
/*------------------ Logical address allocation -----------------------------*/
/* Get the device type */
/* Device type = CEC_TV */
if (DeviceType == HDMI_CEC_TV)
{
if (HDMI_CEC_ROOT)
{
MyLogicalAddress = 0x00;
}
else
{
CEC_OwnAddressConfig(0xE); /* Own address = 0xE */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte(0xEE);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the polling message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_BLOCK_ACKNOWLEDGE)
{
MyLogicalAddress = 0x0E;
errorstatus = HDMI_CEC_OK;
}
else if (errorstatus == HDMI_CEC_OK)
{
MyLogicalAddress = 0x0F;
errorstatus = HDMI_CEC_DEVICE_UNREGISTRED;
}
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
}
/* Device type = CEC_RECORDING */
if (DeviceType == HDMI_CEC_RECORDING)
{
CEC_OwnAddressConfig(0x1); /* Own address = 0x1 */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte(0x11);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_BLOCK_ACKNOWLEDGE)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -