Android 驱动开发系列二

最近琐碎事太多了,都没什么时间来写blog。现在继续写这个android驱动的开发调试

这一章主要是讲如何测试驱动。

 

1、驱动的简单测试

在上一篇文章中,我们已经把添加驱动模块做完了,并把驱动下载到了板子上。下面将介绍一下如何测试驱动是否正常。

这个ttt驱动,我们实现了一个读、一个写的接口,就此进行简单的测试:

启动板子,进入系统,然后进入命令行(可以用串口,也可以用adb shell)

进入dev目录:

[plain]  view plain copy
  1. root@android:/ # cd /dev  
  2. root@android:/dev #  

 

查看 ttt 设备文件是否存在:

[plain]  view plain copy
  1. root@android:/dev # ls -l ttt  
  2. crw------- root     root     249,   0 2013-04-02 09:58 ttt  


进入到/proc目录,验证设备的输入输出:

[plain]  view plain copy
  1. root@android:/dev # cd /proc/  
  2. root@android:/proc #  


获取 ttt 设备的值:

[plain]  view plain copy
  1. root@android:/proc # cat ttt  
  2. 0  
  3. root@android:/proc #  


设置 ttt 设备的值:

[plain]  view plain copy
  1. root@android:/proc # echo '111' > ttt  
  2. root@android:/proc # cat ttt  
  3. 111  
  4. root@android:/proc #  


这里就可以说明: ttt 设备文件已经OK了,输入输出接口都没有问题。

当然,这里还有其他的方式去验证这个输入输出,如:

进入到 /sys/class 的 ttt 设备目录下:

[plain]  view plain copy
  1. root@android:/proc # cd /sys/class/ttt/ttt/  
  2. root@android:/sys/class/ttt/ttt # ls  
  3. dev  
  4. power  
  5. subsystem  
  6. uevent  
  7. val  
  8. root@android:/sys/class/ttt/ttt #  


通过访问 val 属性文件来读写 ttt 设备的值:

[plain]  view plain copy
  1. root@android:/sys/class/ttt/ttt # ls  
  2. dev  
  3. power  
  4. subsystem  
  5. uevent  
  6. val  
  7. root@android:/sys/class/ttt/ttt # cat val  
  8. 111  
  9. root@android:/sys/class/ttt/ttt # echo '123' > val  
  10. root@android:/sys/class/ttt/ttt # cat val  
  11. 123  
  12. root@android:/sys/class/ttt/ttt #  


 

2、编写C程序来测试驱动的读写

切换到root权限,并进入到android源码目录下的 external 目录:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~# cd workspace/android-4.0.4_r1.2/external/  
  2. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external# ls  
  3. android-mock    freetype                 libpng         safe-iop  
  4. antlr           fsck_msdos               libvpx         skia  
  5. apache-harmony  genext2fs                libxml2        sonivox  
  6. apache-http     giflib                   libxslt        speex  
  7. apache-xml      google-diff-match-patch  libyuv         sqlite  
  8. astl            grub                     llvm           srec  
  9. bison           gtest                    lohit-fonts    srtp  
  10. blktrace        guava                    markdown       stlport  
  11. bluetooth       harfbuzz                 mesa3d         strace  
  12. bouncycastle    hyphenation              mksh           svox  
  13. bsdiff          icu4c                    mockwebserver  tagsoup  
  14. bzip2           iproute2                 mtpd           tcpdump  
  15. chromium        ipsec-tools              netcat         tinyalsa  
  16. clang           iptables                 netperf        tinyxml  
  17. collada         javasqlite               neven          tremolo  
  18. dbus            javassist                nist-sip       v8  
  19. dhcpcd          jdiff                    oauth          valgrind  
  20. dnsmasq         jhead                    opencv         webkit  
  21. doclava         jpeg                     openssl        webp  
  22. dropbear        jsilver                  oprofile       webrtc  
  23. e2fsprogs       jsr305                   pcre           wpa_supplicant  
  24. easymock        junit                    ping           wpa_supplicant_6  
  25. elfutils        kernel-headers           ping6          wpa_supplicant_8  
  26. embunit         libffi                   ppp            xmlwriter  
  27. emma            libgsm                   proguard       yaffs2  
  28. esd             liblzf                   protobuf       yapp  
  29. expat           libnfc-nxp               qemu           zlib  
  30. eyes-free       libnl-headers            qemu-pc-bios  
  31. fdlibm          libpcap                  quake  
  32. flac            libphonenumber           replicaisland  
  33. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external#   

由于这个目录下的文件比较多,为了不混淆,我另外新建了一个yapp目录,用于存放相关的程序。

进入到yapp目录,并创建 tttapp 目录:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# mkdir tttapp  
  2. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# ls  
  3. helloapp  helloworld  tttapp  

 

进入到 tttapp 目录,并创建 tttapp.c 文件:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp# cd tttapp/  
  2. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp/tttapp# gedit tttapp.c  


tttapp.c 文件内容如下:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <fcntl.h>  
  4.   
  5. #define DEVICE_NAME     "/dev/ttt"  
  6.   
  7. int main(int argc, char** argv)  
  8. {  
  9.     int fd = -1;  
  10.     int val = 0;  
  11.     fd = open(DEVICE_NAME, O_RDWR);  
  12.     if(fd == -1){  
  13.         printf("Failed to open device %s.\n", DEVICE_NAME);  
  14.         return -1;  
  15.     }  
  16.       
  17.     printf("Read original value:\n");  
  18.     read(fd, &val, sizeof(val));  
  19.     printf("%d.\n\n", val);  
  20.       
  21.     val = 100;  
  22.     printf("Write value %d to %s.\n\n", val, DEVICE_NAME);  
  23.     write(fd, &val, sizeof(val));  
  24.       
  25.     printf("Read the value again:\n");  
  26.     read(fd, &val, sizeof(val));  
  27.     printf("%d.\n\n", val);  
  28.       
  29.     close(fd);  
  30.       
  31.     return 0;  
  32. }  



 

 

创建对应的Android.mk配置文件:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/external/yapp/tttapp# gedit Android.mk  


Android.mk 文件内容如下:

[cpp]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE_TAGS := optional  
  4. LOCAL_MODULE := tttapp  
  5. LOCAL_SRC_FILES := tttapp.c  
  6. include $(BUILD_EXECUTABLE)  


C程序编写完了,下面进行编译:

回到android的源码目录,并执行envsetup.sh:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# ls  
  2. abi       build        device      hardware  out       system  
  3. bionic    cts          docs        libcore   packages  v8.log  
  4. bootable  dalvik       external    Makefile  prebuilt  vendor  
  5. boot.img  development  frameworks  ndk       sdk  
  6. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# . build/envsetup.sh   
  7. including device/moto/stingray/vendorsetup.sh  
  8. including device/moto/wingray/vendorsetup.sh  
  9. including device/samsung/crespo4g/vendorsetup.sh  
  10. including device/samsung/crespo/vendorsetup.sh  
  11. including device/samsung/maguro/vendorsetup.sh  
  12. including device/samsung/smdkc110/vendorsetup.sh  
  13. including device/samsung/smdkv210/vendorsetup.sh  
  14. including device/samsung/torospr/vendorsetup.sh  
  15. including device/samsung/toro/vendorsetup.sh  
  16. including device/samsung/tuna/vendorsetup.sh  
  17. including device/ti/panda/vendorsetup.sh  
  18. including sdk/bash_completion/adb.bash  
  19. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   

 

执行 make tttapp 编译 tttapp 程序:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# make tttapp  
  2. ============================================  
  3. PLATFORM_VERSION_CODENAME=REL  
  4. PLATFORM_VERSION=4.0.4  
  5. TARGET_PRODUCT=full  
  6. TARGET_BUILD_VARIANT=eng  
  7. TARGET_BUILD_TYPE=release  
  8. TARGET_BUILD_APPS=  
  9. TARGET_ARCH=arm  
  10. TARGET_ARCH_VARIANT=armv7-a  
  11. HOST_ARCH=x86  
  12. HOST_OS=linux  
  13. HOST_BUILD_TYPE=release  
  14. BUILD_ID=IMM76I  
  15. ============================================  
  16. target thumb C: tttapp <= external/yapp/tttapp/tttapp.c  
  17. target Executable: tttapp (out/target/product/generic/obj/EXECUTABLES/tttapp_intermediates/LINKED/tttapp)  
  18. target Symbolic: tttapp (out/target/product/generic/symbols/system/bin/tttapp)  
  19. target Strip: tttapp (out/target/product/generic/obj/EXECUTABLES/tttapp_intermediates/tttapp)  
  20. Install: out/target/product/generic/system/bin/tttapp  
  21. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   

这样就表示编译成功了,我们看一下这个对应的执行程序是否已经生成:

[plain]  view plain copy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# ls -l out/target/product/generic/system/bin/tttapp   
  2. -rwxr-xr-x 1 root root 5524 2013-04-02 11:04 out/target/product/generic/system/bin/tttapp  
  3. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   

这样就表示生成了对应的 可执行程序。

 好,现在我们把这个生成的 tttapp 程序拷贝到 SD卡上,然后放到板子上去执行。

我这里是放到了U盘上面,从U盘中把tttapp 拷贝到板子上的/data目录中去:

[plain]  view plain copy
  1. root@android:/mnt # ls usb  
  2. D3GOther.exe  
  3. EBOOT.bin  
  4. EBOOT.nb0  
  5. IRDA_X.exe  
  6. LOST.DIR  
  7. MapTools.exe  
  8. NK.BIN  
  9. NK_2G.bin  
  10. NK_3G.bin  
  11. NK_3G_y.BIN  
  12. NK_src.bin  
  13. RFIDForProduce.exe  
  14. RFIDTest.exe  
  15. RFID_X.exe  
  16. STEPLDR.bin  
  17. STEPLDR.nb0  
  18. SwitchTools.exe  
  19. WINCE 6软件  
  20. android-samsung-dev_20110830.tar.gz  
  21. barscan.exe  
  22. bbk  
  23. hello  
  24. htcbjwdm.inf  
  25. tttapp  
  26. ubuntu-11.10-desktop-i386.iso  
  27. 凯立德地图  
  28. 机身å·ç (MC60端).exe  
  29. root@android:/mnt #  
  30. root@android:/mnt # ls  
  31. asec  
  32. ext_sd  
  33. obb  
  34. sdcard  
  35. secure  
  36. usb  
  37. root@android:/mnt # cd usb/  
  38. root@android:/mnt/usb # ls  
  39. D3GOther.exe  
  40. EBOOT.bin  
  41. EBOOT.nb0  
  42. IRDA_X.exe  
  43. LOST.DIR  
  44. MapTools.exe  
  45. NK.BIN  
  46. NK_2G.bin  
  47. NK_3G.bin  
  48. NK_3G_y.BIN  
  49. NK_src.bin  
  50. RFIDForProduce.exe  
  51. RFIDTest.exe  
  52. RFID_X.exe  
  53. STEPLDR.bin  
  54. STEPLDR.nb0  
  55. SwitchTools.exe  
  56. WINCE 6软件  
  57. android-samsung-dev_20110830.tar.gz  
  58. barscan.exe  
  59. bbk  
  60. hello  
  61. htcbjwdm.inf  
  62. tttapp  
  63. ubuntu-11.10-desktop-i386.iso  
  64. 凯立德地图  
  65. 机身å·ç (MC60端).exe  
  66. root@android:/mnt/usb # ll tttapp  
  67. ----rwxr-x system   media_rw     5524 2013-04-02 11:08 tttapp  
  68. root@android:/mnt/usb # chmod 777 tttapp  
  69. root@android:/mnt/usb # ll tttapp  
  70. ----rwxr-x system   media_rw     5524 2013-04-02 11:08 tttapp  
  71. root@android:/mnt/usb # cp tttapp /data  
  72. /system/bin/sh: cp: not found  
  73. 127|root@android:/mnt/usb # mv tttapp /data  
  74. failed on 'tttapp' - Cross-device link  
  75. 255|root@android:/mnt/usb # mv tttapp /data/tttapp  
  76. failed on 'tttapp' - Cross-device link  
  77. 255|root@android:/mnt/usb # cat tttapp > /data/tttapp  
  78. root@android:/mnt/usb # ll /data/tttapp  
  79. -rw-rw-rw- root     log          5524 2013-04-02 11:14 tttapp  
  80. root@android:/mnt/usb # cd /data  
  81. root@android:/data # ./tttapp  
  82. /system/bin/sh: ./tttapp: cannot execute - Permission denied  
  83. 126|root@android:/data # chmod 777 tttapp  
  84. root@android:/data # ./tttapp  
  85. [ttt]: ttt_open().  
  86. [ttt]: ttt_read().  
  87. [ttt]: ttt_write().  
  88. [ttt]: ttt_read().  
  89. [ttt]: ttt_release().  
  90. Read original value:  
  91. 123.  
  92.   
  93. Write value 100 to /dev/ttt.  
  94.   
  95. Read the value again:  
  96. 100.  
  97.   
  98. root@android:/data #  


拷贝的过程中,出现了一些情况,cp指令不可用,使用cat指令就OK了。由上面最后的几句信息,可以看出这个C程序成功了。测试驱动OK了。 

 

 

到此,驱动的测试就完了。下一篇将会介绍编写对应的HAL硬件抽象层来访问内核驱动
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值