首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門(mén) / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 23299|回復(fù): 0
上一主題 下一主題
[教程]

在Ubuntu上為Android系統(tǒng)內(nèi)置C可執(zhí)行程序測(cè)試Linux內(nèi)核驅(qū)動(dòng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
   在前一篇文章中,我們介紹了如何在Ubuntu上為Android系統(tǒng)編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序。在這個(gè)名為hello的Linux內(nèi)核驅(qū)動(dòng)程序中,創(chuàng)建三個(gè)不同的文件節(jié)點(diǎn)來(lái)供用戶空間訪問(wèn),分別是傳統(tǒng)的設(shè)備文件/dev/hello、proc系統(tǒng)文件/proc/hello和devfs系統(tǒng)屬性文件/sys/class/hello/hello/val。進(jìn)一步,還通過(guò)cat命令來(lái)直接訪問(wèn)/proc/hello和/sys/class/hello/hello/val文件來(lái),以驗(yàn)證驅(qū)動(dòng)程序的正確性。在這一篇文章里,我們將通過(guò)自己編寫(xiě)的C可執(zhí)行程序來(lái)訪問(wèn)設(shè)備文件/dev/hello??赡茏x者會(huì)覺(jué)得奇怪,怎么能在Android系統(tǒng)中用C語(yǔ)言來(lái)編寫(xiě)應(yīng)用程序呢?Android系統(tǒng)上的應(yīng)用程序不都是Java應(yīng)用程序嗎?其實(shí)是可以的,讀者不妨用adb shell命令連上Android模擬器,在/system/bin目錄下可以看到很多C可執(zhí)行程序,如cat命令。今天,我們就來(lái)學(xué)習(xí)一下怎么在Android系統(tǒng)中添加用C語(yǔ)言編寫(xiě)的可執(zhí)行程序吧。   
   
      一. 參照在Ubuntu上為Android系統(tǒng)編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序一文,準(zhǔn)備好Linux驅(qū)動(dòng)程序。使用Android模擬器加載包含這個(gè)Linux驅(qū)動(dòng)程序的內(nèi)核文件,并且使用adb shell命令連接上模擬,驗(yàn)證在/dev目錄中存在設(shè)備文件hello。   
   
      二. 進(jìn)入到Android源代碼工程的external目錄,創(chuàng)建hello目錄:   
   
      USER-NAME@MACHINE-NAME:~/Android$ cd external   
   
      USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello   
   
      三. 在hello目錄中新建hello.c文件:   
  1. #include <stdio.h>   
    #include <stdlib.h>   
    #include <fcntl.h>   
    #define DEVICE_NAME "/dev/hello"   
    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./n", DEVICE_NAME);   
                    return -1;   
            }   
               
            printf("Read original value:/n");   
            read(fd, &val, sizeof(val));   
            printf("%d./n/n", val);   
            val = 5;   
            printf("Write value %d to %s./n/n", val, DEVICE_NAME);   
            write(fd, &val, sizeof(val));   
               
            printf("Read the value again:/n");   
            read(fd, &val, sizeof(val));   
            printf("%d./n/n", val);   
            close(fd);   
            return 0;   
    }
復(fù)制代碼
這個(gè)程序的作用中,打開(kāi)/dev/hello文件,然后先讀出/dev/hello文件中的值,接著寫(xiě)入值5到/dev/hello中去,最后再次讀出/dev/hello文件中的值,看看是否是我們剛才寫(xiě)入的值5。從/dev/hello文件讀寫(xiě)的值實(shí)際上就是我們虛擬的硬件的寄存器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表示我們要編譯的是可執(zhí)行程序。   
   
      五. 參照如何單獨(dú)編譯Android源代碼中的模塊一文,使用mmm命令進(jìn)行編譯:   
   
      USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello   
   
      編譯成功后,就可以在out/target/product/gerneric/system/bin目錄下,看到可執(zhí)行文件hello了。   
   
      六. 重新打包Android系統(tǒng)文件system.img:   
   
      USER-NAME@MACHINE-NAME:~/Android$ make snod   
   
      這樣,重新打包后的system.img文件就包含剛才編譯好的hello可執(zhí)行文件了。   
   
      七. 運(yùn)行模擬器,使用/system/bin/hello可執(zhí)行程序來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序:   
   
      USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &   
   
      USER-NAME@MACHINE-NAME:~/Android$ adb shell   
   
      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.   
   
      看到這個(gè)結(jié)果,就說(shuō)我們編寫(xiě)的C可執(zhí)行程序可以訪問(wèn)我們編寫(xiě)的Linux內(nèi)核驅(qū)動(dòng)程序了。   
   
      介紹完了如何使用C語(yǔ)言編寫(xiě)的可執(zhí)行程序來(lái)訪問(wèn)我們的Linux內(nèi)核驅(qū)動(dòng)程序,讀者可能會(huì)問(wèn),能不能在Android的Application Frameworks提供Java接口來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序呢?可以的,接下來(lái)的幾篇文章中,我們將介紹如何在Android的Application Frameworks中,增加Java接口來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序,敬請(qǐng)期待

上一篇:Android硬件抽象層(HAL)概要介紹和學(xué)習(xí)計(jì)劃
下一篇:Android學(xué)習(xí)啟動(dòng)篇

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書(shū) | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-12-22 16:04 , Processed in 0.061069 second(s), 16 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表