2 This file is part of CanFestival, a library implementing CanOpen Stack.
4 Copyright (C): Edouard TISSERANT and Francis DUPIN
6 See COPYING file for copyrights details.
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <linux/module.h>
30 #ifndef NOT_USE_DYNAMIC_LOADING
31 #define DLL_CALL(funcname) (* funcname##_driver)
32 #define FCT_PTR_INIT =NULL
35 *(void **) (&name##_driver) = dlsym(handle, #name"_driver");\
36 if ((error = dlerror()) != NULL) {\
37 fprintf (stderr, "%s\n", error);\
38 UnLoadCanDriver(handle);\
42 #else /*NOT_USE_DYNAMIC_LOADING*/
44 /*Function call is direct*/
45 #define DLL_CALL(funcname) funcname##_driver
47 #endif /*NOT_USE_DYNAMIC_LOADING*/
50 #include "canfestival.h"
51 #include "timers_driver.h"
53 #define MAX_NB_CAN_PORTS 16
55 /** CAN port structure */
57 char used; /**< flag indicating CAN port usage, will be used to abort Receiver task*/
58 CAN_HANDLE fd; /**< CAN port file descriptor*/
59 TASK_HANDLE receiveTask; /**< CAN Receiver task*/
60 CO_Data* d; /**< CAN object data*/
63 #include "can_driver.h"
65 /*Declares the funtion pointers for dll binding or simple protos*/
66 /*UNS8 DLL_CALL(canReceive)(CAN_HANDLE, Message *);
67 UNS8 DLL_CALL(canSend)(CAN_HANDLE, Message *);
68 CAN_HANDLE DLL_CALL(canOpen)(s_BOARD *);
69 int DLL_CALL(canClose)(CAN_HANDLE);
71 CANPort canports[MAX_NB_CAN_PORTS] = {{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,}};
73 #ifndef NOT_USE_DYNAMIC_LOADING
76 UNS8 UnLoadCanDriver(LIB_HANDLE handle)
89 * Loads the dll and get funcs ptr
91 * @param driver_name String containing driver's dynamic library name
92 * @return Library handle
94 LIB_HANDLE LoadCanDriver(char* driver_name)
96 LIB_HANDLE handle = NULL;
102 handle = dlopen(driver_name, RTLD_LAZY);
106 fprintf (stderr, "%s\n", dlerror());
114 DLSYM(canChangeBaudRate)
124 /*Not needed -- canReceiveLoop calls _canReceive directly *//*
125 UNS8 canReceive(CAN_PORT port, Message *m)
127 return DLL_CALL(canReceive)(port->fd, Message *m);
133 * @param port CAN port
134 * @param m CAN message
135 * @return success or error
137 UNS8 canSend(CAN_PORT port, Message *m)
142 res = DLL_CALL(canSend)(((CANPort*)port)->fd, m);
151 * @param port CAN port
153 void canReceiveLoop(CAN_PORT port)
157 while (((CANPort*)port)->used) {
158 if (DLL_CALL(canReceive)(((CANPort*)port)->fd, &m) != 0)
162 canDispatch(((CANPort*)port)->d, &m);
169 * @param board device name and baudrate
170 * @param d CAN object data
171 * @return valid CAN_PORT pointer or NULL
173 CAN_PORT canOpen(s_BOARD *board, CO_Data * d)
176 for(i=0; i < MAX_NB_CAN_PORTS; i++)
178 if(!canports[i].used)
182 #ifndef NOT_USE_DYNAMIC_LOADING
183 if (&DLL_CALL(canOpen)==NULL) {
184 fprintf(stderr,"CanOpen : Can Driver dll not loaded\n");
188 CAN_HANDLE fd0 = DLL_CALL(canOpen)(board);
190 canports[i].used = 1;
191 canports[i].fd = fd0;
193 d->canHandle = (CAN_PORT)&canports[i];
194 CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop);
195 return (CAN_PORT)&canports[i];
197 MSG("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate);
204 * @param d CAN object data
205 * @return success or error
207 int canClose(CO_Data * d)
211 ((CANPort*)d->canHandle)->used = 0;
212 CANPort* tmp = (CANPort*)d->canHandle;
216 res = DLL_CALL(canClose)(tmp->fd);
218 // kill receiver task
219 WaitReceiveTaskEnd(&tmp->receiveTask);
226 * CAN change baudrate routine
227 * @param port CAN port
228 * @param baud baudrate
229 * @return success or error
231 UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
236 res = DLL_CALL(canChangeBaudRate)(((CANPort*)port)->fd, baud);
245 EXPORT_SYMBOL (canOpen);
246 EXPORT_SYMBOL (canClose);
247 EXPORT_SYMBOL (canSend);
248 EXPORT_SYMBOL (canChangeBaudRate);