|
亚瑟王 发表于 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.}
|
|