【VR9项目】LED功能实现(一):Uboot

Bug号:17415

平台: 全志VR9

一、sys_config.fex

[led_rgb]
led_used         = 1
led_red          = port:PL17<1><1><default><1>
led_green        = port:PL07<1><1><default><1>
led_blue         = port:PL06<1><1><default><1> 
首先定义一个led_rgb的主键,在config.fex中,并分配RGB使用的三个IO口
二、Uboot

secondary_main.c

额外包含 <sys_config.h> 此头文件中主要包含了GPIO的结构体以及接口。

此文件中包含两个CPU(CPU1 CPU2)的初始化接口:

int sunxi_secendary_cpu_task(void)
int sunxi_third_cpu_task(void)
进入CPU1的配置流程中:找到获取当前电源状态的接口函数

static int sunxi_probe_power_state(void)

第一部分,首先从fex中获取POWER相关的参数,并读取当前的充电状态和电池电压信息。

然后就是LED部分的控制:

(1) rgb_init()

此函数的作用为根据fex参数,返回三色灯的句柄

_u32 gpio_handle_red;         //红灯句柄
__u32 gpio_handle_green; //绿灯句柄
__u32 gpio_handle_blue;   //蓝灯句柄

#define ON 1
#define OFF 0
#define RGB_OFF    0
#define RGB_ON     1
#define RGB_RED    2
#define RGB_GREEN  3
#define RGB_BLUE   4
#define RGB_WHITE  5
#define RGB_YELLOW 6
#define RGB_PURPLE 7
int rgb_status = RGB_OFF;
static void rgb_init(void)
{			
	int ret_rgb;
	user_gpio_set_t gpio_reverse;   //保存GPIO信息的结构变量
	printf("RGB init\n");		
	//R
	ret_rgb = script_parser_fetch("led_rgb", "led_red", (int *)&gpio_reverse, sizeof(user_gpio_set_t)/4);  
 //从fex文件中读入红色灯的GPIO信息
	if(!ret_rgb)  
	{	
	  gpio_reverse.mul_sel = 1;         //设置为输出 
	  gpio_handle_red = gpio_request(&gpio_reverse, 1);    //根据获得的GPIO,返回红色灯的句柄,
	 }
	//以下绿色灯和蓝色灯返回句柄的过程同理
	//G
	ret_rgb = script_parser_fetch("led_rgb", "led_green", (int *)&gpio_reverse, sizeof(user_gpio_set_t)/4);  
	if(!ret_rgb)  
	{	
	  gpio_reverse.mul_sel = 1;    //set output type 
	  gpio_handle_green = gpio_request(&gpio_reverse, 1);  
	 }
	//B
	ret_rgb = script_parser_fetch("led_rgb", "led_blue", (int *)&gpio_reverse, sizeof(user_gpio_set_t)/4);	
	if(!ret_rgb)  
	{
	  gpio_reverse.mul_sel = 1;  //set output type 
	  gpio_handle_blue = gpio_request(&gpio_reverse, 1);  
	 }
}
(2)rgb_control

控制LED亮灭


int rgb_control(int value_red,int value_green,int value_blue)
{
   //red
	if(gpio_handle_red)	
	{  
	  gpio_write_one_pin_value(gpio_handle_red, value_red,0);
	  pr_msg("RGB R is	%s\n", (value_red == ON?"on":"off"));
	}
   //green
	if(gpio_handle_green)  
	{  
	  gpio_write_one_pin_value(gpio_handle_green, value_green,0);
	  pr_msg("RGB G is	%s\n", (value_green == ON?"on":"off"));
	}
   //blue
	if(gpio_handle_blue)  
	{  
	gpio_write_one_pin_value(gpio_handle_blue, value_blue,0);
	pr_msg("RGB B is	%s\n", (value_blue == ON?"on":"off"));
	}
	return 0;
}

board_common.c

入口函数

int board_late_init(void)
最终位置:
static void fresh_led(void)
{
	pr_msg("LED COLOR:ON OFF R G B W Y P\n");
	pr_msg("LED  CODE:0  1   2 3 4 5 6 7\n");
	pr_msg("LED status:%d\n",rgb_status);

	switch(rgb_status)
	{
		case RGB_ON:
			rgb_control(ON,ON,ON);
			break;
		case RGB_OFF:
			rgb_control(OFF,OFF,OFF);
			break;
		case RGB_RED:
			rgb_control(ON,OFF,OFF);
			break;
		case RGB_GREEN:
			rgb_control(OFF,ON,OFF);
			break;
		case RGB_BLUE:
			rgb_control(OFF,OFF,ON);
			break;
		case RGB_YELLOW:
			rgb_control(ON,ON,OFF);
			break;
		default:
			break;
	}

}








猜你喜欢

转载自blog.csdn.net/musicalspace/article/details/79112899