開發板:明遠智睿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來分析它具體加載的內核鏡像文件名叫什么