Here is the interface to the hardware functionality #define BLOCK_LENGTH UINTMAX_C(16) #define MAX_IO_BUFFER_SIZE UINTMAX_C(2048) int foo(uint8_t output_param[MAX_IO_BUFFER_SIZE], const uint8_t input_param[MAX_IO_BUFFER_SIZE], uint32_t length, const uint8_t config1[16], const enum_t type, uint8_t const config2[BLOCK_LENGTH]); Here is a snippet from the main. int main(int argc, char* argv[]) { uint8_t output[MAX_IO_BUFFER_SIZE] = {0}; uint8_t input[MAX_IO_BUFFER_SIZE] = {0}; uint32_t length = BLOCK_LENGTH; uint8_t config_1[16] = {0}; uint8_t config_2[BLOCK_LENGTH] = {0}; ... memcpys to init arrays ... (void)foo(output, input, length, config_1, TYPE_0, config_1); return 0; }