Android内核中判别启动模式

Android内核中判别启动模式

问题出现在驱动组描述了一个问题是内核的一个驱动中设置的电压值在正常模式和其它模式启动时电压值不能设置成一样,在正常模式中3.3v,其它模式3.0v。正常模式设置成3.3v是为了解决问题,但是这样也带来了一个问题在非正常模式(Recovery)启动时因此有附带的问题。

总归一句话:解决起来就是怎么让内核驱动时知道启动模式,来动态的设置电压值。

先从启动模式判别来说,知道Android判别启动方式一般是靠在Bootloader启动时检测 魔键(magic key)是否按下,然后传递给kernel不同的参数。知道一般kernel的参数在/proc/cmdline中存着呢?要想找出区别只能看它。但是在Recovery模式下没有cat等等命令可以用,那么cmdline中的内核就不好取出来。还好以前有调试内核的经验,知道在内核启动时会在串口中打印出来cmdline中的内容。有了内容就不差找出区别了。对比区别如下:

Android内核中判别启动模式

文字说明一下就是非正常模式启动时参数mtdparts中会多一个“[email protected](parameter),”;vcD4KPHA+ICAgICAgICDI57TL0rvAtKOs09DV4rj2ss7K/bXEvs3Kx7fH1f2zo8Sjyr2jrLe01q7Kx9X9s6PEo8q9oaO1q8rH1NrE2rrLx/22r9bQyOe6zsXQts/E2KOsudjT2tXiuPbOyszix/PW+tPawctMaW51eGRydsi6o6zIutb3uPjBy7e9sLijrNXrttTV4rj2x+m/9sTausvKx9PQtKbA7be9sLi1xKOs08NfX3NldHVwoaPU2sf9tq/W0MztvNPSu7j2uq/K/aOs16Ky4bW9X19zZXR1cNbQo6zV4tH5xNq6y9TaveLO9qGhxNq6y7LOyv3B0LHtoaG1xMqxuvKjrMTausu74b2rbXRkcGFydHOyzsr9tcTE2sjdtKu13bn9wLSjrNTa1eK49rqvyv3W0Nf20rvPwtfWt/u0rsalxeSjrMno1sPSu7j2yKu+1rHkwb9ub3JtYWxfYm9vdKGjtci1vbzT1NjH/bavtcTKsbryo6y4+b7d1eK49sirvtax5MG/tcTAtMno1sO159G5JiMyMDU0MDujrNXi0fnV+8zlt72wuL7N09DBy6GjPC9wPgo8cD4gICAgICAgILe9sLjA7cflvbu4tsf9tq/X6aGj0tTPwsrHztK4+LP2tcRkZW1vOjwvcD4KPHA+Lyo8L3A+CjxwPiAqIFZpcnR1YWwgVG91Y2hTY3JlZW4gZHJpdmVyPC9wPgo8cD4gKjwvcD4KPHA+ICogQ29weXJpZ2h0IChDKSAyMDExIE5pdSBUYW8gPG5pdXRhbzA2MDJAZ21haWwuY29tPjwvcD4KPHA+ICo8L3A+CjxwPiAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljPC9wPgo8cD4gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcjwvcD4KPHA+ICogbW9yZSBkZXRhaWxzLjwvcD4KPHA+ICo8L3A+CjxwPiAqLzwvcD4KPHA+IDwvcD4KPHA+I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPjwvcD4KPHA+I2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPjwvcD4KPHA+I2luY2x1ZGUgPGxpbnV4L2luaXQuaD48L3A+CjxwPiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPjwvcD4KPHA+I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+PC9wPgo8cD4jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+PC9wPgo8cD4jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+PC9wPgo8cD4jaW5jbHVkZSA8bGludXgvaW5wdXQuaD48L3A+CjxwPiA8L3A+CjxwPiNkZWZpbmUgRFJJVkVSX0RFU0Mg"Virtual TouchScreen"

static struct input_dev *vts_dev;

#define VTS_MIN_XC 0

#define VTS_MAX_XC 320

#define VTS_MIN_YC 0

#define VTS_MAX_YC 480

static int __initdata vts_max_xc = VTS_MAX_XC;

static int __initdata vts_max_yc = VTS_MAX_YC;

#ifndef MODULE

static int __initdata vts_use = 0;

/**

* parse options,format must be vts=widthxheigth

*/

static int __init vts_setup(char *str)

{

char buf[64];

char *p;

int xc, yc;

vts_use = 1;

/* 本代码参考自:http://blog.chinaunix.net/uid-20729605-id-2876040.html

* 启动模式。正常模式:不包含"parameter";其它模式:包含"parameter".

* 使用内核中的__setup方法,注册后内核检测到有没有内容,如果有直接调用

* 判断str中有无"parameter"关键字,无说明正常启动,有说明其它模式启动

* if(isHad)

* normal_boot = 0;

* else

* normal_boot = 1;

* 在设置电压处时行normal_boot这个变量值的判断如下:

* if(normal_boot)

* 电压=3.3v;

*/

/*

strncpy(buf, str, sizeof(buf));

p = strchr(buf, 'x');

if (!p)

goto out;

*p = '';

xc = simple_strtoul(buf, NULL, 0);

yc = simple_strtoul(p + 1, NULL, 0);

if (!xc || !yc)

goto out;

vts_max_xc = xc;

vts_max_yc = yc;

return 1;

out:

printk(KERN_WARNING "vts: option format must be like 'vts=widthxheigth'. "

"use default config vts=%dx%d\n", vts_max_xc, vts_max_yc);

*/

return 0;

}

__setup("mtdparts=", vts_setup);

#endif

static int __init vts_init(void)

{

int err;

#ifndef MODULE

if (!vts_use)

return -ENODEV;

#endif

vts_dev = input_allocate_device();

if (!vts_dev) {

printk(KERN_ERR "vts: not enough memory\n");

err = -ENOMEM;

goto fail1;

}

vts_dev->name = DRIVER_DESC;

vts_dev->phys = "vts/input0";

vts_dev->id.bustype = BUS_VIRTUAL;

vts_dev->id.vendor = 0x0000;

vts_dev->id.product = 0x0000;

vts_dev->id.version = 0x0100;

vts_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);

vts_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);

input_set_abs_params(vts_dev, ABS_X, VTS_MIN_XC, vts_max_xc, 0, 0);

input_set_abs_params(vts_dev, ABS_Y, VTS_MIN_YC, vts_max_yc, 0, 0);

err = input_register_device(vts_dev);

if (err)

goto fail2;

return 0;

fail2:

input_free_device(vts_dev);

fail1:

return err;

}

module_init(vts_init);

#ifdef MODULE

static void __exit vts_exit(void)

{

input_unregister_device(vts_dev);

input_free_device(vts_dev);

}

module_exit(vts_exit);

#endif

MODULE_AUTHOR("Niu Tao ");

MODULE_DESCRIPTION(DRIVER_DESC);

MODULE_LICENSE("GPL");

关于__setup见《__setup 在内核中的作用》。

关于__setup实例见《虚拟触摸屏驱动+如何通过启动参数给驱动程序传递参数 》。

分类:默认分类 时间:2012-05-14 人气:0
本文关键词:
分享到:

相关文章

  • Android SQLite数据库操作示例 2012-01-01

    SQLite介绍 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能。此外,它还是开源的,任何人都可以使用它。 SQLite由以下几个组件组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。 SQLite支持的数据类型参考链接:http://blog.csdn.net/wzy_1988/article/details/36005947 Android在运行时(

  • Android引路蜂地图开发示例:选择地图服务 2012-01-02

    引路蜂地图服务缺省使用Google地图服务,但你也可以选择其它地图服务,比方说当Google服务离线时,您可以选择MapAbc的地图服务,另外要注意的是中国地图是有偏移的。如果想使用无偏移的中国地图,一是采用地图偏移校正算法,另外一个是使用CloudMade地图服务。 所前所述,引路蜂地图开发包在设计时将地图图片显示和地图服务两部分设计成相对独立的两部分,Google中国地图图片,Bing中国地图图片,MapAbc中国地图图片是有偏移的地图图片,CloudMade(OpenStreet)中国地图

  • Android 关于greenDao的使用教程 2012-01-02

    关于greenDao的使用 第一篇How to get started ? 原文地址:http://greendao-orm.com/documentation/how-to-get-started/ 该教程会带你浏览一个简单的greenDao示例工程。地址:https://github.com/greenrobot/greenDAO,该工程包含两个子工程: DaoExample和DaoExampleGenerator。你可以clone到本地,运行或者直接在github上直接浏览。 如果你从gi

  • Android 手势识别 2012-01-03

    Android 提供了GestureDetector类来识别用户的手势操作,这个类提供了两个侦听接口:OnGestureListener(处理单击类消息)与OnDoubleTagListener(处理双击类消息)。onGestureListener( )接口中有以下几个抽象方法: // 单击,触摸屏按下时立刻触发 abstract boolean onDown(MotionEvent e); // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) abstract boolea

  • Android-Universal-Image-Loader框架学习 2012-01-03

    先来看一下Android-Universal-Image-Loader框架的用法; 1、初始化ImageLoaderConfiguration(全局的,在整个application中初始化configuration,配置缓存、加载线程等)、 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( getApplicationContext()) .threadPriority(Thread.NORM_PRIO

  • iOS和Android将在良性竞争中互存 2012-01-03

      苹果推出iPhone 4S。图/CFP   三星可弯曲屏幕概念机   Natali概念机   Kambala概念机   Windows概念机   “苹果风光将长久依旧!”,iPhone的最大竞争对手Android阵营显然不这么看。Android由Google推出,而Google董事长施密特前不久刚刚发表了对智能手机大战的见解,他表示,实际上在苹果的系统(iOS)和Android之间的竞争还会继续存在下去,而且这种竞争是非常良性的竞争。它能够把我们的价格降低,而且会把更多的投资带到市场上。目前

  • android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用 2012-01-04

    有时候我们需要修改列表里的数据,并实时刷新,我们除了在在外部调用adapter.notifyDataSetChanged()方法来通知activity刷新, 如果在adapter内部有涉及到更新数据,删除或者增加数据,就可以直接在adapter内部调用notifyDataSetChanged()这个方法,前提是该listview绑定的数据有改变。 以下例子结合Handler,线程展示 public class MyAdapter extends BaseAdapter { private fin

  • Google否认Android应用认证体系被破解 2012-01-04

    Google在7月发布了新的Android应用程序许可验证服务, 以防止Android应用可被轻松破解的尴尬局面。但是这一新的版权保护形式依然很脆弱,脆弱到依然可以被轻松破解。只要用一个叫做 smali/baksmali的程序将.apk文件解包,把里面的授权验证库给移除掉,再重新打包成.apk文件就完成了破解。因为.apk文件里的授权 验证库是独立的一个部分,所以很好分离出来,完成破解。目前这一方式还存在于理论上,不过估计很快就会有人做出自动工具来实现批量.apk文件的破解。 Google迅速通

  • android 点击下弹动画实现 2012-01-04

    下弹动画的实现 下弹动画在很多应用都有使用,比如豌豆荚中的应用介绍界面,百度手机助手的应用介绍界面等。 只要熟悉android动画的使用接口,制作动画并不困难。 这里使用开源库nineoldandroids,其实和android3.0 以上直接使用动画接口是一样的。 实现效果 PS, 搞了半天GIF 才能播放。原来是最大边不能太大了。原来图片尺寸太大,被默认转成jpg了。现在总算能看到效果了。 DropDownExample.java package com.buptfarmer.devapp;

  • 细数Android十大最受欢迎的程序软件(下) 2012-01-04

      上文关于Android程序软件的介绍看的过瘾吗?这里再次为你呈现你喜爱的,你常用的,你不知道的……   6、BatteryHD   Battery HD在排行中一直很稳定的维持在第6名。它两星期之前第一次出现在thenextinstall排名榜上,目前为止安装量已经超过了100k。随着 hockey-stick发展起来, Battery HD的安装量将很快超过100万。虽然这个程序很简单,但是电池方面的应用程序在安卓程序中永远不会过时。   7、Radiant Defense   上个星期R

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.036 (s). 10 q(s)