• 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("----------------------------------------------- ");

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

    printk("----------------------------------------------- ");

    然后我们只需把该驱动编译进内核,按道理应该在内核启动打印信息中应该有

    printk("----------------------------------------------- ");

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

    printk("----------------------------------------------- ");

    实际:内核打印信息并没有出现以上打印信息,一直没进入到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来分析它具体加载的内核镜像文件名叫什么

  • 相关阅读:
    7-30-组队赛
    POJ 3125 Printer Queue
    7-28-比赛
    POJ 3922 A simple stone game
    POJ 1845
    第一次组队训练
    I-number
    Radar Installation
    Robots on a grid(DP+bfs())
    Dividing a Chocolate(zoj 2705)
  • 原文地址:https://www.cnblogs.com/fah936861121/p/6844014.html
Copyright © 2020-2023  润新知