Android 从硬件到应用:一步一步向上爬 6 -- 编写APP测试框架层硬件服务(完)

创建Android Application工程:使用Eclipse的Android插件ADT创建Android工程,工程名称为Gpio,创建完成后将工程目录拷贝到packages/apps/文件夹下,并删除工程目录下的gen文件夹,不删除的话会造成类重复的错误。

src/com/android/gpio/Gpio.java:

package com.android.gpio;
import com.android.gpio.R;
import android.app.Activity;
import android.os.ServiceManager;
import android.os.Bundle;
import android.os.IGpioService;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;  

public class Gpio extends Activity implements OnClickListener {
private final static String LOG_TAG = "com.android.Gpio";
private IGpioService gpioService = null;  

private Button setButton = null;
private Button clearButton = null;  

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);  

	gpioService = IGpioService.Stub.asInterface(
	ServiceManager.getService("gpio"));  

	setButton = (Button)findViewById(R.id.button_set);
	clearButton = (Button)findViewById(R.id.button_clear);  

	setButton.setOnClickListener(this);
	clearButton.setOnClickListener(this);
}  

@Override
public void onClick(View v) {
	if(v.equals(setButton)) {
	try{
		int val='1';
		gpioService.setVal(val);
	} catch (RemoteException e){
		Log.e(LOG_TAG,"setting value");
	}
	}
	else if(v.equals(clearButton)) {
	try{
		int val='0';
		gpioService.setVal(val);
	   } catch (RemoteException e){
		Log.e(LOG_TAG,"setting value");
	   }
	   }
	}
}  

布局res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">  

   <Button
       android:id="@+id/button_clear"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/clear"
       android:textStyle="bold"
       android:layout_marginTop="140dp"/>
   <Button
       android:id="@+id/button_set"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/set"
       android:textStyle="bold"
       android:layout_marginTop="0dp"/>
</LinearLayout>  

字符串res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">GPIO</string>
   <string name="set">Set</string>
   <string name="clear">Clear</string>
</resources>  

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.android.gpio"
  android:versionCode="1"
  android:versionName="1.0">
  <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
    <activity android:name=".Gpio"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  </application>
</manifest>   

编辑工程目录下Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Gpio
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

编辑build/target/product/generic_no_telephony.mk:

在PRODUCT_PACKAGES := \ 后加入Gpio \

编译工程会生成Gpio.apk

make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x 

到这一步一切准备工作都已就绪,开始更新目标板am335evm的文件系统:(左为host,右为evm)

out/target/product/am335xevm_sk/system/app/Gpio.apk                 ==>   rootfs/

out/target/product/am335xevm_sk/system/framework/services.jar       ==>   rootfs/system/framework/

out/target/product/am335xevm_sk/system/framework/framework.jar      ==>   rootfs/system/framework/

out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so       ==>   rootfs/system/lib/

out/target/product/am335xevm_sk/obj/lib/gpio.default.so             ==>   rootfs/system/lib/hw/

确保rootfs下 ueventd.rc 已经添加:(Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动 提到)

/dev/AdrIO                0666   root       root

启动,安装Gpio.apk,打开GPIO:

现象:

点击"Set"按钮:     D1灯亮    

点击"Clear"按钮:   D1灯灭

可见编写的APP通过调用硬件服务已经成功操作了AM335寄存器,改变AM335X_GPIO_LED4的电平,通过N沟MOS器件控制LED D1的亮灭。

时间: 2024-09-28 18:39:41

Android 从硬件到应用:一步一步向上爬 6 -- 编写APP测试框架层硬件服务(完)的相关文章

Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动

Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动 中我们已经编译好了硬件抽象层模块,下面就要开始为HAL层编写JNI方法,为上层提供服务. cd到frameworks/base/services/jni目录中,新建一个com_android_server_GpioService.cpp文件: #include "jni.h" #include "JNIHelp.h"

Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动

Android 标准的硬件驱动分为两个部分,一个是运行在linux内核里的硬件驱动,而另外一部分是运行在用户空间的硬件抽象层.采用这种方法,就可以使系统具有硬件无关性,也保护了部分厂商的利益.在Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序中已经有了编写硬件驱动到linux内核里的步骤,下面就要接着这个工程去看看怎么在硬件抽象层增加硬件模块和我们的内核驱动程序进行交互,完成硬件控制. 进入hardware/libhardware/include/hardware

Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序

硬件平台:TI AM335X Starter Kit 开发源码:TI-Android-ICS-4.0.3-DevKit-EVM-SK-3.0.1.bin 主机系统:Ubuntu 10.04 这次写<Android 从硬件到应用>是想尝试从底层的最简单的GPIO硬件驱动开始,一步一步的向上走,经过硬件抽象层HAL.JNI方法等,最终编写出APP,达到硬件调用的目的,期间会增加一些Android下C程序测试底层驱动的细节.既然是从零编写驱动,那就要脱离源码包里已有的一些api函数,从硬件电路开始.

Android 从硬件到应用:一步一步向上爬 5 -- 在Frameworks层添硬件服务

Android Frameworks层提供了硬件服务,Android系统APP可以调用这些硬件服务,进而完成硬件的控制,实现应有的功能.接着上一篇,这一篇要在frameworks层为应用提供java接口的硬件服务.cd到frameworks/base/core/java/android/os目录,添加 IGpioService.aidl: package android.os; interface IGpioService { void setVal(int val); int getVal()

Android教程-从零开始一步一步接入SDK

从零开始一步一步接入SDK 本篇博客想总结一下笔者在接入手游渠道SDK的一些经验方法,为想接入手游渠道或者想学习如何接入SDK的童鞋们提供一个参考.本篇博客基于Android平台,关于IOS接入SDK的方法,笔者以后有机会也会整理. 首先来给大家说明一下SDK,何为SDK?它的全称是,SoftWare Develop Kit,意思是软件开发工具包,它是可以辅助我们去开发某类软件的相关文档,范例和工具的集合.关于SDK,这里推荐一个服务商店,名叫Devstore(http://www.devsto

一步一步教你在 Android 里创建自己的账号系统(一)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 大家在平时使用 Android 手机的时候,都会发现有些应用(例如 qq,微信,淘宝)为自己创建了账号系统,并且能够在设置页面看到他,可是当自己希望为自己的软件写一个账号系统的时候总是不知从何入手,现在我们就从头开始,一步一步打造属于自己应用的账号系统. 在进行设备账户管理的时候,我们会通过一个 Acco

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

android一步一步实现视频clientapp(一)

我开发完毕了一个完整的视频clientapp.如今.分享出来.供刚開始学习的人学习參考(大神就不用看了,比較简单,仅供入门),大家相互交流相互学习. 项目有些功能,我时间也不是非常多.仅仅能时不时更新下. 仅仅能大概解说怎么一步一步实现,相关的知识点.大家自己查阅相关文档了,本人非常多地方也是会使用,要我说出个详细的原理什么的,确实说不清,还有本人表达能力有限.大家仅仅能将就看看,不喜忽喷,哈哈. 还有为大家说下,怎么增加广告平台的广告,公布市场,获取收入(老实说本人app,加广告.基本没收入)

android一步一步实现视频客户端app(一)

我开发完成了一个完整的视频客户端app,现在,分享出来,供初学者学习参考(大神就不用看了,比较简单,仅供入门),大家相互交流相互学习.项目有些功能,我时间也不是很多,只能时不时更新下.只能大概讲解怎么一步一步实现,相关的知识点,大家自己查阅相关资料了,本人很多地方也是会使用,要我说出个具体的原理什么的,确实说不清,还有本人表达能力有限,大家只能将就看看,不喜忽喷,哈哈. 还有为大家说下,怎么加入广告平台的广告,发布市场,获取收入(老实说本人app,加广告,基本没收入),这里只是抛砖引玉罢了,给刚