#define UIO "uio0"
mf624_state_t* mfst=NULL;
+unsigned mfst_refcnt = 0;
static int bar_mapping_fill(bar_mapping_t *barmap, const char *uio_dev, int map_nr)
{
return 0;
}
+static int bar_mapping_destroy(bar_mapping_t *barmap)
+{
+ off_t mmap_start;
+ size_t mmap_size;
+ size_t page_mask = sysconf(_SC_PAGESIZE) - 1;
+
+ mmap_start = barmap->mmap_offset & ~page_mask;
+ mmap_size = barmap->mmap_offset + barmap->size + page_mask - mmap_start;
+ mmap_size &= ~page_mask;
+
+ return munmap(barmap->mmap_addr, mmap_size);
+}
+
/****************************************************************/
#define BUFF_SMALL 32
if (S) ssSetErrorStatus(S,"/dev/" UIO ": mmap_regions failed");
goto close;
}
-
}
+ mfst_refcnt++;
return 0;
close:
close(mfst->device_fd);
return -1;
}
+int mf624_done()
+{
+ if (mfst) {
+ if (--mfst_refcnt == 0) {
+ close(mfst->device_fd);
+ bar_mapping_destroy(&mfst->bar0);
+ bar_mapping_destroy(&mfst->bar2);
+ bar_mapping_destroy(&mfst->bar4);
+ free(mfst);
+ mfst = NULL;
+ }
+ }
+}
+
+
+/**
+ * Check whether MF624 card is initialized.
+ *
+ * @param S
+ *
+ * @return Zero if MF624 is initialized, -1 othewise.
+ */
+int mf624_check(SimStruct *S)
+{
+ if (mfst==NULL) {
+ if (S) ssSetErrorStatus(S, "MF624 is not initialized");
+ return -1;
+ }
+ else
+ return 0;
+}
+
/*int main(int argc, char* argv[])
{
mf624_state_t* mfst = &mf624_state;
extern double ADC_read(mf624_state_t* mfst, adc_channel_t channel);
int mf624_init(SimStruct *S);
+int mf624_check(SimStruct *S);
+int mf624_done();
#endif
int i;
int res,res1;
- if (mf624_init(S) != 0)
+ if (mf624_check(S) != 0)
return;
// Activate trigger to start conversion
*/
static void mdlTerminate(SimStruct *S)
{
- if(mfst != NULL){
- free(mfst);
- mfst=NULL;
- }
+ mf624_done(S);
}
//mf624_state_t* mfst = ssGetPWorkValue(S,0);
int out;
- if (mf624_init(S) != 0)
+ if (mf624_check(S) != 0)
return;
if(u[0] > 9.9988){
static void mdlTerminate(SimStruct *S)
{
//mf624_state_t* mfst = ssGetPWorkValue(S,0);
- if (mf624_init(0) != 0)
+ if (mf624_check(NULL) != 0)
return;
/*At the end of simulation disable D/A outputs*/
mf624_write32((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg))
& ~GPIOC_DACEN_mask), // disable output,
MFST2REG(mfst, 0, GPIOC_reg));
- free(mfst);
- mfst=NULL;
+
+ mf624_done();
}
{
const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
- if (mf624_init(S) != 0)
+ if (mf624_check(S) != 0)
return;
if(u[0] > 0.5){
*/
static void mdlTerminate(SimStruct *S)
{
- if(mfst!=NULL){
- free(mfst);
- mfst=NULL;
- }
+ mf624_done();
}
unsigned int period;
unsigned int c0,c1,c2,c4;
- if (mf624_init(S) != 0)
+ if (mf624_check(S) != 0)
return;
c0 = mf624_read32(MFST2REG(mfst,4,CTR0));
*/
static void mdlTerminate(SimStruct *S)
{
- if (mf624_init(NULL) != 0)
+ if (mf624_check(NULL) != 0)
return;
- /* FIXME: This is ugly! */
- if(mfst!=NULL){
- mf624_write32(CTR_STOP,MFST2REG(mfst,4,CTRXCTRL));
- free(mfst);
- mfst=NULL;
- } else {
- mfst = malloc(sizeof(mf624_state_t));
- if (mf624_init(S) != 0)
- return;
- mf624_write32(CTR_STOP,MFST2REG(mfst,4,CTRXCTRL));
- free(mfst);
- mfst=NULL;
- }
+ mf624_write32(CTR_STOP,MFST2REG(mfst,4,CTRXCTRL));
+ mf624_done();
}