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
證明成功