完整Android CAN匯流排程式開發
最近在研究一塊TI公司的TMDEVM-AM3358開發板,這是一款硬體資源相當豐富並且效能非常好的工業評估板,我重點需要用到板上的網卡、串口以及CAN匯流排。眾所周知,在android這樣一款風靡全球的移動端作業系統內部,對於網卡的支援已經伴隨這一系統本身的發展而相當完善。然而,串口線已經逐步淡出我們的視野,但是由於簡單易用,在很多時刻依然派得上用場。其中最少見的應該就是CAN匯流排了,所以在調試CAN模組之中遇到了很多的問題。遺憾的是,似乎就連Google上也很難找到關於AM335x系列的ARM開發板CAN開發的介紹,這裡就將我這段時間以來在CAN上所做的工作和遇到的問題總結一下。方便有需要的人少走彎路。
關於CAN的介紹,官方給出了一份文檔,點擊下載。經過了好幾遍的通讀之後,對他的基本步驟及意圖有了一些瞭解,但是有一點讓我感到疑惑——所有的步驟都是在PC上完成的,但是最後的使用是在ARM上,我並沒有看到哪一步對ARM板進行了操作,那麼最後如何?呢?要瞭解這個問題,首先簡單看看文檔的操作步驟。
首先我們需要將ARM板上的CAN模組啟動,調節SW8,將profile設定為1。SW8在顯示屏接線的下方,如所示:
ARM開發板運行linux系統並且不修改canutil工具源碼
如果你的ARM是啟動並執行linux系統,那麼恭喜你,TI的linux源碼中已經整合了CANUTIL工具,可以直接使用。但是預設CAN驅動好像是未開啟的,例如:在ARM終端
root@am335x-evm:~# canconfig can0 bitrate 50000 Cannot find device can0 failed to set bitrate of can0 to 50000
提示找不到can0裝置,說明核心中未加入CAN驅動,那麼我們需要配置驅動,方法如下:
在核心根目錄輸入
gedit Makefile
找到如下片段:
export KBUILD_BUILDHOST := (SUBARCH)ARCH?=(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:”%”=%)
修改為:
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-eabi-
此步驟目的是使當前核心編譯模式為ARM平台。
接下來輸入:
make menuconfig
按照圖示步驟依次選擇:
1. [*] Networking support —>
2. <*> CAN bus subsystem support —>
3. CAN Device Drivers —>
4. <*> Bosch D_CAN devices —>
注意把這裡的D_CAN打上星號。
5. Generic Platform Bus based D_CAN driver
同樣將這一項打上星號。
好了,驅動配置完畢,下面執行Make指令,隨後將產生好的核心鏡像製作到SD卡中,重新啟動開發板,那麼CAN0裝置就可以使用了。
可以嘗試通過以下指令進行配置和收發:
1. 配置can0傳輸速率為50000 ,開啟三取樣模式<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">canconfig can0 bitrate 50000 ctrlmode triple-sampling on開啟can0裝置
canconfig can0 start
發送資料
cansend can0 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
接收資料
candump can0
ARM開發板運行android系統或者要重新編譯canutil工具
如果你是用的android或者你想對CAN工具進行修改重新編譯,那麼還需要繼續下面的步驟。
首先同樣需要在核心中配置CAN驅動,並將Profile Selection設定成1,方法同上。
然後下載源碼,官方說明中是需要下載三種源碼(點擊可下載):
- iproute2
- libsocket
- canutil
但是這裡我只需要用到最後一個canutil即可。
下載完成之後,首先配置環境變數,如下:
export GNUEABI=arm-arago-linux-gnueabiexport CC=$GNUEABI-gccexport LD=$GNUEABI-ldexport NM=$GNUEABI-nmexport AR=$GNUEABI-arexport RANLIB=$GNUEABI-ranlibexport CXX=$GNUEABI-c++export PREFIX=$FILESYS_PATH/usrexport CROSS_COMPILE_PREFIX=$PREFIXexport PATH=$TOOL_CHAIN_PATH/bin:$PATHexport LIBSOCKETCAN_INSTALL_DIR=$LIBSOCKETCAN_PATH/installexport PKG_CONFIG_PATH=$LIBSOCKETCAN_PATH/configexport LD_LIBRARY_PATH=${LIBDIR}:${LD_LIBRARY_PATH}export LD_RAN_PATH=${LIBDIR}:${LD_RAN_PATH}export LDFLAGS=-Wl,--rpath -Wl,$LIBSOCKETCAN_INSTALL_DIR/libexport INCLUDES=-I$LIBSOCKETCAN_INSTALL_DIR/include
其中PREFIX 是目標目錄,可以自行設定。
然後進入canutils-4.0.6檔案夾,輸入以下指令:
./configure --host=arm-arago-linux --prefix=$PREFIX --enable-debug
之後會根據目標平台產生相應的Makefile。接著依次執行:
make
make install
完畢之後,會在PREFIX/usr/bin下找到如下四個檔案:
cansend , candump , cansequence , canecho
PREFIX/usr/sbin下找到如下一個檔案:
canconfig
將這幾個檔案複製到android系統的/system/bin目錄下(需要root許可權)。這樣我們就可以執行這5個命令了。
但這時候如果直接執行,可能會出現如下錯誤:
root@android:/ # cansend/system/bin/sh: cansend: No such file or directory
這說明cansend這個應用程式是動態編譯的,本地缺少需要的庫檔案。可以在PC上通過命令readelf查看需要的庫檔案。
root@MC:~/android/can/usr/bin# readelf -l cansendElf file type is EXEC (Executable file)Entry point 0x8679There are 8 program headers, starting at offset 52Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x001074 0x00009074 0x00009074 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x00008134 0x00008134 0x00019 0x00019 R 0x1 [Requesting program interpreter: /lib/ld-linux-armhf.so.3] LOAD 0x000000 0x00008000 0x00008000 0x01080 0x01080 R E 0x8000 LOAD 0x001080 0x00011080 0x00011080 0x00158 0x00170 RW 0x8000 DYNAMIC 0x00108c 0x0001108c 0x0001108c 0x000e8 0x000e8 RW 0x4 NOTE 0x000150 0x00008150 0x00008150 0x00044 0x00044 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
看到最中間顯示的一句話:
[Requesting program interpreter: /lib/ld-linux-armhf.so.3]
這裡需要ld-linux-armhf.so.3庫檔案才能使用cansend命令。這裡也是android和linux在檔案系統上的一個差異,android系統無法直接運行由交叉編譯器動態編譯出來的應用程式。這裡可以參考我的另一篇部落格——
Android系統如何運行動態編譯的程式 。將ARM-linux系統中的庫檔案複製到android系統的/lib目錄下即可。
這時候,我們可以利用canconfig來配置can裝置,也可以通過cansend、cansequence來發送資料,通過candump來接收資料,具體指令集可以參考官方文檔。
以上就是這段時間以來對AM335x開發板can模組的調試過程,還是花了不少功夫的,主要原因是資料太少,除了文檔就沒有找到關於這套開發板的android CAN的介紹。如果大家還有什麼問題,可以留言,大家一起探討。