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) {\
UnLoadCanDriver(handle);\
return NULL;\
}
-#endif
#else /*NOT_USE_DYNAMIC_LOADING*/
#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"
{
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);
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
}
*/
+/**
+ * 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;
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;
}
#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