| 
 | 
亚瑟王 发表于 2013-7-4 14:33   
不好意思哦,这个参数没有用过,不太清楚具体的作用。  
那就是在UBOOT中把androidboot.mode设定为charger状态,内核正常流程启动,然后到init时要对charger这种状态处理。 
 
system\core\init\init.c 
 
[cpp] view plaincopy 
01.int main(int argc, char **argv)   
02.{   
03.    ………………   
04.    action_for_each_trigger("early-init", action_add_queue_tail);   
05.   
06.    queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");   
07.    queue_builtin_action(property_init_action, "property_init");   
08.    queue_builtin_action(keychord_init_action, "keychord_init");   
09.    queue_builtin_action(console_init_action, "console_init");  //(1)、显示initlogo.rle,也就是android第二张图片;   
10.    queue_builtin_action(set_init_properties_action, "set_init_properties");   
11.   
12.    /* execute all the boot actions to get us started */   
13.    action_for_each_trigger("init", action_add_queue_tail);   
14.   
15.    /* skip mounting filesystems in charger mode */   
16.    if (strcmp(bootmode, "charger") != 0) {//(2)、这里就是UBOOT中设定的bootmode,如果是charger模式,跳过下面初始化;   
17.        action_for_each_trigger("early-fs", action_add_queue_tail);   
18.        action_for_each_trigger("fs", action_add_queue_tail);   
19.        action_for_each_trigger("post-fs", action_add_queue_tail);   
20.        action_for_each_trigger("post-fs-data", action_add_queue_tail);   
21.    }   
22.   
23.    queue_builtin_action(property_service_init_action, "property_service_init");   
24.    queue_builtin_action(signal_init_action, "signal_init");   
25.    queue_builtin_action(check_startup_action, "check_startup");   
26.   
27.    if (!strcmp(bootmode, "charger")) {//(3)、如果为charger,则调用charger.c。   
28.        action_for_each_trigger("charger", action_add_queue_tail);   
29.    } else {   
30.        action_for_each_trigger("early-boot", action_add_queue_tail);   
31.        action_for_each_trigger("boot", action_add_queue_tail);   
32.    }   
33.……………………   
34.}   
 
 
(1)、显示initlogo.rle,也就是android第二张图片; 
 
queue_builtin_action(console_init_action,"console_init");调用console_init_action 
 
 
 
[cpp] view plaincopy 
01.static int console_init_action(int nargs, char **args)   
02.{   
03.    int fd;   
04.    char tmp[PROP_VALUE_MAX];   
05.    if (console[0]) {   
06.        snprintf(tmp, sizeof(tmp), "/dev/%s", console);   
07.        console_name = strdup(tmp);   
08.    }   
09.    fd = open(console_name, O_RDWR);   
10.    if (fd >= 0)   
11.        have_console = 1;   
12.    close(fd);   
13.    if( load_565rle_image(INIT_IMAGE_FILE) ) {//这里定义rle文件的名称#define INIT_IMAGE_FILE "/initlogo.rle"   
14.        fd = open("/dev/tty0", O_WRONLY);   
15.        if (fd >= 0) {//如果没有这张图片,就显示android字样,在屏幕左上角;   
16.            const char *msg;   
17.                msg = "\n"   
18.            "\n"   
19.            "\n"  // console is 40 cols x 30 lines   
20.            "\n"   
21.            "\n"   
22.            "\n"   
23.            "\n"   
24.            "\n"   
25.            "\n"   
26.            "\n"   
27.            "             A N D R O I D ";   
28.            write(fd, msg, strlen(msg));   
29.            close(fd);   
30.        }   
31.    }   
32.    return 0;   
33.}   
 
 
(2)、这里就是UBOOT中设定的bootmode,如果是charger模式,跳过下面初始化; 
 
 
 
[cpp] view plaincopy 
01./* skip mounting filesystems in charger mode */   
02.if (strcmp(bootmode, "charger") != 0) {   
03.    action_for_each_trigger("early-fs", action_add_queue_tail);   
04.    action_for_each_trigger("fs", action_add_queue_tail);   
05.    action_for_each_trigger("post-fs", action_add_queue_tail);   
06.    action_for_each_trigger("post-fs-data", action_add_queue_tail);   
07.}   
 
 
(3)、如果为charger,则调用charger.c 
 
 
 
[cpp] view plaincopy 
01.action_for_each_trigger("charger", action_add_queue_tail);   
 
 
我们在后面细分charger这部分。 
 
4、charger.c 
 
这部分就是我们充电部分,充电画面显示的实现。 
 
system\core\charger\charger.c 
 
 
 
 
[cpp] view plaincopy 
01.int main(int argc, char **argv)   
02.{   
03.………………   
04.    klog_set_level(CHARGER_KLOG_LEVEL);   
05.    dump_last_kmsg();   
06.    LOGI("--------------- STARTING CHARGER MODE ---------------\n");   
07.   
08.    gr_init();   
09.    gr_font_size(&char_width, &char_height); //(1)、初始化graphics,包括buf大小;   
10.   
11.    ev_init(input_callback, charger);//(2)初始化按键;   
12.      
13.fd = uevent_open_socket(64*1024, true);   
14.    if (fd >= 0) {   
15.        fcntl(fd, F_SETFL, O_NONBLOCK);   
16.        ev_add_fd(fd, uevent_callback, charger);   
17.    }   
18.   
19.    charger->uevent_fd = fd;   
20.    coldboot(charger, "/sys/class/power_supply", "add");//(3)、创建/sys/class/power_supply结点,把socket信息通知应用层;   
21.       
22.ret = res_create_surface("charger/battery_fail", &charger->surf_unknown);   
23.    if (ret < 0) {   
24.        LOGE("Cannot load image\n");   
25.        charger->surf_unknown = NULL;   
26.    }   
27.    for (i = 0; i < charger->batt_anim->num_frames; i++) {//(4)、这里是显示charger logo,res_create_surface显示图片函数;   
28.        struct frame *frame = &charger->batt_anim->frames;   
29.        ret = res_create_surface(frame->name, &frame->surface);   
30.        if (ret < 0) {   
31.            LOGE("Cannot load image %s\n", frame->name);   
32.            /* TODO: free the already allocated surfaces... */   
33.            charger->batt_anim->num_frames = 0;   
34.            charger->batt_anim->num_cycles = 1;   
35.            break;   
36.        }   
37.    }   
38.ev_sync_key_state(set_key_callback, charger);   
39.    gr_fb_blank(true);   
40.   
41.    charger->next_screen_transition = now - 1;   
42.    charger->next_key_check = -1;   
43.    charger->next_pwr_check = -1;   
44.    reset_animation(charger->batt_anim);   
45.    kick_animation(charger->batt_anim);   
46.    event_loop(charger);//(5)、event_loop循环,电池状态,检测按键是否按下;   
47.    return 0;   
48.   
49.}   
 |   
 
 
 
 |