LCD屏背光驅動調試心得---血的教訓


開發板:明遠智睿MY-IMX6-EK140

內核源碼:linux-3.14.52

背光驅動IC:MP3202

調光原理:通過開發板的核心板PWM4引腳控制MP3202的EN腳,輸出不同的占空比從而達到輸出平均電流的不同,這樣就可以達到調節背光亮度的目的

調試過程:

1.從硬件圖可以看出核心板的PWM4引腳連接到了背光驅動IC MP3202的EN腳,所以我們通過搜索PWM4來找設備樹上的硬件節點

2.在明遠智睿MY-IMX6-EK140設備樹,arch/arm/boot/dts/myimx6ek140-6g.dts中搜索PWM4

3.搜索結果如下:

backlight {
  compatible = "pwm-backlight";
  pwms = <&pwm4 0 5000000>;
  brightness-levels = <0 4 8 16 32 64 128 255>;
  default-brightness-level = <7>;
  status = "okay";
};

由此可以得出背光驅動是pwm-backlight

4.在linux內核源碼中找pwm-backlight驅動,這個驅動在drivers/video/backlight/pwm_bl.c中,由於要調試這個驅動,所以我在pwm_bl.c驅動的探測函數中加了打印信息

printk("-----------------------------------------------\n");

printk("pwm-backlight-probe in\n");

printk("-----------------------------------------------\n");

然后我們只需把該驅動編譯進內核,按道理應該在內核啟動打印信息中應該有

printk("-----------------------------------------------\n");

printk("pwm-backlight-probe in\n");

printk("-----------------------------------------------\n");

實際:內核打印信息並沒有出現以上打印信息,一直沒進入到pwm-bl.c中pwm-backlight驅動的probe探測函數中去,即設備沒有與該驅動匹配上

調試為何沒進入pwm-bl.c的pwm-backlight驅動的probe探測函數中

思維定式:只要設備樹上的屬性compatible = "pwm-backlight";與驅動中的of_match_table的屬性compatible = "pwm-backlight";匹配就應該能進入該驅動的探測函數中去,

然后就以為設備樹寫錯了(多了空格,字母之類的),然后重新拷貝一遍,結果調試還是不行

然后就換一種方式,把這個驅動編譯成動態庫加載,即配置make menuconfig時選擇M,編譯成模塊,具體如下:

make menuconfig:

   Device Drivers  --->  

    Graphics support  ---> 

      [*] Backlight & LCD device support  ---> 

        <M>     Generic PWM based Backlight Driver  

然后make modules這樣就編譯成模塊,模塊在drivers/video/backlight/pwm-bl.ko

然后再次基礎上編譯內核make zImage

重新燒寫內核,啟動板子,加載pwm-bl.ko模塊,發現如下錯誤:

Error: Driver 'pwm-backlight' is already registered, aborting...
insmod: ERROR: could not insert module pwm_bl.ko: Device or resource busy

從這可以發現,內核中已經有了該pwm-backlight驅動,所以動態加載不上這個pwm-bl.ko

分析為什么內核中已經有了pwm-backlight驅動了呢?

這里又思維定式了:因為重新燒寫了內核(即pwm-backlight驅動沒有編譯進內核),所以應該不會出現此類錯誤

最終找組長給我重新操作一遍,原來是板子上跑的內核不是新編譯生成的內核

我是把新生成的內核zImage拷貝到/dev/mmcblk1p1中,而板子跑的是zImage-myimx6內核鏡像文件,所以一直不會跑新編譯生成的內核文件zImage,由於之前的內核鏡像文件zImage-myimx6已經編譯好了pwm-backlight驅動,所以我們再加載pwm-bl.ko會出現

Error: Driver 'pwm-backlight' is already registered, aborting...
insmod: ERROR: could not insert module pwm_bl.ko: Device or resource busy

這是血的教訓啊,不一定板子跑的就是zImage文件名的內核鏡像,實際這個板子上跑的是zImage-myimx6文件名的內核鏡像。這讓我折騰了一天,淚奔。。。

有兩種方法來避免這種情況

1.看內核啟動信息

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 3.14.52 (edward@edward) (gcc version 4.9.1 (GCC) ) #3 SMP PREEMPT Fri May 12 11:00:14 CST 2017

這里的時間看是不是與你編譯內核的時間相同

2.通過uname -a命令來顯示系統信息(包括內核編譯時間)

uname -a
Linux myzr 3.14.52 #3 SMP PREEMPT Fri May 12 11:00:14 CST 2017 armv7l GNU/Linux

看這里的時間是不是與你編譯內核時間相同

如果不同則表示板子跑的內核不是你新編譯的內核

那又怎么知道板子跑的內核文件名叫什么呢?

通過uboot的bootcmd來分析它具體加載的內核鏡像文件名叫什么

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM