Este final de semana resolvi mexer com o osmocombb. Eu tenho dois celulares que utilizam o processador calypso suportado pelo osmocombb: o C115 e o W220. O celular C115 possui suporte completo incluindo a parte dos transceptores RF, ja’ o W220 ainda nao possui a parte de RF, mas consegue rodar os exemplos basicos na highram:
$ ./osmocon -p /dev/ttyUSB0 -m romload ../../target/firmware/board/chimei_w220/hello_world.highram.bin
O W220 utiliza o transceptor RF Si4210 da Silicon Labs que ainda não possui driver, portanto terei que criar um driver para que o W220 possa funcionar com o osmocombb.
Entao, para esquentar as turbinas, resolvi fazer um teste basico e teoricamente simples: acender os LEDs do W220. Apos analisar o esquematico, a primeira coisa que descobri foi que os LEDs nao sao controlados diretamente pelo processador calypso, mas sim atraves de um expandor de I/O PCA9537 ligado ao processador via barramento I2C.
Apos varias tentativas sem sucesso resolvi soldar dois fios (no SCL e SDA) do PCA9537 para analisar o que estava errado. Para minha surpresa o bit mais significativo do endereco do expansor de I/O (0x49) nao aparecia no barramento. Nao demorou muito para que eu encontrasse a causa do problema, o autor do driver I2C para o Calypso (Harald Welte) se confundiu na hora de mascarar os bits de endereco. Então submeti um patch para resolver o problema.
Assim finalmente tudo funcionou como o esperado:
Este foi o codigo usado para acender todos os LEDs:
#define PCA9537_ADDR 0x49 int rc = 0; const uint8_t data1[1] = {0x00}; const uint8_t data2[1] = {0x00}; rc = i2c_write(PCA9537_ADDR, 3, 1, data1, 1); if(rc) puts("i2c 1 fail\n"); rc = i2c_write(PCA9537_ADDR, 1, 1, data2, 1); if(rc) puts("i2c 2 fail\n");