• imx6背光驱动调试


    1.内核配置pwm背光驱动
    make menuconfig:
    Device Driver --->
    Graphics support --->
    [*] Backlight & LCD device support --->
    <*> Lowlevel Backlight controls
    <*> Generic PWM based Backlight Driver

    2.背光sys文件节点/sys/class/backlight/的由来
    在drivers/video/backlight/backlight.c中backlight_class_init()函数中class_create(THIS_MODULE, "backlight")中创建的, 那么剩下的/sys/class/backlight/backlight.27/brightness又是怎么来的呢?我们可以看到在drivers/video/backlight/pwm_bl.c中有backlight_device_register(dev_name(&pdev->dev), &pdev->dev, pb, &pwm_backlight_ops, &props), 这个注册函数接口在/sys/class/backlight/下又创建了一个设备接口, 名字是通过dev_name(&pdev->dev)实参传递的. 那么dev_name(&pdev->dev)是怎样的呢?
    static inline const char *dev_name(const struct device *dev)
    {
    /* Use the init name until the kobject becomes available */
    if (dev->init_name)
    return dev->init_name;

    return kobject_name(&dev->kobj);
    }
    由此可知, 如果dev的init_name成员不为空, 则dev_name就是dev的init_name成员值, 否则dev_name就是kobject_name(&dev->kobj), 官方驱动中dev的init_name为空, 所有dev_name为kobject_name(&dev->kobj), 这个会是随机值, 会产生/sys/class/backlight/backlight.27/...等目录, 或产生/sys/class/backlight/backlight.16/...等目录, 现在项目中我需要固定这个目录为/sys/class/backlight/hud-lcd-backlight/..., 所以我可以给dev的init_name赋值, 这样就可以产生我们想要的目录了, 在drivers/video/backlight/pwm_bl.c文件probe函数中backlight_device_register函数前增加dev_set_name(&pdev->dev, "%s", "hud-lcd-backlight");即可实现

    3.背光驱动源码分析driver/video/backlight/pwm_bl.c
    3.1通过compitable = "pwm-backlight";匹配到设备树上arch/arm/boot/dts/imx6dl-hud.dtsi的pwm-backlight设备
    3.2进入到探测函数pwm_backlight_probe, 由于backlight设备是采用设备树, 所以data = dev_get_platdata(&pdev->dev), data = NULL, 所以会进入到pwm_backlight_parse_dt函数
    3.3进入到pwm_backlight_parse_dt(&pdev->dev, &defdata)函数,解析设备树的设备值, 其实就是把设备树的值(pdev->dev)解析赋值给defdata, 其中prop = of_find_property(node, "brightness-levels", &length);
    该函数读取设备数结点中"brightness-levels"属性,并把读取的值放到length中去,这里length = 32,因为每一个bright-levels的元素(0 4 8 16 32 64 128 255)占4个字节, 共8个元素(0 4 8 16 32 64 128 255)所有共占32字节, 所以length = 32
    3.4data = &defdata把解析好的数据defdata赋值给data
    3.5data->init = NULL
    3.6devm_regulator_get(&pdev->dev, "power"); 由于没有power节点, 所以会返回错误(backlight.27 supply power not found, using dummy regulator)
    3.7devm_pwm_get()获取pwm
    3.8注意这里backlight_device_register(dev_name(&dev->dev), &pdev->dev, pb, &pwm_backlight_ops, &props);通过这个注册函数接口就创建了/sys/class/backlight/目录下相应的brightness, max_brightness等属性(通过backlight_device_register()函数中memcpy()实现)

    4.背光驱动IC(U8 SC44ATETRT)与imx6接口控制有3个信号
    LCD_BL_EN:背光驱动IC使能
    LCD_BL_FFLAG:背光驱动IC电源失效检测信号, 正常是低电平
    LCD_BL_PWM:背光驱动IC pwm控制
    4.1LCD_BL_EN
    对应原理图中的NANDF_CS2 pad
    需要配置成gpio模式 对应gpio为GPIO6_IO15(MX6QDL_PAD_NANDF_CS2__GPIO6_IO15)
    4.2LCD_BL_FFLAG
    对应原理图中的NANDF_CLE pad
    需要配置成gpio模式 对应gpio为GPIO6_IO07(MX6QDL_PAD_NANDF_CLE__GPIO6_IO07)
    4.3LCD_BL_PWM
    对应原理图中的SD1_DAT2 pad
    需要配置成pwm模式 对应的是pwm2输出(MX6QDL_PAD_SD1_DAT2__PWM2_OUT),在arch/arm/boot/dts/imx6dl-hud.dtsi设备树要配置
    可以在该文件搜索pwm,所有配置如pwm所示

    5.SYS_12V_EN
    对应原理图U4电源管理ic的使能脚 对应SD1_DAT0 pad
    需要配置成gpio模式 对应gpio为GPIO1_IO16
    这个使能后才能给背光驱动IC供电

    6.imx6qdl上的背光驱动设备树分析
    imx6q设备树上的pwm背光驱动描述如下,各节点的具体含义可参考http://blog.csdn.net/mike8825/article/details/51656400
    pwm-backlight {
    compatible = "pwm-backlight";
    pwms = <&pwm2 0 50000>;
    brightness-levels = <0 4 8 16 32 64 128 255>;
    default-brightness-level = <7>;
    status = "okay";
    };


    &pwm2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_pwm2>;
    status = "okay";
    };


    pinctrl_pwm2: pwm2grp {
    fsl,pins = <
    MX6QDL_PAD_SD1_DAT2__PWM2_OUT 0x1b0b1
    >;
    };

    参考http://blog.csdn.net/wilsonboliu/article/details/14170135

  • 相关阅读:
    【Azure 应用服务】App Service中运行Python 编写的 Jobs,怎么来安装Python包 (pymssql)呢?
    【Azure 存储服务】使用POST方式向Azure Storage Queue中插入Message的办法
    【Azure Developer】使用Azure Resource Graph的查询语法的示例
    img标签到底是行内元素还是块级元素
    [前端面试]前端缓存问题看这篇,让面试官爱上你
    Vue3.0 响应式数据原理:ES6 Proxy
    几行代码教你解决微信生成海报及二维码
    冷门的HTML
    HTML选择器
    程序猿必备 代码保平安
  • 原文地址:https://www.cnblogs.com/fah936861121/p/7085977.html
Copyright © 2020-2023  润新知