IPC Module¶
The IPC (Inter-Processor Communication) Driver for Texas Instruments® F2838x device provides a set of API functions for using the IPC module to communicate between the 3 cores (C28x1, C28x2 and CM)on the microcontroller. C28x1 and C28x2 are also referred to as CPU1 and CPU2 in this document and in the driver. Each core contains two different instances of IPC - one for each remote core.
-
group
ipc_api
This module is used for inter-processor communications.
Defines
-
IPC_MSGQ_SUPPORT
1U¶
-
IPC_BUFFER_SIZE
4U¶
-
IPC_NUM_OF_INTERRUPTS
4U¶
-
IPC_FLAGS_DEFINED
¶
-
IPC_NO_FLAG
0x00000000U¶ NO FLAG.
-
IPC_FLAG0
0x00000001U¶ IPC FLAG 0.
-
IPC_FLAG1
0x00000002U¶ IPC FLAG 1.
-
IPC_FLAG2
0x00000004U¶ IPC FLAG 2.
-
IPC_FLAG3
0x00000008U¶ IPC FLAG 3.
-
IPC_FLAG4
0x00000010U¶ IPC FLAG 4.
-
IPC_FLAG5
0x00000020U¶ IPC FLAG 5.
-
IPC_FLAG6
0x00000040U¶ IPC FLAG 6.
-
IPC_FLAG7
0x00000080U¶ IPC FLAG 7.
-
IPC_FLAG8
0x00000100U¶ IPC FLAG 8.
-
IPC_FLAG9
0x00000200U¶ IPC FLAG 9.
-
IPC_FLAG10
0x00000400U¶ IPC FLAG 10.
-
IPC_FLAG11
0x00000800U¶ IPC FLAG 11.
-
IPC_FLAG12
0x00001000U¶ IPC FLAG 12.
-
IPC_FLAG13
0x00002000U¶ IPC FLAG 13.
-
IPC_FLAG14
0x00004000U¶ IPC FLAG 14.
-
IPC_FLAG15
0x00008000U¶ IPC FLAG 15.
-
IPC_FLAG16
0x00010000U¶ IPC FLAG 16.
-
IPC_FLAG17
0x00020000U¶ IPC FLAG 17.
-
IPC_FLAG18
0x00040000U¶ IPC FLAG 18.
-
IPC_FLAG19
0x00080000U¶ IPC FLAG 19.
-
IPC_FLAG20
0x00100000U¶ IPC FLAG 20.
-
IPC_FLAG21
0x00200000U¶ IPC FLAG 21.
-
IPC_FLAG22
0x00400000U¶ IPC FLAG 22.
-
IPC_FLAG23
0x00800000U¶ IPC FLAG 23.
-
IPC_FLAG24
0x01000000U¶ IPC FLAG 24.
-
IPC_FLAG25
0x02000000U¶ IPC FLAG 25.
-
IPC_FLAG26
0x04000000U¶ IPC FLAG 26.
-
IPC_FLAG27
0x08000000U¶ IPC FLAG 27.
-
IPC_FLAG28
0x10000000U¶ IPC FLAG 28.
-
IPC_FLAG29
0x20000000U¶ IPC FLAG 29.
-
IPC_FLAG30
0x40000000U¶ IPC FLAG 30.
-
IPC_FLAG31
0x80000000U¶ IPC FLAG 31.
-
IPC_FLAG_ALL
0xFFFFFFFFU¶ All IPC flags.
-
IPC_INT0
0x0U¶ IPC Interrupt 0.
-
IPC_INT1
0x1U¶ IPC Interrupt 1.
-
IPC_INT2
0x2U¶ IPC Interrupt 2.
-
IPC_INT3
0x3U¶ IPC Interrupt 3.
-
IPC_INT4
0x4U¶ IPC Interrupt 4.
-
IPC_INT5
0x5U¶ IPC Interrupt 5.
-
IPC_INT6
0x6U¶ IPC Interrupt 6.
-
IPC_INT7
0x7U¶ IPC Interrupt 7.
-
IPC_ADDR_CORRECTION_ENABLE
true¶
-
IPC_ADDR_CORRECTION_DISABLE
false¶
-
IPC_BLOCKING_CALL
true¶
-
IPC_NONBLOCKING_CALL
false¶
-
IPC_PUMPREQUEST_REG
IPC_Instance[IPC_CPU1_L_CPU2_R].IPC_Boot_Pump_Reg->IPC_PUMPREQUEST¶
-
IPC_MAX_BUFFER_INDEX
(IPC_BUFFER_SIZE - 1U)¶
Enums
-
enum
IPC_Type_t
¶ Values that can be passed as parameter ipcType in all the driver functions
Values:
-
enumerator
IPC_CPU1_L_CPU2_R
¶ CPU1 - Local core, CPU2 - Remote core.
-
enumerator
IPC_CPU1_L_CM_R
¶ CPU1 - Local core, CM - Remote core.
-
enumerator
IPC_CPU2_L_CPU1_R
¶ CPU2 - Local core, CPU1 - Remote core.
-
enumerator
IPC_CPU2_L_CM_R
¶ CPU2 - Local core, CM - Remote core.
-
enumerator
IPC_TOTAL_NUM
¶
-
enumerator
Functions
-
void
IPC_setFlagLtoR
(IPC_Type_t ipcType, uint32_t flags)¶ Local core sets Local to Remote IPC Flag
This function will allow the Local core system to set the designated IPC flags to send to the Remote core system. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the IPC flag mask for the flags being set
- Return
None.
-
void
IPC_clearFlagLtoR
(IPC_Type_t ipcType, uint32_t flags)¶ Local core clears Local to Remote IPC Flag
This function will allow the Local core system to clear the designated IPC flags sent to the Remote core system. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the IPC flag mask for the flags being cleared
- Return
None.
-
void
IPC_ackFlagRtoL
(IPC_Type_t ipcType, uint32_t flags)¶ Local core acknowledges Remote to Local IPC Flag.
This function will allow the Local core system to acknowledge/clear the IPC flag set by the Remote core system. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the IPC flag mask for the flags being acknowledged.
- Return
None.
-
bool
IPC_isFlagBusyLtoR
(IPC_Type_t ipcType, uint32_t flags)¶ Determines whether the given IPC flags are busy or not.
Allows the caller to determine whether the designated Local to Remote IPC flags are pending. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the Local to Remote IPC flag masks to check the status of
- Return
Returns true if the any of the designated IPC flags are busy or false if all the designated IPC flags are free.
-
bool
IPC_isFlagBusyRtoL
(IPC_Type_t ipcType, uint32_t flags)¶ Determines whether the given Remote to Local IPC flags are busy or not.
Allows the caller to determine whether the designated Remote to Local IPC flags are pending. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the Remote to Local IPC Flag masks to check the status of
- Return
Returns true if the any of the designated IPC flags are busy or false if all the designated IPC flags are free.
-
void
IPC_waitForFlag
(IPC_Type_t ipcType, uint32_t flag)¶ Wait for the remote core to send a flag
Allows the caller to wait for the Remote to Local flag to be send by the remote core. The
flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflag
: is the Remote to Local IPC flag mask to wait for
- Return
None
-
void
IPC_waitForAck
(IPC_Type_t ipcType, uint32_t flag)¶ Wait for the IPC flag to be acknowledged
Allows the caller to wait for the IPC flag to be acknowledged by the remote core. The
flagsparameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflag
: is the IPC flag mask for which ack is pending
- Return
None
-
void
IPC_sync
(IPC_Type_t ipcType, uint32_t flag)¶ Synchronises the two cores
Allows the local and remote cores to synchronise. Neither core will return from this function call before the other core enters it.
- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflag
: is the IPC flag mask with which synchronisation is done
- Note
Must be called with same flag mask on both the cores
- Return
None
-
void
IPC_init
(IPC_Type_t ipcType)¶ Initialize IPC
- Return
None
- Parameters
ipcType
: is the enum corresponding to the IPC instance used This function initializes IPC by clearing all the flags
-
bool
IPC_sendCommand
(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, uint32_t command, uint32_t addr, uint32_t data)¶ Sends a command to the Remote core
Allows the caller to send a command to the remote core. A command consists of a unique command value, a 32-bit address and a 32-bit data. The function also sends the designated flags to the remote core. There may be differences in the address spaces of Local and Remote core. For example in case of F2838X device, the address spaces of C28x core and CM core are different. In case the
addr refers to an address in the IPC MSG RAM, addrCorrEnable param may be used to correct the address mismatch- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the IPC flag mask for the flags to be setaddrCorrEnable
: is the flag used to determine whether or not to convert the addr parameter to remote core’s address spacecommand
: is the 32-bit command valueaddr
: is the 32-bit address to be sent as part of commanddata
: is the 32-bit data to be sent as part of command
The flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31. The addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE (converts the address to remote core’s address space) or IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter)
The application shall use the function IPC_getResponse to read the response sent by the remote core.
- Note
The application is expected to wait until the the response is received before sending another command.
- Note
addrCorrEnable parameter must be kept same on the sending and receiving cores
- Return
Returns true if the command is sent properly and false if the designated flags were busy and hence command was not sent.
-
bool
IPC_readCommand
(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, uint32_t *command, uint32_t *addr, uint32_t *data)¶ Reads a command sent by the Remote core
Allows the caller to read a command sent by the remote core. A command consists of a unique command value, a 32-bit address and a 32-bit data. There may be differences in the address spaces of Local and Remote core. For example in case of F2838X device, the address spaces of C28x core and CM core are different. In case the
addr refers to an address in the IPC MSG RAM, addrCorrEnable param may be used to correct the address mismatch- Parameters
ipcType
: is the enum corresponding to the IPC instance usedflags
: is the IPC flag mask for the flags sent by the remote coreaddrCorrEnable
: is the flag used to determine whether or not to convert the addr parameter to remote core’s address spacecommand
: is the 32-bit pointer at which the command value is read toaddr
: is the 32-bit pointer at which address value is read todata
: is the 32-bit pointer at which the data is read to
The flags parameter can be any of the IPC flag values: IPC_FLAG0 - IPC_FLAG31. The addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE (converts the address to remote core’s address space) or IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter)
- Note
The application is expected to acknowledge the flag and send a response (if needed) after reading the command
- Note
addrCorrEnable parameter must be kept same on the sending and receiving cores
- Return
Returns true if the command is read properly and false if the designated flags were empty and hence command was not read.
-
void
IPC_sendResponse
(IPC_Type_t ipcType, uint32_t data)¶ Sends the response to the command sent by remote core.
Allows the caller to send a response to the command previously sent by the remote core
- Parameters
ipcType
: is the enum corresponding to the IPC instance useddata
: is the 32-bit value of the response to be sent
- Return
None.
-
uint32_t
IPC_getResponse
(IPC_Type_t ipcType)¶ Reads the response from the remote core.
Allows the caller to read the response sent by the remote core to the command previously sent by the local core
- Parameters
ipcType
: is the enum corresponding to the IPC instance used
- Return
the 32-bit value of the response.
-
void
IPC_setBootMode
(IPC_Type_t ipcType, uint32_t mode)¶ Sets the BOOTMODE register.
Allows the caller to set the BOOTMODE register.
- Parameters
ipcType
: is the enum corresponding to the IPC instance usedmode
: is the 32-bit value to be set
- Note
This function shall be called by CPU1 only.
- Note
Boot registers are not available in CPU2<->CM IPC instance
- Return
None
-
uint32_t
IPC_getBootMode
(IPC_Type_t ipcType)¶ Reads the BOOTMODE register.
Allows the caller to read the BOOTMODE register.
- Parameters
ipcType
: is the enum corresponding to the IPC instance used
- Note
Boot registers are not available in CPU2<->CM IPC instance
- Return
32-bit value of the BOOOTMODE register
-
void
IPC_setBootStatus
(IPC_Type_t ipcType, uint32_t status)¶ Sets the BOOTSTS register.
Allows the caller to set the BOOTSTS register.
- Parameters
ipcType
: is the enum corresponding to the IPC instance usedstatus
: is the 32-bit value to be set
- Note
This function shall be called by CPU2 and CM only
- Note
This function shall be called by CPU2 and CM only. Boot registers are not available in CPU2<->CM IPC instance
- Return
None.
-
uint32_t
IPC_getBootStatus
(IPC_Type_t ipcType)¶ Reads the BOOTSTS register.
Allows the caller to set the BOOTMODE register.
- Parameters
ipcType
: is the enum corresponding to the IPC instance used
- Note
Boot registers are not available in CPU2<->CM IPC instance
- Return
32-bit value of the BOOOTSTS register
-
uint64_t
IPC_getCounter
(IPC_Type_t ipcType)¶ Reads the timestamp counter value.
Allows the caller to read the IPC timestamp counter value.
- Parameters
ipcType
: is the enum corresponding to the IPC instance used
- Return
64-bit counter value.
-
void
IPC_registerInterrupt
(IPC_Type_t ipcType, uint32_t ipcInt, void (*pfnHandler)(void))¶ Registers an interrupt handler for IPC
This function registers the handler to be called when an IPC interrupt occurs. This function enables the global interrupt in the interrupt controller. The
ipcInt parameter can be any of the IPC flag values:IPC_INT0 - IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedipcInt
: is the Flag number for which interrupt is being registeredpfnHandler
: is the pointer to ISR function
-
void
IPC_unregisterInterrupt
(IPC_Type_t ipcType, uint32_t ipcInt)¶ Unregisters an interrupt handler for IPC
This function clears the handler to be called when an IPC interrupt occurs. This function also masks off the interrupt in the interrupt controller so that the interrupt handler no longer is called. The
ipcInt parameter can be any of the IPC flag values:IPC_INT0 - IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedipcInt
: is the Flag number for which interrupt is being unregistered
-
void
IPC_initMessageQueue
(IPC_Type_t ipcType, volatile IPC_MessageQueue_t *msgQueue, uint32_t ipcInt_L, uint32_t ipcInt_R)¶ Initializes the IPC message queue
This function initializes the IPC message queue with circular buffer and index addresses for an IPC interrupt pair. The
ipcInt_L and ipcInt_R parameters can be one of the following values: IPC_INT0, IPC_INT1, IPC_INT2, IPC_INT3.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedmsgQueue
: specifies the address of a IPC_MessageQueue_t instanceipcInt_L
: specifies the interrupt number on the local core used by the message queue .ipcInt_R
: specifies the interrupt number on the remote core used by the message queue.
- Note
If an interrupt is currently in use by an IPC_MessageQueue_t instance, that particular interrupt should not be tied to a second IPC_MessageQueue_t instance.
- Note
For a particular ipcInt_L - ipcInt_R pair, there must be an instance of IPC_MessageQueue_t defined and initialized on both the locakl and remote systems.
- Return
None.
-
bool
IPC_sendMessageToQueue
(IPC_Type_t ipcType, volatile IPC_MessageQueue_t *msgQueue, bool addrCorrEnable, IPC_Message_t *msg, bool block)¶ Sends a message into the messageQueue.
This function checks if there is a free slot in the message queue. If so, it puts the message pointed to by
msg into the free and sets the appropriate IPC interrupt flag- Parameters
ipcType
: is the enum corresponding to the IPC instance usedmsgQueue
: specifies the address of a IPC_MessageQueue_t instanceaddrCorrEnable
: is the flag used to determine whether or not to convert the addr parameter to remote core’s address spacemsg
: specifies the address of the IPC_Message_t instance to be sent to message queue.block
: specifies whether to allow function to block until the buffer has a free slot
The addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE (converts the address to remote core’s address space) or IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) The block parameter can be one of the following values: IPC_BLOCKING_CALL or IPC_NONBLOCKING_CALL.
- Return
false if the queue is full. true if the message is successfully sent.
-
bool
IPC_readMessageFromQueue
(IPC_Type_t ipcType, volatile IPC_MessageQueue_t *msgQueue, bool addrCorrEnable, IPC_Message_t *msg, bool block)¶ Reads a message from the messageQueue.
This function checks if there is a message in the message queue. If so, it reads the message and writes to the address pointed to by
msg into.- Parameters
ipcType
: is the enum corresponding to the IPC instance usedmsgQueue
: specifies the address of a IPC_MessageQueue_t instanceaddrCorrEnable
: is the flag used to determine whether or not to convert the addr parameter to remote core’s address spacemsg
: specifies the address of the IPC_Message_t instance to which the message needs to be readblock
: specifies whether to allow function to block until a message is available in the message queue
The addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE (converts the address to remote core’s address space) or IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) The block parameter can be one of the following values: IPC_BLOCKING_CALL or IPC_NONBLOCKING_CALL.
- Return
false if the queue is empty. true if the message successfully read.
Variables
-
const IPC_Instance_t
IPC_Instance
[IPC_TOTAL_NUM
]¶
-
struct
IPC_Flag_Ctr_Reg_t
¶ - #include <ipc.h>
-
struct
IPC_SendCmd_Reg_t
¶ - #include <ipc.h>
-
struct
IPC_RecvCmd_Reg_t
¶ - #include <ipc.h>
-
struct
IPC_Boot_Pump_Reg_t
¶ - #include <ipc.h>
-
struct
IPC_Message_t
¶ - #include <ipc.h>
-
struct
IPC_PutBuffer_t
¶ - #include <ipc.h>
-
struct
IPC_GetBuffer_t
¶ - #include <ipc.h>
-
struct
IPC_Instance_t
¶ - #include <ipc.h>
-
struct
IPC_MessageQueue_t
¶ - #include <ipc.h>
-
There are two versions of IPC drivers in this device - one used by the C28x cores (present in the driverlib folder), the other used by the CM core (present in the driverlib_cm folder). With very few exceptions, the same IPC APIs are used by all the 3 processors. As a result all the APIs require a parameter indicating the IPC type that defines the local and remote cores. For example, IPC_CPU1_L_CPU2_R enum defines CPU1 as the local core and CPU2 as the remote core. This enum shall be used by the CPU1 core to communncate to CPU2 core.
The IPC driver can be configured to include or exclude the message queue support using the macro IPC_MSGQ_SUPPORT. The macro is set to 1 by default and includes message queue support. This feature creates some data structures in the IPC MSG RAM. If the application do not want the IPC message RAM to used by the driver, this macro can be set to 0. Make sure the macro value is the same on C28x and CM side IPC drivers.