Last active
June 4, 2021 13:45
-
-
Save CommitThis/586a564ea56f45c9918d630198008fa0 to your computer and use it in GitHub Desktop.
Device Mapping
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> // for printf debugging | |
struct port_channel | |
{ | |
unsigned int muxaddr; | |
unsigned int muxchannel; | |
unsigned int port_number; | |
}; | |
typedef struct port_channel port_channel_t; | |
#define MUX_ADDR_1 0x74 | |
#define MUX_ADDR_2 0x75 | |
#define MUX_ADDR_3 0x76 | |
#define MUX_ADDR_4 0x77 | |
#define MUX_CHANNEL_0 0 // 0x01 | |
#define MUX_CHANNEL_1 1 // 0x02 | |
#define MUX_CHANNEL_2 2 // 0x04 | |
#define MUX_CHANNEL_3 3 // 0x08 | |
#define MUX_CHANNEL_4 4 // 0x10 | |
#define MUX_CHANNEL_5 5 // 0x20 | |
#define MUX_CHANNEL_6 6 // 0x40 | |
#define MUX_CHANNEL_7 7 // 0x80 | |
#define MAX_FRONT_PORT 64 | |
/* This shouldn't happen unless there is an entry missing */ | |
#define PORT_UNRECOGNISED -2; | |
#define PORT_OUT_OF_BOUNDS -1; | |
#define PORT_OK 0; | |
port_channel_t port_channels[MAX_FRONT_PORT] = | |
{ | |
//1-8 | |
{ MUX_ADDR_1, MUX_CHANNEL_0, 1 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_1, 2 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_2, 3 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_3, 4 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_4, 5 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_5, 6 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_6, 7 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_7, 8 }, | |
//9-16 | |
{ MUX_ADDR_2, MUX_CHANNEL_0, 14 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_1, 13 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_2, 16 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_3, 15 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_4, 10 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_5, 9 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_6, 12 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_7, 11 }, | |
//17-24 | |
{ MUX_ADDR_3, MUX_CHANNEL_0, 17 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_1, 18 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_2, 26 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_3, 25 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_4, 22 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_5, 21 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_6, 24 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_7, 23 }, | |
//25-32 | |
{ MUX_ADDR_4, MUX_CHANNEL_0, 29 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_1, 30 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_2, 27 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_3, 28 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_4, 32 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_5, 31 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_6, 19 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_7, 20 }, | |
//33-40 | |
{ MUX_ADDR_1, MUX_CHANNEL_0, 33 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_1, 34 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_2, 35 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_3, 36 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_4, 37 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_5, 38 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_6, 39 }, | |
{ MUX_ADDR_1, MUX_CHANNEL_7, 40 }, | |
//41-48 | |
{ MUX_ADDR_2, MUX_CHANNEL_0, 47 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_1, 48 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_2, 41 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_3, 42 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_4, 43 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_5, 44 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_6, 45 }, | |
{ MUX_ADDR_2, MUX_CHANNEL_7, 46 }, | |
//49-56 | |
{ MUX_ADDR_3, MUX_CHANNEL_0, 55 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_1, 56 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_2, 53 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_3, 54 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_4, 58 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_5, 57 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_6, 49 }, | |
{ MUX_ADDR_3, MUX_CHANNEL_7, 50 }, | |
//57-64 | |
{ MUX_ADDR_4, MUX_CHANNEL_0, 59 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_1, 60 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_2, 61 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_3, 62 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_4, 63 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_5, 64 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_6, 52 }, | |
{ MUX_ADDR_4, MUX_CHANNEL_7, 51 } | |
}; | |
int get_port_channel(unsigned int port, port_channel_t * device) | |
{ | |
if (port > MAX_FRONT_PORT) | |
{ | |
return PORT_OUT_OF_BOUNDS; | |
} | |
for (int idx = 0ull; idx <= MAX_FRONT_PORT; ++idx) | |
{ | |
if (port_channels[idx].port_number == port) | |
{ | |
*device = port_channels[idx]; | |
return PORT_OK; | |
} | |
} | |
return PORT_UNRECOGNISED; | |
} | |
int main() { | |
/* This seems to be a common pattern in C (declaration without | |
initialisation) and as a C++ dev this irks me. Could add | |
`= {0, 0, 0};` at the end. */ | |
port_channel_t device; | |
int res = 0; | |
for (int port = 0ull; port <= MAX_FRONT_PORT; ++port) { | |
if ((res = get_port_channel(port, &device)) != 0) | |
{ | |
printf("Could not find port %u [err: %d]\n", port, res); | |
/* You may just want to return -1; ONLP may not know how to deal | |
with different return values -- this I don't really know | |
although given this would be called within onlp_i2c_mux_mapping | |
it's entiry up to you. */ | |
return -1; // or res; | |
} | |
printf("Port: %u, mux address: 0x%02x, channel: %u\n", device.port_number, | |
device.muxaddr, device.muxchannel); | |
} | |
} |
You wouldn't use the loop in the function though, in case that's not clear! -- Just for printing results so you can check.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The idea is to replace the switch statement with a separate function. You would call this within
onlp_i2c_mux_mapping
.