From 9a696571f65fe181ccf858c80ad3a57b54d7a943 Mon Sep 17 00:00:00 2001 From: Matthew GONG Date: Wed, 18 Mar 2020 15:35:47 +0800 Subject: [PATCH] new navram api --- hal_api_nvram.slx | Bin 0 -> 28199 bytes hal_api_nvram_bld.slx | Bin 0 -> 26164 bytes hal_nvram_cancel.c | 253 ++++++++++++++++++ hal_nvram_cancel.mexw64 | Bin 0 -> 20480 bytes hal_nvram_cancel.tlc | 70 +++++ hal_nvram_read.c | 304 ++++++++++++++++++++++ hal_nvram_read.mexw64 | Bin 0 -> 20480 bytes hal_nvram_read.tlc | 76 ++++++ hal_nvram_write.c | 380 ++++++++++++++++++++++++++++ hal_nvram_write.mexw64 | Bin 0 -> 21504 bytes hal_nvram_write.tlc | 76 ++++++ hal_template.slx | Bin 30294 -> 33913 bytes template/hal_nvram_cancel_wrapper.c | 78 ++++++ template/hal_nvram_read_wrapper.c | 97 +++++++ template/hal_nvram_write_wrapper.c | 92 +++++++ 15 files changed, 1426 insertions(+) create mode 100644 hal_api_nvram.slx create mode 100644 hal_api_nvram_bld.slx create mode 100644 hal_nvram_cancel.c create mode 100644 hal_nvram_cancel.mexw64 create mode 100644 hal_nvram_cancel.tlc create mode 100644 hal_nvram_read.c create mode 100644 hal_nvram_read.mexw64 create mode 100644 hal_nvram_read.tlc create mode 100644 hal_nvram_write.c create mode 100644 hal_nvram_write.mexw64 create mode 100644 hal_nvram_write.tlc create mode 100644 template/hal_nvram_cancel_wrapper.c create mode 100644 template/hal_nvram_read_wrapper.c create mode 100644 template/hal_nvram_write_wrapper.c diff --git a/hal_api_nvram.slx b/hal_api_nvram.slx new file mode 100644 index 0000000000000000000000000000000000000000..5dab355e738b2f5dc487836b8791eb2a8adb5a6e GIT binary patch literal 28199 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 literal 0 HcmV?d00001 diff --git a/hal_nvram_cancel.c b/hal_nvram_cancel.c new file mode 100644 index 0000000..109436f --- /dev/null +++ b/hal_nvram_cancel.c @@ -0,0 +1,253 @@ +/* + * File: hal_nvram_cancel.c + * + * + * --- THIS FILE GENERATED BY S-FUNCTION BUILDER: 3.0 --- + * + * This file is an S-function produced by the S-Function + * Builder which only recognizes certain fields. Changes made + * outside these fields will be lost the next time the block is + * used to load, edit, and resave this file. This file will be overwritten + * by the S-function Builder block. If you want to edit this file by hand, + * you must change it only in the area defined as: + * + * %%%-SFUNWIZ_defines_Changes_BEGIN + * #define NAME 'replacement text' + * %%% SFUNWIZ_defines_Changes_END + * + * DO NOT change NAME--Change the 'replacement text' only. + * + * For better compatibility with the Simulink Coder, the + * "wrapper" S-function technique is used. This is discussed + * in the Simulink Coder's Manual in the Chapter titled, + * "Wrapper S-functions". + * + * ------------------------------------------------------------------------- + * | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template | + * ------------------------------------------------------------------------- + * + * Created: Wed Mar 18 14:21:46 2020 + */ + +#define S_FUNCTION_LEVEL 2 +#define S_FUNCTION_NAME hal_nvram_cancel +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +/* %%%-SFUNWIZ_defines_Changes_BEGIN --- EDIT HERE TO _END */ +#define NUM_INPUTS 2 +/* Input Port 0 */ +#define IN_PORT_0_NAME nvram_id +#define INPUT_0_WIDTH 1 +#define INPUT_DIMS_0_COL 1 +#define INPUT_0_DTYPE uint8_T +#define INPUT_0_COMPLEX COMPLEX_NO +#define IN_0_FRAME_BASED FRAME_NO +#define IN_0_BUS_BASED 0 +#define IN_0_BUS_NAME +#define IN_0_DIMS 1-D +#define INPUT_0_FEEDTHROUGH 1 +#define IN_0_ISSIGNED 0 +#define IN_0_WORDLENGTH 8 +#define IN_0_FIXPOINTSCALING 1 +#define IN_0_FRACTIONLENGTH 9 +#define IN_0_BIAS 0 +#define IN_0_SLOPE 0.125 +/* Input Port 1 */ +#define IN_PORT_1_NAME address +#define INPUT_1_WIDTH 1 +#define INPUT_DIMS_1_COL 1 +#define INPUT_1_DTYPE uint32_T +#define INPUT_1_COMPLEX COMPLEX_NO +#define IN_1_FRAME_BASED FRAME_NO +#define IN_1_BUS_BASED 0 +#define IN_1_BUS_NAME +#define IN_1_DIMS 1-D +#define INPUT_1_FEEDTHROUGH 1 +#define IN_1_ISSIGNED 0 +#define IN_1_WORDLENGTH 8 +#define IN_1_FIXPOINTSCALING 1 +#define IN_1_FRACTIONLENGTH 9 +#define IN_1_BIAS 0 +#define IN_1_SLOPE 0.125 + +#define NUM_OUTPUTS 1 +/* Output Port 0 */ +#define OUT_PORT_0_NAME ErrorCode +#define OUTPUT_0_WIDTH 1 +#define OUTPUT_DIMS_0_COL 1 +#define OUTPUT_0_DTYPE int32_T +#define OUTPUT_0_COMPLEX COMPLEX_NO +#define OUT_0_FRAME_BASED FRAME_NO +#define OUT_0_BUS_BASED 0 +#define OUT_0_BUS_NAME +#define OUT_0_DIMS 1-D +#define OUT_0_ISSIGNED 1 +#define OUT_0_WORDLENGTH 8 +#define OUT_0_FIXPOINTSCALING 1 +#define OUT_0_FRACTIONLENGTH 3 +#define OUT_0_BIAS 0 +#define OUT_0_SLOPE 0.125 + +#define NPARAMS 0 + +#define SAMPLE_TIME_0 INHERITED_SAMPLE_TIME +#define NUM_DISC_STATES 0 +#define DISC_STATES_IC [0] +#define NUM_CONT_STATES 0 +#define CONT_STATES_IC [0] + +#define SFUNWIZ_GENERATE_TLC 1 +#define SOURCEFILES "__SFB__" +#define PANELINDEX 8 +#define USE_SIMSTRUCT 0 +#define SHOW_COMPILE_STEPS 0 +#define CREATE_DEBUG_MEXFILE 0 +#define SAVE_CODE_ONLY 0 +#define SFUNWIZ_REVISION 3.0 +/* %%%-SFUNWIZ_defines_Changes_END --- EDIT HERE TO _BEGIN */ +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +#include "simstruc.h" + + +extern void hal_nvram_cancel_Start_wrapper(void); +extern void hal_nvram_cancel_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + int32_T *ErrorCode); +/*====================* + * S-function methods * + *====================*/ +/* Function: mdlInitializeSizes =============================================== + * Abstract: + * Setup sizes of the various vectors. + */ +static void mdlInitializeSizes(SimStruct *S) +{ + + DECL_AND_INIT_DIMSINFO(inputDimsInfo); + DECL_AND_INIT_DIMSINFO(outputDimsInfo); + ssSetNumSFcnParams(S, NPARAMS); + if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { + return; /* Parameter mismatch will be reported by Simulink */ + } + + ssSetArrayLayoutForCodeGen(S, SS_COLUMN_MAJOR); + + ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE); + + ssSetNumContStates(S, NUM_CONT_STATES); + ssSetNumDiscStates(S, NUM_DISC_STATES); + + + if (!ssSetNumInputPorts(S, NUM_INPUTS)) return; + /* Input Port 0 */ + ssSetInputPortWidth(S, 0, INPUT_0_WIDTH); + ssSetInputPortDataType(S, 0, SS_UINT8); + ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/ + + /* Input Port 1 */ + ssSetInputPortWidth(S, 1, INPUT_1_WIDTH); + ssSetInputPortDataType(S, 1, SS_UINT32); + ssSetInputPortComplexSignal(S, 1, INPUT_1_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 1, INPUT_1_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 1, 1); /*direct input signal access*/ + + + if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return; + ssSetOutputPortWidth(S, 0, OUTPUT_0_WIDTH); + ssSetOutputPortDataType(S, 0, SS_INT32); + ssSetOutputPortComplexSignal(S, 0, OUTPUT_0_COMPLEX); + ssSetNumPWork(S, 0); + + ssSetNumSampleTimes(S, 1); + ssSetNumRWork(S, 0); + ssSetNumIWork(S, 0); + ssSetNumModes(S, 0); + ssSetNumNonsampledZCs(S, 0); + + ssSetSimulinkVersionGeneratedIn(S, "9.2"); + + /* Take care when specifying exception free code - see sfuntmpl_doc.c */ + ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | + SS_OPTION_USE_TLC_WITH_ACCELERATOR | + SS_OPTION_WORKS_WITH_CODE_REUSE)); +} + +/* Function: mdlInitializeSampleTimes ========================================= + * Abstract: + * Specifiy the sample time. + */ +static void mdlInitializeSampleTimes(SimStruct *S) +{ + ssSetSampleTime(S, 0, SAMPLE_TIME_0); + ssSetModelReferenceSampleTimeDefaultInheritance(S); + ssSetOffsetTime(S, 0, 0.0); +} + +#define MDL_SET_INPUT_PORT_DATA_TYPE +static void mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetInputPortDataType(S, 0, dType); +} + +#define MDL_SET_OUTPUT_PORT_DATA_TYPE +static void mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetOutputPortDataType(S, 0, dType); +} + +#define MDL_SET_DEFAULT_PORT_DATA_TYPES +static void mdlSetDefaultPortDataTypes(SimStruct *S) +{ + ssSetInputPortDataType(S, 0, SS_DOUBLE); + ssSetOutputPortDataType(S, 0, SS_DOUBLE); +} + +#define MDL_START /* Change to #undef to remove function */ +#if defined(MDL_START) +/* Function: mdlStart ======================================================= + * Abstract: + * This function is called once at start of model execution. If you + * have states that should be initialized once, this is the place + * to do it. + */ +static void mdlStart(SimStruct *S) +{ + + hal_nvram_cancel_Start_wrapper(); +} +#endif /* MDL_START */ + +/* Function: mdlOutputs ======================================================= + * + */ +static void mdlOutputs(SimStruct *S, int_T tid) +{ + const uint8_T *nvram_id = (uint8_T *) ssGetInputPortRealSignal(S, 0); + const uint32_T *address = (uint32_T *) ssGetInputPortRealSignal(S, 1); + int32_T *ErrorCode = (int32_T *) ssGetOutputPortRealSignal(S, 0); + + hal_nvram_cancel_Outputs_wrapper(nvram_id, address, ErrorCode); + +} + +/* Function: mdlTerminate ===================================================== + * Abstract: + * In this function, you should perform any actions that are necessary + * at the termination of a simulation. For example, if memory was + * allocated in mdlStart, this is the place to free it. + */ +static void mdlTerminate(SimStruct *S) +{ + +} + + +#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ +#include "simulink.c" /* MEX-file interface mechanism */ +#else +#include "cg_sfun.h" /* Code generation registration function */ +#endif + + + diff --git a/hal_nvram_cancel.mexw64 b/hal_nvram_cancel.mexw64 new file mode 100644 index 0000000000000000000000000000000000000000..547d56c8d65eac679f490eaa4121c681ae1b14ce GIT binary patch literal 20480 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 F{3oEGh*tmr literal 0 HcmV?d00001 diff --git a/hal_nvram_cancel.tlc b/hal_nvram_cancel.tlc new file mode 100644 index 0000000..f8ea819 --- /dev/null +++ b/hal_nvram_cancel.tlc @@ -0,0 +1,70 @@ +%% File : hal_nvram_cancel.tlc +%% Created : Wed Mar 18 14:21:46 2020 +%% +%% Description: +%% Simulink Coder wrapper functions interface generated for +%% S-function "hal_nvram_cancel.c". +%% +%% File generated by S-function Builder Block +%% +%% For more information on using the Target Language with the +%% Simulink Coder, see the Target Language Compiler manual +%% (under Simulink Coder) in the "Inlining S-Functions" +%% chapter under the section and subsection: +%% "Writing Block Target Files to Inline S-Functions", +%% "Function-Based or Wrappered Code". +%% +%implements hal_nvram_cancel "C" +%% Function: BlockTypeSetup =================================================== +%% +%% Purpose: +%% Set up external references for wrapper functions in the +%% generated code. +%% +%function BlockTypeSetup(block, system) Output + %openfile externs + + #ifdef __cplusplus + extern "C" { + #endif + + extern void hal_nvram_cancel_Start_wrapper(void); + + extern void hal_nvram_cancel_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + int32_T *ErrorCode); + + extern void hal_nvram_cancel_Terminate_wrapper(void); + + #ifdef __cplusplus + } + #endif + %closefile externs + % + %% +%endfunction + + +%% Function: Start ============================================================ +%% +%function Start(block, system) Output + /* % Block: % */ + hal_nvram_cancel_Start_wrapper(); +%endfunction +%% Function: Outputs ========================================================== +%% +%% Purpose: +%% Code generation rules for mdlOutputs function. +%% +%function Outputs(block, system) Output + %% + %assign pu0 = LibBlockInputSignalAddr(0, "", "", 0) + %assign pu1 = LibBlockInputSignalAddr(1, "", "", 0) + %assign py0 = LibBlockOutputSignalAddr(0, "", "", 0) + hal_nvram_cancel_Outputs_wrapper(%, %, %); + %% +%endfunction + + +%% [EOF] hal_nvram_cancel.tlc + diff --git a/hal_nvram_read.c b/hal_nvram_read.c new file mode 100644 index 0000000..3742d79 --- /dev/null +++ b/hal_nvram_read.c @@ -0,0 +1,304 @@ +/* + * File: hal_nvram_read.c + * + * + * --- THIS FILE GENERATED BY S-FUNCTION BUILDER: 3.0 --- + * + * This file is an S-function produced by the S-Function + * Builder which only recognizes certain fields. Changes made + * outside these fields will be lost the next time the block is + * used to load, edit, and resave this file. This file will be overwritten + * by the S-function Builder block. If you want to edit this file by hand, + * you must change it only in the area defined as: + * + * %%%-SFUNWIZ_defines_Changes_BEGIN + * #define NAME 'replacement text' + * %%% SFUNWIZ_defines_Changes_END + * + * DO NOT change NAME--Change the 'replacement text' only. + * + * For better compatibility with the Simulink Coder, the + * "wrapper" S-function technique is used. This is discussed + * in the Simulink Coder's Manual in the Chapter titled, + * "Wrapper S-functions". + * + * ------------------------------------------------------------------------- + * | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template | + * ------------------------------------------------------------------------- + * + * Created: Wed Mar 18 13:56:54 2020 + */ + +#define S_FUNCTION_LEVEL 2 +#define S_FUNCTION_NAME hal_nvram_read +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +/* %%%-SFUNWIZ_defines_Changes_BEGIN --- EDIT HERE TO _END */ +#define NUM_INPUTS 3 +/* Input Port 0 */ +#define IN_PORT_0_NAME nvram_id +#define INPUT_0_WIDTH 1 +#define INPUT_DIMS_0_COL 1 +#define INPUT_0_DTYPE uint8_T +#define INPUT_0_COMPLEX COMPLEX_NO +#define IN_0_FRAME_BASED FRAME_NO +#define IN_0_BUS_BASED 0 +#define IN_0_BUS_NAME +#define IN_0_DIMS 1-D +#define INPUT_0_FEEDTHROUGH 1 +#define IN_0_ISSIGNED 0 +#define IN_0_WORDLENGTH 8 +#define IN_0_FIXPOINTSCALING 1 +#define IN_0_FRACTIONLENGTH 9 +#define IN_0_BIAS 0 +#define IN_0_SLOPE 0.125 +/* Input Port 1 */ +#define IN_PORT_1_NAME address +#define INPUT_1_WIDTH 1 +#define INPUT_DIMS_1_COL 1 +#define INPUT_1_DTYPE uint32_T +#define INPUT_1_COMPLEX COMPLEX_NO +#define IN_1_FRAME_BASED FRAME_NO +#define IN_1_BUS_BASED 0 +#define IN_1_BUS_NAME +#define IN_1_DIMS 1-D +#define INPUT_1_FEEDTHROUGH 1 +#define IN_1_ISSIGNED 0 +#define IN_1_WORDLENGTH 8 +#define IN_1_FIXPOINTSCALING 1 +#define IN_1_FRACTIONLENGTH 9 +#define IN_1_BIAS 0 +#define IN_1_SLOPE 0.125 +/* Input Port 2 */ +#define IN_PORT_2_NAME read_len +#define INPUT_2_WIDTH 1 +#define INPUT_DIMS_2_COL 1 +#define INPUT_2_DTYPE uint16_T +#define INPUT_2_COMPLEX COMPLEX_NO +#define IN_2_FRAME_BASED FRAME_NO +#define IN_2_BUS_BASED 0 +#define IN_2_BUS_NAME +#define IN_2_DIMS 1-D +#define INPUT_2_FEEDTHROUGH 1 +#define IN_2_ISSIGNED 0 +#define IN_2_WORDLENGTH 8 +#define IN_2_FIXPOINTSCALING 1 +#define IN_2_FRACTIONLENGTH 9 +#define IN_2_BIAS 0 +#define IN_2_SLOPE 0.125 + +#define NUM_OUTPUTS 2 +/* Output Port 0 */ +#define OUT_PORT_0_NAME buffer +#define OUTPUT_0_WIDTH DYNAMICALLY_SIZED +#define OUTPUT_DIMS_0_COL 1 +#define OUTPUT_0_DTYPE uint8_T +#define OUTPUT_0_COMPLEX COMPLEX_NO +#define OUT_0_FRAME_BASED FRAME_NO +#define OUT_0_BUS_BASED 0 +#define OUT_0_BUS_NAME +#define OUT_0_DIMS 1-D +#define OUT_0_ISSIGNED 1 +#define OUT_0_WORDLENGTH 8 +#define OUT_0_FIXPOINTSCALING 1 +#define OUT_0_FRACTIONLENGTH 3 +#define OUT_0_BIAS 0 +#define OUT_0_SLOPE 0.125 +/* Output Port 1 */ +#define OUT_PORT_1_NAME ErrorCode +#define OUTPUT_1_WIDTH 1 +#define OUTPUT_DIMS_1_COL 1 +#define OUTPUT_1_DTYPE int32_T +#define OUTPUT_1_COMPLEX COMPLEX_NO +#define OUT_1_FRAME_BASED FRAME_NO +#define OUT_1_BUS_BASED 0 +#define OUT_1_BUS_NAME +#define OUT_1_DIMS 1-D +#define OUT_1_ISSIGNED 1 +#define OUT_1_WORDLENGTH 8 +#define OUT_1_FIXPOINTSCALING 1 +#define OUT_1_FRACTIONLENGTH 3 +#define OUT_1_BIAS 0 +#define OUT_1_SLOPE 0.125 + +#define NPARAMS 0 + +#define SAMPLE_TIME_0 INHERITED_SAMPLE_TIME +#define NUM_DISC_STATES 0 +#define DISC_STATES_IC [0] +#define NUM_CONT_STATES 0 +#define CONT_STATES_IC [0] + +#define SFUNWIZ_GENERATE_TLC 1 +#define SOURCEFILES "__SFB__" +#define PANELINDEX 8 +#define USE_SIMSTRUCT 0 +#define SHOW_COMPILE_STEPS 0 +#define CREATE_DEBUG_MEXFILE 0 +#define SAVE_CODE_ONLY 0 +#define SFUNWIZ_REVISION 3.0 +/* %%%-SFUNWIZ_defines_Changes_END --- EDIT HERE TO _BEGIN */ +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +#include "simstruc.h" + + +extern void hal_nvram_read_Start_wrapper(void); +extern void hal_nvram_read_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *read_len, + uint8_T *buffer, + int32_T *ErrorCode, + const int_T y_width); +/*====================* + * S-function methods * + *====================*/ +/* Function: mdlInitializeSizes =============================================== + * Abstract: + * Setup sizes of the various vectors. + */ +static void mdlInitializeSizes(SimStruct *S) +{ + + DECL_AND_INIT_DIMSINFO(inputDimsInfo); + DECL_AND_INIT_DIMSINFO(outputDimsInfo); + ssSetNumSFcnParams(S, NPARAMS); + if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { + return; /* Parameter mismatch will be reported by Simulink */ + } + + ssSetArrayLayoutForCodeGen(S, SS_COLUMN_MAJOR); + + ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE); + + ssSetNumContStates(S, NUM_CONT_STATES); + ssSetNumDiscStates(S, NUM_DISC_STATES); + + + if (!ssSetNumInputPorts(S, NUM_INPUTS)) return; + /* Input Port 0 */ + ssSetInputPortWidth(S, 0, INPUT_0_WIDTH); + ssSetInputPortDataType(S, 0, SS_UINT8); + ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/ + + /* Input Port 1 */ + ssSetInputPortWidth(S, 1, INPUT_1_WIDTH); + ssSetInputPortDataType(S, 1, SS_UINT32); + ssSetInputPortComplexSignal(S, 1, INPUT_1_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 1, INPUT_1_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 1, 1); /*direct input signal access*/ + + /* Input Port 2 */ + ssSetInputPortWidth(S, 2, INPUT_2_WIDTH); + ssSetInputPortDataType(S, 2, SS_UINT16); + ssSetInputPortComplexSignal(S, 2, INPUT_2_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 2, INPUT_2_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 2, 1); /*direct input signal access*/ + + + if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return; + /* Output Port 0 */ + ssSetOutputPortWidth(S, 0, OUTPUT_0_WIDTH); + ssSetOutputPortDataType(S, 0, SS_UINT8); + ssSetOutputPortComplexSignal(S, 0, OUTPUT_0_COMPLEX); + /* Output Port 1 */ + ssSetOutputPortWidth(S, 1, OUTPUT_1_WIDTH); + ssSetOutputPortDataType(S, 1, SS_INT32); + ssSetOutputPortComplexSignal(S, 1, OUTPUT_1_COMPLEX); + ssSetNumPWork(S, 0); + + ssSetNumSampleTimes(S, 1); + ssSetNumRWork(S, 0); + ssSetNumIWork(S, 0); + ssSetNumModes(S, 0); + ssSetNumNonsampledZCs(S, 0); + + ssSetSimulinkVersionGeneratedIn(S, "9.2"); + + /* Take care when specifying exception free code - see sfuntmpl_doc.c */ + ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | + SS_OPTION_USE_TLC_WITH_ACCELERATOR | + SS_OPTION_WORKS_WITH_CODE_REUSE)); +} + +/* Function: mdlInitializeSampleTimes ========================================= + * Abstract: + * Specifiy the sample time. + */ +static void mdlInitializeSampleTimes(SimStruct *S) +{ + ssSetSampleTime(S, 0, SAMPLE_TIME_0); + ssSetModelReferenceSampleTimeDefaultInheritance(S); + ssSetOffsetTime(S, 0, 0.0); +} + +#define MDL_SET_INPUT_PORT_DATA_TYPE +static void mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetInputPortDataType(S, 0, dType); +} + +#define MDL_SET_OUTPUT_PORT_DATA_TYPE +static void mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetOutputPortDataType(S, 0, dType); +} + +#define MDL_SET_DEFAULT_PORT_DATA_TYPES +static void mdlSetDefaultPortDataTypes(SimStruct *S) +{ + ssSetInputPortDataType(S, 0, SS_DOUBLE); + ssSetOutputPortDataType(S, 0, SS_DOUBLE); +} + +#define MDL_START /* Change to #undef to remove function */ +#if defined(MDL_START) +/* Function: mdlStart ======================================================= + * Abstract: + * This function is called once at start of model execution. If you + * have states that should be initialized once, this is the place + * to do it. + */ +static void mdlStart(SimStruct *S) +{ + + hal_nvram_read_Start_wrapper(); +} +#endif /* MDL_START */ + +/* Function: mdlOutputs ======================================================= + * + */ +static void mdlOutputs(SimStruct *S, int_T tid) +{ + const uint8_T *nvram_id = (uint8_T *) ssGetInputPortRealSignal(S, 0); + const uint32_T *address = (uint32_T *) ssGetInputPortRealSignal(S, 1); + const uint16_T *read_len = (uint16_T *) ssGetInputPortRealSignal(S, 2); + uint8_T *buffer = (uint8_T *) ssGetOutputPortRealSignal(S, 0); + int32_T *ErrorCode = (int32_T *) ssGetOutputPortRealSignal(S, 1); + const int_T y_width = ssGetOutputPortWidth(S, 0); + + hal_nvram_read_Outputs_wrapper(nvram_id, address, read_len, buffer, ErrorCode, y_width); + +} + +/* Function: mdlTerminate ===================================================== + * Abstract: + * In this function, you should perform any actions that are necessary + * at the termination of a simulation. For example, if memory was + * allocated in mdlStart, this is the place to free it. + */ +static void mdlTerminate(SimStruct *S) +{ + +} + + +#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ +#include "simulink.c" /* MEX-file interface mechanism */ +#else +#include "cg_sfun.h" /* Code generation registration function */ +#endif + + + diff --git a/hal_nvram_read.mexw64 b/hal_nvram_read.mexw64 new file mode 100644 index 0000000000000000000000000000000000000000..e9415d7d2b786ad61025bb41e01c2a7f99bf70e3 GIT binary patch literal 20480 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%0AyPg{jzuA|Lw#WbJed!rvb1TK+{#x{TYI7@M z8F*bkQrMYb>lg6WvS0C>7MQW`t6b>ce^gTy0hW$b2{v4!r_>+X(Bvt1BYbbIz7`7` z%NRqetaUfJ1B_i6$7BDASf8;b?}p~q!n&p=_8@sQsa5W%aygc+^@@!*ZMXxQ2hQVB znb=}*HP^PZ(dtoMT~Zyy_QG55t*vf!`|20wWPY& z(n%iQMsL9Hqs=$|BfuyQKXy`Hv08M)(%6YHY;_yZ9Mq#x>b2cH%VpJ`R!?n6^ynnD z&`jtO5UbH&5X7b<#}f<_$K2-N+)ZBJT+rvjbYB15rg?Mc%~g$Z9-TTakzuR^{6`28 zo0LSBCsJ04O(pIY5q2o?W9N(iL-22ebNT&uhFbJFt;{C|(6i4FWsNr=hTKi7eNYU0 z`X3rs`_wM3D{HOww9vkE88I-@A%=8z}QR^bWM`vc8xUoBdJR>Ivf&zJ73V_6B-smO~uyAxw@ZNb4M>Rxs2)W{0^;GX3WMUSXg8w&y*w_vj!bC`FK z&IDYgr3V3@y%>0kr2!S(!$?zn@&fiV2a)avoQ+t8;%$lwaOqsc=)?oK5OLlvq!$Cy|6#F$pWq?f>yYjTOu0(cnc%Cq z`@w${(1{i2DAF##PTW-2R={VpG{M7K`W3*>v^2pf^HlyUzz}Y#w-s==h9~%pmL_N{ zR&_7|9>$#o{#O9$qlJ^up#^X!Zn7=G-)iX?pc%UfZgarPag&|}fUn?QOmYCvX!uL8 z`@0r5@z?=7vFi|!-U>K?n{4t5;LK~)bOGRp3-HY;@HlVgF?lP}w8x})y9N3Xq?nr0 z1SvM|MVjEW>lm8^{%@|o9}B=e*mB$}a8LaEY1TI_8K(tOIKKhWDE52^`Ss#Dp4N6u zh3Dbv6Bhxrbvy8FI~MzQ)B5zUzXujh<$AaBj1=7Vnb$ z_2OKF(AT+x&4nB1#f1@;;S`HZlvdUsQhj(D$%%N|`gEgTSH&BR;&|Di+4K4eM}?!b)VXr` tx^-IO>*Q(wO?}?}$ks>p?C#pV;IWFw);$J94d!|Pwu>I$Tz{_?_}?Sixsm_? literal 0 HcmV?d00001 diff --git a/hal_nvram_read.tlc b/hal_nvram_read.tlc new file mode 100644 index 0000000..8435752 --- /dev/null +++ b/hal_nvram_read.tlc @@ -0,0 +1,76 @@ +%% File : hal_nvram_read.tlc +%% Created : Wed Mar 18 13:56:54 2020 +%% +%% Description: +%% Simulink Coder wrapper functions interface generated for +%% S-function "hal_nvram_read.c". +%% +%% File generated by S-function Builder Block +%% +%% For more information on using the Target Language with the +%% Simulink Coder, see the Target Language Compiler manual +%% (under Simulink Coder) in the "Inlining S-Functions" +%% chapter under the section and subsection: +%% "Writing Block Target Files to Inline S-Functions", +%% "Function-Based or Wrappered Code". +%% +%implements hal_nvram_read "C" +%% Function: BlockTypeSetup =================================================== +%% +%% Purpose: +%% Set up external references for wrapper functions in the +%% generated code. +%% +%function BlockTypeSetup(block, system) Output + %openfile externs + + #ifdef __cplusplus + extern "C" { + #endif + + extern void hal_nvram_read_Start_wrapper(void); + + extern void hal_nvram_read_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *read_len, + uint8_T *buffer, + int32_T *ErrorCode, + const int_T y_width); + + extern void hal_nvram_read_Terminate_wrapper(void); + + #ifdef __cplusplus + } + #endif + %closefile externs + % + %% +%endfunction + + +%% Function: Start ============================================================ +%% +%function Start(block, system) Output + /* % Block: % */ + hal_nvram_read_Start_wrapper(); +%endfunction +%% Function: Outputs ========================================================== +%% +%% Purpose: +%% Code generation rules for mdlOutputs function. +%% +%function Outputs(block, system) Output + %% + %assign pu0 = LibBlockInputSignalAddr(0, "", "", 0) + %assign pu1 = LibBlockInputSignalAddr(1, "", "", 0) + %assign pu2 = LibBlockInputSignalAddr(2, "", "", 0) + %assign py0 = LibBlockOutputSignalAddr(0, "", "", 0) + %assign py1 = LibBlockOutputSignalAddr(1, "", "", 0) + %assign py_width = LibBlockOutputSignalWidth(0) + hal_nvram_read_Outputs_wrapper(%, %, %, %, %, %); + %% +%endfunction + + +%% [EOF] hal_nvram_read.tlc + diff --git a/hal_nvram_write.c b/hal_nvram_write.c new file mode 100644 index 0000000..e2b3dd1 --- /dev/null +++ b/hal_nvram_write.c @@ -0,0 +1,380 @@ +/* + * File: hal_nvram_write.c + * + * + * --- THIS FILE GENERATED BY S-FUNCTION BUILDER: 3.0 --- + * + * This file is an S-function produced by the S-Function + * Builder which only recognizes certain fields. Changes made + * outside these fields will be lost the next time the block is + * used to load, edit, and resave this file. This file will be overwritten + * by the S-function Builder block. If you want to edit this file by hand, + * you must change it only in the area defined as: + * + * %%%-SFUNWIZ_defines_Changes_BEGIN + * #define NAME 'replacement text' + * %%% SFUNWIZ_defines_Changes_END + * + * DO NOT change NAME--Change the 'replacement text' only. + * + * For better compatibility with the Simulink Coder, the + * "wrapper" S-function technique is used. This is discussed + * in the Simulink Coder's Manual in the Chapter titled, + * "Wrapper S-functions". + * + * ------------------------------------------------------------------------- + * | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template | + * ------------------------------------------------------------------------- + * + * Created: Wed Mar 18 14:08:03 2020 + */ + +#define S_FUNCTION_LEVEL 2 +#define S_FUNCTION_NAME hal_nvram_write +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +/* %%%-SFUNWIZ_defines_Changes_BEGIN --- EDIT HERE TO _END */ +#define NUM_INPUTS 4 +/* Input Port 0 */ +#define IN_PORT_0_NAME buffer +#define INPUT_0_WIDTH DYNAMICALLY_SIZED +#define INPUT_DIMS_0_COL 1 +#define INPUT_0_DTYPE uint8_T +#define INPUT_0_COMPLEX COMPLEX_NO +#define IN_0_FRAME_BASED FRAME_NO +#define IN_0_BUS_BASED 0 +#define IN_0_BUS_NAME +#define IN_0_DIMS 1-D +#define INPUT_0_FEEDTHROUGH 1 +#define IN_0_ISSIGNED 0 +#define IN_0_WORDLENGTH 8 +#define IN_0_FIXPOINTSCALING 1 +#define IN_0_FRACTIONLENGTH 9 +#define IN_0_BIAS 0 +#define IN_0_SLOPE 0.125 +/* Input Port 1 */ +#define IN_PORT_1_NAME nvram_id +#define INPUT_1_WIDTH 1 +#define INPUT_DIMS_1_COL 1 +#define INPUT_1_DTYPE uint8_T +#define INPUT_1_COMPLEX COMPLEX_NO +#define IN_1_FRAME_BASED FRAME_NO +#define IN_1_BUS_BASED 0 +#define IN_1_BUS_NAME +#define IN_1_DIMS 1-D +#define INPUT_1_FEEDTHROUGH 1 +#define IN_1_ISSIGNED 0 +#define IN_1_WORDLENGTH 8 +#define IN_1_FIXPOINTSCALING 1 +#define IN_1_FRACTIONLENGTH 9 +#define IN_1_BIAS 0 +#define IN_1_SLOPE 0.125 +/* Input Port 2 */ +#define IN_PORT_2_NAME address +#define INPUT_2_WIDTH 1 +#define INPUT_DIMS_2_COL 1 +#define INPUT_2_DTYPE uint32_T +#define INPUT_2_COMPLEX COMPLEX_NO +#define IN_2_FRAME_BASED FRAME_NO +#define IN_2_BUS_BASED 0 +#define IN_2_BUS_NAME +#define IN_2_DIMS 1-D +#define INPUT_2_FEEDTHROUGH 1 +#define IN_2_ISSIGNED 0 +#define IN_2_WORDLENGTH 8 +#define IN_2_FIXPOINTSCALING 1 +#define IN_2_FRACTIONLENGTH 9 +#define IN_2_BIAS 0 +#define IN_2_SLOPE 0.125 +/* Input Port 3 */ +#define IN_PORT_3_NAME write_len +#define INPUT_3_WIDTH 1 +#define INPUT_DIMS_3_COL 1 +#define INPUT_3_DTYPE uint16_T +#define INPUT_3_COMPLEX COMPLEX_NO +#define IN_3_FRAME_BASED FRAME_NO +#define IN_3_BUS_BASED 0 +#define IN_3_BUS_NAME +#define IN_3_DIMS 1-D +#define INPUT_3_FEEDTHROUGH 1 +#define IN_3_ISSIGNED 0 +#define IN_3_WORDLENGTH 8 +#define IN_3_FIXPOINTSCALING 1 +#define IN_3_FRACTIONLENGTH 9 +#define IN_3_BIAS 0 +#define IN_3_SLOPE 0.125 + +#define NUM_OUTPUTS 1 +/* Output Port 0 */ +#define OUT_PORT_0_NAME ErrorCode +#define OUTPUT_0_WIDTH 1 +#define OUTPUT_DIMS_0_COL 1 +#define OUTPUT_0_DTYPE int32_T +#define OUTPUT_0_COMPLEX COMPLEX_NO +#define OUT_0_FRAME_BASED FRAME_NO +#define OUT_0_BUS_BASED 0 +#define OUT_0_BUS_NAME +#define OUT_0_DIMS 1-D +#define OUT_0_ISSIGNED 1 +#define OUT_0_WORDLENGTH 8 +#define OUT_0_FIXPOINTSCALING 1 +#define OUT_0_FRACTIONLENGTH 3 +#define OUT_0_BIAS 0 +#define OUT_0_SLOPE 0.125 + +#define NPARAMS 0 + +#define SAMPLE_TIME_0 INHERITED_SAMPLE_TIME +#define NUM_DISC_STATES 0 +#define DISC_STATES_IC [0] +#define NUM_CONT_STATES 0 +#define CONT_STATES_IC [0] + +#define SFUNWIZ_GENERATE_TLC 1 +#define SOURCEFILES "__SFB__" +#define PANELINDEX 8 +#define USE_SIMSTRUCT 0 +#define SHOW_COMPILE_STEPS 0 +#define CREATE_DEBUG_MEXFILE 0 +#define SAVE_CODE_ONLY 0 +#define SFUNWIZ_REVISION 3.0 +/* %%%-SFUNWIZ_defines_Changes_END --- EDIT HERE TO _BEGIN */ +/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ +#include "simstruc.h" + + +extern void hal_nvram_write_Start_wrapper(void); +extern void hal_nvram_write_Outputs_wrapper(const uint8_T *buffer, + const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *write_len, + int32_T *ErrorCode, + const int_T u_width); +/*====================* + * S-function methods * + *====================*/ +/* Function: mdlInitializeSizes =============================================== + * Abstract: + * Setup sizes of the various vectors. + */ +static void mdlInitializeSizes(SimStruct *S) +{ + + DECL_AND_INIT_DIMSINFO(inputDimsInfo); + DECL_AND_INIT_DIMSINFO(outputDimsInfo); + ssSetNumSFcnParams(S, NPARAMS); + if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { + return; /* Parameter mismatch will be reported by Simulink */ + } + + ssSetArrayLayoutForCodeGen(S, SS_COLUMN_MAJOR); + + ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE); + + ssSetNumContStates(S, NUM_CONT_STATES); + ssSetNumDiscStates(S, NUM_DISC_STATES); + + + if (!ssSetNumInputPorts(S, NUM_INPUTS)) return; + /* Input Port 0 */ + ssSetInputPortWidth(S, 0, INPUT_0_WIDTH); + ssSetInputPortDataType(S, 0, SS_UINT8); + ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/ + + /* Input Port 1 */ + ssSetInputPortWidth(S, 1, INPUT_1_WIDTH); + ssSetInputPortDataType(S, 1, SS_UINT8); + ssSetInputPortComplexSignal(S, 1, INPUT_1_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 1, INPUT_1_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 1, 1); /*direct input signal access*/ + + /* Input Port 2 */ + ssSetInputPortWidth(S, 2, INPUT_2_WIDTH); + ssSetInputPortDataType(S, 2, SS_UINT32); + ssSetInputPortComplexSignal(S, 2, INPUT_2_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 2, INPUT_2_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 2, 1); /*direct input signal access*/ + + /* Input Port 3 */ + ssSetInputPortWidth(S, 3, INPUT_3_WIDTH); + ssSetInputPortDataType(S, 3, SS_UINT16); + ssSetInputPortComplexSignal(S, 3, INPUT_3_COMPLEX); + ssSetInputPortDirectFeedThrough(S, 3, INPUT_3_FEEDTHROUGH); + ssSetInputPortRequiredContiguous(S, 3, 1); /*direct input signal access*/ + + + if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return; + outputDimsInfo.width = OUTPUT_0_WIDTH; + ssSetOutputPortDimensionInfo(S, 0, &outputDimsInfo); + ssSetOutputPortFrameData(S, 0, OUT_0_FRAME_BASED); + ssSetOutputPortDataType(S, 0, SS_INT32); + ssSetOutputPortComplexSignal(S, 0, OUTPUT_0_COMPLEX); + ssSetOutputPortComplexSignal(S, 0, OUTPUT_0_COMPLEX); + ssSetNumPWork(S, 0); + + ssSetNumSampleTimes(S, 1); + ssSetNumRWork(S, 0); + ssSetNumIWork(S, 0); + ssSetNumModes(S, 0); + ssSetNumNonsampledZCs(S, 0); + + ssSetSimulinkVersionGeneratedIn(S, "9.2"); + + /* Take care when specifying exception free code - see sfuntmpl_doc.c */ + ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | + SS_OPTION_USE_TLC_WITH_ACCELERATOR | + SS_OPTION_WORKS_WITH_CODE_REUSE)); +} + + +#define MDL_SET_INPUT_PORT_DIMENSION_INFO +void mdlSetInputPortDimensionInfo(SimStruct *S, + int portIndex, + const DimsInfo_T *dimsInfo) +{ + DECL_AND_INIT_DIMSINFO(portDimsInfo); + int_T dims[2] = { OUTPUT_0_WIDTH, 1 }; + bool frameIn = (ssGetInputPortFrameData(S, 0) == FRAME_YES); + + ssSetInputPortDimensionInfo(S, 0, dimsInfo); + + if (ssGetOutputPortNumDimensions(S, 0) == (-1)) { + /* the output port has not been set */ + + portDimsInfo.width = 1; + portDimsInfo.numDims = frameIn ? 2 : 1; + portDimsInfo.dims = frameIn ? dims : &portDimsInfo.width; + + ssSetOutputPortDimensionInfo(S, 0, &portDimsInfo); + } +} + + +#define MDL_SET_OUTPUT_PORT_DIMENSION_INFO +void mdlSetOutputPortDimensionInfo(SimStruct *S, + int_T portIndex, + const DimsInfo_T *dimsInfo) +{ + DECL_AND_INIT_DIMSINFO(portDimsInfo); + int_T dims[2] = { OUTPUT_0_WIDTH, 1 }; + bool frameOut = (ssGetOutputPortFrameData(S, 0) == FRAME_YES); + + ssSetOutputPortDimensionInfo(S, 0, dimsInfo); + + if (ssGetInputPortNumDimensions(S, 0) == (-1)) { + /* the input port has not been set */ + + portDimsInfo.width = 1; + portDimsInfo.numDims = frameOut ? 2 : 1; + portDimsInfo.dims = frameOut ? dims : &portDimsInfo.width; + + ssSetInputPortDimensionInfo(S, 0, &portDimsInfo); + } +} + + +#define MDL_SET_DEFAULT_PORT_DIMENSION_INFO +static void mdlSetDefaultPortDimensionInfo(SimStruct *S) +{ + DECL_AND_INIT_DIMSINFO(portDimsInfo); + int_T dims[2] = { 1, 1 }; + bool frame = (ssGetInputPortFrameData(S, 0) == FRAME_YES) || + (ssGetOutputPortFrameData(S, 0) == FRAME_YES); + + /* Neither the input nor the output ports have been set */ + + portDimsInfo.width = 1; + portDimsInfo.numDims = frame ? 2 : 1; + portDimsInfo.dims = frame ? dims : &portDimsInfo.width; + + if (ssGetInputPortNumDimensions(S, 0) == (-1)) { + ssSetInputPortDimensionInfo(S, 0, &portDimsInfo); + } + + if (ssGetOutputPortNumDimensions(S, 0) == (-1)) { + ssSetInputPortDimensionInfo(S, 0, &portDimsInfo); + } +} + +/* Function: mdlInitializeSampleTimes ========================================= + * Abstract: + * Specifiy the sample time. + */ +static void mdlInitializeSampleTimes(SimStruct *S) +{ + ssSetSampleTime(S, 0, SAMPLE_TIME_0); + ssSetModelReferenceSampleTimeDefaultInheritance(S); + ssSetOffsetTime(S, 0, 0.0); +} + +#define MDL_SET_INPUT_PORT_DATA_TYPE +static void mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetInputPortDataType(S, 0, dType); +} + +#define MDL_SET_OUTPUT_PORT_DATA_TYPE +static void mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dType) +{ + ssSetOutputPortDataType(S, 0, dType); +} + +#define MDL_SET_DEFAULT_PORT_DATA_TYPES +static void mdlSetDefaultPortDataTypes(SimStruct *S) +{ + ssSetInputPortDataType(S, 0, SS_DOUBLE); + ssSetOutputPortDataType(S, 0, SS_DOUBLE); +} + +#define MDL_START /* Change to #undef to remove function */ +#if defined(MDL_START) +/* Function: mdlStart ======================================================= + * Abstract: + * This function is called once at start of model execution. If you + * have states that should be initialized once, this is the place + * to do it. + */ +static void mdlStart(SimStruct *S) +{ + + hal_nvram_write_Start_wrapper(); +} +#endif /* MDL_START */ + +/* Function: mdlOutputs ======================================================= + * + */ +static void mdlOutputs(SimStruct *S, int_T tid) +{ + const uint8_T *buffer = (uint8_T *) ssGetInputPortRealSignal(S, 0); + const uint8_T *nvram_id = (uint8_T *) ssGetInputPortRealSignal(S, 1); + const uint32_T *address = (uint32_T *) ssGetInputPortRealSignal(S, 2); + const uint16_T *write_len = (uint16_T *) ssGetInputPortRealSignal(S, 3); + int32_T *ErrorCode = (int32_T *) ssGetOutputPortRealSignal(S, 0); + const int_T u_width = ssGetInputPortWidth(S, 0); + + hal_nvram_write_Outputs_wrapper(buffer, nvram_id, address, write_len, ErrorCode, u_width); + +} + +/* Function: mdlTerminate ===================================================== + * Abstract: + * In this function, you should perform any actions that are necessary + * at the termination of a simulation. For example, if memory was + * allocated in mdlStart, this is the place to free it. + */ +static void mdlTerminate(SimStruct *S) +{ + +} + + +#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ +#include "simulink.c" /* MEX-file interface mechanism */ +#else +#include "cg_sfun.h" /* Code generation registration function */ +#endif + + + diff --git a/hal_nvram_write.mexw64 b/hal_nvram_write.mexw64 new file mode 100644 index 0000000000000000000000000000000000000000..a6bcc5fccb822a3a4e9564ea0122ebfa1c0bcd3d GIT binary patch literal 21504 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 literal 0 HcmV?d00001 diff --git a/hal_nvram_write.tlc b/hal_nvram_write.tlc new file mode 100644 index 0000000..085e2f5 --- /dev/null +++ b/hal_nvram_write.tlc @@ -0,0 +1,76 @@ +%% File : hal_nvram_write.tlc +%% Created : Wed Mar 18 14:08:03 2020 +%% +%% Description: +%% Simulink Coder wrapper functions interface generated for +%% S-function "hal_nvram_write.c". +%% +%% File generated by S-function Builder Block +%% +%% For more information on using the Target Language with the +%% Simulink Coder, see the Target Language Compiler manual +%% (under Simulink Coder) in the "Inlining S-Functions" +%% chapter under the section and subsection: +%% "Writing Block Target Files to Inline S-Functions", +%% "Function-Based or Wrappered Code". +%% +%implements hal_nvram_write "C" +%% Function: BlockTypeSetup =================================================== +%% +%% Purpose: +%% Set up external references for wrapper functions in the +%% generated code. +%% +%function BlockTypeSetup(block, system) Output + %openfile externs + + #ifdef __cplusplus + extern "C" { + #endif + + extern void hal_nvram_write_Start_wrapper(void); + + extern void hal_nvram_write_Outputs_wrapper(const uint8_T *buffer, + const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *write_len, + int32_T *ErrorCode, + const int_T u_width); + + extern void hal_nvram_write_Terminate_wrapper(void); + + #ifdef __cplusplus + } + #endif + %closefile externs + % + %% +%endfunction + + +%% Function: Start ============================================================ +%% +%function Start(block, system) Output + /* % Block: % */ + hal_nvram_write_Start_wrapper(); +%endfunction +%% Function: Outputs ========================================================== +%% +%% Purpose: +%% Code generation rules for mdlOutputs function. +%% +%function Outputs(block, system) Output + %% + %assign pu0 = LibBlockInputSignalAddr(0, "", "", 0) + %assign pu1 = LibBlockInputSignalAddr(1, "", "", 0) + %assign pu2 = LibBlockInputSignalAddr(2, "", "", 0) + %assign pu3 = LibBlockInputSignalAddr(3, "", "", 0) + %assign pu_width = LibBlockInputSignalWidth(0) + %assign py0 = LibBlockOutputSignalAddr(0, "", "", 0) + hal_nvram_write_Outputs_wrapper(%, %, %, %, %, %); + %% +%endfunction + + +%% [EOF] hal_nvram_write.tlc + diff --git a/hal_template.slx b/hal_template.slx index b2d372d62696f9a216b27d2d52250729100a4431..05e0d29e511dfdca698c5b431a2bda411bde1dc9 100644 GIT binary patch delta 21725 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 delta 18028 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 @EjA+boQls+) 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 diff --git a/template/hal_nvram_cancel_wrapper.c b/template/hal_nvram_cancel_wrapper.c new file mode 100644 index 0000000..468b6d1 --- /dev/null +++ b/template/hal_nvram_cancel_wrapper.c @@ -0,0 +1,78 @@ + +/* + * Include Files + * + */ +#if defined(MATLAB_MEX_FILE) +#include "tmwtypes.h" +#include "simstruc_types.h" +#else +#include "rtwtypes.h" +#endif + + + +/* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* include files */ +#endif +/* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */ +#define u_width 1 +#define y_width 1 + +/* + * Create external references here. + * + */ +/* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +extern void initialize_navram_device(void); +extern bool hal_api_navram = false; +#endif +/* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */ + +/* + * Start function + * + */ +void hal_nvram_cancel_Start_wrapper(void) +{ +/* %%%-SFUNWIZ_wrapper_Start_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +if (hal_api_navram) +{ + initialize_navram_device(); + hal_api_navram = true; +} +#endif +/* %%%-SFUNWIZ_wrapper_Start_Changes_END --- EDIT HERE TO _BEGIN */ +} +/* + * Output function + * + */ +void hal_nvram_cancel_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + int32_T *ErrorCode) +{ +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* **************************************** + * Cancel to read/write NAVRAM device + * this call should return immediately, so it's better to state the + * backgournd task to do the real work. + * + * inputs: + * nvram_id - NV-RAM device/proxy ID + * address - Starting address to be write + * + * outputs: + * ErrorCode - return 0 when success cancelling, otherwise return -1 + */ +#else +ErrorCode[0] = 0; +#endif +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */ +} + + diff --git a/template/hal_nvram_read_wrapper.c b/template/hal_nvram_read_wrapper.c new file mode 100644 index 0000000..d897af1 --- /dev/null +++ b/template/hal_nvram_read_wrapper.c @@ -0,0 +1,97 @@ + +/* + * Include Files + * + */ +#if defined(MATLAB_MEX_FILE) +#include "tmwtypes.h" +#include "simstruc_types.h" +#else +#include "rtwtypes.h" +#endif + + + +/* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* include files */ +#endif +/* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */ +#define u_width 1 + +/* + * Create external references here. + * + */ +/* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +extern void initialize_navram_device(void); +bool hal_api_navram = false; + +void initialize_navram_device(void) +{ + +} +#endif +/* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */ + +/* + * Start function + * + */ +void hal_nvram_read_Start_wrapper(void) +{ +/* %%%-SFUNWIZ_wrapper_Start_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +if (hal_api_navram) +{ + initialize_navram_device(); + hal_api_navram = true; +} +#endif + +/* %%%-SFUNWIZ_wrapper_Start_Changes_END --- EDIT HERE TO _BEGIN */ +} +/* + * Output function + * + */ +void hal_nvram_read_Outputs_wrapper(const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *read_len, + uint8_T *buffer, + int32_T *ErrorCode, + const int_T y_width) +{ +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* **************************************** + * read from NAVRAM device + * this call should return immediately, so it's better to state the + * backgournd task to do the real work. + * + * inputs: + * nvram_id - NV-RAM device/proxy ID + * address - Starting address to be read + * read_len - maxium bytes to be read + * + * outputs: + * buffer - read data to buffer + * ErrorCode - return 0 when read complete, otherwise + * return remaining length when readling uncompletly, + * return -1 on genral failures. + * return -2 on busy(ocuppied). + * return -3 on cancelled. + * + * constant: + * y_width - the size of buffer, do not write overflow. + */ +#else +ErrorCode[0] = 0; +#endif + + +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */ +} + + diff --git a/template/hal_nvram_write_wrapper.c b/template/hal_nvram_write_wrapper.c new file mode 100644 index 0000000..4b7552b --- /dev/null +++ b/template/hal_nvram_write_wrapper.c @@ -0,0 +1,92 @@ + +/* + * Include Files + * + */ +#if defined(MATLAB_MEX_FILE) +#include "tmwtypes.h" +#include "simstruc_types.h" +#else +#include "rtwtypes.h" +#endif + + + +/* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* include files */ +#endif + +/* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */ +#define y_width 1 + +/* + * Create external references here. + * + */ +/* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +extern void initialize_navram_device(void); +extern bool hal_api_navram = false; +#endif + +/* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */ + +/* + * Start function + * + */ +void hal_nvram_write_Start_wrapper(void) +{ +/* %%%-SFUNWIZ_wrapper_Start_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +if (hal_api_navram) +{ + initialize_navram_device(); + hal_api_navram = true; +} +#endif +/* %%%-SFUNWIZ_wrapper_Start_Changes_END --- EDIT HERE TO _BEGIN */ +} +/* + * Output function + * + */ +void hal_nvram_write_Outputs_wrapper(const uint8_T *buffer, + const uint8_T *nvram_id, + const uint32_T *address, + const uint16_T *write_len, + int32_T *ErrorCode, + const int_T u_width) +{ +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */ +#ifdef HAL_IMPL +/* **************************************** + * write to NAVRAM device + * this call should return immediately, so it's better to state the + * backgournd task to do the real work. + * + * inputs: + * buffer - write data to buffer + * nvram_id - NV-RAM device/proxy ID + * address - Starting address to be write + * read_len - maxium bytes to be write + * + * outputs: + * ErrorCode - return 0 when write complete, otherwise + * return remaining length when writting uncompletly, + * return -1 on genral failures. + * return -2 on busy(ocuppied). + * return -3 on cancelled. + * + * constant: + * u_width - the size of buffer, do not write overflow. + */ +#else +ErrorCode[0] = 0; +#endif + +/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */ +} + +