Androidドライバ開発シリーズ2

11453 ワード

最近些細なことが多すぎて、blogを書く時間がありません.このandroidドライバの開発デバッグを書き続けます
この章では、ドライバをテストする方法について説明します.
 
1、駆動の簡単なテスト
前の記事では、ドライバモジュールの追加を完了し、ドライバをボードにダウンロードしました.次に、ドライブが正常かどうかをテストする方法について説明します.
このtttドライバでは、読み取りと書き込みのインタフェースを実現し、簡単なテストを行います.
ボードを起動し、システムに入り、コマンドラインに入ります(シリアルポートでもadb shellでも構いません)
devディレクトリにアクセスするには:
root@android:/ # cd /dev
root@android:/dev #

 
tttデバイスファイルが存在するかどうかを確認します.
root@android:/dev # ls -l ttt
crw------- root     root     249,   0 2013-04-02 09:58 ttt

/procディレクトリにアクセスし、デバイスの入出力を検証します.
root@android:/dev # cd /proc/
root@android:/proc #

tttデバイスの値を取得するには、次の手順に従います.
root@android:/proc # cat ttt
0
root@android:/proc #

tttデバイスの値を設定します.
root@android:/proc # echo '111' > ttt
root@android:/proc # cat ttt
111
root@android:/proc #

ここで、tttデバイスファイルはOKで、入出力インタフェースに問題はありません.
もちろん、この入出力を検証する方法は他にもあります.
/sys/classのtttデバイスディレクトリにアクセスします.
root@android:/proc # cd /sys/class/ttt/ttt/
root@android:/sys/class/ttt/ttt # ls
dev
power
subsystem
uevent
val
root@android:/sys/class/ttt/ttt #

valプロパティファイルにアクセスしてtttデバイスの値を読み書きします.
root@android:/sys/class/ttt/ttt # ls
dev
power
subsystem
uevent
val
root@android:/sys/class/ttt/ttt # cat val
111
root@android:/sys/class/ttt/ttt # echo '123' > val
root@android:/sys/class/ttt/ttt # cat val
123
root@android:/sys/class/ttt/ttt #

 
2、Cプログラムを作成して駆動の読み書きをテストする
root権限に切り替え、androidソースディレクトリのexternalディレクトリにアクセスします.
root@brantyou-ubuntu:~# cd workspace/android-4.0.4_r1.2/external/
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external# ls
android-mock    freetype                 libpng         safe-iop
antlr           fsck_msdos               libvpx         skia
apache-harmony  genext2fs                libxml2        sonivox
apache-http     giflib                   libxslt        speex
apache-xml      google-diff-match-patch  libyuv         sqlite
astl            grub                     llvm           srec
bison           gtest                    lohit-fonts    srtp
blktrace        guava                    markdown       stlport
bluetooth       harfbuzz                 mesa3d         strace
bouncycastle    hyphenation              mksh           svox
bsdiff          icu4c                    mockwebserver  tagsoup
bzip2           iproute2                 mtpd           tcpdump
chromium        ipsec-tools              netcat         tinyalsa
clang           iptables                 netperf        tinyxml
collada         javasqlite               neven          tremolo
dbus            javassist                nist-sip       v8
dhcpcd          jdiff                    oauth          valgrind
dnsmasq         jhead                    opencv         webkit
doclava         jpeg                     openssl        webp
dropbear        jsilver                  oprofile       webrtc
e2fsprogs       jsr305                   pcre           wpa_supplicant
easymock        junit                    ping           wpa_supplicant_6
elfutils        kernel-headers           ping6          wpa_supplicant_8
embunit         libffi                   ppp            xmlwriter
emma            libgsm                   proguard       yaffs2
esd             liblzf                   protobuf       yapp
expat           libnfc-nxp               qemu           zlib
eyes-free       libnl-headers            qemu-pc-bios
fdlibm          libpcap                  quake
flac            libphonenumber           replicaisland
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external# 

このディレクトリの下のファイルが多いので、混同しないようにyappディレクトリを別途作成し、関連するプログラムを保存しました.
yappディレクトリに入り、tttappディレクトリを作成します.
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# mkdir tttapp
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# ls
helloapp  helloworld  tttapp

 
tttappディレクトリに入り、tttappを作成します.cファイル:
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# cd tttapp/
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp/tttapp# gedit tttapp.c

tttapp.cファイルの内容は以下の通りです.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define	DEVICE_NAME		"/dev/ttt"

int main(int argc, char** argv)
{
	int fd = -1;
	int val = 0;
	fd = open(DEVICE_NAME, O_RDWR);
	if(fd == -1){
		printf("Failed to open device %s.
", DEVICE_NAME); return -1; } printf("Read original value:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); val = 100; printf("Write value %d to %s.

", val, DEVICE_NAME); write(fd, &val, sizeof(val)); printf("Read the value again:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); close(fd); return 0; }

 
 
対応するAndroidを作成します.mkプロファイル:
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp/tttapp# gedit Android.mk

Android.mkファイルの内容は以下の通りです.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := tttapp
LOCAL_SRC_FILES := tttapp.c
include $(BUILD_EXECUTABLE)

Cプログラムの編集が終わりました.次にコンパイルします.
Androidのソースディレクトリに戻りenvsetupを実行します.sh:
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# ls
abi       build        device      hardware  out       system
bionic    cts          docs        libcore   packages  v8.log
bootable  dalvik       external    Makefile  prebuilt  vendor
boot.img  development  frameworks  ndk       sdk
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# . build/envsetup.sh 
including device/moto/stingray/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including device/samsung/crespo4g/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/smdkc110/vendorsetup.sh
including device/samsung/smdkv210/vendorsetup.sh
including device/samsung/torospr/vendorsetup.sh
including device/samsung/toro/vendorsetup.sh
including device/samsung/tuna/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 

 
make tttappコンパイルtttappプログラムを実行します.
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# make tttapp
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
target thumb C: tttapp <= external/yapp/tttapp/tttapp.c
target Executable: tttapp (out/target/product/generic/obj/EXECUTABLES/tttapp_intermediates/LINKED/tttapp)
target Symbolic: tttapp (out/target/product/generic/symbols/system/bin/tttapp)
target Strip: tttapp (out/target/product/generic/obj/EXECUTABLES/tttapp_intermediates/tttapp)
Install: out/target/product/generic/system/bin/tttapp
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 

これはコンパイルに成功したことを示しています.この対応する実行プログラムが生成されたかどうかを見てみましょう.
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# ls -l out/target/product/generic/system/bin/tttapp 
-rwxr-xr-x 1 root root 5524 2013-04-02 11:04 out/target/product/generic/system/bin/tttapp
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 

これは,対応する実行可能プログラムが生成されたことを示す.では、生成したtttappプログラムをSDカードにコピーし、ボードに置いて実行します.
ここではUディスクの上に置いて、Uディスクからtttappをボードの/dataディレクトリにコピーします.
root@android:/mnt # ls usb
D3GOther.exe
EBOOT.bin
EBOOT.nb0
IRDA_X.exe
LOST.DIR
MapTools.exe
NK.BIN
NK_2G.bin
NK_3G.bin
NK_3G_y.BIN
NK_src.bin
RFIDForProduce.exe
RFIDTest.exe
RFID_X.exe
STEPLDR.bin
STEPLDR.nb0
SwitchTools.exe
WINCE 6软件
android-samsung-dev_20110830.tar.gz
barscan.exe
bbk
hello
htcbjwdm.inf
tttapp
ubuntu-11.10-desktop-i386.iso
凯立德地图
机身å·ç (MC60端).exe
root@android:/mnt #
root@android:/mnt # ls
asec
ext_sd
obb
sdcard
secure
usb
root@android:/mnt # cd usb/
root@android:/mnt/usb # ls
D3GOther.exe
EBOOT.bin
EBOOT.nb0
IRDA_X.exe
LOST.DIR
MapTools.exe
NK.BIN
NK_2G.bin
NK_3G.bin
NK_3G_y.BIN
NK_src.bin
RFIDForProduce.exe
RFIDTest.exe
RFID_X.exe
STEPLDR.bin
STEPLDR.nb0
SwitchTools.exe
WINCE 6软件
android-samsung-dev_20110830.tar.gz
barscan.exe
bbk
hello
htcbjwdm.inf
tttapp
ubuntu-11.10-desktop-i386.iso
凯立德地图
机身å·ç (MC60端).exe
root@android:/mnt/usb # ll tttapp
----rwxr-x system   media_rw     5524 2013-04-02 11:08 tttapp
root@android:/mnt/usb # chmod 777 tttapp
root@android:/mnt/usb # ll tttapp
----rwxr-x system   media_rw     5524 2013-04-02 11:08 tttapp
root@android:/mnt/usb # cp tttapp /data
/system/bin/sh: cp: not found
127|root@android:/mnt/usb # mv tttapp /data
failed on 'tttapp' - Cross-device link
255|root@android:/mnt/usb # mv tttapp /data/tttapp
failed on 'tttapp' - Cross-device link
255|root@android:/mnt/usb # cat tttapp > /data/tttapp
root@android:/mnt/usb # ll /data/tttapp
-rw-rw-rw- root     log          5524 2013-04-02 11:14 tttapp
root@android:/mnt/usb # cd /data
root@android:/data # ./tttapp
/system/bin/sh: ./tttapp: cannot execute - Permission denied
126|root@android:/data # chmod 777 tttapp
root@android:/data # ./tttapp
[ttt]: ttt_open().
[ttt]: ttt_read().
[ttt]: ttt_write().
[ttt]: ttt_read().
[ttt]: ttt_release().
Read original value:
123.

Write value 100 to /dev/ttt.

Read the value again:
100.

root@android:/data #

コピー中、cpコマンドが使用できない場合があり、catコマンドを使用すればOKです.上の最後のメッセージから、このCプログラムが成功したことがわかります.テストドライブOKです. 
 
これで、駆動のテストは終わります.次の記事では、カーネルドライバにアクセスするためのHALハードウェア抽象層の作成について説明します.