5 #include <posix/unistd.h>
7 #define printf rtl_printf
9 #include "../include/can.h"
13 struct canfilt_t canfilt = {
23 int canfilt_mask, canfilt_id, canfilt_flags;
28 char *can_dev_name = "/dev/can0";
30 #define PRT_PREFIX_SIZE 40
31 char prt_prefix[PRT_PREFIX_SIZE];
33 char *prt_prefix_in = "CAN %s : ";
35 MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]");
36 MODULE_PARM(can_dev_name,"1s");
37 MODULE_PARM_DESC(canfilt_mask,"CAN filter mask");
38 MODULE_PARM(canfilt_mask,"1i");
39 MODULE_PARM_DESC(canfilt_id,"CAN filter message ID");
40 MODULE_PARM(canfilt_id,"1i");
41 MODULE_PARM_DESC(canfilt_flags,"CAN filter flags");
42 MODULE_PARM(canfilt_flags,"1i");
43 MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages");
44 MODULE_PARM(can_wait_sec,"1i");
45 MODULE_PARM_DESC(prt_prefix_in,"string prefix for output");
46 MODULE_PARM(prt_prefix_in,"1i");
48 MODULE_SUPPORTED_DEVICE("sendburst_rtl");
49 MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
50 MODULE_DESCRIPTION("readburst_rtl: receiver of CAN messages for RT-Linux interface to LinCAN driver");
51 MODULE_LICENSE("GPL");
53 void readburst_cleanup(void *arg)
55 printf("%scleanup handler called\n", prt_prefix);
60 int can_fd_wait(int fd, int wait_sec)
63 struct timeval timeout;
68 timeout.tv_sec = wait_sec;
70 while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
76 int readburst_main(void *arg)
80 struct canmsg_t readmsg={0,0,5,0,0,{0,}};
82 if(canfilt_mask || canfilt_id || canfilt_flags){
84 canfilt.mask=canfilt_mask;
85 canfilt.id=canfilt_id;
86 canfilt.flags=canfilt_flags;
89 if ((fd=open(can_dev_name, O_RDWR)) < 0) {
90 printf("Error opening %s\n", can_dev_name);
93 pthread_cleanup_push(readburst_cleanup,(void*)fd);
95 snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
98 ret = ioctl(fd, CANQUE_FILTER, &canfilt);
100 printf("%serror in call ioctl FILTER_QUE",prt_prefix);
110 ret=can_fd_wait(fd, can_wait_sec);
111 printf("%scan_fd_wait returned %d\n", prt_prefix, ret);
113 ret=read(fd,&readmsg,sizeof(struct canmsg_t));
115 printf("%sError reading message\n", prt_prefix);
118 printf("%sNo message arrived\n", prt_prefix);
120 printf("%sRx msg #%lu: id=%lX dlc=%u flg=0x%02x",
121 prt_prefix,i,readmsg.id,readmsg.length,readmsg.flags);
122 for(n=0 ; n<readmsg.length ; n++)
123 printf(" %.2X",(unsigned char)readmsg.data[n]);
127 pthread_testcancel();
130 /* close(fd); is called by cleanup handler*/
131 pthread_cleanup_pop(1);
135 /*===========================================================*/
138 void * t1_routine(void *arg)
140 readburst_main(NULL);
151 int init_module(void) {
153 return pthread_create (&t1, NULL, t1_routine, 0);
157 void cleanup_module(void) {
158 pthread_delete_np (t1);
160 /*pthread_cancel(t1);
161 pthread_join(t1, NULL);*/