全志芯片驱动lcd使用pwm作为背光控制亮度调节异常的解决方法

您所在的位置:网站首页 aoc2217显示器没有背光是什么问题 全志芯片驱动lcd使用pwm作为背光控制亮度调节异常的解决方法

全志芯片驱动lcd使用pwm作为背光控制亮度调节异常的解决方法

2024-05-31 18:50| 来源: 网络整理| 查看: 265

将board.dts设置为lcd_pwm_pol = 时,休眠唤醒后读寄存器PWM_ACT_STA = 1,此时的极性还是正常的。但在第一次启动时,读取到的寄存器PWM_ACT_STA = 0,也就是说极性翻转了。

在board.dts设置lcd_pwm_pol = ,读寄存器PWM_ACT_STA = 0,此时的极性也是正常的

查log PWM的初始化正常,引脚配置也正确,打印dump节点查看pwm对应引脚复用功能,引脚pull功能也正常。

不过通过示波器外接pwm引脚,查看输出波形频率、占空比、极性时,输出频率正常,但是占空比设置相反,极性相反;

搞定了,是当前内核pwm框架与我们的pwm驱动对于极性的判断相反导致,并且kernel阶段的pwm极性与uboot阶段的不一致

添加函数将极性配置与uboot阶段保持一致的极性状态。具体方法是在pwm代码中添加接口:

static void sunxi_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm, struct pwm_state *state) { unsigned int reg_offset; u32 val, sel; sel = pwm->pwm - chip->base; reg_offset = PWM_PCR_BASE + sel * 0x20; val = sunxi_pwm_readl(chip, reg_offset); if (val & BIT_MASK(8)) { state->polarity = PWM_POLARITY_NORMAL; } else { state->polarity = PWM_POLARITY_INVERSED; } } static struct pwm_ops sunxi_pwm_ops = { ... .get_state = sunxi_pwm_get_state, ... };

这个函数的作用是在pwm驱动初始化阶段,读取uboot阶段设置的极性,并将kernel阶段的极性设置与其保持一致。具体内核操作可追流程。

除了修改驱动代码,还需要同对应修改每个板级目录下的board.dts。该修改主要是针对regulator使用pwm进行调压,会在dts中配置pwm调压的极性,为了保证与uboot阶段的电压一致,现在需要把dts中配置的极性的值置位1。

reg_vdd_cpu: vdd-cpu { compatible = "sunxi-pwm-regulator"; - pwms = ; // 第一个参数是使用的pwm通道,第二个参数是频率,第三个参数是极性 + pwms = ; // 第一个参数是使用的pwm通道,第二个参数是频率,第三个参数是极性 regulator-name = "vdd_cpu"; regulator-min-microvolt = ; regulator-max-microvolt = ; regulator-ramp-delay = ; regulator-always-on; regulator-boot-on; status = "okay"; };

在修改完成后,编译打包,确认版型后烧录测试,先看板子能不能起来,起不来的话证明电压极性有误,可以拿万用表测量一下电压,看启动阶段电压有没有发生突变。成功起来后还需要测试一下pwm功能是否正常,最好使用示波器来测一下board.dts里配置的pwm通道的管脚,然后调试该通道看有无波形变化,具体方法如下: 进入/sys/class/pwm目录,该目录是linux内核为pwm子系统提供的类目录,遍历该目录:

/sys/class/pwm # ls pwmchip0

可以看到,上述 pwmchip0 就是我们注册的pwm控制器,进入该目录,然后遍历该目录:

sys/class/pwm # cd pwmchip0/ /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls device export npwm subsystem uevent unexport

其中npwm文件储存了该pwm控制器的pwm个数,而export和unexport是导出和删除某个pwm设备的文件,下面演示导出pwm1。

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # cat npwm 2 /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # echo 1 > export /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls device export npwm pwm1 subsystem uevent unexport

可以看到目录中多出pwm1目录,进入该目录,遍历:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # cd pwm1/ /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # ls capture duty_cycle enable period polarity uevent

该目录中,enable是使能pwm,duty_cycle是占空比,period是周期,polarity是极性,可以配置相关的pwm并且使能:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 1000000000 > period /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 500000000 > duty_cycle /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo normal > polarity /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 1 > enable

如果相应的引脚外接了示波器,可以看到相关的波形。最后返回上层目录,删除该pwm设备:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # cd .. /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls device export npwm pwm1 subsystem uevent unexport /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # echo 1 > unexport /sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls device export npwm subsystem uevent unexport

在有条件的情况且能找到相应屏幕的情况下,最好接上屏幕进行验证,确认在uboot阶段进入kernel阶段出现闪屏的情况。 不带屏幕,且没有vdd-cpu的话,pwm初始化极性就不会影响到默认固件正常使用,使用示波器验证就好。

原贴链接:https://bbs.aw-ol.com/topic/3830/ 资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com 全志及开发者最新动态可以关注全志在线微信公众号



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3