Que a bateria do N900 não é lá essas coisas é mais ou menos como dizer que vai chover em São Paulo no final da tarde.
Mas eu tive alguns problemas mais sérios com ela alguns dias. Já aconteceu umas 3 ou 4 de vezes de deixar o aparelho carregando durante a noite, tirar da tomada de manhã, e no meio da tarde, praticamente sem uso nenhum, ter que carregar de novo pois já estava no vermelho.
Carregava, voltava pra casa, e pouco antes de dormir a bateria já estava no fim de novo. Reiniciar o aparelho resolvia o problema. Mas como há um problema, vamos tentar descobrir qual é.
Eu já tinha o applet que mostra o uso de CPU instalado, mas ele não estava mostrando um uso fora do normal. Então parti para o comando top do terminal, para ver se algum processo em especial era o bandido. Nada.
Aí descobri um outro programinha, o powertop. Ele estava instalado na versão anterior do firmware, mas foi removido da atual, sabe-se lá porque. Ele também não está disponível nos repositórios. É necessário baixá-lo separadamente, e copiar pra algum lugar do aparelho. Eu o coloquei no diretório “/opt” (é obrigatório que fique em algum lugar particionado como “ext3″…dentro do “MyDocs” ele não vai rodar). Também é necessário dar permissão de execução para o arquivo (“chmod +x powertop”).
O que ele faz é bem simples: monitora por algum tempo a CPU, e depois mostra o resultado, que dá pra ver abaixo.
Nokia-N900-51-1:~# /opt/powertop -s 60 -t 120 Powertop 1.13.3 status: Unknown job: pmtrackerdaemon Sleeping 60 seconds before sampling Collecting data for 120 seconds Sample interval was 02m 00s 33699us C# | Ratio | Avg/dura | Frequency | Ratio --------+--------+----------+-----------+--------+ C0 | 0.2% | | 600 MHz | 0.0% | C1 | 0.0% | 0.2ms | 550 MHz | 0.0% | C2 | 0.3% | 4.3ms | 500 MHz | 0.0% | C3 | 3.6% | 238.3ms | 250 MHz | 100.0% | C4 | 95.9% | 2449.7ms | IRQ# | Activity | Type | Name --------+------------+----------------+--------------------------- 56 | 430 | INTC | i2c_omap 12 | 224 | INTC | DMA 11 | 108 | INTC | prcm 37 | 105 | INTC | gp 57 | 100 | INTC | i2c_omap 202 | 20 | GPIO | wl1251 PID# | Activity | Name | Function Entry (Expire) --------+------------+----------------+--------------------------- 0 | 51 | <kernel core=""> | tick_nohz_restart_sched_tick (tick_sched_timer) 37 | 33D| awk | cpufreq_governor_dbs (delayed_work_timer_fn) 700 | 22 | bme_RX-51 | sys_timer_settime (posix_timer_fn) 458 | 17 | wl12xx | queue_delayed_work (delayed_work_timer_fn) 0 | 14 | <kernel core=""> | hrtimer_start (tick_sched_timer) 1 | 11D| <kernel core=""> | queue_delayed_work (delayed_work_timer_fn) 688 | 10 | dsme | do_nanosleep (hrtimer_wakeup) 688 | 10 | dsme | __enqueue_rt_entity (sched_rt_period_timer) 700 | 10 | bme_RX-51 | schedule_timeout (process_timeout) 700 | 8 | bme_RX-51 | sys_timer_settime (posix_timer_fn) 700 | 8 | bme_RX-51 | do_nanosleep (hrtimer_wakeup) 458 | 6 | wl12xx | schedule_timeout (process_timeout) 458 | 3 | wl12xx | schedule_timeout (process_timeout) 1113 | 2 | wlancond | ieee80211_ioctl_siwpower (ieee80211_dynamic_ps_timer) 10 | 2 | omap2_mcspi | neigh_add_timer (neigh_timer_handler) 2630 | 1 | sshd | sk_reset_timer (tcp_write_timer) 0 | 1 | <kernel core=""> | queue_delayed_work (delayed_work_timer_fn) 1 | 1 | <kernel core=""> | inet_initpeers (peer_check_expire) 1 | 1 | <kernel core=""> | inet_frags_init (inet_frag_secret_rebuild) 1 | 1 | <kernel core=""> | flow_cache_init (flow_cache_new_hashrnd) 2644 | 1 | powertop | do_nanosleep (hrtimer_wakeup) Power domain activity breakdown Domain | % of time spent in states --------+---------+---------+---------+---------+---------- usbhost |OFF: 100%|RET: 0%|INA: 0%| ON: 0%| now:(OFF) sgx |OFF: 100%|RET: 0%|INA: 0%| ON: 0%| now:(OFF) per |OFF: 99%|RET: 0%|INA: 0%| ON: 0%| now:(ON) dss |OFF: 100%|RET: 0%|INA: 0%| ON: 0%| now:(OFF) cam |OFF: 100%|RET: 0%|INA: 0%| ON: 0%| now:(OFF) core |OFF: 95%|RET: 3%|INA: 0%| ON: 0%| now:(ON) neon |OFF: 95%|RET: 3%|INA: 0%| ON: 0%| now:(ON) mpu |OFF: 95%|RET: 3%|INA: 0%| ON: 0%| now:(ON) iva2 |OFF: 100%|RET: 0%|INA: 0%| ON: 0%| now:(OFF) Clock activity breakdown at end of period Domain | Active clocks --------+---------------+---------------+------------------ core | SDRC | HSOTGUSB_IDLE | OMAPCTRL | MAILBOXES | wkup | GPT1 | 32KSYNC | GPIO1 | WDT1 | ckgen | CORE | PERI | 96M | 48M | 12M | 54M | EMU_CORE | per | GPIO2 | GPIO3 | GPIO4 | GPIO5 | GPIO6 | Total wakeups 1200, 10.0/s | IRQ 987, 8.2/s | Timers 213, 1.8/s HW wakeups 108, 0.9/s | Real gp_timers expired 105, 0.9/s
A primeira coisa a se olhar é o primeiro bloco. Ali ele mostra qual era a frequência do processador durante o teste. No meu caso, dá pra ver que ele ficou quase que o tempo todo a 250MHz ou “dormindo”. Ou seja, poupando energia.
O terceiro bloco é a parte mais interessante. Ali ele mostra os processos que estavam consumindo processamento (meio redundante a frase). Se temos alguém que está comendo bateria, provavelmente é aí que o encontraremos.
No meu caso, quando estava procurando o culpado, notei que um tal de “wl12xx” aparecia bastante. E depois de uma pesquisada bem simples (na verdade o próprio nome já dá pistas), vi que era o processo do wi-fi (WireLess). E coincidentemente, todas as vezes que tive problemas com a bateria, eu tinha usado o wi-fi!
Ainda estou investigando quem é realmente o culpado, mas tenho 2 suspeitos. Um deles, o menos provável, é o widget que uso para mostrar o IP na tela, que também serve para iniciar uma conexão wi-fi. Talvez ele fique rodando alguma coisa em background ou então prenda algum recurso, e não permita que o módulo do wi-fi “morra” corretamente.
E o outro suspeito, mais provável, é o próprio módulo do wi-fi. Ele pode não morrer totalmente quando você se afasta do raio de ação do roteador, e consequentemente perde a conexão. Talvez ele continue ativo tentando reconectar ao invés de simplesmente se desligar. Só que ele tenta se reconectar apenas ao roteador no qual estava antes! Ou seja: se estou conectado no meu trabalho, vou embora, e chego em casa, ele não vai reconectar no de casa, mas vai continuar tentando o do trabalho….que obviamente não vai conseguir e vai ficar gastando a bateria.
De qualquer forma, fica a dica sobre o powertop. Para saber as opções do comando, digite “powertop -h”. Lembrando que é necessário, claro, estar como root.