分析lk的leds_init()函数

来源:互联网 发布:js如何获取对象的长度 编辑:程序博客网 时间:2024/05/29 18:39

1.函数调用关系:

void platform_init(void)leds_init();cust_led_init();struct cust_gpio_para *para = &lpara;para->bl_mode = 0;mt65xx_backlight_off();mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF);mt65xx_led_set_cust(&cust_led_list[type], level);((cust_brightness_set)(cust->data))(level);//typedef int (*cust_brightness_set)(int level);
2.相关的结构体:

struct cust_mt65xx_led {char                 *name;enum mt65xx_led_mode  mode;int                   data;    struct PWM_config config_data;};struct PWM_config{int clock_source;int div;int low_duration;int High_duration;BOOL pmic_pad;};struct cust_gpio_para {int bl_mode;unsigned short bl_timing_start;unsigned short bl_timing_low;unsigned short bl_timing_high;unsigned short bl_timing_shutdown;unsigned short max_adjust;unsigned short min_adjust;unsigned short max_level;unsigned short min_level;};static struct cust_gpio_para lpara;enum mt65xx_led_type{MT65XX_LED_TYPE_RED = 0,MT65XX_LED_TYPE_GREEN,MT65XX_LED_TYPE_BLUE,MT65XX_LED_TYPE_JOGBALL,MT65XX_LED_TYPE_KEYBOARD,MT65XX_LED_TYPE_BUTTON,MT65XX_LED_TYPE_LCD,MT65XX_LED_TYPE_TOTAL,};typedef enum {    DISP_PWM0 = 0x1,    DISP_PWM1 = 0x2,    DISP_PWM_ALL = (DISP_PWM0 | DISP_PWM1)} disp_pwm_id_t;static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {{"red",               MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"green",             MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"blue",              MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"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,{0}},};

3.贴代码

int disp_bls_set_backlight(int level_256){int level_1024 = 0;if (level_256 <= 0)level_1024 = 0;else if (level_256 >= 255)level_1024 = 1023;else {level_1024 = (level_256 << 2) + 2;}return disp_pwm_set_backlight(disp_pwm_get_main(), level_1024);}static disp_pwm_id_t g_pwm_main_id = DISP_PWM0;disp_pwm_id_t disp_pwm_get_main(void){return g_pwm_main_id;}int disp_pwm_set_backlight(disp_pwm_id_t id, int level_1024){disp_pwm_init(id);reg_base = pwm_get_reg_base(id);PWM_REG_SET(reg_base + DISP_PWM_COMMIT_OFF, 0);PWM_REG_SET(reg_base + DISP_PWM_CON_1_OFF, (level_1024 << 16) | 0x3ff);}/* 该函数的主要功能是:使能PWM0的时钟,根据数组中PWM_config配置数据来设置时钟源和PWM div*/void disp_pwm_init(disp_pwm_id_t id){ddp_enable_module_clock(DISP_MODULE_PWM0);cust = &cust_led_list[MT65XX_LED_TYPE_LCD];config_data = &cust->config_data;unsigned int reg_val = DISP_REG_GET(CLK_CFG_7);PWM_REG_SET(CLK_CFG_7, (reg_val & ~0x3) | config_data->clock_source);pwm_div =(config_data->div == 0) ? PWM_DEFAULT_DIV_VALUE : config_data->div;pwm_div &= 0x3FF;PWM_REG_SET(reg_base + DISP_PWM_CON_0_OFF, pwm_div << 16);PWM_REG_SET(reg_base + DISP_PWM_CON_1_OFF, 1023);/* 1024 levels */}







原创粉丝点击