完整Android CAN匯流排程式開發

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.