1. 程式人生 > >linux下can總線移植及測試總結

linux下can總線移植及測試總結

哪裏 ips sub 開關 switch 發現 開發 主機 編譯工具

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總線移植及測試總結