被LCD调戏睡不着了
好吧,我承認我不是因為被調戲睡不著的,我是因為今天晚上喝了一杯該死的咖啡,然后就睡不著了,這個點[3:40]在床上翻來覆去,剛開始我摸著楠哥的小腿,過了一會,覺得沒意思了,然后再摸楠哥的大腿,我想跟他說幾句話,接著是,啪的一個聲音,精神小伙給了我一巴掌。
因為睡不著,于是我就坐起來寫點奇怪的東西,就有了這篇文章。
我們今天在調試屏幕,已經在LK階段讓屏幕亮起來了,但是在kernel階段屏幕還是不能亮,排查了很久不知道問題在哪里。
1、測量了復位腳上電時序,可以看到按下power鍵休眠喚醒的時候可以看到reset腳的電平變化,也就是說這個腳是可以控制的,不過話說回來,如果這個腳不可以控制,在lk階段怎么可能亮屏呢?
2、測量mipi的lane腳,也可以看到休眠的時候沒有波形,喚醒的時候有波形,所以平臺端的視頻輸出是正確的。
3、發現上電時候復位引腳拉高后的延遲時間不夠,芯片手冊上要求是 10ms以上,但是我們代碼實際上寫的是5ms,但是實際修改后也沒有亮屏。
4、在kernel階段,我們寫入BIST模式的時候不能進入測試模式。這個可以猜測沒有寫成功是因為上電時序有問題,IC沒有進入正常的上電狀態。
明天準備排查方向
1、還是從上電時序入手,VDD 和RESET之間的時間,還有RESET和LANE數據的時間,都需要嚴格遵守,并且要用示波器測量正確。
這一點跟模組廠確認,電源開機后一直打開是沒有問題的,所以排除這一點。但是有的屏幕如果復位時序不正確,寄存器是寫不進去的。
2、去掉LK的控制,讓屏幕在Kernel階段初始化,因為從沒有電到上電有一個過程,這也是為什么LK階段上電不嚴格也可以初始化的原因,因為它總是從沒有電到有電的冷啟動。
3、叫模組廠的FAE過來,我們沒有調通,大家應該都有責任把這個事情做好,先把鍋甩出去再說。
題外話
在知乎上看到一個問題,如果當時關羽不出手,劉備不出手,張飛不出手,誰能斬華雄。
這里只討論演義,我看了很多人的答案,我覺得有兩個人可以,一個是孫堅,一個是曹洪,孫堅前期打架是很厲害的,當然也還有其他人選,比如典韋,趙云之類的,但是他們當時還沒有出現,趙云那時候年紀也還比較小,我選的這兩個人也都出現在當時的聯合軍隊中。不過不管是孫堅和曹洪,戰斗力應該都打不過華雄,即使能不被反殺,想拿下華雄人頭應該還是很難的。
時間來到今天
今天還是一樣,我把我熬夜思考出來的秘籍都測試了,開機后可以亮屏幕,但是suspend后再resume,該死的屏幕還是亮不了。
其中還跟模組廠溝通如下:
這個時候,我發現我的背光亮不了。于是我就跟著背光在resume的時候不能亮的思路去尋找。我還想起來,我昨天發了文章,有一個大牛給我回復了,我跟他聊了下。
就是這個該死的宏,在喚醒的時候進行了判斷跑了不同的邏輯。
我按照這樣修改后,這個該死的屏幕就亮起來了。
void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level) {struct mt65xx_led_data *led_data =container_of(led_cdev, struct mt65xx_led_data, cdev);/* unsigned long flags; *//* spin_lock_irqsave(&leds_lock, flags); */output_met_backlight_tag(level);printk("=== weiqifa === %s-%d\n",__FUNCTION__,__LINE__); #ifdef CONFIG_MTK_AAL_SUPPORTif (led_data->level != level) {led_data->level = level;if (strcmp(led_data->cust.name, "lcd-backlight") != 0) {LEDS_DEBUG("Set NLED directly %d at time %lu\n",led_data->level, jiffies);schedule_work(&led_data->work);} else {if (level != 0&& level * CONFIG_LIGHTNESS_MAPPING_VALUE < 255) {level = 1;} else {level =(level * CONFIG_LIGHTNESS_MAPPING_VALUE) /255;}LEDS_DEBUG("Set Backlight directly %d at time %lu, mapping level is %d\n",led_data->level, jiffies, level);/* mt_mt65xx_led_set_cust(&led_data->cust, led_data->level); */disp_aal_notify_backlight_changed((((1 <<MT_LED_INTERNAL_LEVEL_BIT_CNT)- 1) * level +127) / 255);}} #else/* do something only when level is changed */if (led_data->level != level) {led_data->level = level;if (strcmp(led_data->cust.name, "lcd-backlight") != 0) {LEDS_DEBUG("Set NLED directly %d at time %lu\n",led_data->level, jiffies);schedule_work(&led_data->work);} else {if (level != 0&& level * CONFIG_LIGHTNESS_MAPPING_VALUE < 255) {level = 1;} else {level =(level * CONFIG_LIGHTNESS_MAPPING_VALUE) /255;}LEDS_DEBUG("Set Backlight directly %d at time %lu, mapping level is %d\n",led_data->level, jiffies, level);if (led_data->cust.mode == MT65XX_LED_MODE_CUST_BLS_PWM) {mt_mt65xx_led_set_cust(&led_data->cust,((((1 <<MT_LED_INTERNAL_LEVEL_BIT_CNT)- 1) * level +127) / 255));} else {mt_mt65xx_led_set_cust(&led_data->cust, level);}}}/* spin_unlock_irqrestore(&leds_lock, flags); */ #endif但是這個背光控制沒有在DTS里面設置的,這個真的是一個大坑,我們的背光控制硬件GPIO口是
但是代碼中,這里直接通過PWM寄存器控制了,所以就脫離了GPIO口了。也就是我們想在DTS里面找GPIO口配置是不對的。
還有這個宏的作用
CONFIG_MTK_AAL_SUPPORT
這個是自動背光的作用,可以用來節省電量,但是我們不需要這個功能,而且前期調試的時候,光感還沒有起來,開了這個就有影響了。
把這個功能關閉后需要全編譯一次,要不然功能還沒有完全關閉。
MTK8167S的LCD軟件流程框架我就不說了,驅動調試的話可以按照原有的驅動來參考編寫,也有MTK的調試文檔,先不花篇幅在這里了。有需要的可以私聊我。
最后~
感謝這位小哥哥~
? 回復「?籃球的大肚子」進入技術群聊
回復「1024」獲取1000G學習資料
總結
以上是生活随笔為你收集整理的被LCD调戏睡不着了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythoniris补全缺失值_机器学习
- 下一篇: gps高斯utm_高斯-克吕格投影与UT