精华内容
下载资源
问答
  • 2022-05-03 19:50:27

    主板上使用GPIO1_PD6作为LCD背光亮度调节引脚。

    查看rk3568-pinctrl.dtsi文件中pwm9相关的信息,得知GPIO1_PD6为pwm9m1_pins;

    pwm9 {
            /omit-if-no-ref/
            pwm9m0_pins: pwm9m0-pins {
                rockchip,pins =
                    /* pwm9_m0 */
                    <3 RK_PB2 5 &pcfg_pull_none>;
            };

            /omit-if-no-ref/
            pwm9m1_pins: pwm9m1-pins {
                rockchip,pins =
                    /* pwm9_m1 */
                    <1 RK_PD6 4 &pcfg_pull_none>;
            };
        };

    RK3568.dtsi文件中,pwm9默认使用的是pwm9m0_pins管脚;

        pwm9: pwm@fe6f0010 {
            compatible = "rockchip,rk3568-pwm", "rockchip,rk3328-pwm";
            reg = <0x0 0xfe6f0010 0x0 0x10>;
            #pwm-cells = <3>;
            pinctrl-names = "active";
            pinctrl-0 = <&pwm9m0_pins>;
            clocks = <&cru CLK_PWM2>, <&cru PCLK_PWM2>;
            clock-names = "pwm", "pclk";
            status = "disabled";
        };

    改为:

        pwm9: pwm@fe6f0010 {
            compatible = "rockchip,rk3568-pwm", "rockchip,rk3328-pwm";
            reg = <0x0 0xfe6f0010 0x0 0x10>;
            #pwm-cells = <3>;
            pinctrl-names = "active";
            pinctrl-0 = <&pwm9m1_pins>;
            clocks = <&cru CLK_PWM2>, <&cru PCLK_PWM2>;
            clock-names = "pwm", "pclk";
            status = "disabled";
        };

    backlight节点改为:

        backlight: backlight {
            compatible = "pwm-backlight";
            pwms = <&pwm9 0 25000 1>;

            ......

    };

    重新编译内核生成boot.img,然后烧写到主板中。

    亮度调节:

    cd到/sys/devices/platform/backlight/backlight/backlight目录下,设置brightness的值即可调节亮度,0为亮度最低,255为亮度最高;

    [root@RK356X:/sys/devices/platform/backlight/backlight/backlight]# ls
    actual_brightness  brightness  max_brightness  subsystem  uevent
    bl_power           device      power           type
    [root@RK356X:/sys/devices/platform/backlight/backlight/backlight]# echo 200 > br
    ightness
    [root@RK356X:/sys/devices/platform/backlight/backlight/backlight]# echo 0 > brig
    htness
    [root@RK356X:/sys/devices/platform/backlight/backlight/backlight]# echo 150 > br
    ightness

    可以看到屏幕的亮度会有变化。

    更多相关内容
  • mtk8788 pwm频率背光亮度调节

    千次阅读 2019-11-14 18:15:58
    =======pwm频率修改 当前ALPS branch上,disp_pwmdriver采用的是turnkey code,不同芯片型号,或不同branch,disp_pwm频率设定可能会有差异,因此客户有时会遇到如下问题: (1)如何修改lk和kernel下disp_pwm频率...

    =======pwm频率修改

    当前ALPS branch上,disp_pwm driver采用的是turnkey code,不同芯片型号,或不同branch,disp_pwm频率设定可能会有差异,因此客户有时会遇到如下问题:

    (1)如何修改lk和kernel下disp_pwm频率?

    (2)如何修改disp_pwm clock source?

    (3)为什么修改dts无效?

    首先 介绍下pwm

    [SOLUTION]

     对于以上几种问题,归根结底就是:disp_pwm频率如何设定的问题。下面就概括一下,当前遇到的设定disp_pwm频率(fre)的方法。

    1、Disp_PWM频率计算方法

    fre=source clock/(divider+1)/(period+1)

    source clock:时钟源,26MHz/104MHz/125MHz/62.5MHz/15.625/……,与IC design有关。若没有特别说明,一般是26MHz

    divider:对source clock除频

    period:disp_pwm周期,默认是1023

    因此,想达到特定的fre,只需要适当的修改source、divider参数即可(period一般不建议修改)

     

     

    2、disp_pwm频率代码位置

    lk: ddp_pwm.c/disp_pwm_init()

    kernel: ddp_pwm.c/disp_pwm_config_init()

     

    3、dts配置方式方式

    若lk & kernel都从dts读取disp_pwm参数,则只需针对性修改dts即可

    led6:led@6 {

    compatible = "mediatek,lcd-backlight";

    led_mode = <5>;

    data = <1>;

    pwm_config = <0 0 0 0 0>;

    };

    pwm_config参数:clock source、divider、low_duration、high_duration、pmic_pad。与dts配置中pwm_config = <0 0 0 0 0>参数一一对应。只需关注前面2个参数即可

    如上设定:clock source=26MHz,divider=0

    fre=26MHz/1/1024=25.29KHz

     

    3、不使用dts

    divider: PWM_DEFAULT_DIV_VALUE   ///设定成你需要的值

    CLK_CFG_1 bit[2:0]:0/1/2/……      ///选择不同的source

     

    所以遇到频率无法修改成功的问题,先看是使用dts配置,还是disp_pwm driver init时hardcode写死,再相对应的修改设定。

    5、kernel下source clock切换问题

    【MT8788】ALPS04829940

    说明:MT8788(MT8183,Sylvia)芯片上,disp_pwm source有如下5种:

    0x100000B0

    CLK_CFG_7

    bit[2:0]

    0

    clk26m

    26MHz

    1

    univpll_d3_d4

    104MHz

    2

    osc_d2

    125MHz

    3

    osc_d4

    62.5MHz

    4

    osc_d16

    15.625MHz

     

    kernel下使用dts设定,ddp_pwm.c/disp_pwm_config_init(),会调用disp_pwm_set_pwmmux()函数对如上的5种clock source进行重新mapping,使用mapping后的clock ID进行配置。8788上我司目前使用的CLK_CFG_7

    例如,想设定source=26MHz,则dts中应该这样填写:pwm_config = <4 0 0 0 0>;

    寄存器定义

    mapping后的clock ID

    clock source

    预期clk(mhz)

    bit[2:0]=0

    4

    clk26m

    26

    bit[2:0]=1

    3

    univpll_d3_d4

    104

    bit[2:0]=2

    2

    osc_d2

    125

    bit[2:0]=3

    1

    osc_d4

    62.5

    bit[2:0]=4

    0

    osc_d16

    15.625

     

     

     

    =======pwm背光亮度调节

    mtk方案并没有使用原生.level = EARLY_SUSPEND_LEVEL_DISABLE_FB去设置亮度,而是通过直接写属性节点brightness的方式,hal层通过读写此节点从而控制亮度

    想要知道原生亮度控制方式可以参考此此链接:https://www.cnblogs.com/reality-soul/p/4757728.html

    1 hal层控制

    节点路径:sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness

    上层调用流程课参考http://www.52rd.com/Blog/Detail_RD.Blog_apu981_69251.html,此博客已做了解释

    2 kernel如何响应亮度

    首先看看驱动层brightness设备节点如何创建的

    kernel-4.4/drivers/leds/led-class.c模块中会执行static DEVICE_ATTR_RW(brightness);这里要说下这个DEVICE_ATTR_RW宏

    #define DEVICE_ATTR_RW(_name) \
        struct device_attribute dev_attr_##_name = __ATTR_RW(_name)

        struct device_attribute dev_attr_(wakealarm) = __ATTR_RW(wakealarm);

        
    #define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),    _name##_show, _name##_store)    
                 
    struct device_attribute dev_attr_(wakealarm) =  __ATTR(wakealarm, (S_IWUSR | S_IRUGO),wakealarm_show, wakealarm_store)         


    #define __ATTR(_name, _mode, _show, _store) {                
        .attr = {.name = __stringify(_name),                
             .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },        
        .show    = _show,                        
        .store    = _store,                        
    }

    struct device_attribute dev_attr_(wakealarm) = {                
        .attr = {.name = __stringify(wakealarm),                
             .mode = VERIFY_OCTAL_PERMISSIONS((S_IWUSR | S_IRUGO)) },        
        .show    = wakealarm_show,                        
        .store    = wakealarm_store,                
    }    

     

    最终这个宏 static DEVICE_ATTR_RW(wakealarm);  生成了

    struct device_attribute dev_attr_(wakealarm) = {                
        .attr = {.name = __stringify(wakealarm),                
             .mode = VERIFY_OCTAL_PERMISSIONS((S_IWUSR | S_IRUGO)) },        
        .show    = wakealarm_show,                        
        .store    = wakealarm_store,                
    }

    由此可以知道DEVICE_ATTR_RW(brightness)也会去指定一个store函数即brightness_store,在写brightness时会调用brightness_store,一搜果然存在

    static ssize_t brightness_store(struct device *dev,
                    struct device_attribute *attr, const char *buf, size_t size)
    {       
            struct led_classdev *led_cdev = dev_get_drvdata(dev);
            unsigned long state;
            ssize_t ret;
            
            mutex_lock(&led_cdev->led_access);
            
            if (led_sysfs_is_disabled(led_cdev)) {
                    ret = -EBUSY;
                    goto unlock;
            }
            
            ret = kstrtoul(buf, 10, &state);/*上层写数据时会保存到buf里*/
            if (ret)
                    goto unlock;
            
            if (state == LED_OFF)
                    led_trigger_remove(led_cdev);
            led_set_brightness(led_cdev, state);/*当上层写节点时会调用led_set_brightness,我们的brightness也会传下去*/
            
            ret = size;
    unlock: 
            mutex_unlock(&led_cdev->led_access);
            return ret;
    }

     

     接下来led_set_brightness(leds/led-core.c) 会调用led_set_brightness_async(led_cdev, brightness)这里面还涉及到soft-blink可以不管,我们主要分析亮如何传进去的,以及驱动如何把0-255的亮度转化成pwm的占空比。接下来看下led_set_brightness_async干了啥

    //led_set_brightness_async定义在leds.h里
    static inline void led_set_brightness_async(struct led_classdev *led_cdev,
                                            enum led_brightness value)
    {
            value = min(value, led_cdev->max_brightness);
            led_cdev->brightness = value;
    
            if (!(led_cdev->flags & LED_SUSPENDED))
                    led_cdev->brightness_set(led_cdev, value);//接着brightness_set,这个        
                                                              //brightness_set在哪儿定义
    }

     

     

     

    想要知道brightness_set如何来的就要看kernel-4.4/driver/misc/mediatek/leds/mtk_leds_drv.c中的probe函数

    static int mt65xx_leds_probe(struct platform_device *pdev){
        int i;
            int ret;/* rc; */
            struct cust_mt65xx_led *cust_led_list = mt_get_cust_led_list();
    
            if (cust_led_list == NULL) {
                    LEDS_DRV_INFO("%s: get dts fail.\n", __func__);
                    return -1;
            }
         ................//省略中间代码
        
         
        g_leds_data[i]->cust.mode = cust_led_list[i].mode;
                    g_leds_data[i]->cust.data = cust_led_list[i].data;
                    g_leds_data[i]->cust.name = cust_led_list[i].name;
    
                    g_leds_data[i]->cdev.name = cust_led_list[i].name;
                    g_leds_data[i]->cust.config_data = cust_led_list[i].config_data;        
    
                    g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;//brightness_set实际上        
                                                                         //是调用的    
                                             //mt65xx_led_set,不清楚的需要去了解下Linux设备与驱动
                    g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;
    
                    INIT_WORK(&g_leds_data[i]->work, mt_mt65xx_led_work);
    
                    ret = led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);
    
    }

    mt65xx_led_set接下来会调用mt_mt65xx_led_set 进而调用mt_mt65xx_led_set_cust(misc/mediatek/leds/mt6771/mtk_leds.c)

    //这个函数里重点讲下上层0-255级数如何跟驱动pwm级数(0-1024)发生联系的
    void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level)
    {
    	struct mt65xx_led_data *led_data =
    	    container_of(led_cdev, struct mt65xx_led_data, cdev);
    	/* unsigned long flags; */
    	/* spin_lock_irqsave(&leds_lock, flags); */
    
    	if (disp_aal_is_support() == true) {
    		if (led_data->level != level) {
    			led_data->level = level;
    			if (strcmp(led_data->cust.name, "lcd-backlight") != 0) {
    				LEDS_DEBUG("Set NLED directly %d at time %lu\n",
    					   led_data->level, jiffies);
    				schedule_work(&led_data->work);
    			} else {
    				if (level != 0
    				    && level * CONFIG_LIGHTNESS_MAPPING_VALUE < 255) {
    					level = 1;
    				} else {
    					level =
    					    (level * CONFIG_LIGHTNESS_MAPPING_VALUE) /
    					    255;
    				}
    				backlight_debug_log(led_data->level, level);
    				disp_pq_notify_backlight_changed((((1 <<
    								     MT_LED_INTERNAL_LEVEL_BIT_CNT)
    								    - 1) * level +
    								   127) / 255);
                                    //mt_mt65xx_led_set_cust第二个参数就是即将传给驱动的真正值,1《MT_LED_INTERNAL_LEVEL_BIT_CNT是固定的1023,这个计算公式将上层brightness跟pwm(0-1023)对应起来了,至于为什么时驱动中pwm级数为0-1023驱动有涉及,查找一下就知道了 
    
    				disp_aal_notify_backlight_changed((((1 <<
    								     MT_LED_INTERNAL_LEVEL_BIT_CNT)
    								    - 1) * level +
    								   127) / 255);
    			}
    		}
    	} else {
    
    		.............
    	
    	}
    		/* spin_unlock_irqrestore(&leds_lock, flags); */
    	}
    /* if(0!=aee_kernel_Powerkey_is_press()) */
    /* aee_kernel_wdt_kick_Powkey_api("mt_mt65xx_led_set",WDT_SETBY_Backlight); */
    }
    
    int mt_mt65xx_led_set_cust(struct cust_mt65xx_led *cust, int level)
    {
        #ifdef CONFIG_MTK_PWM
            struct nled_setting led_tmp_setting = { 0, 0, 0 };
            int tmp_level = level;
            unsigned int BacklightLevelSupport =
                Cust_GetBacklightLevelSupport_byPWM();
        #endif
            static bool button_flag;
    
            switch (cust->mode) {//这些mode实在dts中定义的,8788背光使用的是     
                                 //MT65XX_LED_MODE_CUST_BLS_PWM
                case MT65XX_LED_MODE_GPIO:
                    LEDS_DEBUG("brightness_set_cust:go GPIO mode!!!!!\n");
                    return ((cust_set_brightness) (cust->data)) (level);
    
                case MT65XX_LED_MODE_PMIC:
    
            ...................// 省略中间代码
        
            case MT65XX_LED_MODE_CUST_BLS_PWM:
                    if (strcmp(cust->name, "lcd-backlight") == 0)
                            bl_brightness_hal = level;
            #ifdef MET_USER_EVENT_SUPPORT
                    if (enable_met_backlight_tag())
                            output_met_backlight_tag(level);
            #endif
                    return ((cust_set_brightness) (cust->data)) (level);//此函数才是这一些列调用 
                                                                      //中最关键的
        
            ......................
    }

    ((cust_set_brightness) (cust->data)) (level)这个就是一个函数 指针,使用typedef 定义了,那这个函数到底指向那里了?它指向vendor/.../cust_leds.c定义的cust_mt65xx_led结构体中,如下:

    static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
            {"red",               MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK3,{255}},
            {"green",             MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK1,{25}},
            {"blue",              MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK2,{25}},
            {"jogball-backlight", MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},
            {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},
            {"button-backlight",  MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},
            {"lcd-backlight",         MT65XX_LED_MODE_CUST_BLS_PWM, (int)disp_bls_set_backlight,{1,0,0,0,0}},
    };//MT65XX_LED_MODE_CUST_BLS_PWM模式下设置会调用disp_bls_set_backlight函数
    
    
     然后继续调用disp_pwm_set_backlight->disp_pwm_set_backlight_cmdq(/misc/mediatek/video/common/pwm10/ddp_pwm.c)
    int disp_pwm_set_backlight_cmdq(enum disp_pwm_id_t id, int level_1024, void *cmdq)
    {
    #ifndef CONFIG_FPGA_EARLY_PORTING
            /* PWM is excluded from FPGA bitfile */
            unsigned long reg_base;
            int old_pwm;
            int index;
            int abs_diff;
            int max_level_1024;
    
            if ((DISP_PWM_ALL & id) == 0) {
                    PWM_ERR("[ERROR] disp_pwm_set_backlight_cmdq: invalid PWM ID = 0x%x", id);
                    return -EFAULT;
            }
    
            index = index_of_pwm(id);//id为0选用pwm0输出   1 pwm1输出
    
            /* we have to change backlight after config init or max backlight changed */
            old_pwm = atomic_xchg(&g_pwm_backlight[index], level_1024);
            if (old_pwm != level_1024 || atomic_cmpxchg(&g_pwm_is_change_state[index], 1, 0) == 1) {
                    abs_diff = level_1024 - old_pwm;
                    if (abs_diff < 0)
                            abs_diff = -abs_diff;
    
                    if (old_pwm == 0 || level_1024 == 0 || abs_diff > 64) {
                            /* To be printed in UART log */
                            disp_pwm_log(level_1024, MSG_LOG);
                            if (old_pwm != level_1024) {
                                    /* Print information if backlight is changed */
                                    PWM_NOTICE("disp_pwm_set_backlight_cmdq(id = 0x%x, level_1024 = %d), old = %d",
                                            id, level_1024, old_pwm);
                            }
                    } else {
                            disp_pwm_log(level_1024, MSG_LOG);
                    }
    
                    max_level_1024 = disp_pwm_get_max_backlight(id);
    
                    if (level_1024 > max_level_1024)
                            level_1024 = max_level_1024;
                    else if (level_1024 < 0)
                            level_1024 = 0;
    
                    level_1024 = disp_pwm_level_remap(id, level_1024);
                    PWM_NOTICE("disp_pwm_set_backlight_cmdq max_level_1024 : %d\n",max_level_1024);
                    reg_base = pwm_get_reg_base(id);//读取pwm0的基地址  8788上是1 1 00E000
                    PWM_NOTICE("disp_pwm_set_backlight_cmdq(reg_base = 0x%x, DISP_PWM_CON_1_OFF = 0x%x), reg = 0x%x",
                                            reg_base, DISP_PWM_CON_1_OFF, reg_base + DISP_PWM_CON_1_OFF);
                    if (level_1024 > 0) {
                            printk("[lcm][kernel] (unsigned int)(INREG32(reg32)&~(mask))|(val)-->%d\n",
                                            (unsigned int)(INREG32(reg_base + DISP_PWM_CON_1_OFF)&~(0x1fff << 16))|(level_1024 << 16));
                            DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_1_OFF, level_1024 << 16, 0x1fff << 16);
    
                            disp_pwm_set_enabled(cmdq, id, 1);
                    } else {
                            /* Avoid to set 0 */
                            DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_1_OFF, 1 << 16, 0x1fff << 16);
                            //reg_base + DISP_PWM_CON_1_OFF值为1100E01C DISP_PWM_CON_1寄存器
    
                            disp_pwm_set_enabled(cmdq, id, 0);      /* To save power */
                    }
    
                    DISP_REG_MASK(cmdq, reg_base + DISP_PWM_COMMIT_OFF, 1, ~0);
                    DISP_REG_MASK(cmdq, reg_base + DISP_PWM_COMMIT_OFF, 0, ~0);
            }
    
            if (g_pwm_led_mode == MT65XX_LED_MODE_CUST_BLS_PWM &&
                    atomic_read(&g_pwm_is_power_on[index]) == 0 && level_1024 > 0) {
                    /* print backlight once after device resumed */
                    disp_pwm_backlight_status(id, true);
            }
    #endif
            return 0;
    }
    
    
    //介绍下如何获取pwm寄存器基地址
    #define pwm_get_reg_base(id) ((id == DISP_PWM0) ? DISPSYS_PWM0_BASE : DISPSYS_PWM1_BASE)
    传下去的id为0,所以返回DISPSYS_PWM0_BASE,看下这个DISPSYS_PWM0_BASE
    
    #define DISPSYS_PWM0_BASE		    ddp_get_module_va(DISP_MODULE_PWM0)
    这个ddp_get_module_va实际上就是从ddp_module结构体中根据module_id获取地址, 贴出来部分ddp_module代码:
    static ddp_module  ddp_modules[DISP_MODULE_NUM] = {
            
            ....................
            
    	{DISP_MODULE_PWM0,
    	 DISP_T_PWM,
    	 "pwm0",
    	 0,
    	 &ddp_driver_pwm,
    	 {"mediatek,disp_pwm0",
    	  0x1100e000,
    	  158,
    	  0,
    	  0,
    	  0}
    	},
    
    	{DISP_MODULE_PWM1,
    	 DISP_T_PWM,
    	 "pwm1",
    	 0,
    	 NULL,
    	 {reg_magic,}
    	},
    
    	{DISP_MODULE_CONFIG,
    	 DISP_T_UNKNOWN,
    	 "config",
    	 0,
    	 NULL,
    	 {"mediatek,mmsys_config",
    	  0x14000000,
    	  0,
    	  0,
    	  0,
    	  0}
    	},
        
        .........................
    }
    
    
    

    pwm寄存器如下

     

     

    DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_1_OFF, level_1024 << 16, 0x1fff << 16);如上所说reg_base + DISP_PWM_CON_1_OFF是pwm1,看看这个寄存器说明

     到这里就完全清晰了,DISP_REG_MASK将计算后的pwm级数写进寄存器   转换成占空比(PWM_HIGH_WIDTH/PWM_PERIOD)

    展开全文
  • LCD背光调节实验

    千次阅读 2021-11-19 21:42:28
    目录LCD 背光调节简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载 不管是使用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以...

    不管是使用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕,在光线比较暗的地方可以调低背光,防止伤眼睛并且省电。正点原子的三款RGB LCD 也支持背光调节,本章我们就来学习如何调节LCD 背光。

    LCD 背光调节简介

    正点原子的三个RGB LCD 都有一个背光控制引脚,给这个背光控制引脚输入高电平就会点亮背光,输入低电平就会关闭背光。假如我们不断的打开和关闭背光,当速度足够快的时候就不会感觉到背光关闭这个过程了。这个正好可以使用PWM 来完成,PWM 全称是Pulse Width Modulation,也就是脉冲宽度调制,PWM 信号如图29.1.1 所示:
    在这里插入图片描述
    PWM 信号有两个关键的术语:频率和占空比,频率就是开关速度,把一次开关算作一个周期,那么频率就是1 秒内进行了多少次开关。占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比就是0%,如果一个周期内全是高电平那么占空比就是
    100%。

    我们给LCD 的背光引脚输入一个PWM 信号,这样就可以通过调整占空比的方式来调整LCD 背光亮度了。提高占空比就会提高背光亮度,降低占空比就会降低背光亮度。重点就在于PWM 信号的产生和占空比的控制,很幸运的是,I.MX6U 提供了PWM 外设,因此我们可以配置PWM 外设来产生PWM 信号。

    打开《I.MX6ULL 参考手册》的第40 章“Chapter 40 Pulse Width Modulation(PWM)”,I.MX6U一共有8 路PWM 信号,每个PWM 包含一个16 位的计数器和一个4 x 16 的数据FIFO,I.MX6U的PWM 外设结构如图29.1.2 所示:
    在这里插入图片描述
    图29.1.2 中的各部分功能如下:
    ①、此部分是一个选择器,用于选择PWM 信号的时钟源,一共有三种时钟源:ipg_clk、ipg_clk_highfreq 和ipg_clk_32k。
    ②、这是一个12 位的分频器,可以对①中选择的时钟源进行分频。
    ③、这是PWM 的16 位计数器寄存器,保存着PWM 的计数值。
    ④、这是PWM 的16 位周期寄存器,此寄存器用来控制PWM 的频率。
    ⑤、这是PWM 的16 位采样寄存器,此寄存器用来控制PWM 的占空比。
    ⑥、此部分是PWM 的中断信号,PWM 是提供中断功能的,如果使能了相应的中断的话就会产生中断。
    ⑦、此部分是PWM 对应的输出IO,产生的PWM 信号就会从对应的IO 中输出,I.MX6U-ALPHA 开发板的LCD 背光控制引脚连接在I.MX6U 的GPIO1_IO8 上,GPIO1_IO8 可以复用为PWM1_OUT。

    可以通过配置相应的寄存器来设置PWM 信号的频率和占空比,PWM 的16 位计数器是个向上计数器,此计数器会从0X0000 开始计数,直到计数值等于寄存器PWMx_PWMPR(x=1~8) + 1,然后计数器就会重新从0X0000 开始计数,如此往复。所以寄存器PWMx_PWMPR 可以设置PWM 的频率。

    在一个周期内,PWM 从0X0000 开始计数的时候,PWM 引脚先输出高电平(默认情况下,可以通过配置输出低电平)。采样FIFO 中保存的采样值会在每个时钟和计数器值进行比较,当采样值和计数器相等的话PWM 引脚就会改为输出低电平(默认情况下,同样可以通过配置输出高电平)。计数器会持续计数,直到和周期寄存器PWMx_PWMPR(x=1~8) + 1 的值相等,这样一个周期就完成了。所以,采样FIFO 控制着占空比,而采样FIFO 里面的值来源于采样寄存器PWMx_PWMSAR,因此相当于PWMx_PWMSAR 控制着占空比。至此,PWM 信号的频率和占空比设置我们就知道该如何去做了。

    PWM 开启以后会按照默认值运行,并产生PWM 波形,而这个默认的PWM 一般并不是我们需要的波形。如果这个PWM 波形控制着设备的话就会导致设备因为接收到错误的PWM 信号而运行错误,严重情况下可能会损坏设备,甚至人身安全。因此,在开启PWM 之前最好设置好PWMx_PWMPR 和PWMx_PWMSAR 这两个寄存器,也就是设置好PWM 的频率和占空比。

    当我们向PWMx_PWMSAR 寄存器写入采样值的时候,如果FIFO 没满的话其值会被存储到FIFO 中。如果FIFO 满的时候写入采样值就会导致寄存器PWMx_PWMSR 的位FWE(bit6)置1,表示FIFO 写错误,FIFO 里面的值也并不会改变。FIFO 可以在任何时候写入,但是只有在PWM 使能的情况下读取。寄存器PWMx_SR 的位FIFOAV(bit2:0)记录着当前FIFO 中有多少个
    数据。从采样寄存器PWMx_PWMSAR 读取一次数据,FIFO 里面的数据就会减一,每产生一个周期的PWM 信号,FIFO 里面的数据就会减一,相当于被用掉了。PWM 有个FIFO 空中断,当FIFO 为空的时候就会触发此中断,可以在此中断处理函数中向FIFO 写入数据。

    关于I.MX6U 的PWM 的原理知识就讲解到这里,接下来看一下PWM 的几个重要的寄存器,本章我们使用的是PWM1,首先看一下寄存器PWM1_PWMCR 寄存器,此寄存器结构如图29.1.2 所示:

    在这里插入图片描述
    寄存器PWM1_PWMCR 用到的重要位如下:

    FWM(bit27:26):FIFO 水位线,用来设置FIFO 空余位置为多少的时候表示FIFO 为空。设置为0 的时候表示FIFO 空余位置大于等于1 的时候FIFO 为空;设置为1 的时候表示FIFO 空余位置大于等于2 的时候FIFO 为空;设置为2 的时候表示FIFO 空余位置大于等于3 的时候FIFO 为空;设置为3 的时候表示FIFO 空余位置大于等于4 的时候FIFO 为空。

    STOPEN(bit25):此位用来设置停止模式下PWM 是否工作,为0 的话表示在停止模式下PWM 继续工作,为1 的话表示停止模式下关闭PWM。

    DOZEN(bit24):此位用来设置休眠模式下PWM 是否工作,为0 的话表示在休眠模式下PWM 继续工作,为1 的话表示休眠模式下关闭PWM。

    WAITEN(bit23):此位用来设置等待模式下PWM 是否工作,为0 的话表示在等待模式下PWM 继续工作,为1 的话表示等待模式下关闭PWM。

    DEGEN(bit22):此位用来设置调试模式下PWM 是否工作,为0 的话表示在调试模式下PWM 继续工作,为1 的话表示调试模式下关闭PWM。

    BCTR(bit21):字节交换控制位,用来控制16 位的数据进入FIFO 的字节顺序。为0 的时候不进行字节交换,为1 的时候进行字节交换。

    HCRT(bit20):半字交换控制位,用来决定从32 位IP 总线接口传输来的哪个半字数据写入采样寄存器的低16 位中。

    POUTC(bit19:18):PWM 输出控制控制位,用来设置PWM 输出模式,为0 的时候表示PWM 先输出高电平,当计数器值和采样值相等的话就输出低电平。为1 的时候相反,当为2 或者3 的时候PWM 信号不输出。本章我们设置为0,也就是一开始输出高电平,当计数器值和采样值相等的话就改为低电平,这样采样值越大高电平时间就越长,占空比就越大。

    CLKSRC(bit17:16):PWM 时钟源选择,为0 的话关闭;为1 的话选择ipg_clk 为时钟源;为2 的话选择ipg_clk_highfreq 为时钟源;为3 的话选择ipg_clk_32k 为时钟源。本章我们设置为1,也就是选择ipg_clk 为PWM 的时钟源,因此PWM 时钟源频率为66MHz。

    PRESCALER(bit15:4):分频值,可设置为04095,对应着14096 分频。

    SWR(bit3):软件复位,向此位写1 就复位PWM,此位是自清零的,当复位完成以后此位会自动清零。

    REPEAT(bit2:1):重复采样设置,此位用来设置FIFO 中的每个数据能用几次。可设置0~ 3,分别表示FIFO 中的每个数据能用1~4 次。本章我们设置为0,即FIFO 中的每个数据只能用一次。

    EN(bit0):PWM 使能位,为1 的时候使能PWM,为0 的时候关闭PWM。
    接下来看一下寄存器PWM1_PWMIR 寄存器,这个是PWM 的中断控制寄存器,此寄存器结构如图29.1.3 所示:
    在这里插入图片描述
    寄存器PWM1_PWMIR 只有三个位,这三个位的含义如下:

    CIE(bit2):比较中断使能位,为1 的时候使能比较中断,为0 的时候关闭比较中断。

    RIE(bit1):翻转中断使能位,当计数器值等于采样值并回滚到0X0000 的时候就会产生此中断,为1 的时候使能翻转中断,为0 的时候关闭翻转中断。

    FIE(bit0):FIFO 空中断,为1 的时候使能,为0 的时候关闭。

    再来看一下状态寄存器PWM1_PWMSR,此寄存器结构如图29.1.4 所示:
    在这里插入图片描述
    寄存器PWM1_PWMSR 各个位的含义如下:

    FWE(bit6):FIFO 写错误事件,为1 的时候表示发生了FIFO 写错误。
    CMP(bit5):FIFO 比较事件发标志位,为1 的时候表示发生FIFO 比较事件。
    ROV(bit4):翻转事件标志位,为1 的话表示翻转事件发生。
    FE(bit3):FIFO 空标志位,为1 的时候表示FIFO 位空。
    FIFOAV(bit2:1):此位记录FIFO 中的有效数据个数,有效值为0~4,分别表示FIFO 中有0~ 4 个有效数据。

    接下来是寄存器PWM1_PWMPR 寄存器,这个是PWM 周期寄存器,可以通过此寄存器来设置PWM 的频率,此寄存器结构如图29.1.5 所示:
    在这里插入图片描述

    从图29.1.5 可以看出,寄存器PWM1_PWMPR 只有低16 位有效,当PWM 计数器的值等于PERIOD+1 的时候就会从0X0000 重新开始计数,开启另一个周期。PWM 的频率计算公式如下:

    PWMO(Hz) = PCLK(Hz) / (PERIOD + 2)

    其中PCLK 是最终进入PWM 的时钟频率,假如PCLK 的频率为1MHz,现在我们要产生一个频率为1KHz 的PWM 信号,那么就可以设置PERIOD = 1000000 / 1000 – 2 = 998。

    最后来看一下寄存器PWM1_PWMSAR,这是采样寄存器,用于设置占空比的,此寄存器结构如图29.1.6 所示:
    在这里插入图片描述

    此寄存器也是只有低16 位有效,为采样值。通过这个采样值即可调整占空比,当计数器的值小于SAMPLE 的时候输出高电平(或低电平)。当计数器值大于等于SAMPLE,小于寄存器PWM1_PWMPR 的PERIO 的时候输出低电平(或高电平)。同样在上面的例子中,假如我们要设置PWM 信号的占空比为50%,那么就可以将SAMPLE 设置为(PERIOD + 2) / 2 = 1000 / 2=500。

    关于PWM 有关的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6ULL参考手册》第2480 页的40.7 小节。本章我们使用I.MX6U 的PWM1,PWM1 的输出引脚为GPIO1_IO8,配置步骤如下:

    1、配置引脚GPIO1_IO8
    配置GPIO1_IO08 的复用功能,将其复用为PWM1_OUT 信号线。

    2、初始化PWM1
    初始化PWM1,配置所需的PWM 信号的频率和默认占空比。

    3、设置中断
    因为FIFO 中的采样值每个周期都会少一个,所以需要不断的向FIFO 中写入采样值,防止其为空。我们可以使能FIFO 空中断,这样当FIFO 为空的时候就会触发相应的中断,然后在中断处理函数中向FIFO 写入采样值。

    4、使能PWM1
    配置好PWM1 以后就可以开启了。

    硬件原理分析

    本试验用到的资源如下:
    ①、指示灯LED0。
    ②、RGB LCD 接口。
    ③、按键KEY0

    本实验用到的硬件原理图参考第二十四章,本章实验我们一开始设置RGB LCD 的背光亮度PWM 信号频率为1KHz,占空比为10%,这样屏幕亮度就很低。然后通过按键KEY0 逐步的提升PWM 信号的占空比,按照10%步进。当达到100%以后再次按下KEY0,PWM 信号占空比回到10%重新开始。LED0 不断的闪烁,提示系统正在运行。

    实验程序编写

    本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 20_pwm_lcdbacklight。

    本章实验在上一章例程的基础上完成,更改工程名字为“backlight”,然后在bsp 文件夹下创建名为“backlight”的文件夹,然后在bsp/backlight 中新建bsp_backlight.c 和bsp_backlight.h这两个文件。在bsp_backlight.h 中输入如下内容:

    1 #ifndef _BACKLIGHT_H
    2 #define _BACKLIGHT_H
    3 /***************************************************************
    4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
    5 文件名: bsp_backlight.c
    6 作者: 左忠凯
    7 版本: V1.0
    8 描述: LCD背光PWM驱动头文件。
    9 其他: 无
    10 论坛: www.openedv.com
    11 日志: 初版V1.0 2019/1/22 左忠凯创建
    12 ***************************************************************/
    13 #include "imx6ul.h"
    14
    15 /* 背光PWM结构体*/
    16 struct backlight_dev_struc
    17 {
    18 unsigned char pwm_duty; /* 占空比*/
    19 };
    20
    21 /* 函数声明*/
    22 void backlight_init(void);
    23 void pwm1_enable(void);
    24 void pwm1_setsample_value(unsigned int value);
    25 void pwm1_setperiod_value(unsigned int value);
    26 void pwm1_setduty(unsigned char duty);
    27 void pwm1_irqhandler(void);
    28
    29 #endif
    
    

    文件bsp_backlight.h 文件内容很简单,在第16 行定义了一个背光PWM 结构体,剩下的就是函数声明。在文件bsp_backlight.c 中输入如下内容:

    1 #include "bsp_backlight.h"
    2 #include "bsp_int.h"
    3 #include "stdio.h"
    4
    5 struct backlight_dev_struc backlight_dev; /* 背光设备*/
    6
    7 /*
    8 * @description : pwm1中断处理函数
    9 * @param : 无
    10 * @return : 无
    11 */
    12 void pwm1_irqhandler(void)
    13 {
    14 if(PWM1->PWMSR & (1 << 3)) /* FIFO为空中断*/
    15 {
    16 /* 将占空比信息写入到FIFO中,其实就是设置占空比*/
    17 pwm1_setduty(backlight_dev.pwm_duty);
    18 PWM1->PWMSR |= (1 << 3); /* 写1清除中断标志位*/
    19 }
    20 }
    21
    22 /*
    23 * @description : 初始化背光PWM
    24 * @param : 无
    25 * @return : 无
    26 */
    27 void backlight_init(void)
    
    

    文件bsp_blacklight.c 一共有6 个函数,首先是函数pwm1_irqhandler,这个是PWM1 的中断处理函数。需要在此函数中处理FIFO 空中断,当FIFO 空中断发生以后需要向采样寄存器PWM1_PWMSAR 写入采样数据,也就是占空比值,最后要清除相应的中断标志位。第2 个函数是backlight_init,这个是背光初始化函数,在此函数里面会初始化背光引脚GPIO1_IO08,将其复用为PWM1_OUT。然后此函数初始化PWM1,设置要产生的PWM 信号频率和默认占空比,接下来使能FIFO 空中断,注册相应的中断处理函数,最后使能PWM1。第3 个函数是pwm1_enable,用于使能PWM1。第4 个函数是pwm1_setsample_value,用于设置采样值,也就是寄存器PWM1_PWMSAR 的值。第5 个函数是pwm1_setperiod_value,用于设置PWM 信号的频率。第6 个函数是pwm1_setduty,用于设置PWM 的占空比,这个函数只有一个参数duty,也就是占空比值,单位为%,函数内部会根据百分值计算出寄存器PWM1_PWMSAR 应该设置的值。

    最后在main.c 文件中输入如下所示内容:

    /**************************************************************
    Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
    文件名: main.c
    作者: 左忠凯
    版本: V1.0
    描述: I.MX6U开发板裸机实验21 背光PWM实验
    其他: 我们使用手机的时候背光都是可以调节的,同样的I.MX6U-ALPHA
    开发板的LCD背光也是可以调节,LCD背光就相当于一个LED灯。
    LED灯的亮灭可以通过PWM来控制,本实验我们就来学习一下如何
    通过PWM来控制LCD的背光。
    论坛: www.openedv.com
    日志: 初版V1.0 2019/1/21 左忠凯创建
    **************************************************************/
    
    

    第34 行调用函数backlight_init 初始化屏幕背光PWM。第44 行设置背光PWM 默认占空比为10%。在main 函数中读取按键值,如果KEY0 按下的话就将PWM 信号的占空比增加10%,当占空比超过100%的时候就重回到10%,重新开始。总的来说,main.c 的内容还是很简单的。

    编译下载验证

    编写Makefile 和链接脚本

    修改Makefile 中的TARGET 为backlight,然后在在INCDIRS 和SRCDIRS 中加入“bsp/rtc”,修改后的Makefile 如下:

    1 CROSS_COMPILE ?= arm-linux-gnueabihf-
    2 TARGET ?= backlight
    3
    4 /* 省略掉其它代码...... */
    5
    6 INCDIRS := imx6ul \
    
    

    第2 行修改变量TARGET 为“backlight”,也就是目标名称为“backlight”。
    第26 行在变量INCDIRS 中添加背光PWM 驱动头文件(.h)路径。
    第48 行在变量SRCDIRS 中添加背光PWM 驱动驱动文件(.c)路径。
    链接脚本保持不变。

    编译下载

    使用Make 命令编译代码,编译成功以后使用软件imxdownload 将编译完成的backlight.bin文件下载到SD 卡中,命令如下:

    chmod 777 imxdownload //给予imxdownload 可执行权限,一次即可
    ./imxdownload backlight.bin /dev/sdd //烧写到SD 卡中,不能烧写到/dev/sda 或sda1 里面!
    

    烧写成功以后将SD 卡插到开发板的SD 卡槽中,然后复位开发板,默认背光PWM 是10%,PWM 信号波形如图29.4.2.1 所示:
    在这里插入图片描述
    从图29.4.2.1 可以看出,此时背光PWM 信号的频率为1.00KHz,占空比是10.02%,和我们代码中配置的一致,此时LCD 的屏幕显示如图29.4.2.2 所示:
    在这里插入图片描述
    图29.4.2.2 就是PWM 占空比为10%的LCD 屏幕显示,可以看出屏幕亮度很低,甚至可以看到屏幕上拍照人的倒影。因为拍照的原因,实际亮度跟实际情况可能会有少许差别。

    我们将PWM 的占空比调节到90%,此时的LCD 屏幕亮度肯定会很亮,如图29.4.2.3 所示:
    在这里插入图片描述
    图29.4.2.3 的屏幕亮度相比图29.4.2.2 就要高很多,这个就是LCD 背光调节的原理,采用PWM 波形来完成,通过调整占空比即可完成亮度调节。

    至此,I.MX6U-ALPHA 开发板的所有裸机例程已经全部完成了,通过这几十个裸机例程,我们对I.MX6UL/ULL 这款芯片的外设有了一个基本的了解,为我们以后学习Uboot 和Linux 驱动打下了坚实的基础。

    展开全文
  • [LED]LCD背光设置为PWM模式的时候,config_data里面的参数如何使用 [DESCRIPTION] LCD背光设置为PWM模式的时候,config_data里面的参数如何使用 [SOLUTION] 配置cust_leds.c参数: static struct cust_mt...

    [LED]LCD背光设置为PWM模式的时候,config_data里面的参数如何使用

    [DESCRIPTION]

    LCD背光设置为PWM模式的时候,config_data里面的参数如何使用

    [SOLUTION]

    配置cust_leds.c参数:
    static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
    {"red", MT65XX_LED_MODE_NONE, -1,{0}},
    {"green", MT65XX_LED_MODE_NONE, -1,{0}},
    {"blue", MT65XX_LED_MODE_NONE, -1,{0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1,{0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1,{0}},
    {"button-backlight", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_BUTTON,{0}},
    {"lcd-backlight", MT65XX_LED_MODE_PWM, PWM1,{0,0,0,0,0}},
    };
    LCD 背光
    MT6589
    PWMPWM frequency = src_clk/(div+1)/64/HDuration;
    其中src_clk表示时钟源的频率,div表示分频的参数,HDuration表示每个bit的高电平持续的时钟周期。
    在\alps\mediatek\kernel\drivers\leds\leds.c文件里面的backlight_set_pwm函数通过config_data的参数来决定上面公式里面的参数。
    1. config_data->clock_source = 0表示选择32k的src_clk,config_data->clock_source> 0表示选择52M的src_clk;
    2. config_data->div表示分频的参数;
    3. config_data->High_duration和config_data->Low_duration分别表示每个bit持续的高电平的时钟周期和低电平持续的时钟周期。
    {0,0,0,0,0}src_clk=32kdiv=0HDuration=4; LDuration=4,pmic_pad=0
    32K/(0+1)/64/4=125Hz
    {"lcd-backlight", MT65XX_LED_MODE_PWM, PWM5,{1,1,32,32,1}},
    {1,1,32,32,1}src_clk=52Mdiv=1HDuration=32; LDuration=32,pmic_pad=1
    52M/(1+1)/64/32=12.695KHz
    因为底层设置的背光强度的level最大值是64,所以一个完整的PWM周期的波形如下,需要64bit来表示(T表示时钟周期),每个bit都需要High_duration这个时钟周期表示(Low_duration和High_duration在backlight_set_pwm被设置成是一样的,所以公式里面统一使用High_duration表示)。
    另外PWM的占空比是由kernel层设置的背光强度的level来决定的,level越大,输出波形的占空比越大。

    5.11tp-1.png (50.37 KB, 下载次数: 0 )

    下载附件  保存到相册

    2016-5-11 10:20 上传


    MT6572
    MT6572MT6589src_clkconfig_data->clock_source = 032ksrc_clk,config_data->clock_source> 066Msrc_clk;


    展开全文
  • (转)高通LCDpwm背光驱动

    千次阅读 2019-01-21 19:23:33
    lcd背光控制调用流程: LCD背光驱动 patch地址   正文 回到顶部 发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭;测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败...
  • LCD背光调节实验
  • 调试问题:开机亮屏会听到嗡嗡鸣响,初步猜测背光频率过高
  • 考虑到设备功耗的降低以及使用的便利性,本文在嵌入式Linux下,设计了一种使用S3C2440的定时器产生PWM (Pulse Width Modulation)信号,根据设备实际使用需要,和外界光线强度的变化用按键调节LCD背光亮度的解决...
  • MT6582 使用PWM配置背光频率计算     [SOLUTION]   以GPIO52 pin为例: Mode0 Mode1 Mode2 Mode3 GPIO52 LPD8 PWM_BL PWM_A  /mediatek...
  • 介绍了一种液晶显示器的LED背光驱动控制设计方案,对电路的整体控制、各项功能的实现、各性能参数的详细计算方法以及电路的具体设计等一一进行了阐述,并给出了相关的控制框图和时序图,配合灵活的FPGA的软件编程...
  • RK3399之背光PWM

    千次阅读 2020-06-22 11:23:13
    RK3399之背光PWM: https://notes.z-dd.net/2020/06/21/RK3399%E4%B9%8B%E8%83%8C%E5%85%89PWM/
  • 基于STM32控制的可调PWM输出+LCD显示,使用最小系统板C8T6通过按键对PWM输出调整同时在LCD上显示
  • MTK android配置LCD背光和LED,调试方法

    千次阅读 2015-06-24 22:10:10
    [DESCRIPTION] ...如何配置LCD背光和LED,调试方法 [SOLUTION] LCD背光和LED配置文件 alps/custom/lk/cust_leds.c alps/custom//kernel/leds/mt65xx/cust_leds.c drvgen.exe编辑修改
  • 该产品可用于驱动为包括PDA、手机和数码相机在内的各种手持设备的LCD提供背光的白光LED。 XC9116的输入电压范围为2.5V至6.0V,输出电压高达17.5V。因此,输入2.5V电压,该产品可串联驱动4个LED,输入3.2V电压,则可...
  • [MT6582_LCD]使用PWM配置背光如何配置,及频率计算2016年07月08日 10:10:22阅读数:1175MT6582 使用PWM配置背光频率计算 [SOLUTION] 以GPIO52 pin为例:Mode0Mode1Mode2Mode3GPIO52LPD8PWM_BLPWM_A /mediatek/...
  • LCD背光驱动IC

    万次阅读 2018-10-19 11:20:18
    对于40Pin标准RGBLCD,需要背光驱动电路,现有如下三种参考设计,这三种均是恒流驱动: 1.UM1661 (某宝价格1元左右) 输入:2~6V  输出电压:高达24V 内部开关频率:2MHZ 最大输出电流:1.6A EN脚可接入PWM...
  • 相形之下,挑选适合的运作频率,让触控控制器的频率不同于LCD噪声频率则是最佳选项之一。对此种方法而言,导入能应付大量尖峰噪声的触控控制器,并且避免触控屏幕感测电路过度饱和,有助达成降噪声的目标。 此外,...
  • 基于嵌入式Linux的LCD背光调节及驱动的实现
  • 在研发嵌入式产品时,往往会用到LCD(液晶屏)来显示图形界面,而液晶屏的显示亮度则需要背光系统去调节。调光方法:1.数字调光,又称波宽控制调光(Pulse Width Modulation,简称PWM): 通过PWM 波开启和关闭LED 来...
  • 1)实验平台:正点原子阿尔法Linux开发板 ...3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 ...第二十九章 LCD背光调节实验 不管是使用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以控制
  • 3 背光调节的软件设计背光调节的软件部分主要是驱动程序的设计,设备驱动程序是连接硬件和操作系统内核的桥梁,它为应用程序屏蔽了硬件的细节,应用程序将使用统一的系统调用接口来访问设备。Linux系统将设备分为3种...
  • 如何配置LCD背光和LED,调试方法

    千次阅读 2014-08-09 12:46:34
    LCD背光和LED配置文件 alps/custom/lk/cust_leds.c alps/custom//kernel/leds/mt65xx/cust_leds.c drvgen.exe编辑修改codegen.dws  配置cust_leds.c参数: static struct cust_mt65xx_led cust_led_list[MT65...
  • MT6571 使用PWM配置背光频率计算     [SOLUTION]   以GPIO52 pin为例: Mode0 Mode1 Mode2 Mode3 GPIO52 LPD8 PWM_BL PWM_A   一、将...
  • LCD背光控制芯片

    千次阅读 2012-09-29 15:30:00
    PWM信号可通过调整占空比来调节输出电压,可以使用PWM来控制LCD背光。 但CPU的pwm引脚驱动能力太弱,常外接一个背光芯片。rt9293就是这样的一个恒流升压转换器。 Iled=Vref/Rset Vfb=Duty * 300mV ...
  • MT6571 使用PWM配置背光频率计算

    千次阅读 2016-07-15 16:46:25
    MT6571 使用PWM配置背光频率计算 [DESCRIPTION] MT6571 使用PWM配置背光频率计算 [SOLUTION] 以GPIO52 pin为例: 5.11tp-2.png (14.14 KB, 下载次数: 0 ) 下载附件 保存到相册 2016-5-11 ...
  • [LED]如何配置LCD背光和LED,调试方法

    千次阅读 2016-07-18 16:16:05
    [LED]如何配置LCD背光和LED,调试方法 [DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION] LCD背光和LED配置文件 alps/custom/lk/cust_leds.c alps/custom//kernel/leds/mt65xx/cust_leds.c ...
  • 关于LCD,LED,OLED那些事and关于DC调光与PWM调光 LCD(liquid-crystal display)液晶显示器 LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状...
  • LCD背光设备 原理1

    千次阅读 2014-02-17 13:42:26
    本次背光驱动开发对应的是IMX233下LCD背光灯设备,主要由三个部分组成:PWM、RT9284B15PJ6芯片 和 LCD背光灯。 PWM(Pulse-Width Modulator,脉冲宽度调制) 是 利用微处理器的数字输出来对模拟电路进行控制的一种非常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 818
精华内容 327
关键字:

lcd背光 pwm频率