]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - drivers/unix/unix.c
- add RTAI support
[CanFestival-3.git] / drivers / unix / unix.c
index 5eb006c1f7c8b41b52c7193111ac4f980e61cdfa..216ac6d7ba267bdb991d624f10ef6d162beb26f3 100644 (file)
@@ -19,9 +19,13 @@ 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)
@@ -48,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"
@@ -80,7 +85,12 @@ UNS8 UnLoadCanDriver(LIB_HANDLE handle)
        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;
@@ -101,6 +111,7 @@ LIB_HANDLE LoadCanDriver(char* driver_name)
        DLSYM(canReceive)
        DLSYM(canSend)
        DLSYM(canOpen)
+       DLSYM(canChangeBaudRate)
        DLSYM(canClose)
 
        return handle;
@@ -117,6 +128,12 @@ 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){
@@ -129,11 +146,15 @@ UNS8 canSend(CAN_PORT port, Message *m)
        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;
 
@@ -142,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;
@@ -162,29 +190,59 @@ CAN_PORT canOpen(s_BOARD *board, CO_Data * d)
                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);
-               
-               EnterMutex();
-               d->canHandle = (CAN_PORT)&canports[i];
-               LeaveMutex();
                return (CAN_PORT)&canports[i];
        }else{
-               fprintf(stderr,"CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate);
+               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