drivers/unix/unix.c
changeset 629 b9274b595650
parent 480 d0d76932ad74
child 644 11b21e9a92f6
--- a/drivers/unix/unix.c	Fri Nov 12 22:02:32 2010 +0100
+++ b/drivers/unix/unix.c	Fri Nov 12 22:24:06 2010 +0100
@@ -1,5 +1,5 @@
 /*
-This file is part of CanFestival, a library implementing CanOpen Stack. 
+This file is part of CanFestival, a library implementing CanOpen Stack.
 
 Copyright (C): Edouard TISSERANT and Francis DUPIN
 
@@ -26,6 +26,7 @@
 #else
 #include <linux/module.h>
 #endif
+#include <linux/delay.h>
 
 #ifndef NOT_USE_DYNAMIC_LOADING
 #define DLL_CALL(funcname) (* funcname##_driver)
@@ -95,7 +96,7 @@
 {
 	LIB_HANDLE handle = NULL;
 	char *error;
-	
+
 
 	if(handle==NULL)
 	{
@@ -106,7 +107,7 @@
 		fprintf (stderr, "%s\n", dlerror());
         	return NULL;
 	}
- 
+
 	/*Get function ptr*/
 	DLSYM(canReceive)
 	DLSYM(canSend)
@@ -142,7 +143,7 @@
 		res = DLL_CALL(canSend)(((CANPort*)port)->fd, m);
 		//EnterMutex();
 		return res; // OK
-	}               
+	}
 	return 1; // NOT OK
 }
 
@@ -161,6 +162,13 @@
                EnterMutex();
                canDispatch(((CANPort*)port)->d, &m);
                LeaveMutex();
+
+#ifdef __KERNEL__
+#ifdef USE_XENO
+               /* periodic task for Xenomai kernel realtime */
+               rt_task_wait_period(NULL);
+#endif
+#endif
        }
 }
 
@@ -178,19 +186,19 @@
 		if(!canports[i].used)
 		break;
 	}
-	
+
 #ifndef NOT_USE_DYNAMIC_LOADING
 	if (&DLL_CALL(canOpen)==NULL) {
         	fprintf(stderr,"CanOpen : Can Driver dll not loaded\n");
         	return NULL;
 	}
-#endif	
+#endif
 	CAN_HANDLE fd0 = DLL_CALL(canOpen)(board);
 	if(fd0){
 		canports[i].used = 1;
 		canports[i].fd = fd0;
 		canports[i].d = d;
-		d->canHandle = (CAN_PORT)&canports[i];		
+		d->canHandle = (CAN_PORT)&canports[i];
 		CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop);
 		return (CAN_PORT)&canports[i];
 	}else{
@@ -207,17 +215,18 @@
 int canClose(CO_Data * d)
 {
 	UNS8 res;
-	
+
 	((CANPort*)d->canHandle)->used = 0;
 	CANPort* tmp = (CANPort*)d->canHandle;
-	d->canHandle = NULL;
-	
+
+	// kill receiver task before port is closed and handle set to NULL
+	WaitReceiveTaskEnd(&tmp->receiveTask);
+
 	// close CAN port
 	res = DLL_CALL(canClose)(tmp->fd);
 
-	// kill receiver task
-	WaitReceiveTaskEnd(&tmp->receiveTask);
-	
+	d->canHandle = NULL;
+
 	return res;
 }
 
@@ -236,7 +245,7 @@
 		res = DLL_CALL(canChangeBaudRate)(((CANPort*)port)->fd, baud);
 		//EnterMutex();
 		return res; // OK
-	}               
+	}
 	return 1; // NOT OK
 }