編輯:關於Android編程
最近在研究一塊TI公司的TMDEVM-AM3358開發板,這是一款硬件資源相當豐富並且性能非常好的工業評估板,我重點需要用到板上的網卡、串口以及CAN總線。眾所周知,在android這樣一款風靡全球的移動端操作系統內部,對於網卡的支持已經伴隨這一系統本身的發展而相當完善。然而,串口線已經逐步淡出我們的視野,但是由於簡單易用,在很多時刻依然派得上用場。其中最少見的應該就是CAN總線了,所以在調試CAN模塊之中遇到了很多的問題。遺憾的是,似乎就連谷歌上也很難找到關於AM335x系列的ARM開發板CAN開發的介紹,這裡就將我這段時間以來在CAN上所做的工作和遇到的問題總結一下。方便有需要的人少走彎路。
關於CAN的介紹,官方給出了一份文檔,點擊下載。經過了好幾遍的通讀之後,對他的基本步驟及意圖有了一些了解,但是有一點讓我感到疑惑——所有的步驟都是在PC上完成的,但是最後的使用是在ARM上,我並沒有看到哪一步對ARM板進行了操作,那麼最後如何實現呢?要了解這個問題,首先簡單看看文檔的操作步驟。
首先我們需要將ARM板上的CAN模塊啟動,調節SW8,將profile設置為1。SW8在顯示屏接線的下方,如下圖所示:
如果你的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 ,開啟三采樣模式<喎?/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
如果你是用的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的介紹。如果大家還有什麼問題,可以留言,大家一起探討。
那裡是把用戶名和密碼保存到了內存中,這一篇把用戶名和密碼保存至SharedPreferences文件。為了引起誤導,聲明實際開發中不會用到這兩種方式,這裡指示提供一種思路
1.初始置換/IP置換// 初始置換表 private static final int[] IP_Table = { 58, 50, 42, 34, 26, 18, 1
本節引言: 好的,上一節中,我們又寫了一個關於Xfermode圖片混排的例子——擦美女衣服的Demo,加上前面的 利用Xfermode
在Android開發中,往往要用到自定義的控件來實現我們的需求或效果。在使用自定義 控件時,難免要用到自定義屬性,那怎麼使用自定義屬性呢?在文件res/values/下新