Android 手机电源管理实例 – milestone

MOTO Milestone (omap)HTC tattoo (msm7225)HTC Magic (msm7201A)某手机(保密)(msm7227)
开机过程200ma-1000ma200ma-500ma
HSDPA 联网700ma500ma
idle, 屏幕最暗, 黑色背景,键灯关44ma13ma33ma60ma
idle, 屏幕中等, 黑色背景,键灯关69ma64ma73ma88ma
idle, 屏幕最亮, 黑色背景,键灯关104ma97ma135ma120ma
idle, 屏幕最暗, 动态桌面,键灯关330ma
idle, 屏幕中等, 动态桌面,键灯关350ma
idle, 屏幕最亮, 动态桌面,键灯关450ma
idle, 屏幕最暗, 白背景,键灯关51ma
idle, 屏幕中等, 白背景,键灯关92ma
idle, 屏幕最亮, 白背景,键灯关167ma
照相机预览400ma-500ma(1G)
325ma-350ma(550M)
210ma-260ma295ma-334ma
录制音频(开屏)107ma-112ma
录制音频(关屏)43ma-59ma
录制视频500ma-700ma(1G)
427ma-558ma(550M)
260ma-360ma360ma-390ma
google maps(gps开)540ma-750ma
浏览网页(HSDPA)(有数据链接时)400ma-600ma
浏览网页(EDGE)(有数据链接时)200ma-500ma
开屏,放mp3,耳机90ma-120ma168ma-220ma285ma
关屏, 放mp3,耳机30ma-50ma93ma-112ma210ma
开屏, 放mp4,耳机(放自己拍摄的)250ma-300ma300ma-327ma
开启g-sensro和gps320ma
wifi扫描时150ma
开led闪光灯(长亮)50ma(单独计算)
虚拟按键led20ma(单独计算)14ma
GSM通话(开接近)350ma-450ma
suspend(关屏进入休眠)2ma1ma1ma2ma

相关日志

这样的房,这样的车,这样的女人(阿哈哈)

x:  什么是房子, 什么是车, 连老爹的女人都霸占了.

1x: 住老爹的房, 坐老爹的车, 连泡妞都用老爹的钱

2x: 和别人拼房, 和别人拼车, 连女朋友都和别人拼.

3x: 开二手车, 住二手房, 连媳妇都是二手的.

4x: 开上新车了, 住上大房子了, 连媳妇都都不止一个了.

5x: 开不动车了, 上不动楼了, 连孩子都说我不是亲爹了.

6x: 给孩子买车, 给孩子买房, 连儿媳妇都要帮着去相了.

7x: 车坏了, 房拆了, 连给自己买个墓地都要排号了.

8x: 再也不需要车了, 也不需要房了,连自己是生是死都不重要了.

可以说真的是闲着没事干, 才写了这样的话. 是挺消极的, 但是…..改变,还是顺从?

相关日志

macbook pro ubuntu10.4 bcm无线网卡问题修复

话说虽然用了 pro成了apple fan但是也没有使我对的热情衰减, 这不刚刚把 pro上的9.10升级为10.4, 这回我相信的自动升级能力,但是结果是,我不应该像要求mac os x一样要求 。 有几个东西不能用了,但是那也无关紧要,最要命的使我的wireless的驱动没了,装不上了,靠。这个我受不了。找到了以下解决方法。

首先,说明一点,我的电脑是 pro 471,就是 pro 5,1.

本来是应该这样解决

System->Administration->Hardware Drivers. Select the Broadcom STA options and click enable.

但是现在不行了。

1. 下载broadcom驱动源码,http://www.broadcom.com/support/802.11/linux_sta.php

2. 解压,然后找到 src/wl/sys/wl_linux.c 这个文件

3. 在 #include <XX.h>的下面一行加上下面的代码

#include </sched.h>

4. 编译源码  make

5.把新编译的放到lib中

sudo mv wl.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless

6. 更新依赖关系

sudo depmod -a

7. ok 加入内核
modprobe wl
8. 如果编译报 没有include </sched.h> 加入新的内核头文件。

sudo apt-get install -headers-$(uname -r)

到这里基本上就ok了 可以继续自由自在了,至于以后升级内核从新来一遍就ok

相关日志

android驱动之虚拟按键

1    背景

nexus one工业设计简洁,类似于iphone只有一个按键的设计,只有中间的一个轨迹球。但是标准键盘是有 HOME,MENU,BACK,SEARCH等,但是同时要保持工业设计。nexus one是这样解决问题的,显示屏是800X480,但是在电容触摸屏是8xx*480的就是比800要大的地方就变成了虚拟按键,模拟了标准按键。

2    方案

要实现,虚拟按键,在里面是靠两层协助实现,底层要把虚拟按键在比显示屏多出的地方规定好虚拟按键的位置大小以及键值等,给上层一文件接口。上层java层启动一个服务来读取这一区域的按键响应,这样就是大体的架构。具体实现如下:

2.1    底层虚拟按键功能实现方案

简而言之,就是在内核中把虚拟按键的所有信息给上层给出,用什么方式?就是用sys文件系统的方式,sys文件系统的路径是约定好的所以代码如下实现。给出信息的协议格式是一段连续的字符串,每个按键有六项分别用冒号分割,按键按键之间也是用冒号分割,六项按顺序分别是:

键类型:键值:按键区域中心x坐标:按键区域中心y坐标:按键区域宽:按键区域高

arch/arm/mach-msm/board-mahimahi.c

static ssize_t mahimahi_virtual_keys_show(struct kobject *kobj,
			       struct kobj_attribute *attr, char *buf)
{
	if (system_rev &gt; 2) {
		/* center: x: back: 55, menu: 172, home: 298, search 412, y: 835 */
		return sprintf(buf,
			__stringify(EV_KEY) ":" __stringify(KEY_BACK)  ":55:835:90:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU)   ":172:835:125:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME)   ":298:835:115:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":412:835:95:55"
		   "\n");
	} else {
		/* center: x: home: 55, menu: 185, back: 305, search 425, y: 835 */
		return sprintf(buf,
			__stringify(EV_KEY) ":" __stringify(KEY_HOME)  ":55:835:70:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU)   ":185:835:100:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK)   ":305:835:70:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":425:835:70:55"
		   "\n");
	}
}
 
static struct kobj_attribute mahimahi_virtual_keys_attr = {
	.attr = {
		.name = "virtualkeys.synaptics-rmi-touchscreen",
		.mode = S_IRUGO,
	},
	.show = &amp;mahimahi_virtual_keys_show,
};
 
static struct attribute *mahimahi_properties_attrs[] = {
	&amp;mahimahi_virtual_keys_attr.attr,
	NULL
};
 
static struct attribute_group mahimahi_properties_attr_group = {
	.attrs = mahimahi_properties_attrs,
};
 
struct kobject *properties_kobj;
 
properties_kobj = kobject_create_and_add("board_properties", NULL);
if (properties_kobj)
	ret = sysfs_create_group(properties_kobj,
					 &amp;mahimahi_properties_attr_group);
if (!properties_kobj || ret)
	pr_err("failed to create board_properties\n");

2.2    JAVA上层方案

Java层主要是读取按键信息,然后经过一定的算法,来识别虚拟按键,基本不需要修改,但最好还是熟悉java层的架构这样出问题的时候利于定位
frameworks/base/services/java/com//server/KeyInputQueue.java

/*这是虚拟按键的类里面包括了VirtualKey所用到的成员变量和按键定位方法*/
    static class VirtualKey {
        int scancode;
        int centerx;
        int centery;
        int width;
        int height;
 
        int hitLeft;
        int hitTop;
        int hitRight;
        int hitBottom;
 
        InputDevice lastDevice;
        int lastKeycode;
 
        boolean checkHit(int x, int y) {
            return (x &gt;= hitLeft &amp;&amp; x &lt;= hitRight                     &amp;&amp; y &gt;= hitTop &amp;&amp; y &lt;= hitBottom);
        }
 
        void computeHitRect(InputDevice dev, int dw, int dh) {
            if (dev == lastDevice) {
                return;
            }
            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "computeHitRect for " + scancode
                    + ": dev=" + dev + " absX=" + dev.absX + " absY=" + dev.absY);
 
            lastDevice = dev;
 
            int minx = dev.absX.minValue;
            int maxx = dev.absX.maxValue;
 
            int halfw = width/2;
            int left = centerx - halfw;
            int right = centerx + halfw;
            hitLeft = minx + ((left*maxx-minx)/dw);
            hitRight = minx + ((right*maxx-minx)/dw);
 
            int miny = dev.absY.minValue;
            int maxy = dev.absY.maxValue;
 
            int halfh = height/2;
            int top = centery - halfh;
            int bottom = centery + halfh;
            hitTop = miny + ((top*maxy-miny)/dh);
            hitBottom = miny + ((bottom*maxy-miny)/dh);
        }
    }
/*以下就是与底层接口的函数,如果这个函数和底层接口正常,基本上虚拟按键就能够ok*/
    private void readVirtualKeys(String deviceName) {
        try {
            FileInputStream fis = new FileInputStream(
                    "/sys/board_properties/virtualkeys." + deviceName);
/*这里就是读取kernel给出信息的地方,也就是地层与上层接口的地方,所以整个实现的重点就是这里*/
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr, 2048);
            String str = br.readLine();
            if (str != null) {
                String[] it = str.split(":");
                if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "***** VIRTUAL KEYS: " + it);
                final int N = it.length-6;
                for (int i=0; i&lt;=N; i+=6) {
                    if (!"0x01".equals(it[i])) {
                        Log.w(TAG, "Unknown virtual key type at elem #" + i
                                + ": " + it[i]);
                        continue;
                    }
                    try {
                        VirtualKey sb = new VirtualKey();
                        sb.scancode = Integer.parseInt(it[i+1]);
                        sb.centerx = Integer.parseInt(it[i+2]);
                        sb.centery = Integer.parseInt(it[i+3]);
                        sb.width = Integer.parseInt(it[i+4]);
                        sb.height = Integer.parseInt(it[i+5]);
                        if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Virtual key "
                                + sb.scancode + ": center=" + sb.centerx + ","
                                + sb.centery + " size=" + sb.width + "x"
                                + sb.height);
                        mVirtualKeys.add(sb);
                    } catch (NumberFormatException e) {
                        Log.w(TAG, "Bad number at region " + i + " in: "
                                + str, e);
                    }
                }
            }
            br.close();
        } catch (FileNotFoundException e) {
            Log.i(TAG, "No virtual keys found");
        } catch (IOException e) {
            Log.w(TAG, "Error reading virtual keys", e);
        }
    }

2.3    总结

方案基本上就是这样,主要是调试工作可能需要一段时间,还有如果要做虚拟按键,还需要硬件的支持(超过显示区域的触摸屏区域)。本代码基于 2.1请根据实际情况修改

相关日志

真有蛋疼人…..

看来, 广大p民还是比较蛋疼的…..哪个姐妹有处理的? 赶紧去百姓网…..呵呵….

相关日志