Tive a oportunidade de ver rodando, no Nintendo DS, o sistema operacional GNU/Linux (DSLinux) , achei interessante e resolvi compartilhar...
Especificações de Hardware
- CPU
- ARM9 67Mhz (para o display touch screen)
- ARM7 33Mhz processors
- Memory: 4MB
- Screens:
- Upper Screen: A backlit, 3-inch, transmissive TFT color LCD with 256 x 192 pixel resolution and .24 mm dot pitch, capable of displaying 260,000 colors.
- Lower Screen: The same as top but with transparent analog touch screen
- Wireless Communication:
- 802.11
- Nintendo’s proprietary format
- Audio: Virtual surround sound, built-in stereo headphone / microphone jack
- Game cartridge slots: 1 DS slot, 1 Game Boy Advance / SP slot
- Size (closed): 133 millimeters (5.2 inches) wide, 73.9 millimeters (2.9 inches) long, 21.5 millimeters (0.85 inches) tall.
- Weight: (with DS cartridge installed) 9 oz.
- Power: Rechargeable lithium-ion battery, 6-10 hours continuous play depending on use per 4 hours recharging time
Instalação
Algumas fotos
Como vocês podem ver, o teclado é uma idéia bem interessante, utilizando o recurso touch screen do dipositivo.
Testei alguns aplicativos como o editor de textos vi, o sistema em algumas situações motrou-se instável, pelo menos a saída (fontes) no display, mas ainda não procurei saber os reais motivos.
dmesg
Linux version 2.6.14-hsc0ds (kineox@debian) (gcc version 4.0.4) #12 Wed Apr 2 13:01:10 CEST 2008
CPU: ARM946E [41009460] revision 0 (ARMvundefined/unknown)
Machine: Nintendo DS
Memory management: Non-Paged(unused/noMMU)
Ignoring unrecognised tag 0×00000000
On node 0 totalpages: 1024
DMA zone: 1024 pages, LIFO batch:1
Normal zone: 0 pages, LIFO batch:1
HighMem zone: 0 pages, LIFO batch:1
CPU0: D VIVT write-back cache
CPU0: I cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
CPU0: D cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
Built 1 zonelists
Kernel command line: rootfstype=romfs
PID hash table entries: 32 (order: 5, 512 bytes)
Console: colour dummy device 80×30
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 512 (order: -1, 2048 bytes)
Memory: 4MB = 4MB total
Memory: 1928KB available (1258K code, 265K data, 108K init)
Calibrating delay loop… 33.38 BogoMIPS (lpj=166912)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
NDS FIFO driver
NetWinder Floating Point Emulator V0.97 (double precision)
Console: switching to colour frame buffer device 64×32
fb0: Nintendo DS frame buffer device
fb1: Nintendo DS frame buffer device
Real Time Clock Driver v1.12
io scheduler noop registered
dldi: dldi1
NDS Wireless <bthaeler@aol.com>
uclinux[mtd]: RAM probe address=0x21985e4 size=0×76000
Creating 1 MTD partitions on “RAM”:
0×00000000-0×00076000 : “ROMfs”
uclinux[mtd]: set ROMfs to be root filesystem
mice: PS/2 mouse device common for all mice
nds_ts: Driver version 0.0.1 loaded
Advanced Linux Sound Architecture Driver Version 1.0.10rc1 (Mon Sep 12 08:13:09 2005 UTC).
ALSA device list:
#0: Nintendo DS sound
NET: Registered protocol family 2
IP route cache hash table entries: 64 (order: -4, 256 bytes)
TCP established hash table entries: 256 (order: -2, 1024 bytes)
TCP bind hash table entries: 256 (order: -2, 1024 bytes)
TCP: Hash tables configured (established 256 bind 256)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 108K
CPU: ARM946E [41009460] revision 0 (ARMvundefined/unknown)
Machine: Nintendo DS
Memory management: Non-Paged(unused/noMMU)
Ignoring unrecognised tag 0×00000000
On node 0 totalpages: 1024
DMA zone: 1024 pages, LIFO batch:1
Normal zone: 0 pages, LIFO batch:1
HighMem zone: 0 pages, LIFO batch:1
CPU0: D VIVT write-back cache
CPU0: I cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
CPU0: D cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
Built 1 zonelists
Kernel command line: rootfstype=romfs
PID hash table entries: 32 (order: 5, 512 bytes)
Console: colour dummy device 80×30
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 512 (order: -1, 2048 bytes)
Memory: 4MB = 4MB total
Memory: 1928KB available (1258K code, 265K data, 108K init)
Calibrating delay loop… 33.38 BogoMIPS (lpj=166912)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
NDS FIFO driver
NetWinder Floating Point Emulator V0.97 (double precision)
Console: switching to colour frame buffer device 64×32
fb0: Nintendo DS frame buffer device
fb1: Nintendo DS frame buffer device
Real Time Clock Driver v1.12
io scheduler noop registered
dldi: dldi1
NDS Wireless <bthaeler@aol.com>
uclinux[mtd]: RAM probe address=0x21985e4 size=0×76000
Creating 1 MTD partitions on “RAM”:
0×00000000-0×00076000 : “ROMfs”
uclinux[mtd]: set ROMfs to be root filesystem
mice: PS/2 mouse device common for all mice
nds_ts: Driver version 0.0.1 loaded
Advanced Linux Sound Architecture Driver Version 1.0.10rc1 (Mon Sep 12 08:13:09 2005 UTC).
ALSA device list:
#0: Nintendo DS sound
NET: Registered protocol family 2
IP route cache hash table entries: 64 (order: -4, 256 bytes)
TCP established hash table entries: 256 (order: -2, 1024 bytes)
TCP bind hash table entries: 256 (order: -2, 1024 bytes)
TCP: Hash tables configured (established 256 bind 256)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 108K
Um fato que achei interessante
O Nintendo DS não tem uma unidade de gerenciamento de memória (da sigla em inglês, MMU), e tem apenas 4 MB de RAM. Para contornar essa limitação, tanto o kernel como o espaço do usuário (userspace) utilizam a técnica XIP (do inglês, execute in place) que permite executar o programa no mesmo local em que ele é armazenado; além de uma alocação de memória SLOB (que preza pela economia de espaço). Depois, surgiram expansões que ofereciam 32 MB adicionais. Contudo, adicionar suporte a essa RAM externa não foi trivial, pois o barramento do slot GBA (para expansão de memória) suporta apenas escritas de 16 bits e o sistema envia ao barramento apenas 8 bits, resultando sempre em pedaço com lixo na memória. Um desenvolvedor do DSLinux chamado Amadeus encontrou uma solução para o problema, que consiste na substituição da instrução “strb” (store byte) do assembly do processador ARM para a instrução “swpb” (swap byte). A instrução swpb primeiro lê o conteúdo do endereço requisitado, colocando na cache, então uma escrita de 8 bits é feita na cache. Mais tarde, quando a linha da cache for utilizada, uma escrita de 16 bits é efetuada, dessa forma eliminando as escritas de 8 bits no barramento. Amadeus também modificou o gerador de códigos para ARM do GCC para que as aplicações compiladas para o DSLinux agora possam usufruir das instruções swpb. A mudança no código-fonte do kernel deve ser feita através de um patch.
Conclusão
O Nintendo DS é um ótimo video game de mão, relativamente barato no mercado americano, e mais uma vez podemos provar a capacidade de adaptação do kernel do Linux nos mais variados dispositivos.
Links:
Nenhum comentário:
Postar um comentário