編輯:關於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實例見《虛擬觸摸屏驅動+如何通過啟動參數給驅動程序傳遞參數 》。
綜述 在Retrofit2.0使用詳解這篇文章中詳細介紹了retrofit的用法。並且在retrofit中我們可以通過ResponseBody進行對文件的下載。但是在r
大家好,翻了翻以前的筆記,發現了一個我特別標記的功能,那就是ListView全選功能,頓時想起了我那個時候苦逼的生涯,由於我大學機械出身,大學畢業了都不知道
除非我們特別為某個操作指定特定的線程,否則大部分在前台UI界面上的操作任務都執行在一個叫做UI Thread的特殊線程中。這可能存在某些隱患,因為部分在UI界面上的耗時操
最近做的項目中需要實現斷點下載,即用戶一次下載可以分多次進行,下載過程可以中斷,在目前大多數的帶離線緩存的軟件都是需要實現這一功能。本文闡述了通過sqlite3簡單實現了