linux下can总线移植及测试总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下can总线移植及测试总结相关的知识,希望对你有一定的参考价值。

Can移植及测试总结

Adding Flexcan driver support on Kernel

一.On kernel menuconfig, add the following items:

[*] Networking support --->
<*> CAN bus subsystem support --->
<*> Raw CAN Protocol (raw access with CAN-ID filtering)

<*> Broadcast Manager CAN Protocol (with content filtering)
        CAN Device Driver --->
         <*> Virtual Local CAN Interface (vcan)
          [*] CAN devices debugging messages
         <*> Support for Freescale FLEXCAN based chips

修改驱动:

1.board-mx6q_sabresd.h

添加

/*can2*/

MX6Q_PAD_KEY_COL4__CAN2_TXCAN,

MX6Q_PAD_KEY_ROW4__CAN2_RXCAN,

MX6Q_PAD_GPIO_1__GPIO_1_1,/*CAN_STBY 省电开关,为0唤醒,为1休眠*/

2.board-mx6q_sabresd.c

/*CAN1*/

gpio_request(SABRESD_CAN1_STBY,"flexcan1_stby");

gpio_direction_output(SABRESD_CAN1_STBY,1);

 

static void mx6q_sabresd_flexcan0_switch(int enable)

{

if (enable) {

printk("\nflexcan0 up\n");

gpio_set_value(SABRESD_CAN1_STBY, 0);

} else {

printk("flexcan0 down\n");

gpio_set_value(SABRESD_CAN1_STBY, 1);

}

}

 

static const struct flexcan_platform_data

mx6q_sabresd_flexcan0_pdata __initconst = {

.transceiver_switch = mx6q_sabresd_flexcan0_switch,//控制can设备的休眠唤醒省电开关

};

 

/*CAN1*/

imx6q_add_flexcan0(&mx6q_sabresd_flexcan0_pdata);

 

二.can test:

 

预备知识:

--build= 谁在这里编译? 意思说你目前的编译动作在哪里跑的 ? 如果是编译一个arm工具链,虽然工具链为为arm弄的,但是构建工具链的时候是在主机上进行的。所以 --build=i686-pc-linux-gnu

--host= 目前编译出来的程序在哪里跑 ? 所以工具链好了之后,给目标系统编译程序全部是设置host为arm的。

--target=为谁编译程序,这在交叉编译的时候跟host一个意思,一般是guess的,而且configure 脚本会说是 =--host.

通常我们编译复杂的情况就是交叉编译了,据说还有一种很复杂的情况,三个平台:

比较,我现在在 i686机器上,想编译一个在 ppc上运行的交叉工具链,然后这个交叉工具链为arm生产程序,这个就算比较复杂了。

应该是binutils,gcc,libc的时候这个三个--要很谨慎的设置了。

可能是

· --build=i686-pc-linux-gnu

· --host=ppc-xxx

· --target=arm-xxx

没有实验过,可以改天实验下,学习下。

续:三平台交叉编译实验

binutils源码解压,配置如下:

../binutils-2.21.1/configure --build=i686-pc-linux-gnu --host=armv5l-jztech-linux-gnueabi --target=mips-linux --prefix=/home/dbh/workspace/linux-dev/nmru/prjhome/sources/bin-build/dest

然后make,发现编译的时候大部分时候调用的armv5l-xx-gcc,顺利完成,

make install,装到dest下面:

然后 ls dest

bin  lib  mips-linux  share

看来target的确是mips,然后file 下:

file bin/mips-linux-as
bin/mips-linux-as: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

mips-linux-as是个交叉编译器哦,在arm上跑的,不过target是mips,哈哈,看来有点感觉了。

这下可以明白,其实编译的时候编译系统根据合适的 host, build 来调用合适的gcc来做事情,可以看出来,在三个平台的时候,--build平台是跑编译脚本或者说make的,会调用 host的编译器,而且显而易见的是 host指定的一定是个交叉编译器。

开始工作:

sudo tar -xvf xx.tar

freecale ltib环境:

./ltib -m shell

正事开始工作:

下载canutils的最新源码http://www.pengutronix.de/software/socket-can/download/canutils。

下载libsocketcan。http://www.pengutronix.de/software/libsocketcan/download/下载的是libsocketcan 0.0.9。

解压两个包

sudo bzip2 -d xx.tar.bz2 从交叉工具链的情况来看,可以总结如下

 

1. 由于canutils-4.0.6需要libsocketcan 0.0.9它的库的支持所以先编译libsocketcan 0.0.9

(1)Export你的编译工具链的路径:

export PATH=$PATH:/disk2/Extand1/yg_work/test/arm-2011.03/bin/

(2) 配置编译工具链和安装目录

./configure  --prefix=/disk2/Extand1/yg_work/test/can/libsocketcan_out/ --host= arm-none-linux-gnueabi 

(3)编译安装

make

make install

2.编译canutils-4.0.6

(1) 配置编译工具链,安装目录和链接库等

cd canutils-4.0.6/

export PATH=$PATH:/disk2/Extand1/yg_work/test/arm-2011.03/bin/

./configure --host=arm-none-linux-gnueabi 

--prefix=/disk2/Extand1/yg_work/test/can/canutils-4.0.6_out/ libsocketcan_LIBS=-lsocketcan LDFLAGS="-L/disk2/Extand1/yg_work/test/can/libsocketcan_out/lib/" libsocketcan_CFLAGS="-I/disk2/Extand1/yg_work/test/can/libsocketcan_out/include"

(2)到src目录下静态编译canutils-4.0.6

cd src

cp ../../libsocketcan_out/include/libsocketcan.h ../../libsocketcan_out/include/can_netlink.h  ./    

arm-none-linux-gnueabi-gcc -DHAVE_CONFIG_H -I. -I../include  -I../include -I../include  -o candump candump.c –static

arm-none-linux-gnueabi-gcc -DHAVE_CONFIG_H -I. -I../include  -I../include -I../include  -o cansend cansend.c –static

其余同理这样编译成静态,因为单纯make发现编译成动态总会在arm板上运行说no such file.

报错:

canconfig.c:34:26: fatal error: libsocketcan.h: No such file or directory

解决办法:将先前编译好的技术分享复制到

(3)将编译好的cansend 复制到对应开发板的bin目录即可

dmesg | grep can

ip link set can0 up type can bitrate 500000

ifconfig can0 up

cansend can0 -i0xb00 0x31 0x32 0x33 0x41 0x42 0x43

 

:如果测试中发现这样的信息

cansend can0 -i0xb00 0x31 0x32 0x33 0x41 0x42 0x43               

interface = can0, family = 29, tyflexcan imx6q-flexcan.0: Error Warning IRQ

则说明:

你的内核配置没问题,只是你和你的另一块板子通信有问题(可能硬件没连接好或者你干脆没连接那块板)

pe = 3, proto = 1

另一块板子接受即可。

发送板:

[email protected]:/ # cansend can0 -i0xb00 0x31 0x32 0x33 0x41 0x42 0x43               

interface = can0, family = 29, type = 3, proto = 1

接收板:

CAN receive = 00000031 00000032 00000033 00000041 00000042 00000043

2,  CAN总线测试                    FAIL         J2,E7,E8,C33,C11,R15,R20,R154,R153,U2,C62,R23,R83

 

 CAN receive = 00000031 00000032 00000033 00000041 00000042 00000043

证明成功

 








以上是关于linux下can总线移植及测试总结的主要内容,如果未能解决你的问题,请参考以下文章

linux can 总线socket接口测试使用

技术丨汽车CAN总线的开发及测试工具

Linux下的can 设备测试

信迈AM5728 CAN总线测试方法

CAN总线知识总结

CAN现场总线基础知识总结,看这一篇就理清了(CAN是什么,电气属性,CAN通协议等)