MX Foundation 4
Multiprotocol Ports

The MULTI supports 8 transmit channels and 8 receive channels. Each channel can be configured, by software, as ARINC 429, ARINC 717, Serial ASYNC, CSDB, HDLC/SDLC or Discrete. HDLC/SDLC channel needs two channels, one for HDLC/SDLC and another for CLOCK channel.

The MULTI can be configured, by software, the way you want. For example, you could configure it with 2Tx/2Rx ARINC 429, 1Tx/1Rx ARINC 717, 2Tx/2RX Serial ASYNC, 1Tx/1RX CSDB, 1Tx/1Rx HDLC/SDLC.

The eight transmit channels feature MAX Technologies’ proprietary Universal Serial Transmitter (UST) technology. UST channels can output differential waveforms with programmable amplitude, DC level, and slew rate.

All eight of the receive channels feature MAX Technologies’ proprietary Universal Serial Receiver (USR) technology. USR channels have programmable differential input threshold voltages.

It is a good programming practice to avoid relying on the default channel class value and set it to the desired value.

Two techniques are available to configure the channel.

Channel class

Since MXF 4.5.2, it is possible to change the channel class by using mxfAttributeUint64Set().

To configure a channel, set its channel class attribute to the desired protocol.

Initialization callback

An initialization callback set with the mxfSystemInitAttributeUint64CallbackHandler() function can also be used.

MULTI module is not at the same position on all FlexMulti family devices. In a case where the application must handle different FlexMulti family devices, it is possible to get the module type by calling mxfDeviceInfoGet(). Only mxfSystemDeviceGet() and mxfDeviceInfoGet() functions can be called, no other MX Foundation functions can be called from within the callback handler.

The callback is called multiple times, once for each attribute that can be changed at initialization time for each channel/module/device combination.

Here is an example of initialization callback to configure all MULTI channels to ARINC 429 on first device.

uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value);
int main(void)
{
uint32 rc;
HMXF_SERVER server=0;
// Connects to services and initialize environment
rc = mxfServerConnect("10.10.10.138", "admin", "admin", TRUE, &server);
if(rc!=MAXT_SUCCESS)
{
printf("Failed to connect; rc=0x%08x", rc);
getchar();
return 0;
}
// Initializes init callback handler
if (!rc)
rc = mxfSystemInitAttributeUint64CallbackHandler(server, &initHandler);
// Initializes MX Foundation library
if (!rc)
{
printf("Starting ...\n");
rc = mxfSystemInit(server);
}
...
}
uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value)
{
HMXF_DEVICE device;
MXF_DEVICE_INFO deviceInfo;
uint32 rc;
server=server;
if(attrib == KMXF_CHANNEL_CLASS)
{
rc = mxfSystemDeviceGet(server, deviceIndex, &device);
if(!rc)
rc = mxfDeviceInfoGet(device, &deviceInfo);
if(!rc && (deviceInfo.modules[moduleIndex].type == MXF_MODULE_MULTI_EH))
{
// Sets MXF_MODULE_MULTI_EH channels to A429
*value = MXF_CLASS_A429;
return TRUE;
}
}
return FALSE;
}

Here is an example of initialization callback to configure the first MULTI Tx and Rx channel to HDLC/SDLC on first device.

uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value)
{
HMXF_DEVICE device;
MXF_DEVICE_INFO deviceInfo;
uint32 rc;
server=server;
if(attrib == KMXF_CHANNEL_CLASS)
{
rc = mxfSystemDeviceGet(server, deviceIndex, &device);
if(!rc)
rc = mxfDeviceInfoGet(device, &deviceInfo);
if(!rc && (deviceInfo.modules[moduleIndex].type == MXF_MODULE_MULTI_EH))
{
// Sets IPM-MULTI-EH first TX and RX channel to HDLC
// Channel index 0 is first Tx channel, channel index 8 is first Rx channel
if((channelIndex == 0) || (channelIndex == 8))
{
*value = MXF_CLASS_HDLC;
return TRUE;
}
//Sets the TX and RX channel clock
// HDLC Tx channel 0 must have clock at index 4
// HDLC Rx channel 0 must have clock at index 12
else if ((channelIndex == 4) || (channelIndex == 12))
{
*value = MXF_CLASS_CLOCK;
return TRUE;
}
}
}
return FALSE;
}

Here is an example of initialization callback to configure the MULTI with 1Tx/1Rx HDLC/SDLC, 2Tx/2Rx ARINC 429, 1Tx/1Rx ARINC 717, 1Tx/1RX CSDB and 2Tx/2RX Serial ASYNC on first device.

uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value)
{
HMXF_DEVICE device;
MXF_DEVICE_INFO deviceInfo;
uint32 rc;
server=server;
if(attrib == KMXF_CHANNEL_CLASS)
{
rc = mxfSystemDeviceGet(server, deviceIndex, &device);
if(!rc)
rc = mxfDeviceInfoGet(device, &deviceInfo);
if(!rc && (deviceInfo.modules[moduleIndex].type == MXF_MODULE_MULTI_EH))
{
switch(channelIndex)
{
case 0:
case 8:
*value = MXF_CLASS_HDLC;
return TRUE;
case 1:
case 2:
case 9:
case 10:
*value = MXF_CLASS_A429;
return TRUE;
case 3:
case 11:
*value = MXF_CLASS_A717;
return TRUE;
case 4:
case 12:
*value = MXF_CLASS_CLOCK;
return TRUE;
case 5:
case 13:
*value = MXF_CLASS_CSDB;
return TRUE;
case 6:
case 7:
case 14:
case 15:
*value = MXF_CLASS_ASYNC;
return TRUE;
}
}
}
return FALSE;
}
Updated 10/23/2023