fanqiehua 发表于 2013-7-4 13:54:32

android关机充电功能,显示图标问题

想在tq210上面作的android4.0上作关机充电时显示图标,android部分的测试,为了方便直接在uboot当中bootargs参数增加androidboot.mode=charger,更改为:
bootargs=noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 init=/init console=ttySAC0 androidboot.mode=charger
然后启动系统!
终端打印:
Freeing init memory: 168K
init: /init.rc: 631: invalid option 'setprop'
init: cannot open '/initlogo.rle'
后没有下文了,屏幕还是左上角的linux的小企鹅!!!
按道理来讲这个应该是android的标准功能啊!难道是因为我现在没有电池的充放电管理芯片检票不到电池电压启动不起来,还是什么原因!

天嵌厂家有作过这个方面的工作,能否给提示一下,下一步怎么作,修改什么地方!

亚瑟王 发表于 2013-7-4 14:33:37

不好意思哦,这个参数没有用过,不太清楚具体的作用。

fanqiehua 发表于 2013-7-4 14:54:49

亚瑟王 发表于 2013-7-4 14:33 static/image/common/back.gif
不好意思哦,这个参数没有用过,不太清楚具体的作用。

那就是在UBOOT中把androidboot.mode设定为charger状态,内核正常流程启动,然后到init时要对charger这种状态处理。

system\core\init\init.c

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



view plaincopy
01.static int console_init_action(int nargs, char **args)
02.{
03.    int fd;
04.    char tmp;
05.    if (console) {
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模式,跳过下面初始化;



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



view plaincopy
01.action_for_each_trigger("charger", action_add_queue_tail);


我们在后面细分charger这部分。

4、charger.c

这部分就是我们充电部分,充电画面显示的实现。

system\core\charger\charger.c




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

fanqiehua 发表于 2013-7-4 14:55:58

亚瑟王 发表于 2013-7-4 14:33 static/image/common/back.gif
不好意思哦,这个参数没有用过,不太清楚具体的作用。

我也是参考网上的一片文章的!http://blog.csdn.net/xubin341719/article/details/8498580

这里讲的就是安卓关机充电的!你们在这方面作过吗?

亚瑟王 发表于 2013-7-4 15:26:16

fanqiehua 发表于 2013-7-4 14:55 static/image/common/back.gif
我也是参考网上的一片文章的!http://blog.csdn.net/xubin341719/article/details/8498580

这里讲的就 ...

目前在210上还没有做这个功能。

fanqiehua 发表于 2013-7-4 16:12:55

亚瑟王 发表于 2013-7-4 15:26 static/image/common/back.gif
目前在210上还没有做这个功能。

那你知道怎么作,怎么完善这个功能吗?

亚瑟王 发表于 2013-7-4 17:05:18

fanqiehua 发表于 2013-7-4 16:12 static/image/common/back.gif
那你知道怎么作,怎么完善这个功能吗?

android的关机充电有两种情况:
1、假关机(实际是在休眠状态):这种情况下android本身就有的功能。
2、真关机(实际是在u-boot下):这种情况下就是u-boot的功能了。
显示充电图标:
在Android中有对充电响应的API的(这里的API指代比较广泛,包含HAL层的函数接口),在驱动(可能是ADC的驱动,也可能是PMIC的驱动)中满足这个API的调用就可以了,这个百度一下,网上很多类似说明的。
页: [1]
查看完整版本: android关机充电功能,显示图标问题