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
另一块板子接受即可。
发送板:
root@M636:/ # 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
证明成功