Month: November 2011

Controlando os LEDs do celular Motorola W220 rodando Osmocom

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:

w220_led

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");
Advertisements

Visualizador open-source para analisadores lógicos

Hoje em dia temos alguns analisadores lógicos open-source como o Open Logic Sniffer (OLS), mas em geral a interface gráfica para visualização não é das melhores.

Para mudar isto existe um projeto chamado Sigrok que implementa uma interface gráfica em GTK e suporta vários tipos de analisadores lógicos.

Infelizmente ele ainda não suporta as funções avançadas de “trigger” do OLS, mas isto deve mudar em breve. Por enquanto apenas a interface gráfica Java do OLS suporta estes recursos.

Como debugar Linux/Android quando entrando em suspend mode

Estava tendo um problema com o Android entrando em modo suspend e não conseguindo retornar do suspend.

Na verdade o problema acontecia não no momento que a placa tentava voltar do suspend, mas sim no momento que ela tentava entrar em suspend.

Só consegui descobrir isso porque adicionei “no_console_suspend” no kernel comando line.

Criando DVDs simples no Linux

Se você precisa criar um DVD com o video do churrasco do final de semana ou um video simples para passar para seus alunos, então você precisa conhecer o DeVeDe.

Página do projeto:
http://www.rastersoft.com/programas/devede.html

No Debian/Ubuntu você pode instalar apenas executando o comando:

$ sudo apt-get install devede

O software é muito simples de usar, no lado esquerdo clique no botão ‘+’ para adicionar uma nova trilha (uma entrada que aparecerá no menu do DVD) e do lado esquerdo clique no botão ‘+’ para adicionar os vídeos que serão exibidos na trilha criada.

Em resumo, o DeVeDe não tem todas os recursos de outros software mais complexos, mas é muito fácil de usar e muito prático. Se você só quer exibir vídeos em qualquer reprodutor de DVD, então este software é tudo que você precisa.

Compiling Android 4.0 to Panda Board

First patch I need to apply:

https://github.com/jlebar/android-build/commit/96d5e8f1a10acef523ccf7e9f47d33398f98ffdc

build/core/combo/HOST_linux-x86.mk
# Disable new longjmp in glibc 2.11 and later. See bug 2967937.
-HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
+HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

Other error caused on oprofile could be fixed with this patch:
http://permalink.gmane.org/gmane.linux.oprofile/9152

Create symbolic link to fix -lX11 and -lGL errors:

$ sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so
$ sudo ln -s /usr/lib32/libGL.so.1.2 /usr/lib32/libGL.so

Compilando a picotts manualmente

Como já comentamos aqui o PicoTTS do Android foi portado para o Debian e tambem esta’ disponivel no repositorio do Ubuntu.

Você pode baixar o código fonte através do comando:

$ sudo apt-src install libttspico-utils

Dentro do diretório svox-blablabla existem vários arquivos que são exclusivos p/ Android e não nos interessa. Copie apenas os arquivos de dentro do diretório libs e o arquivo pico2wave.c (que fica dentro de bin) para o local onde você deseja fazer a compilação.

Inicialmente eu compilei arquivo por arquivo (mas você não precisa fazer isso, veja mais abaixo depois), da seguinte forma:

$ gcc -c -I. picosXYZ.c -o picosXYZ.o

$ gcc picoacph.o picoapi.c picobase.o picocep.o picoctrl.o picodata.o picodbg.o picoextapi.o picofftsg.o picokdbg.o picokdt.o picokfst.o picoklex.o picoknow.o picokpdf.o picokpr.o picoktab.o picoos.o picopal.o picopam.o picopr.o picorsrc.o picosa.o picosig2.o picosig.o picospho.o picotok.o picotrns.o picowa.o pico2wave.o -o pico2wave -lm -lpopt

Copie os arquivos de base de fonemas para o diretorio local:
$ cp -a /usr/share/pico/lang .

E testei executando o comando:

$ ./pico2wave -w /tmp/teste.wav “Hello World” ; aplay /tmp/teste.wav

Agora vamos simplificar o processo criando um Makefile para compilar tudo pra gente:

CC = gcc
CFLAGS = -I.
LDFLAGS = -lm -lpopt

TARGET = pico2wave
OBJ = picoacph.o picoapi.c picobase.o picocep.o picoctrl.o picodata.o picodbg.o picoextapi.o picofftsg.o picokdbg.o picokdt.o picokfst.o picoklex.o picoknow.o picokpdf.o picokpr.o picoktab.o picoos.o picopal.o picopam.o picopr.o picorsrc.o picosa.o picosig2.o picosig.o picospho.o picotok.o picotrns.o picowa.o pico2wave.o

all : $(TARGET)

$(TARGET) : $(OBJ)
$(CC) $(OBJ) -o $@ $(LDFLAGS)

clean:
rm -rf *.[oa] *.gdb *~ core $(TARGET)

O = o

%.$(O) : %.c
$(CC) $(CFLAGS) -c $< -o $@