zynq+linux+ramdisk can调试
由于采用ramdisk文件系统,自带的ip工具版本太旧无法配置can,需要自行编译ip,具体参见参考文献2
1.vivado配置ps
2.设备树增加can0,一般开发板均已提供此配置
can@e0008000 {
compatible = "xlnx,zynq-can-1.0";
status = "okay";
clocks = <0x1 0x13 0x1 0x24>;
clock-names = "can_clk", "pclk";
reg = <0xe0008000 0x1000>;
interrupts = <0x0 0x1c 0x4>;
interrupt-parent = <0x3>;
tx-fifo-depth = <0x40>;
rx-fifo-depth = <0x40>;
};
3.kernel配置,一般已配好,具体参见参考文献1
4.测试
# ifconfig -a
can0 Link encap:UNSPEC HWaddr ---------------
NOARP MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
Interrupt: eth0 Link encap:Ethernet HWaddr :0A::::
inet addr:192.168.0.120 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (465.3 KiB) TX bytes: (18.1 KiB)
Interrupt: Base address:0xb000 lo Link encap:Local Loopback
LOOPBACK MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
设置can0的波特率,这里设置的是100k, ip程序一般需要自己编译生成,参见2
#./ip link set can0 up type can bitrate 100000
显示can0状态信息
#./ip -d -s link show can0
Z-turn# ./ip link set can0 type can bitrate
xilinx_can e0008000.can can0: bitrate error 0.0%
Z-turn#./ip link set can0 up
Z-turn#./ip -d -s link show can0
: can0: <NOARP,UP,LOWER_UP,ECHO> mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen
link/can promiscuity
can state ERROR-ACTIVE (berr-counter tx rx ) restart-ms
bitrate sample-point 0.750
tq prop-seg phase-seg1 phase-seg2 sjw
xilinx_can: tseg1 .. tseg2 .. sjw .. brp .. brp-inc
clock
re-started bus-errors arbit-lost error-warn error-pass bus-off
numtxqueues numrxqueues
RX: bytes packets errors dropped overrun mcast TX: bytes packets errors dropped carrier collsns
5.下面程序为收发测试,也可参见参考文献3
/*****************************************************************************
* Copyright (c) 2014-2017 MYIR Tech Ltd.
* File: can-test.c
* Date: 2014/11/3
* Author: Kevin Su
* Description: A demo program to show how to transmit/receive data with
* socket can interface on CAN bus.
* Please note that, this demo needs two boards to run as
* transmitter and receiver.
* Before run "can-test", we need to config the bitrate with
* "ip" command:
* # ip link set can0 up type can bitrate 100000
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h> #define DEBUG 1 #define ERR_MSG(fmt, args...) fprintf(stderr, fmt, ##args)
#ifdef DEBUG
#define DBG_MSG(fmt, args...) fprintf(stdout, fmt, ##args)
#else
#define DBG_MSG(fmt, args...)
#endif #ifndef PF_CAN
#define PF_CAN 29
#endif #ifndef AF_CAN
#define AF_CAN PF_CAN
#endif int main(int argc, char *argv[])
{
int fd, ret, flag, len;
char senddata[] = "test";
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
socklen_t socket_len = sizeof(struct sockaddr_can); /* Create a socket with PF_CAN family, SOCK_RAW and CAN_RAW protocol */
fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (fd < ) {
ERR_MSG("Open socket failed!\n");
return fd;
} /* Use can0 */
strcpy((char *)(ifr.ifr_name), "can0"); /* Get information */
ret = ioctl(fd, SIOCGIFINDEX, &ifr);
if (ret != ) {
ERR_MSG("SIOCGIFINDEX failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("can0 can_ifindex = %x\n",ifr.ifr_ifindex); /* Disable loopback */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Set loopback disable failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Set can0 loopback disable\n"); /* Disable receiving own message */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
&flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Disable receiving own message failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Disable receiving own message\n"); /* Use AF_CAN protocol family */
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex; /* Binding socket */
ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret != ) {
ERR_MSG("Bind socket failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Bind can0 socket\n"); frame.can_id = 0x123;
len = strlen(senddata); while () {
strncpy((char *)frame.data, senddata, len);
frame.can_dlc = len;
ret = sendto(fd, &frame, sizeof(struct can_frame), , (struct sockaddr*)&addr, sizeof(addr));
if (ret > ) {
DBG_MSG("Send success: [%s], ret=%d\n", senddata, ret);
ret = recvfrom(fd, &frame, sizeof(struct can_frame), , (struct sockaddr *)&addr, &socket_len);
if (ret > ) {
DBG_MSG("Recv message: [%s], ret=%d\n", frame.data, ret);
}
}
usleep();
} return ;
}
超时设置(参考文献4):
struct timeval timeout = {,}; //1.0s
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
对于offline节点处理:
如果该控制器没有连接到can网络上,调用send会返回成功,但只是发送至kernel的缓冲区,并非发送至can网络。kernel会一直尝试重发,即使关闭socket或结束进程都不会取消重 发操作,此时如果将控制器连接到can网络上则会一次性将缓冲区内所有内容发出,有时这并非所要结果。如果想要清空发送和接收缓冲区,只能重启can接口
ifconfig can0 down
ifconfig can0 up
在程序中可使用system调用。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
参考文献:
1.http://xilinx.eetrend.com/blog/12062
2.http://www.cnblogs.com/hujianhua/p/8446291.html
3.https://wenku.baidu.com/view/65baea51bb68a98271fefaa7.html
4.https://blog.csdn.net/newger/article/details/2459113
zynq+linux+ramdisk can调试的更多相关文章
- Linux systemd 打开调试终端、添加开机自运行程序
/************************************************************************* * Linux systemd 打开调试终端.添加 ...
- linux + ffmpeg + eclipse 调试
使用linux + ffmpeg + eclipse调试步骤OS : ubuntu 12.04Eclipse : 3.7.2 为Eclipse安装cdt插件,使其支持c/c++ 导入ffmpeg项目 ...
- pycharm远程linux开发和调试代码
pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...
- zynq linux驱动之PL-PS中断【转】
转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...
- Linux驱动开发调试 -- 打开dev_dbg()【转】
本文转载自:https://blog.csdn.net/kunkliu/article/details/78048618 转载地址:http://blog.chinaunix.net/uid-2284 ...
- Linux 系统内核的调试
http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟 ...
- 嵌入式linux应用程序调试方法
嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...
- Linux Shell 程序调试
Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的“调试信息”.当然,用户也可以在she ...
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
随机推荐
- js插件---评分插件Rating如何使用
js插件---评分插件Rating如何使用 一.总结 一句话总结:form下的input和a标签,input记录值,a标签显示样式 12 <form data-am-rating> 13 ...
- 62.C++文件操作list实现内存检索,实现两千万数据秒查
1 #include <iostream> #include <fstream> #include <cstdlib> #include <string> ...
- BZOJ 2037 区间DP
跟POJ 3042是一个类型的http://blog.csdn.net/qq_31785871/article/details/52954924 思路: 先排个序 (把初始位置也插进去) f[i][j ...
- PHP生成RSS报
<?php$sql="select * from wx_zimi ";$res=$dbs->query($sql);$arr=array();while($o=$dbs ...
- 【Codeforces Round #456 (Div. 2) C】Perun, Ult!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] set1 < pair < int,int > > set1;记录关键点->某个人怪物永远打不死了,第 ...
- 【习题 8-1 UVA - 1149】Bin Packing
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个背包只能装两个东西. 而且每个东西都要被装进去. 那么我们随意考虑某个物品.(不必要求顺序 这个物品肯定要放进某个背包里面的. ...
- 汉化 Hirens.BootCD 中的 XP 系统
汉化 Hirens.BootCD 中的 XP 系统 1. 在中文版 XPSP3 镜像中提取所需的文件 原系统为没有作 server pack 的 Windows XP Professional ,在W ...
- js06--利用js给数组去重
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Android控件开发之Gallery3D效果
package xiaosi.GalleryFlow; import android.app.Activity; import android.os.Bundle; public class Gall ...
- Mysql基本增删改查
1登陆服务器 mysql -h localhost -u username -p password 2查看存在数据库 show databases; 3创建一个数据库(例如名字为class1,以下都是 ...