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.