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 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"
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;
DLSYM(canReceive)
DLSYM(canSend)
DLSYM(canOpen)
+ DLSYM(canChangeBaudRate)
DLSYM(canClose)
return handle;
}
*/
+/**
+ * CAN send routine
+ * @param port CAN port
+ * @param m CAN message
+ * @return success or error
+ */
UNS8 canSend(CAN_PORT port, Message *m)
{
if(port){
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;
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