+/**
+ * Try to initialize the MF624 UIO driver.
+ *
+ * If and only if S is not NULL and initialization fails, then
+ * ssSetErrorStatus() gets called to report the error via Simulink
+ * interface.
+ *
+ * @param S Pointer to SimStruct for error reporting or NULL.
+ *
+ * @return Zero in case of success, -1 in case of error.
+ */
int mf624_init(SimStruct *S)
{
if (mfst==NULL) {
mfst->device_fd = open_device(fn);
if (mfst->device_fd < 0) {
- ssSetErrorStatus(S,"/dev/" UIO ": open failed");
- return;
+ if (S) ssSetErrorStatus(S,"/dev/" UIO ": open failed");
+ goto free;
}
if (mmap_regions(mfst) < 0) {
- ssSetErrorStatus(S,"/dev/" UIO ": mmap_regions failed");
- return;
+ if (S) ssSetErrorStatus(S,"/dev/" UIO ": mmap_regions failed");
+ goto close;
}
}
+ return 0;
+close:
+ close(mfst->device_fd);
+free:
+ free(mfst);
+ mfst = NULL;
+ return -1;
}
/*int main(int argc, char* argv[])
*/
static void mdlStart(SimStruct *S)
{
- if (mf624_init(S) != 0)
+ if (mf624_init(NULL) != 0)
return;
int ADCCMask = (int)MASK_PRM(S);
int i;
int res,res1;
+ if (mf624_init(S) != 0)
+ return;
+
// Activate trigger to start conversion
mf624_read16(MFST2REG(mfst, 2, ADSTART_reg));
*/
static void mdlStart(SimStruct *S)
{
- if (mf624_init(S) != 0)
+ if (mf624_init(NULL) != 0)
return;
DAC_enable(mfst);
//ssSetPWorkValue(S, 0, mfst);
const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
//mf624_state_t* mfst = ssGetPWorkValue(S,0);
int out;
+
+ if (mf624_init(S) != 0)
+ return;
+
if(u[0] > 9.9988){
out = 0x3FFF;
}
*/
static void mdlStart(SimStruct *S)
{
- if (mf624_init(S) != 0)
+ if (mf624_init(NULL) != 0)
return;
mfst->DOut=0;
static void mdlOutputs(SimStruct *S, int_T tid)
{
const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
+
+ if (mf624_init(S) != 0)
+ return;
+
if(u[0] > 0.5){
/*Update the "word" holding Output Values*/
mfst->DOut |= (1 << (int)(CHNL_PRM(S)-1));
*/
static void mdlStart(SimStruct *S)
{
- if (mf624_init(S) != 0)
+ if (mf624_init(NULL) != 0)
return;
/*Configuration of desired counter modes*/
unsigned int period;
unsigned int c0,c1,c2,c4;
-
+ if (mf624_init(S) != 0)
+ return;
+
c0 = mf624_read32(MFST2REG(mfst,4,CTR0));
c1 = mf624_read32(MFST2REG(mfst,4,CTR1));
c2 = mf624_read32(MFST2REG(mfst,4,CTR2));