From: ppisa Date: Sun, 4 Jan 2004 15:53:14 +0000 (+0000) Subject: Added RT-Linux version of sendburst and readburst utilities. X-Git-Tag: CLT_COMM_CAN_pre_canmsg_change~8 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/commitdiff_plain/1a22ac61861ab5e4ab8cde38503832fbc8fbc818 Added RT-Linux version of sendburst and readburst utilities. It worked on the first try with previously committed LinCAN RTL changes :-). Corrected one forgotten line in ioctl_rtl.c => filters work from RT-linux same way as from Linux user-space applications. --- diff --git a/lincan/src/Makefile.omk b/lincan/src/Makefile.omk index 37efcca..674077c 100644 --- a/lincan/src/Makefile.omk +++ b/lincan/src/Makefile.omk @@ -1,6 +1,6 @@ rtlinux_INCLUDES = -I $(srcdir)/../include -DCAN_WITH_RTL kernel_INCLUDES = -I $(srcdir)/../include -kernel_INCLUDES += -DCAN_DEBUG +#kernel_INCLUDES += -DCAN_DEBUG kernel_INCLUDES += -DWITH_DEVFS_FS kernel_MODULES = lincan diff --git a/lincan/src/ioctl_rtl.c b/lincan/src/ioctl_rtl.c index 449b345..6c116a3 100644 --- a/lincan/src/ioctl_rtl.c +++ b/lincan/src/ioctl_rtl.c @@ -76,8 +76,7 @@ int can_ioctl_rtl_posix(struct rtl_file *fptr, unsigned int cmd, unsigned long a } case CANQUE_FILTER: { - struct canfilt_t canfilt; - copy_from_user(&canfilt, (void*)arg, sizeof(struct canfilt_t)); + struct canfilt_t canfilt=*(struct canfilt_t *)arg; if(canuser->rx_edge0){ canque_set_filt(canuser->rx_edge0, canfilt.id, canfilt.mask, canfilt.flags); } diff --git a/lincan/src/main.c b/lincan/src/main.c index 38a0ec0..b57c79c 100644 --- a/lincan/src/main.c +++ b/lincan/src/main.c @@ -102,6 +102,9 @@ MODULE_LICENSE("GPL"); #ifdef MODULE_DESCRIPTION MODULE_DESCRIPTION("Universal Linux CAN-bus device driver"); #endif +#ifdef MODULE_AUTHOR +MODULE_AUTHOR("Pavel Pisa , Arnaud Westenberg"); +#endif /* Global structures, used to describe the installed hardware. */ struct canhardware_t canhardware; diff --git a/lincan/utils/Makefile.omk b/lincan/utils/Makefile.omk index 6c1b093..cdfaf52 100644 --- a/lincan/utils/Makefile.omk +++ b/lincan/utils/Makefile.omk @@ -8,5 +8,10 @@ rxtx_SOURCES = rxtx.c send_SOURCES = send.c can_proxy_SOURCES = can-proxy.c +# RT-Linux version of build +rtlinux_MODULES = sendburst_rtl readburst_rtl +sendburst_rtl_SOURCES = sendburst_rtl.c + +readburst_rtl_SOURCES = readburst_rtl.c diff --git a/lincan/utils/readburst_rtl.c b/lincan/utils/readburst_rtl.c new file mode 100644 index 0000000..9f03cbf --- /dev/null +++ b/lincan/utils/readburst_rtl.c @@ -0,0 +1,157 @@ +#include +#include +#include +#include +#include + +#define printf rtl_printf + +#include "../include/can.h" + +int fd; + +struct canfilt_t canfilt = { + .flags = 0, + .queid = 0, + .cob = 0, + .id = 0, + .mask = 0 +}; + +int canfilt_fl; + +int canfilt_mask, canfilt_id, canfilt_flags; + + +int can_wait_sec = 5; + +char *can_dev_name = "/dev/can0"; + +#define PRT_PREFIX_SIZE 40 +char prt_prefix[PRT_PREFIX_SIZE]; + +char *prt_prefix_in = "CAN %s : "; + +MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]"); +MODULE_PARM(can_dev_name,"1s"); +MODULE_PARM_DESC(canfilt_mask,"CAN filter mask"); +MODULE_PARM(canfilt_mask,"1i"); +MODULE_PARM_DESC(canfilt_id,"CAN filter message ID"); +MODULE_PARM(canfilt_id,"1i"); +MODULE_PARM_DESC(canfilt_flags,"CAN filter flags"); +MODULE_PARM(canfilt_flags,"1i"); +MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages"); +MODULE_PARM(can_wait_sec,"1i"); +MODULE_PARM_DESC(prt_prefix_in,"string prefix for output"); +MODULE_PARM(prt_prefix_in,"1i"); + +MODULE_SUPPORTED_DEVICE("sendburst_rtl"); +MODULE_AUTHOR("Pavel Pisa "); +MODULE_DESCRIPTION("readburst_rtl: receiver of CAN messages for RT-Linux interface to LinCAN driver"); +MODULE_LICENSE("GPL"); + +void readburst_cleanup(void *arg) +{ + printf("%scleanup handler called\n", prt_prefix); + close((int)arg); +} + +#if 0 +int can_fd_wait(int fd, int wait_sec) +{ + int ret; + struct timeval timeout; + fd_set set; + + FD_ZERO (&set); + FD_SET (fd, &set); + timeout.tv_sec = wait_sec; + timeout.tv_usec = 0; + while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1 + &&errno==-EINTR); + return ret; +} +#endif + +int readburst_main(void *arg) +{ + int n,ret; + unsigned long i=0; + struct canmsg_t readmsg={0,0,5,0,0,{0,}}; + + if(canfilt_mask || canfilt_id || canfilt_flags){ + canfilt_fl=1; + canfilt.mask=canfilt_mask; + canfilt.id=canfilt_id; + canfilt.flags=canfilt_flags; + } + + if ((fd=open(can_dev_name, O_RDWR)) < 0) { + printf("Error opening %s\n", can_dev_name); + return -1; + } + pthread_cleanup_push(readburst_cleanup,(void*)fd); + + snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name); + + if (canfilt_fl) { + ret = ioctl(fd, CANQUE_FILTER, &canfilt); + if(ret<0) { + printf("%serror in call ioctl FILTER_QUE",prt_prefix); + } + } + + + while (1) { + readmsg.flags=0; + readmsg.cob=0; + readmsg.timestamp=0; + #if 0 + ret=can_fd_wait(fd, can_wait_sec); + printf("%scan_fd_wait returned %d\n", prt_prefix, ret); + #endif + ret=read(fd,&readmsg,sizeof(struct canmsg_t)); + if(ret <0) { + printf("%sError reading message\n", prt_prefix); + } + else if(ret == 0) { + printf("%sNo message arrived\n", prt_prefix); + } else { + printf("%sRx msg #%lu: id=%lX dlc=%u flg=0x%02x", + prt_prefix,i,readmsg.id,readmsg.length,readmsg.flags); + for(n=0 ; n +#include +#include +#include +#include + +#define printf rtl_printf + +#include "../include/can.h" + +int canmsg_flags = 0; +unsigned long canmsg_id = 5; +int block = 10; +int count = 0; + +int can_wait_sec = 1; +int o_sync_fl = 0; + +char *can_dev_name = "/dev/can0"; + +#define PRT_PREFIX_SIZE 40 +char prt_prefix[PRT_PREFIX_SIZE]; + +char *prt_prefix_in = "CAN %s : "; + +MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]"); +MODULE_PARM(can_dev_name,"1s"); +MODULE_PARM_DESC(canmsg_id,"ID of generated messages"); +MODULE_PARM(canmsg_id,"1i"); +MODULE_PARM_DESC(canmsg_flags,"CAN filter flags"); +MODULE_PARM(canmsg_flags,"1i"); +MODULE_PARM_DESC(o_sync_fl,"open in synchronous mode"); +MODULE_PARM(o_sync_fl,"1i"); +MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages"); +MODULE_PARM(can_wait_sec,"1i"); +MODULE_PARM_DESC(block,"number of messages in block"); +MODULE_PARM(block,"1i"); +MODULE_PARM_DESC(count,"number of sent blocks of messages"); +MODULE_PARM(count,"1i"); +MODULE_PARM_DESC(prt_prefix_in,"string prefix for output"); +MODULE_PARM(prt_prefix_in,"1i"); + + +MODULE_SUPPORTED_DEVICE("sendburst_rtl"); +MODULE_AUTHOR("Pavel Pisa "); +MODULE_DESCRIPTION("sendburst_rtl: generatot of CAN messages for RT-Linux interface to LinCAN driver"); +MODULE_LICENSE("GPL"); + +void sendburst_cleanup(void *arg) +{ + printf("%scleanup handler called\n", prt_prefix); + close((int)arg); +} + +int sendburst_main(void *arg) +{ + struct canmsg_t sendmsg={0,0,5,0,8,{1,2,3,4,5,6,7,8}}; + int fd, ret,i,j; + + + if ((fd=open(can_dev_name, O_RDWR | (o_sync_fl? O_SYNC:0))) < 0) { + printf("Error opening %s\n", can_dev_name); + return -1; + } + pthread_cleanup_push(sendburst_cleanup,(void*)fd); + + snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name); + + j=0; + while (1) { + for(i=0;i