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;
}
}