(二)在Ubuntu上爲Android系統內置C可執行程序測試Linux內核驅動程序

  在前一篇文章中,我們介紹瞭如何在Ubuntu上爲Android系統編寫Linux內核驅動程序。在這個名爲hello的Linux內核驅動程序中,創建三個不同的文件節點來供用戶空間訪問,分別是傳統的設備文件/dev/hello、proc系統文件/proc/hello和devfs系統屬性文件/sys/class/hello/hello/val。進一步,還通過cat命令來直接訪問/proc/hello和/sys/class/hello/hello/val文件來,以驗證驅動程序的正確性。在這一篇文章裏,我們將通過自己編寫的C可執行程序來訪問設備文件/dev/hello。可能讀者會覺得奇怪,怎麼能在Android系統中用C語言來編寫應用程序呢?Android系統上的應用程序不都是Java應用程序嗎?其實是可以的,讀者不妨用adb shell命令連上Android模擬器,在/system/bin目錄下可以看到很多C可執行程序,如cat命令。今天,我們就來學習一下怎麼在Android系統中添加用C語言編寫的可執行程序吧。

      一. 參照在Ubuntu上爲Android系統編寫Linux內核驅動程序一文,準備好Linux驅動程序。使用Android模擬器加載包含這個Linux驅動程序的內核文件,並且使用adb shell命令連接上模擬,驗證在/dev目錄中存在設備文件hello。

      二. 進入到Android源代碼工程的external目錄,創建hello目錄:

      USER-NAME@MACHINE-NAME:~/Android$ cd external
      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello


      三. 在hello目錄中新建hello.c文件:

      

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

      這個程序的作用中,打開/dev/hello文件,然後先讀出/dev/hello文件中的值,接着寫入值5到/dev/hello中去,最後再次讀出/dev/hello文件中的值,看看是否是我們剛纔寫入的值5。從/dev/hello文件讀寫的值實際上就是我們虛擬的硬件的寄存器val的值。

      四. 在hello目錄中新建Android.mk文件:

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE_TAGS := optional
      LOCAL_MODULE := hello
      LOCAL_SRC_FILES := $(call all-subdir-c-files)
      include $(BUILD_EXECUTABLE)


      注意,BUILD_EXECUTABLE表示我們要編譯的是可執行程序。 

      五. 參照如何單獨編譯Android源代碼中的模塊一文,使用mmm命令進行編譯:

      USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello


      編譯成功後,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行文件hello了。

      七. 把hello可執行文件 使用adb 傳輸到開發板的系統文件system/bin/下面

      root@android:/ # cd system/bin
      root@android:/system/bin # ./hello
      Read the original value:
      0.
      Write value 5 to /dev/hello.
      Read the value again:
      5.


      看到這個結果,就說我們編寫的C可執行程序可以訪問我們編寫的Linux內核驅動程序了。

      介紹完了如何使用C語言編寫的可執行程序來訪問我們的Linux內核驅動程序,讀者可能會問,能不能在Android的Application Frameworks提供Java接口來訪問Linux內核驅動程序呢?可以的,接下來的幾篇文章中,我們將介紹如何在Android的Application Frameworks中,增加Java接口來訪問Linux內核驅動程序,敬請期待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章