Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內核中判別啟動模式

Android內核中判別啟動模式

編輯:關於Android編程

Android內核中判別啟動模式

問題出現在驅動組描述了一個問題是內核的一個驅動中設置的電壓值在正常模式和其它模式啟動時電壓值不能設置成一樣,在正常模式中3.3v,其它模式3.0v。正常模式設置成3.3v是為了解決問題,但是這樣也帶來了一個問題在非正常模式(Recovery)啟動時因此有附帶的問題。

總歸一句話:解決起來就是怎麼讓內核驅動時知道啟動模式,來動態的設置電壓值。

先從啟動模式判別來說,知道Android判別啟動方式一般是靠在Bootloader啟動時檢測 魔鍵(magic key)是否按下,然後傳遞給kernel不同的參數。知道一般kernel的參數在/proc/cmdline中存著呢?要想找出區別只能看它。但是在Recovery模式下沒有cat等等命令可以用,那麼cmdline中的內核就不好取出來。還好以前有調試內核的經驗,知道在內核啟動時會在串口中打印出來cmdline中的內容。有了內容就不差找出區別了。對比區別如下:

\

文字說明一下就是非正常模式啟動時參數mtdparts中會多一個“0x00002000@0x00000000(parameter),”;<喎?/kf/ware/vc/" target="_blank" class="keylink">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 = '\0';

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實例見《虛擬觸摸屏驅動+如何通過啟動參數給驅動程序傳遞參數 》。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved