]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - drivers/unix/unix.c
- add RTAI support
[CanFestival-3.git] / drivers / unix / unix.c
index 02a7ded45dcd734a582cae8ef353eedb37267e76..216ac6d7ba267bdb991d624f10ef6d162beb26f3 100644 (file)
@@ -19,24 +19,18 @@ You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
+#ifndef __KERNEL__
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
+#else
+#include <linux/module.h>
+#endif
 
 #ifndef NOT_USE_DYNAMIC_LOADING
 #define DLL_CALL(funcname) (* funcname##_driver)
 #define FCT_PTR_INIT =NULL
 
-#ifdef WIN32
-#define DLSYM(name)\
-    *(void **) (&_##name) = GetProcAddress(handle, TEXT(#name"_driver"));\
-       if (name##_driver == NULL)  {\
-               fprintf (stderr, "Error loading symbol %s\n",#name"_driver");\
-               UnLoadCanDriver(handle);\
-               return NULL;\
-       }
-#else
 #define DLSYM(name)\
        *(void **) (&name##_driver) = dlsym(handle, #name"_driver");\
        if ((error = dlerror()) != NULL)  {\
@@ -44,7 +38,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                UnLoadCanDriver(handle);\
                return NULL;\
        }
-#endif
 
 #else /*NOT_USE_DYNAMIC_LOADING*/
 
@@ -59,11 +52,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 #define MAX_NB_CAN_PORTS 16
 
+/** CAN port structure */
 typedef struct {
-  char used;
-  CAN_HANDLE fd;
-  TASK_HANDLE receiveTask;
-  CO_Data* d;
+  char used;  /**< flag indicating CAN port usage, will be used to abort Receiver task*/
+  CAN_HANDLE fd; /**< CAN port file descriptor*/
+  TASK_HANDLE receiveTask; /**< CAN Receiver task*/
+  CO_Data* d; /**< CAN object data*/
 } CANPort;
 
 #include "can_driver.h"
@@ -83,36 +77,26 @@ UNS8 UnLoadCanDriver(LIB_HANDLE handle)
 {
        if(handle!=NULL)
        {
-#ifdef WIN32
-               FreeLibrary(handle);    
-#else
                dlclose(handle);
-#endif
+
                handle=NULL;
                return 0;
        }
        return -1;
 }
 
-/*Loads the dll and get funcs ptr*/
+/**
+ * Loads the dll and get funcs ptr
+ *
+ * @param driver_name String containing driver's dynamic library name
+ * @return Library handle
+ */
 LIB_HANDLE LoadCanDriver(char* driver_name)
 {
        LIB_HANDLE handle = NULL;
        char *error;
        
-#ifdef WIN32
 
-       if(handle==NULL)
-       {
-               handle = LoadLibrary(driver_name);
-       }
-       if (handle == NULL) {
-               fprintf(stderr,"Error loading Can Driver dll \n");
-               return -1;
-       }
-
-#else
        if(handle==NULL)
        {
                handle = dlopen(driver_name, RTLD_LAZY);
@@ -122,15 +106,15 @@ LIB_HANDLE LoadCanDriver(char* driver_name)
                fprintf (stderr, "%s\n", dlerror());
                return NULL;
        }
-#endif
  
        /*Get function ptr*/
        DLSYM(canReceive)
        DLSYM(canSend)
        DLSYM(canOpen)
+       DLSYM(canChangeBaudRate)
        DLSYM(canClose)
 
-       return 0;
+       return handle;
 }
 
 #endif
@@ -144,23 +128,33 @@ UNS8 canReceive(CAN_PORT port, Message *m)
 }
 */
 
+/**
+ * CAN send routine
+ * @param port CAN port
+ * @param m CAN message
+ * @return success or error
+ */
 UNS8 canSend(CAN_PORT port, Message *m)
 {
        if(port){
                UNS8 res;
-               LeaveMutex();
+               //LeaveMutex();
                res = DLL_CALL(canSend)(((CANPort*)port)->fd, m);
-               EnterMutex();
-               return res;
+               //EnterMutex();
+               return res; // OK
        }               
-       return -1;
+       return 1; // NOT OK
 }
 
+/**
+ * CAN Receiver Task
+ * @param port CAN port
+ */
 void canReceiveLoop(CAN_PORT port)
 {
        Message m;
 
-       while (1) {
+       while (((CANPort*)port)->used) {
                if (DLL_CALL(canReceive)(((CANPort*)port)->fd, &m) != 0)
                        break;
 
@@ -169,6 +163,13 @@ void canReceiveLoop(CAN_PORT port)
                LeaveMutex();
        }
 }
+
+/**
+ * CAN open routine
+ * @param board device name and baudrate
+ * @param d CAN object data
+ * @return valid CAN_PORT pointer or NULL
+ */
 CAN_PORT canOpen(s_BOARD *board, CO_Data * d)
 {
        int i;
@@ -185,29 +186,63 @@ CAN_PORT canOpen(s_BOARD *board, CO_Data * d)
        }
 #endif 
        CAN_HANDLE fd0 = DLL_CALL(canOpen)(board);
-
-       canports[i].used = 1;
-       canports[i].fd = fd0;
-       canports[i].d = d;
-
-       CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop);
-       
-       EnterMutex();
-       d->canHandle = (CAN_PORT)&canports[i];
-       LeaveMutex();
-       return (CAN_PORT)&canports[i];
+       if(fd0){
+               canports[i].used = 1;
+               canports[i].fd = fd0;
+               canports[i].d = d;
+               d->canHandle = (CAN_PORT)&canports[i];          
+               CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop);
+               return (CAN_PORT)&canports[i];
+       }else{
+               MSG("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate);
+               return NULL;
+       }
 }
 
+/**
+ * CAN close routine
+ * @param d CAN object data
+ * @return success or error
+ */
 int canClose(CO_Data * d)
 {
-       EnterMutex();
+       UNS8 res;
+       
        ((CANPort*)d->canHandle)->used = 0;
        CANPort* tmp = (CANPort*)d->canHandle;
        d->canHandle = NULL;
-       LeaveMutex();
        
-       int res = DLL_CALL(canClose)(tmp->fd);
+       // close CAN port
+       res = DLL_CALL(canClose)(tmp->fd);
+
+       // kill receiver task
+       WaitReceiveTaskEnd(&tmp->receiveTask);
        
-       WaitReceiveTaskEnd(tmp->receiveTask);
        return res;
 }
+
+
+/**
+ * CAN change baudrate routine
+ * @param port CAN port
+ * @param baud baudrate
+ * @return success or error
+ */
+UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
+{
+   if(port){
+               UNS8 res;
+               //LeaveMutex();
+               res = DLL_CALL(canChangeBaudRate)(((CANPort*)port)->fd, baud);
+               //EnterMutex();
+               return res; // OK
+       }               
+       return 1; // NOT OK
+}
+
+
+#ifdef __KERNEL__
+EXPORT_SYMBOL (canOpen);
+EXPORT_SYMBOL (canClose);
+EXPORT_SYMBOL (canSend);
+#endif