由一个LED闪烁问题发现的MTK的LED driver中存在的问题

简介: 今天根据最新的需求要对LED灯的提示闪烁频率进行修改,将之前默认的2000ms改为10000ms,但是修改之后没有产生预料中的效果,而是变成了常量,百思不得其解,最后还是read the fucking code,从上层到底层,一路追下来,最终发现了...

今天根据最新的需求要对LED灯的提示闪烁频率进行修改,将之前默认的2000ms改为10000ms,但是修改之后没有产生预料中的效果,而是变成了常量,百思不得其解,最后还是read the fucking code,从上层到底层,一路追下来,最终发现了问题所在,下面直接上MTK的LED driver代码:


#define PMIC_PERIOD_NUM 9
// 100 * period, ex: 0.01 Hz -> 0.01 * 100 = 1
int pmic_period_array[] = {250,500,1000,1250,1666,2000,2500,10000};
//int pmic_freqsel_array[] = {99999, 9999, 4999, 1999, 999, 499, 199, 4, 0};
int pmic_freqsel_array[] = {0, 4, 199, 499, 999, 1999, 1999, 1999};

static int find_time_index_pmic(int time_ms) {
	int i;
	for(i=0;i<PMIC_PERIOD_NUM;i++) {
		if(time_ms<=pmic_period_array[i]) {
			return i;
		} else {
			continue;
		}
	}
	return PMIC_PERIOD_NUM-1;
}

int mt_led_blink_pmic(enum mt65xx_led_pmic pmic_type, struct nled_setting* led) {
	int time_index = 0;
	int duty = 0;
	LEDS_DEBUG("[LED]led_blink_pmic: pmic_type=%d\n", pmic_type);

	if((pmic_type != MT65XX_LED_PMIC_NLED_ISINK0 && pmic_type!= MT65XX_LED_PMIC_NLED_ISINK1 &&
		pmic_type!= MT65XX_LED_PMIC_NLED_ISINK2 && pmic_type!= MT65XX_LED_PMIC_NLED_ISINK3) || led->nled_mode != NLED_BLINK) {
		return -1;
	}

	LEDS_DEBUG("[LED]LED blink on time = %d offtime = %d\n",led->blink_on_time,led->blink_off_time);
	time_index = find_time_index_pmic(led->blink_on_time + led->blink_off_time);
	LEDS_DEBUG("[LED]LED index is %d  freqsel=%d\n", time_index, pmic_freqsel_array[time_index]);
	duty=32*led->blink_on_time/(led->blink_on_time + led->blink_off_time);


从以上代码除了可以看到其本来就不支持1999ms以上的闪烁频率之外,还看到了另外一个问题,就是新手经常发生的数组越界问题,没有采取任何的访问保护。



目录
相关文章
|
4月前
|
C++
在Maix duino开发板上实现LED闪烁
简单介绍 如果你还不知道如何点亮LED,请看:点亮LED 今天开始上手在开发板上运行程序了,学习点亮LED灯就像是学习编程语言的H e l l o , w o r l d Hello, worldHello,world。学会电亮一盏LED灯之后,我便尝试着自己实现了个LED闪烁。
30 0
|
6月前
|
芯片
最详细STM32,cubeMX 按键点亮 led
最详细STM32,cubeMX 按键点亮 led
114 0
|
2天前
|
存储
Rockchip系列之浅度分析LED状态灯 Driver篇(1)
Rockchip系列之浅度分析LED状态灯 Driver篇(1)
13 2
LCD、OLED、Mini LED、Micro LED和Smart MNT
LCD、OLED、Mini LED、Micro LED和Smart MNT
|
10月前
使用STM32CubeMX实现LED闪烁
使用STM32CubeMX实现LED闪烁
136 0
|
11月前
|
芯片
1-STM32之GPIO点亮LED
1-STM32之GPIO点亮LED
STM32cubeMX配置PWM使LED灯闪烁
STM32cubeMX配置PWM使LED灯闪烁
134 0
|
12月前
|
数据采集 内存技术
【Renesas RA6M4开发板之按键和LED的GPIO】
【Renesas RA6M4开发板之按键和LED的GPIO】
110 0
stm32使用CubeMX配置LED灯闪烁
stm32使用CubeMX配置LED灯闪烁
90 0
stm32CubeMX点亮一个LED灯
stm32CubeMX点亮一个LED灯
76 0