Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 完整Android CAN總線程序開發

完整Android CAN總線程序開發

編輯:關於Android編程

最近在研究一塊TI公司的TMDEVM-AM3358開發板,這是一款硬件資源相當豐富並且性能非常好的工業評估板,我重點需要用到板上的網卡、串口以及CAN總線。眾所周知,在android這樣一款風靡全球的移動端操作系統內部,對於網卡的支持已經伴隨這一系統本身的發展而相當完善。然而,串口線已經逐步淡出我們的視野,但是由於簡單易用,在很多時刻依然派得上用場。其中最少見的應該就是CAN總線了,所以在調試CAN模塊之中遇到了很多的問題。遺憾的是,似乎就連谷歌上也很難找到關於AM335x系列的ARM開發板CAN開發的介紹,這裡就將我這段時間以來在CAN上所做的工作和遇到的問題總結一下。方便有需要的人少走彎路。

關於CAN的介紹,官方給出了一份文檔,點擊下載。經過了好幾遍的通讀之後,對他的基本步驟及意圖有了一些了解,但是有一點讓我感到疑惑——所有的步驟都是在PC上完成的,但是最後的使用是在ARM上,我並沒有看到哪一步對ARM板進行了操作,那麼最後如何實現呢?要了解這個問題,首先簡單看看文檔的操作步驟。
首先我們需要將ARM板上的CAN模塊啟動,調節SW8,將profile設置為1。SW8在顯示屏接線的下方,如下圖所示:
Profile

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 —>
網絡設備支持.png
2. <*> CAN bus subsystem support —>
CAN總線子系統支持.png
3. CAN Device Drivers —>
CAN設備驅動.png
4. <*> Bosch D_CAN devices —>
Bosch
注意把這裡的D_CAN打上星號。
5. Generic Platform Bus based D_CAN driver
通用平台D_CAN驅動.png
同樣將這一項打上星號。

好了,驅動配置完畢,下面執行Make指令,隨後將生成好的內核鏡像制作到SD卡中,重新啟動開發板,那麼CAN0設備就可以使用了。
可以嘗試通過以下指令進行配置和收發:
1. 配置can0波特率為50000 ,開啟三采樣模式<喎?/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-gnueabi
export CC=$GNUEABI-gcc
export LD=$GNUEABI-ld
export NM=$GNUEABI-nm
export AR=$GNUEABI-ar
export RANLIB=$GNUEABI-ranlib
export CXX=$GNUEABI-c++
export PREFIX=$FILESYS_PATH/usr
export CROSS_COMPILE_PREFIX=$PREFIX
export PATH=$TOOL_CHAIN_PATH/bin:$PATH
export LIBSOCKETCAN_INSTALL_DIR=$LIBSOCKETCAN_PATH/install
export PKG_CONFIG_PATH=$LIBSOCKETCAN_PATH/config
export LD_LIBRARY_PATH=${LIBDIR}:${LD_LIBRARY_PATH}
export LD_RAN_PATH=${LIBDIR}:${LD_RAN_PATH}
export LDFLAGS=-Wl,--rpath -Wl,$LIBSOCKETCAN_INSTALL_DIR/lib
export 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  cansend
Elf file type is EXEC (Executable file)
Entry point 0x8679
There are 8 program headers, starting at offset 52

Program 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的介紹。如果大家還有什麼問題,可以留言,大家一起探討。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved