Month: July 2012

Colocando o genio de volta na garrafa: Convertendo a saida do hexdump em binario

Durante o processo de instalação do OpenWRT no roteador DIR-825 precisei copiar alguns binários do roteador para o computador.

Como fazer isso quando você não tem a rede funcionando ainda? A solução é simples, use o hexdump e o xxd.

No roteador:

# hexdump mybinary.bin

Use o mouse para selecionar e copiar o conteúdo que o hexdump joga na tela. Uma dia importante é você configurar o terminal para rolagem ilimitada, no caso do gnome-terminal vá em Edit -> Profile -> clique no botão Edit -> Scrolling e marque Unlimited.

Abrar um editor (gedit) e coloque o conteúdo, salve como mybinary.txt, por exemplo.

Agora use o seguinte comando para gerar o binário novamente:

$ cat mybinary.txt | xxd -r > mybinary.bin

Esta dica eu encontrei no Linux Jornal.

ATUALIZACAO:
E se você quisesse fazer o oposto, gerar um binario no seu roteador com a saida do hexdump de um binario do computador? O OpenWRT não possui o xxd por padrão, então você teria que encontrar outra alternativa.

Neste site encontrei a sugestão abaixo.
Considere o arquivo hdump como exemplo, com o conteudo:


$ cat hdump
41 42 43 44
45 46 47 48

$ echo 'ibase=16' | cat - hdump | tr ' ' \; | bc | awk '{printf("%c",$0)}'

Infelizmente o OpenWRT também não possui o comando bc, então lembrei do comando printf que usei para zerar a BIOS do computador a partir do terminal do Linux.

Então o comando ficou assim:

$ for i in $(cat hdump) ; do printf "\x$i" ; done

Sete meses depois: Roteador Wireless Dlink DIR-825 funcionando

Há exatamente 7 meses eu comprei um “Roteador Wireless Wi-fi D-link Dir-825 N Dual-band C Defeito” no Mercado Livre.

Segundo o vendedor a porta Ethernet (WAN) não estava funcionando corretamente, assim não era possível usa-lo como um roteador Wireless. Mas todo o resto estava funcionando corretamente.

Como todas as funções dele estavam funcionando bem e este roteador custa mais de U$ 100.00 na Amazon, não pensei duas vezes, seria um negócio da China compra-lo por R$ 129,90 e instalar o OpenWRT nele.

Quando o roteador chegou liguei e tudo estava funcionando corretamente, inclusive a porta Ethernet WAN, mas não demorou muitos minutos para ela parar de funcionar. Estava muito instável, às vezes funcionava, às vezes não.

Então resolvi pesquisar na Internet e encontrei várias pessoas que estavam com este mesmo problema, mas atualizando o firmware resolvia o problema. Testei várias versões de firmware da Dlink, mas nenhum funcionou corretamente. Então com certeza havia um problema físico no chip ou em algum outro componente da placa. Também instalei o OpenWRT e nada de funcionar.

Como não seria muito fácil consertar a placa, resolvi usar uma estrategia *teoricamente* simples, ligar um conversor USB/Ethernet na porta USB do roteador DIR-825 e usa-la como porta WAN.

Comentei a ideia no trabalho e um dos meus colegas disse que tinha comprado este conversor no DealExtreme e não estava usando, no dia seguinte ele trouxe o conversor.

Compilei uma versão do OpenWRT com o módulo USB/Ethernet Davicom DM9601, para isso acrescentei a linha CONFIG_USB_NET_DM9601=y no target/linux/ar71xx/config-2.6.39. Porém não consegui fazer upgrade do OpenWRT que eu havia instalado no modem, então deixei o modem guardado e não mexi mais nisso.

Hoje resolvi insistir mais um pouco e consegui resolver o problema. Como a interface Wireless do modem estava funcionando eu consegui conectar do notebook no roteador via wireless, configurei a interface wlan0 para usar o ip 192.168.1.2 e usei a cópia de arquivo via ssh (scp) para copiar os modulos dm9601.ko e usbnet.ko para o diretório /lib/modules do roteador.

Em seguida editei o arquivo /etc/modules.d/20-usb-core acrescentando:

usbcore
usbnet
dm9601

Também editei o arquivo /etc/config/network para colocar a interface do conversor USB/Ethernet (eth2) como sendo a interface wan.

Finalmente tudo está funcionando como o esperado. Estou escrevendo este post conectado no roteador DIR-825 com um conversor USB/Ethernet e rodando o OpenWRT.

Se você leu este post até aqui, deve estar se perguntando: por que tanto trabalho para fazer isso funcionar? Não seria melhor comprar outro roteador? A resposta: Nada substitui o prazer de resolver seus problemas criando outros mais interessante e mais desafiadores. Pense nisso!

Update:

O conversor USB/Ethernet Davicom DM9601 é um pouco lento, pois ele é USB 1.1 full-speed (12Mbps), isto limitava minha taxa de download a 800KB/s. Então comprei um adaptador USB/Ethernet mais rápido, compatível com USB 2.0 (480Mbps).
Este novo dongle USB usa o chipset ASIX AX88772B, porém no driver asix.c do kernel 2.6.39 não existe o product ID 772b cadastrado. Tive que cadastrar manualmente, acrescentando:

{
// Cables-to-Go USB Ethernet Adapter
USB_DEVICE(0x0b95, 0x772b),
.driver_info = (unsigned long) &ax88772_info,
},

Correção:

Após usar o conversor USB/Ethernet ASIX notei que a taxa de download ficou limitada em 200KB/s, bem menor que os 900KB/s do Davicom DM9601. Portanto se você quer melhor desempenho aconselho a comprarem o dongle Davicom, que inclusive custa metade do preço do dongle ASIX.

How to load firmware using osmocon

Just for future reference I decide to write down these commands.

Loading firmware on Motorola W220:

/osmocom-bb/src/host/osmocon/osmocon -p /dev/ttyUSB1 -m romload nuttx.bin

Loading firmware on C115:

/osmocom-bb/src/host/osmocon/osmocon -p /dev/ttyUSB1 -m c123xor /osmocom-bb/src/target/firmware/board/compal_e88/chainload.compalram.bin -c nuttx.bin

Note: NuttX is running fine on W220, but although it says it is running on C115 I cannot see nothing on serial console.

Cuidado com as pegadinhas da linguagem C

Hoje Alan Cox corrigiu um erro que para muitas pessoas poderia passar despercebido:

http://permalink.gmane.org/gmane.linux.drivers.video-input-infrastructure/51272

Resolvi testar e inicialmente apenas declarei a variável mac e mandei exibir o tamanho, como esperado retornou 6. Então resolvi criar uma função e passar o vetor mac[6] como no arquivo az6007.c.
Para minha surpresa ele retornou 4. Portanto durante a compilação o vetor é convertido em ponteiro, para evitar a passagem por cópia.


#include<stdio.h>
void calcsize(unsigned char mac[6])
{
printf("Size of mac is %d\n", sizeof(mac));
}
int main (void)
{
unsigned char mymac[6];
mymac[0] = 0x56;
mymac[1] = 0xff;
mymac[2] = 0xf0;
mymac[3] = 0x1b;
mymac[4] = 0x97;
mymac[5] = 0xbf;
printf("Size of mymac is %d\n", sizeof(mymac));
calcsize(mymac);
return 0;
}

Aprendendo a datilografar no Linux

É estranho como as pessoas que usam computador não sabem digitar corretamente. Isto acontece porque elas nunca fizeram aula de datilografia ou por simples preguiça de aprender.

Mas nem tudo está perdido, elas podem aprender a datilografar do jeito certo, existem vários programas disponíveis na Internet para isso.

No Linux meu programa preferido para datilografia chama-se klavaro.

Ele pode ser instalado com o seguinte comando:

sudo apt-get install klavaro

Se você tem crianças em casa ou prefere uma forma mais divertida de aprender a digitar, sugiro instalar o programa Tux Typing 2:

sudo apt-get install tuxtype

Boa digitação e boa diversão!

Update: Existe também o ktouch que ajuda na digitação, visualmente muito bonito, mas não tão intuitivo.

Transformando seu celular numa Estação Base GSM

Sylvain Munaut, um dos principais desenvolvedores do Osmocom-BB desenvolveu uma prova de conceito transformando um celular numa estação base GSM que pode ser usada para comunicação com outros celulares.

Com a modificação que ele fez é possível fazer com que dois ou mais celulares comuniquem diretamente sem a necessidade de um torre GSM para intermediar a comunição.

O vídeo da palestra (em ingles) encontra-se no link abaixo:
http://live.digitaloctober.ru/embed/1207?language=en&params[pw]=630&params[ph]=355&params[episodes_under]=1&params[eh]=100#time1338441117

Instalando o rVoix no LG P698F

Se voce ainda nao conhece, o rVoix e’ um gravador de ligacoes muito util. Voce pode usa-lo para gravar todas as ligacoes que voce faz ou recebe. Infelizmente este programa so’ funciona em smartphones com processadores Qualcomm, como e’ o caso do P698F que utiliza o MSM7227 da Qualcomm.

Outro detalhe e’ que o seu kernel precisa criar quatro arquivos para comunicacao com o canal de audio do processador baseband (i.e. /dev/voc*).

E’ provavel que seu kernel nao venha com isto ativado por padrao, entao voce precisa’ baixar o kernel para o seu celular, acrescentar o driver que cria os dispositivos /dev/voc* e compila-lo para gerar o zImage.

O arquivo com o codigo fonte do Android e do kernel para o LG P698F pode ser baixado do site http://www.lg.com/global/support/opensource/opensource.jsp. Na categoria coloque Mobile Phone e no modelo digite P698F, apos clicar no link LGP698F que aparecera’ voce tera a opcao de baixar dois arquivos, escolha o LGP698F(Optimus_Net)_Android_GB_LGP698Fv10e.zip que e’ o mais atual.

Em seguida voce precisara’ baixar o arquivo http://rvoix.googlecode.com/svn/branches/snapdragon/kernel/msm7k/vocpcm.c e copia-lo para arch/arm/mach-msm/qdsp5/vocpcm.c acrescentando a seguinte linha no Makefile deste diretorio:

obj-y += vocpcm.o

Siga o procedimento de compilacao do kernel que esta’ descrito no README.txt dentro do arquivo que voce baixou do site da LG.

Nota: Nao aconselho este tipo modificacao para usuarios que nao dominem Linux, que nao saibam compilar o kernel e que nao tenham experiencia com gravacao de ROMs customizadas em smartphones com Android.

Compilando e gravando seu proprio kernel para o LG P698F

Encontrei um tutorial explicando como abrir a imagem boot.img e reempacotar com seu kernel e/ou ramdisk modificado.

Porém após reempacotar notei que o Android nao iniciava com esta imagem boot.img que foi gerada.

Após várias tentativas sem sucesso resolvi recriar uma imagem usando os arquivos originais que foram extraidos do boot.img (ao invés de tentar gerar uma boot.img com o kernel e ramdisk que eu compilei) e usar um hexa-editor, neste caso o wxHexEditor, para comparar a imagem boot.img original com a imagem boot.img que eu gerei usando os arquivos extraidos da imagem boot.img original.

Na imagem original notei que os bytes 14 e 15 eram “0x80 0x12” e na imagem gerada eram “0x00 0x10”, os bytes 22 e 23 também mudaram de “0x80 0x13” para “0x00 0x11”, os bytes 48 e 49 de “0x70 0x13” para “0x0F 0x10” e finalmente os bytes 52 e 53 mudaram de “0x80 0x12” para “0x00 0x10”.

Analisando estas posicoes, descobri que elas referem-se ao endereço base que é passado para o comando mkbootimg. Então adicionando “–base 0x12800000” resolveu o problema da imagem não bootar no LG P698F.

O comando final ficou assim:

$ ./mkbootimg --cmdline 'mem=471M console=ttyHSL1,115200n8 androidboot.hardware=gelatods' --kernel boot.img-kernel --ramdisk boot.img-ramdisk.gz --base 0x12800000 -o myboot.img