+
+/**
+ * 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 = malloc(sizeof(mf624_state_t));
+ char fn[32];
+ mfst->uio_dev = UIO;
+ snprintf(fn, sizeof(fn), "/dev/%s", mfst->uio_dev);
+
+ mfst->device_fd = open_device(fn);
+ if (mfst->device_fd < 0) {
+ if (S) ssSetErrorStatus(S,"/dev/" UIO ": open failed");
+ goto free;
+ }
+ if (mmap_regions(mfst) < 0) {
+ if (S) ssSetErrorStatus(S,"/dev/" UIO ": mmap_regions failed");
+ goto close;
+ }
+ }
+ mfst_refcnt++;
+ return 0;
+close:
+ close(mfst->device_fd);
+free:
+ free(mfst);
+ mfst = NULL;
+ 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;
+ }
+ }
+
+ return 0;
+}
+
+
+/**
+ * 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;
+}
+