刷入谷歌system.img,導(dǎo)致TP和Gsensor方向異常解決方案

一娇钱、綜述

目前Android 8.1 項(xiàng)目會(huì)過一個(gè)新GSI測(cè)試項(xiàng)柳畔,
需要刷入谷歌提供的system.img文件,其中默認(rèn)的LCD旋轉(zhuǎn)角度為0度钾麸,
若是在平板項(xiàng)目中更振,正式軟件的LCD旋轉(zhuǎn)角度可能為270度。
因此會(huì)造成TP和Gsensor方向功能異常問題饭尝。
(ps:后來谷歌爸爸終于把關(guān)于平板項(xiàng)目的旋轉(zhuǎn)角度調(diào)回來了肯腕,也就是白改了)

二、實(shí)現(xiàn)思路

當(dāng)前解決思路如下:
刷入谷歌提供的system.img軟件時(shí)钥平,開機(jī)系統(tǒng)狀態(tài):androidboot.verifiedbootstate=orange
軟件正式開機(jī)系統(tǒng)狀態(tài):
androidboot.verifiedbootstate=green

此狀態(tài)會(huì)在lk->kernel的過程中实撒,通過cmdline的參數(shù)傳給kernel層,
從log中搜索cmdline涉瘾,如下


開機(jī)串口log

因此通過在kernel層判斷此狀態(tài)來改變TP和Gsensor方向

三知态、解決方案(代碼實(shí)現(xiàn))

1.TP修改

kernel-3.18/drivers/input/touchscreen/mediatek/gslX68X_9709

#include <linux/string.h>//add by zcf 2018.04.24

static bool used_defautl_tp_rotation = false;//add by zcf 2018.04.24

static int __init tpd_driver_init(void) {
    char * sub = "androidboot.verifiedbootstate=orange";//add by zcf 2018.04.24
    print_info("Sileadinc gslX680 touch panel driver init\n");
    
    //add by zcf 2018.04.24
    if(strstr(saved_command_line,sub)){
      //if boot state == orange ,change tp rotation to 0
        used_defautl_tp_rotation = true;        
    }
    //end add by zcf 2018.04.24

#ifdef ADD_I2C_DEVICE_ANDROID_4_0
    //i2c_register_board_info(1, &gslX680_i2c_tpd, 1);  
#endif
    tpd_get_dts_info();
    if(tpd_driver_add(&tpd_device_driver) < 0)
        print_err("add gslX680 driver failed\n");
    return 0;
}


void tpd_down( int id, int x, int y, int p) 
{
    print_info("+++tpd_down++++ x =%d  y=%d    ++++++++++++++++ \n", x, y);
    if(!used_defautl_tp_rotation){ //add by zcf 2018.04.24
#if defined(TPD_ROTATE_90)
    tpd_rotate_90(&x,&y);
#elif  defined(TPD_ROTATE_270)||defined(TPD_ROTATE_270_2)
    tpd_rotate_270(&x,&y);
#endif
    }  //add by zcf 2018.04.24
    //省略部分代碼
}

不同的項(xiàng)目TP驅(qū)動(dòng)不同個(gè),但修改思路是相同的睡汹,在tpd_driver_init()函數(shù)里肴甸,
char * sub = "androidboot.verifiedbootstate=orange";
if(strstr(saved_command_line,sub)){
//if boot state == orange ,change tp rotation to 0
used_defautl_tp_rotation = true;
}
解析saved_command_line是否包含"androidboot.verifiedbootstate=orange"
如果是的話寂殉,我們就需要改變TP的方向囚巴,使用默認(rèn)旋轉(zhuǎn)度為0的方向。
在tpd_down()友扰,禁止旋轉(zhuǎn)90度或者270度彤叉,也就是使用默認(rèn)0度方向。
同樣道理
kernel-3.18/drivers/input/touchscreen/mediatek

static int tpd_probe(struct platform_device *pdev)
{
    int touch_type = 1; /* 0:R-touch, 1: Cap-touch */
    int i = 0;
    char * sub = "androidboot.verifiedbootstate=orange";//add by zcf 2018.04.24
     //省略....代碼

    //add by zcf 2018.04.24
    if(strstr(saved_command_line,sub)){
    //if boot state == orange ,change tp rotation to 0
        goto tp_rotate_to_zero;    
    }
    // end add by zcf 2018.04.24
    #ifdef CONFIG_MTK_LCM_PHYSICAL_ROTATION
    if (0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "90", 2)
        || 0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "270", 3)) {
#ifdef CONFIG_MTK_FB    
/*Fix build errors,as some projects  cannot support these apis while bring up*/
        TPD_RES_Y = DISP_GetScreenWidth();
        TPD_RES_X = DISP_GetScreenHeight();
#endif
    } else
    #endif
    {
       tp_rotate_to_zero://add by zcf 2018.04.24
#ifdef CONFIG_CUSTOM_LCM_X
#ifndef CONFIG_MTK_FPGA
#ifdef CONFIG_MTK_FB

如果f boot state == orange 村怪,就調(diào)過CONFIG_MTK_LCM_PHYSICAL_ROTATION宏所定義的代碼秽浇,即不旋轉(zhuǎn)
直接goto -> tp_rotate_to_zero:后面的代碼

2.Gsensor方向的修改

kernel-3.18/arch/arm/boot/dts

&i2c2 {
    gsensor@18 {
        i2c_num = <2>;
        i2c_addr = <0x18 0 0 0>;
        direction = <7>;
        direction_for_gsi = <6>;/*add by zcf 2018.04.24*/
        power_id = <0xffff>;
        power_vol = <0>;
        firlen = <0>;
        is_batch_supported = <0>;
    };
}

在dts里面添加direction_for_gsi ,如果刷了gsi的system.img甚负,就使用這個(gè)方向柬焕,否則使用默認(rèn)的direction
kernel-3.18/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts

int get_accel_dts_func(struct device_node *node, struct acc_hw *hw)
{
    char * sub = "androidboot.verifiedbootstate=orange";//add by zcf 2018.04.24
    int i, ret;
    u32 i2c_num[] = {0};
    u32 i2c_addr[G_CUST_I2C_ADDR_NUM] = {0};
    u32 direction[] = {0};
    u32 direction_for_gsi[] = {0};// add by zcf 2018.04.24
    u32 power_id[] = {0};
    u32 power_vol[] = {0};
      //省略...代碼

    ret = of_property_read_u32_array(node, "direction", direction, 
                                ARRAY_SIZE(direction));
    if (ret == 0)
      hw->direction = direction[0];
      //add by zcf 2018.04.24 
       if(strstr(saved_command_line,sub)){
      //if boot state == orange ,used the direction_for_gsi for gsi test
       if(of_find_property(node,"direction_for_gsi",NULL)) {
         ret = of_property_read_u32_array(node, "direction_for_gsi", 
                      direction_for_gsi, ARRAY_SIZE(direction_for_gsi));
         hw->direction = direction_for_gsi[0];      
      }
     }
 //end add by zcf 2018.04.24
}

如果saved_command_line包含androidboot.verifiedbootstate=orange;
判斷direction_for_gsi節(jié)點(diǎn)是否為空
不為空就獲取direction_for_gsi的值賦給hw->direction
hw->direction = direction_for_gsi[0];

saved_command_line在內(nèi)核中的定義和使用

saved_command_line是全局變量梭域,該變量通過EXPOER_SYMBOL(saved_command_line)宏斑举,使得全局可用。

這個(gè)變量定義在main.c


main.c

在sparc_ksyms_32.c或者sparc_ksyms_64.c里export為全局變量


sparc_ksyms_32.c

我們可以看一下內(nèi)核中試如何使用的病涨,模仿即可


mtkfb.c

直接調(diào)用strstr(saved_command_line, "lcm=")富玷,
不需要定義saved_command_line。

到此既穆,就寫完了赎懦,收工練琴!

Stay hungry幻工,Stay foolish!
荊軻刺秦王

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末励两,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囊颅,更是在濱河造成了極大的恐慌当悔,老刑警劉巖工三,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異先鱼,居然都是意外死亡俭正,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門焙畔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸读,“玉大人,你說我怎么就攤上這事宏多《梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伸但,是天一觀的道長(zhǎng)肾请。 經(jīng)常有香客問我,道長(zhǎng)更胖,這世上最難降的妖魔是什么铛铁? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮却妨,結(jié)果婚禮上饵逐,老公的妹妹穿的比我還像新娘。我一直安慰自己彪标,他們只是感情好倍权,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捞烟,像睡著了一般薄声。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上题画,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天默辨,我揣著相機(jī)與錄音,去河邊找鬼婴程。 笑死廓奕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的档叔。 我是一名探鬼主播桌粉,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衙四!你這毒婦竟也來了铃肯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤传蹈,失蹤者是張志新(化名)和其女友劉穎押逼,沒想到半個(gè)月后步藕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挑格,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年咙冗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漂彤。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雾消,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挫望,到底是詐尸還是另有隱情立润,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布媳板,位于F島的核電站桑腮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛉幸。R本人自食惡果不足惜破讨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巨缘。 院中可真熱鬧添忘,春花似錦采呐、人聲如沸若锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽又固。三九已至,卻和暖如春煤率,著一層夾襖步出監(jiān)牢的瞬間仰冠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工蝶糯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洋只,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓昼捍,卻偏偏與公主長(zhǎng)得像识虚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妒茬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 微信已經(jīng)成為人們不可或缺的一部分担锤,預(yù)約服務(wù)正成為微信公眾平臺(tái)發(fā)展的重要方向。生活中有很多需要排隊(duì)乍钻、等候的事情肛循,然而...
    樂享其約閱讀 421評(píng)論 0 0
  • 最喜最擅長(zhǎng)干的事就是幫人捋心! 捋的了周圍所有人的心夹孔,捋的過程笋粟,捎帶手也捋了自己! 這多少算渡人也渡己吧析蝴! 何為福...
    縱情嬉戲天地間閱讀 288評(píng)論 0 0
  • 《Succeed》翻譯作業(yè)(25)I think that last remark is particularly...
    丁涌閱讀 202評(píng)論 0 0
  • 莫名其妙的眩暈發(fā)作了害捕,來勢(shì)洶洶把自己嚇到了,醫(yī)院各大科室一頓檢查闷畸,沒有所以然尝盼,眩暈仍在繼續(xù),身體開始適應(yīng)佑菩,畢竟盾沫,身...
    我是水水閱讀 169評(píng)論 0 1