Month: January 2007

Finalmente Linux rodando no PSP da Sony

Um hacker chamado Chris Mulhearn conseguiu portar o uClinux (também usado no iPodlinux) para o PSP da Sony.
O cara criou um adaptador para ligar no conector que é usado para acessar o controle remoto, que normalmente vem com o PSP. A comunicação entre o controle remoto e o PSP é baseado no padrão RS232 porém ao invés de +12V e -12V utiliza 0V e +2.5V.

Então ele criou uma imagem do kernel do Linux mais o rootfs e carregou esta imagemn usando o próprio sistema de atualização do PSP, o bootloader do PSP carrega e executa este arquivo de imagem e envia a saída pela serial.

O porte está em fase inicial, mas já é possível acessar o terminal via serial, o próximo passo será criar os drivers para os demais periféricos do dispositivo.

Mais informações:
http://df38.dot5hosting.com/~remember/chris/

Gnopernicus falando português

Hoje em dia está se tornando comum o uso de computadores por deficiente visuais, porém estes recursos nem sempre estão disponíveis para todos, devido aos altos custo de equipamentos e softwares para este fim. Visando diminuir este hiáto a empresa Romena “Baum Engineering SRL” desenvolveu o Gnopernicus, que pode ser utilizado gratuitamente por qualquer usuário Linux.

O Gnopernicus é um software de tecnologia assistiva que permite a um deficiente visual utilizar o computador.
O programa possui suporte a dispositivos Braille, síntese de voz, entre outros recursos interessantes. Porém, até então o Gnopernicus só poderia ser utilizado por usuários de língua inglesa e de outras línguas suportadas pelo Festival ou por outro TTS comerciais.

O foco principal deste tutorial é explicar como integrar o festival em português com o Gnopernicus, para que deficientes visuais Brasileiros, ou de países de língua portuguesa, possam também usar computadores. Espero que este tutorial possa incentivar grupos de desenvolvedores a criar uma distribuição Linux customizada para deficientes visuais.

O Festival possui suporte ao idioma português graça a um projeto desenvolvido por professores e alunos da UFRGS, porém ele utiliza as ferramentas da OGI (http://cslu.cse.ogi.edu/tts) e portanto está submisso à licença OGI que é muito restritiva, sendo seu uso permitido apenas para uso acadêmico e uso pessoal. Qualquer outra utilização é considerado uso comercial.

Instalando o Festival em Português

Notas: A compilação do festival-1.95 com o gcc-3.x ou 4.x, g++-3.x ou 4.x gera erros de compilação, porém utilizando-se o gcc-2.95 e g++-2.95 pode-se compilá-lo corretamente.
Caso não tenha estas versões instale-as:
# apt-get install gcc-2.95
# apt-get install g++-2.95

E em seguida mude o link simbolico do gcc e g++ para usarem a versão 2.95:
# cd /usr/bin
# rm gcc
# ln -s gcc-2.95 gcc
# rm g++
# ln -s g++-2.95 g++

DOWNLOAD
Baixe os seguintes arquivos do site do Festival e do OGI:
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festival-1.95-beta.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_CMU.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_OALD.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festlex_POSLEX.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_kallpc16k.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_kedlpc16k.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/festvox_rablpc16k.tar.gz
http://www.cslu.ogi.edu/tts/download/data/OGIresLPC-2.0.7.tar.gz
http://www.cstr.ed.ac.uk/downloads/festival/1.95/speech_tools-1.2.95-beta.tar.gz

Baixe a arquivo de fonemas em português:
http://node1.nirvanix.com/e566Ah03~bUhklTTFPm~4qN817n4~nZwtbetzVY~MicwvaQ/FreeDrive/fd_61647/festival/festival_portuguese.tar.gz

DESCOMPACTAÇÃO

Crie um diretório para instalar o Festival(ex. /tts)

Entre dentro deste diretório e extraia todos os arquivos acima para o diretório que você criou:

# cd /tts
# tar zxvf /caminho/arquivos/festival/arquivo.tar.gz

CONFIGURAÇÃO

Edite o arquivo /tts/festival/config/config.in, acrescentando nas ultimas linhas deste
arquivo:

ALSO_INCLUDE += OGIcommon
ALSO_INCLUDE += OGIdbase
ALSO_INCLUDE += OGIresLPC
ALSO_INCLUDE += OGIinsert

INSTALAÇÃO
Entre no diretório /tts/speech_tools e execute:
# ./configure
# make

Entre /tts/festival e faça o mesmo:
# ./configure
# make

Testando

Entre no diretório /tts/festival/bin e execute o comando “./festival”.

Aparecerá o prompt <festival>, então digite: (voice_aga_diphone) <ENTER>

Faça um pequeno teste: (SayText “Olá Mundo Cruel!”)

Criando link
Entre em /usr/bin e crie um link simbólico para o festival:
# ln -s /tts/festival/bin/festival .

Modificando a libgnome-speech para suportar o festival em Português

Baixe o código fonte do libgnome-speech:
# apt-get source libgnome-speech3

Baixe o patch http://www.freedrive.com/files/8jzusx06weo80/gnome-speech-ptbr.diff

Aplique-o:
# patch -p0 < gnome-speech-ptbr.diff

Entre em gnome-speech-0.3.6 e compile, caso seu sistema não tenha o fakeroot instalado, instale-o antes:
# apt-get install fakeroot
# cd gnome-speech-0.3.6
# dpkg-buildpackage -rfakeroot -uc -b

Retorne ao diretório anterior e veja que o libgnome-speech3_0.3.6-1_i386.deb foi criado, então instale-o
# cd ..
# dpkg -i libgnome-speech3_0.3.6-1_i386.deb

Instalando o Gnopernicus

O Gnopernicus possui como dependência os seguintes programas:
cspi-1.0 (at-spi package)
gconf-2.0
gtk+-2.0
gtk -doc (opcional)
libglade-2.0
libgnome-2.0
libgnomeui-2.0
libxml-2.0
gnome-speech
gnome-mag (opcional)
festival

Das dependências acima apenas a at-spi não é instalada automáticamente pelo Debian, porém ela é necessária para que o suporte a voz do Gnopernicus funcione, portanto deve-se instala-la manualmente:

# apt-get install at-spi

Como nós instalamos o Festival a partir do código fonte, não devemos permitir que o Debian tente instalar o pacote Festival padrão que funciona apenas em inglês.

Vamos resolver isso criando um pacote festival vazio, vamos usar o equivs para isso:
# apt-get install equivs

Entre num diretório qualquer com permissão de escrita (ex. /tmp) e execute:
# cd tmp
# equivs-control festival

Edite o arquivo “festival” criado da seguinte forma:

Section: misc

Priority: optional

Standards-Version: 3.5.10Package: festival

Version: 2.0.0

Maintainer: Your Name <yourname@foo.com>

Pre-Depends:

Depends:

Recommends:

Suggests:

Provides: festival

Architecture: all

Copyright:

Changelog:

Readme:

Extra-Files:

Description: Festival local

long description and info

.

second paragraph

Agora crie o pacote festival:
# equivs-build festival

E instale:
# dpkg -i festival_2.0.0_all.deb

Pronto, agora podemos instalar o Gnopernicus:
# apt-get install gnopernicus

Execute o gnopernicus, vá em Preferências -> Síntese de Voz -> Vozes -> Editar Absoluto:
Driver do Mecanismo: Festival GNOME Speech Driver
Locutor do mecanismo: V2 Aga

Clique no botão “Forçar o driver e o locutor selecionados para todas as vozes”

Alan Carvalho de Assis
acassis@gmail.com

Interfaceando GTK + SNMP + Lintouch

Há algum tempo atrás fiz um programa para controlar um velocimetro no Lintouch, o objetivo era ter o servidor SNMP pegando dados de um programa visual (GTK) e enviando estes mesmos dados para visualização no Lintouch.

Como tudo que não é documentado se perde, resolvi discutir a implementação aqui.
O MIB é simples:

UFRGS-MIB DEFINITIONS ::= BEGIN

IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, Integer32,
Counter32, IpAddress, enterprises FROM SNMPv2-SMI
MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF;
--
-- A brief description and update information about this mib.
--

ufrgs MODULE-IDENTITY
LAST-UPDATED "0104010000Z" -- 01 Apr 2001, midnight
ORGANIZATION "UFRGS"
CONTACT-INFO
" Author: Alan Carvalho de Assis
UFRGS, Departamento de Engenharia Eletrica
Av. Oswaldo Aranha
Porto Alegre
BRAZIL
email: acassis@gmail.com
tel: +55-051-3316-3561"

DESCRIPTION "MIB Agent for Baja-by-Wire"
::= { enterprises 12619 }

-- the meters group
meters OBJECT IDENTIFIER ::= { ufrgs 1 }
reserved OBJECT IDENTIFIER::= { ufrgs 2 }

--
-- The Speed (to speedometer)
--
speed OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The speed variable."
DEFVAL { 0 }
::= { meters 1 }

--
-- The RPM (to tachometer)
--
rpm OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The engine rotation variable."
DEFVAL { 0 }
::= { meters 2 }

--
-- The temperature variable
--
temperature OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The engine temperature."
DEFVAL { 0 }
::= { meters 3 }

END

Na inicialização do MIB (init-ufrgs) eu crio uma área de memória compartilhada:

typedef struct {
int speed;
int rpm;
int temperature;
}meter;

#define SHM_SIZE 12  /* 12 bytes (meter struct size) */

static u_long speed;
static u_long rpm;
static u_long temperature;

meter *m;

void init_ufrgs(void)
{
static oid speed_oid[] = { 1,3,6,1,4,1,12619,1,1 };
static oid rpm_oid[] = { 1,3,6,1,4,1,12619,1,2 };
static oid temperature_oid[] = { 1,3,6,1,4,1,12619,1,3 };

key_t key;
int shmid;
int *data;
int mode;
FILE *f;


/* create the identifier file*/
if((f=fopen("/tmp/meter","w")) == NULL)
{
perror("fopen");
exit(1);
}

/* close it*/
fclose(f);

/* make the key: */
if ((key = ftok("/tmp/meter", 'R')) == -1) {
perror("ftok");
exit(1);
}

/* connect to (and possibly create) the segment: */
if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) {
perror("shmget");
exit(1);
}

/* attach to the segment to get a pointer to it: */
data = shmat(shmid, (void *)0, 0);
m = (meter *) data;

if (data == (int *)(-1)) {
perror("shmat");
exit(1);
}


DEBUGMSGTL(("ufrgs", "Initializing\n"));

}

E na requisição MODE_GET de cada variável lemos o valor que nos foi enviado pela aplicação GTK (discutida abaixo):

case MODE_GET:

speed = (u_long) m->speed;
snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &speed, sizeof(speed));
break;

Na aplicação GTK abrimos a região de memória (mesmo código de init_ufrgs) compartilhada e escrevemos os valores lidos dos sliders:

void on_hscale1_value_changed(GtkRange *range, gpointer user_data){
gdouble vel;
vel = gtk_range_get_value(range);
m->speed = (int)vel;
}


void on_hscale2_value_changed(GtkRange *range, gpointer user_data){
gdouble rot;
rot = gtk_range_get_value(range);
m->rpm = (int)rot;
}


void on_hscale3_value_changed(GtkRange *range, gpointer user_data){
gdouble temp;
temp = gtk_range_get_value(range);
m->temperature = (int)temp;
}

Configurando placa Gigabit no Linux

A configuração da placa Broadcom NetXtreme BCM5705 Gigabit Ethernet no Linux é um processo simples.

Na configuração do kernel vá em “Device Driver” -> Ethernet (1000 Mbit) e marque a opção “Broadcom Tigon3 support”.

Compile o kernel normalmente, para carrega execute:

modprobe tg3

Pronto, pena que a rede aqui não funciona a 1Gigabit ainda 😦

Ubuntu fixando as interfaces de rede ao MAC

De repente você troca sua placa de rede e nada da Internet ou a rede funcionar. Você verifica os módulos, e vê que tudo está certo, mas nada da rede funcionar, o que será?

Simples, o Ubuntu criou um arquivo chamado /etc/iftab para associar as interfaces de rede ao seu número MAC, veja o conteúdo desse arquivo:

# This file assigns persistent names to network interfaces.
# See iftab(5) for syntax.
eth0 mac 00:50:BF:38:A1:0B arp 1

Se quiser sua nova placa de rede funcionando terá que adicionar o número MAC dela no lugar do MAC da placa de rede antiga.

Atualizacao: nas versoes mais novas do Ubuntu este arquivo foi alterado para um regra do sistema de hotplug, o arquivo em questão e’ /etc/udev/rules.d/70-persistent-net.rules