203armco軟件an應(yīng)用控制燈開發(fā)實例_第1頁
203armco軟件an應(yīng)用控制燈開發(fā)實例_第2頁
203armco軟件an應(yīng)用控制燈開發(fā)實例_第3頁
203armco軟件an應(yīng)用控制燈開發(fā)實例_第4頁
203armco軟件an應(yīng)用控制燈開發(fā)實例_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、市視美泰通訊技術(shù)全志 A20 開發(fā)板Android 應(yīng)用GPIOLED 燈開發(fā)實例一、在 linux 內(nèi)核驅(qū)動配置文件初始化需要操作的 GPIO。第一步:進入 sys_config.fex 查看驅(qū)動配置文件目前設(shè)置了初始化了哪些 GPIO:#cyxServer-102:/a20_box/A20-420-V12$catlichee/tools/pack/chips/sun7i/configs/android/wing-mbox203/sys_config.fex第二步:找到“gpio_para” 配置選項:即從圖中可以看到我目前初始化了 8 個GPIO。我以初始化的第 1 個 gpio_pin_

2、1(PH20)為例子,來做 LED 閃爍指示燈。注釋;我為大家以下在 sys_config.fex 里面設(shè)置 gpio 后面的參數(shù)作用和含義,如 gpio_pin_1=port:PH20<1><default><default><1>。即:Port:端口+組內(nèi)序號<功能分配><內(nèi)部電阻狀態(tài)><驅(qū)動能力><輸出電平狀態(tài)>(具體參考配套文檔 GPIO 配置和管理說明.PDF)好的。 目前這里是初始化了所設(shè)置的 GPIO,然后根據(jù)這個初始化的配置,然后我們打開 eclipse 應(yīng)用開發(fā)軟件,需要導(dǎo)入相應(yīng)的

3、平臺的 javalib.jar。1,Javalib.jar 所在 sdk 源碼位置是:android4.2/out/host/common/obj/JAVA_LIBRARIES/layoutlib_intermediates/javalib.jar2,導(dǎo)入方法:你的工程名,假如為“hello”->Build Path -> Configure Build Path->Libraries->Add External JARs 選中 javalib.jar -> OK:傳真:市視美泰通訊技術(shù)3,添加關(guān)鍵源碼到你的 APK 里面去。以下是我寫的簡單 DMEO(LED_T

4、est)。請參考:Java源碼:package com.smdt.test.led;import import import importimportandroid.app.Activity; com.smdt.test.led.R; android.os.Bundle; android.util.Log;android.os.Gpio;publicclass LED_Test extends Activity private boolean ThreadExit = true; private static int LedTime = 500;Thread browseThread = nu

5、ll;private void ctrlLedLight(boolean enable) try if (enable) Log.d(TAG, "ctrlLedLight open led light"); Gpio.writeGpio('h', 20, 1);/ else Log.d(TAG, "ctrlLedLight closeGpio.writeGpio('h', 20, 0);/ledlight"); catch (Exception e) e.printStackTrace();private void sta

6、rtCtrlLedThread() browseThread = new Thread() public void run() try while (ThreadExit) if (LedTime <= 0) LedTime = 500;ctrlLedLight(false);Thread.sleep(LedTime); ctrlLedLight(true);Thread.sleep(LedTime);:傳真:市視美泰通訊技術(shù) catch (Exception e) e.printStackTrace();browseThread.start();public String TAG =

7、"Led Test"Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); startCtrlLedThread();protected void onDestroy() / mHandler.removeCallbacks(mRunnable); System.out.println("-onDestroy");ThreadExit = false; super.o

8、nDestroy();AndroidManifest.xml 布局文件:<manifest xmlns:android=" package="com.smdt.test.led" android:versionCode="1" android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="10" android:targetSdkVersion="10" />"<uses-permissio

9、n android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission><applicationandroid:icon="drawable/ic_launcher" android:label="string/app_name"><act

10、ivityandroid:name="com.smdt.test.led.LED_Test" android:label="string/app_name" >:傳真:市視美泰通訊技術(shù)<intent-filter><action android:name="ent.action.MAIN" /><category android:name="ent.category.LAUNCHER" /></intent-filter&g

11、t;</activity></application></manifest>注釋: a,import android.os.Gpio; 目的是導(dǎo)入支持的GPIO 的接口。b, Gpio.writeGpio('h', 20, 1);此API 的參數(shù)作用是: 第一個參數(shù):是指那組 GPIO 口。第二個參數(shù): 是指第一個參數(shù)指定的 GPIO 組的具體 IO。第三個參數(shù):是指設(shè)置為 1,即為拉高,設(shè)置為 0,即為拉低。4,應(yīng)用如果的 GPIO,必須要配合系統(tǒng)層在 sys_config.fex 文件初始化,才能夠正常使用的。就如應(yīng)用了 GPIO(PH2

12、0),對應(yīng)系統(tǒng)初始的第一個 GPIO 一樣。這就是我們的應(yīng)用界面。GPIO 的 DMEO,如果你想需要當(dāng)然,這僅僅是一個如何的 GPIO 去實現(xiàn)你需要的功能。你只需要按照上面的方法依葫蘆畫瓢去實現(xiàn)就好了。5,最后,如果你只是一個應(yīng)用開發(fā)者,僅僅需要用到解決你的問題了,那么以下就可以省略了。你若是個技術(shù)Javalib.jar 這個庫,那個 Gpio.writeGpio()的源碼的在一起。等等,接下來,我就為你揭開這些謎底:GPIO 口而已,不想了解這些,以上就足矣者,肯定會有所疑問,我們?yōu)樯兑獙?dǎo)入又是怎么樣,又如何通過它們來和底層驅(qū)動A, 首先,我們看看 Javalib.jar 庫,其實它封裝了

13、很多 framework 層的接口,其中具體包含那些我就:傳真:市視美泰通訊技術(shù)不一一介紹了,我就介紹其實跟 GPIO 有關(guān)的接口。B,我們大家都知道 android 的架構(gòu)是由 linux 內(nèi)核->hal->jni->上層接口,依次封裝而成。那么我依次逆序為大家介紹:第一,JNI,接口在源碼 SDK:路徑:android4.2/frameworks/base/core/jni/android_os_Gpio.cpp以下是它的源碼(你也可以按照我提供的路徑去 SDK 直接查看):/*/device/libs/android_runtime/android_os_Gpio.cp

14、p*Copyright 2006, The Android Open Source Project*Licensed under the Apache License, Version 2.0(the"License");*you may not use this file except in compliancewiththe License.*You may obtain a copy of the License at*Unless required by applicable law or agreed toin writing, software*distribu

15、ted under the License isdistributed on an "AS IS" BASIS,*WITHOUT WARRANTIES OR CONDITIONSOF ANY KIND, either express or implied.*See the License for the specificlanguage governing permissions and*limitations under the License.*/#defineLOG_TAG "android_os_gpio"#defineLOG_NDEBUG 0:

16、傳真:市視美泰通訊技術(shù)#include"JNIHelp.h"#include"jni.h"#include"android_runtime/AndroidRuntime.h"#include<utils/misc.h>#include<utils/Log.h>#include<stdint.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<fcntl.h>#ifdef HAV

17、E_ANDROID_OS/justwantPAGE_SIZEdefine#include<asm/page.h>#else#include<sys/user.h>#endif#include<sys/ioctl.h>#include<sys/types.h>#include<sys/mman.h>#include<stdlib.h>namespace android:傳真:市視美泰通訊技術(shù)externint go_recovery(void);externint go_update_package(const char *

18、path);staticvoid throw_NullPointerException(JNIEnv *env, const char* msg)jclass clazz;clazz = env->FindClass("java/lang/NullPointerException");env->ThrowNew(clazz, msg);static int readGpio_native(JNIEnv*env,jobjectclazz,jstringpath)int fd;int value;if (path = NULL)return -1;elseconst

19、 char *chars = env->GetStringUTFChars(path, NULL);:傳真:市視美泰通訊技術(shù)fd = open(chars, O_RDWR);if(fd < 0)LOGE("fail in open file %s", chars);env->ReleaseStringUTFChars(path, chars);return -1;char valueStr32;memset(valueStr, 0, sizeof(valueStr);read(fd, (void *)valueStr, sizeof(valueStr)-1

20、);/LOGD("value str = %s", valueStr);char *end;value = strtol(valueStr, &end, 0);if(end = valueStr)LOGE("Fail in convert string %s to number.",valueStr);env->ReleaseStringUTFChars(path, chars);close(fd);return -1;return value;:傳真:市視美泰通訊技術(shù)static int writeGpio_native(JNIEnv*e

21、nv,jobjectclazz,jstringpath,jstringvalue)int fd;if (path = NULL)return -1;elseconst char *chars = env->GetStringUTFChars(path, NULL);const char *valueStr = env->GetStringUTFChars(value,NULL);fd= open(chars, O_RDWR);if(fd < 0)LOGD("fail in open file %s", chars);env->ReleaseStrin

22、gUTFChars(path, chars);env->ReleaseStringUTFChars(value, valueStr);return -1;/LOGD("value str =%s", valueStr);int ret = write(fd,valueStr, strlen(valueStr);:傳真:市視美泰通訊技術(shù)/LOGD("ret = %d", ret);env->ReleaseStringUTFChars(path, chars);env->ReleaseStringUTFChars(value,valueSt

23、r);close(fd);return 0;static JNINativeMethod method_table = "nativeWriteGpio","(Ljava/lang/String;Ljava/lang/String;)I",(void*)writeGpio_native , "nativeReadGpio", "(Ljava/lang/String;)I", (void*)readGpio_native,;intregister_android_os_Gpio(JNIEnv *env)return

24、AndroidRuntime:registerNativeMethods(env, "android/os/Gpio",method_table, NELEM(method_table);:傳真:市視美泰通訊技術(shù)第二,我們需要在 Android.mk 添加這個文件,否則不能被添加進去。路徑:android4.2/frameworks/base/core/jni/Android.mk以下是它的源碼(你也可以按照我提供的路徑去 SDK 直接查看):LOCAL_SRC_FILES:= android_os_ParcelFileDescriptor.cpp android_os_P

25、ower.cpp android_os_Gpio.cpp android_os_StatFs.cpp android_os_SystemClock.cpp 第三:這是 framework 層對應(yīng)的 JNI 接口源碼:路徑:android4.2/frameworks/base/core/java/android/os/Gpio.java以下是它的源碼(你也可以按照我提供的路徑去 SDK 直接查看):/*Copyright (C) 2007 The Android Open Source Project*Licensed under the Apache License, Version 2.0(

26、the "License");*you may not use this file except in compliancewith the License.*You may obtain a copy of the License at*Unless required by applicablelaw or agreed toin writing,software*distributed under the Licenseis distributed on an "AS IS"BASIS,:傳真:市視美泰通訊技術(shù)*WITHOUT WARRANTIES

27、OR CONDITIONSOF ANY KIND, either express orimplied.*See the License for the specificlanguagegoverningpermissionsand*limitations under the License.*/package android.os;importjava.io.IOException;importandroid.os.ServiceManager;importjava.lang.Integer;importjava.lang.String;importandroid.util.Log;/* Cl

28、ass that provides accessto some ofthegpiomanagementfunctions.* hide*/publicclass Gpiopublicstatic final String TAG = "GPIO"/can't instantiate this classprivate Gpio():傳真:市視美泰通訊技術(shù)private static native int nativeWriteGpio(String path, String value);privatestaticnative int nativeReadGpio(

29、String path);privatestaticfinalStringmPathstr="/sys/class/gpio_sw/P"privatestaticfinalStringmDataName="/data"privatestaticfinalStringmPullName="/pull"privatestaticfinalStringmDrvLevelName="/drv_level"privatestaticfinalStringmMulSelName="/mul_sel"publ

30、ic static int writeGpio(char group, int num, int value)String dataPath = composePinPath(group, num).concat(mDataName);return nativeWriteGpio(dataPath, Integer.toString(value);public static int readGpio(char group, int num)String dataPath = composePinPath(group, num).concat(mDataName);return nativeRe

31、adGpio(dataPath);:傳真:市視美泰通訊技術(shù)public static int setPull(char group, int num, int value)String dataPath = composePinPath(group, num).concat(mPullName);return nativeWriteGpio(dataPath, Integer.toString(value);public static int getPull(char group, int num)String dataPath = composePinPath(group, num).concat(mPullName);return nativeReadGpio(dataPath);public static int setDrvLevel(char group, int num, int value)String dataPath = composePinPath(gro

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論