Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Linux på en Windows-PDA
Christer WeinigelWeinigel Ingenjörsbyrå AB
Vill ha en Linux-PDA
● Vad finns det att välja på?– Gamla HP Ipaq– Sharp Zaurus
● Ingen går att köpa längre.
Windows CE-PDA?
● Många att välja på
● Hitta en som borde gå att få in Linux på– Dokumentation– Linux-stöd– Vettig design– Billig
Processor
● De flesta kör ARM
● Intel StrongARM/XScale– Vanligast
● Texas Instruments OMAP– Mobiltelefoner
● Samsung
Acer n30
● Samsung S3C2410● TFT-skärm 320x200● Bluetooth● USB device och host
– Utbyggbarhet
Acer n30
● Det mesta är inbyggt i processorn– LCD– Touch– USB Host/Device– 3 Serieportar– SD/MMC– Ljud
● Det enda som saknas är Bluetooth
Samsung S3C2410
● Finns redan en Linux-port till processorn– HP Ipaq H1940
● Dokumentation finns på Samsungs WWW– Processorspecifikationer– Referensdesign– Application Notes– Exempelkod
Acer n30 + Linux = sant?
Det finns en sportslig chans att lyckas
Acer n30
● Köpte ett GPS-paket● Liten och söt● Testar med Windows CE
– Microsoft är bra på att göra patiens-spel– Stödet för USB Host i Windows CE är uselt
● Kass GPS-mjukvara
Bilder
● Bilder på hårdvaran– IMG_0934.jpg– IMG_0939.jpg
Inuti Acer n30
● Skruva isär och identifiera komponenter– Kristall 12.000– Processor: Samsung S3C2410– RAM: 2x Samsung 32MiByte SDRAM – Flash: Samsung 32MiByte NAND-flash– Ljud-codec: Philips UDA1380– RS232: Texas MA3243C
Inuti Acer n30
● Okända komponenter– TFT: Maxmega TD035STEB1– Bluetooth? Samsung BTTZ0902SA
● Kontaktkudde mot metall, förmodligen radio● Broadcom har liknande kretsar och samarbetar
med Samsung
– Microcontroller: Texas MSP430 1111A● Finns dokumentation på kretsen● Mjukvaran kan vara precis vad som helst
JTAG
● JTAG är en standard för “in circuit testing”● Kan användas för debugging● Kan styra alla I/O-pinnar● JTAG för Microcontroller
– Mät på pinnarna och jämför med databladet
● JTAG för processor– Svårt att mäta på en BGA, men det verkar
sannolikt
Undersök Windows CE
● CMD.exe och telnetd för Windows CE– Går att logga in och spara output
● Toolchain för Windows CE/arm– Buggig, men fungerar bra nog
● Läs på om Windows CE
Undersök Windows CE
● regdump– mmap av registren in i en applikation– Dumpa innehållet
● regdump och visa förändringar – Läs register under en tid och visa vilka bitar
som har ändrat sig
● changes– Scanna igenom alla register och visa vad som
ändrar på sig
Resultat
Config FunctionEINT8, both edges EINT9, both edges USB power? EINT10, both edges Output Output Output Output Blue LED EINT15, both edges Thumbwheel Pressed EINT16, both edges Thumbwheel Down EINT17, both edges Thumbwheel Up Input SD write protect switch Input XMON TouchnXPON TouchYMON TouchnYPON Touch
Mer resultat
● COM1 – finns på RS232-kretsen● COM2 – IrDA● COM3 – Bluetooth● I2C är aktiv hela tiden● Backlight styrs av GPB1 och TIMER0● Batteriet verkar inte vara direkt kopplat
till processorn
RS232
● Serieportar är bra– Lätt att konfigurera och använda– Finns på de flesta processorer– Kan behöva nivåkonvertering– Inte alltid så enkelt
● Den här gången stod det nästan “RS232” på en krets och det var uppenbart.
● Ibland behöver man leta ordentligt efter testpunkter
Alternativa kommunikationsvägar
● Andra sätt att få ut information– Ett alternativ är IrDA– Morse via lysdiod– Ljud ut som på iPod
RS232
● Vad kan man få ut via RS232?● Många enheter har en bootmonitor som
man kan få igång med lite magi– Testpunkt– Knappkombination
● Slå på n30 med power-knappen inne
RS232NBoot v2.1Apr 28 2004 16:09:42
SMDK2410 Bootloader Version 3.1 Built Sep 3 2004 16:43:32
Ethernet Boot Loader Configuration:---------------------------------------1) BLUETOOTH : Write MAC Address and Security Code MAC Address :00:02:78:38:C6:BE Security Code :4B61:7576:5462:7849:5468:5136:512B:40612) Boot delay: 15 seconds4) Reset TOC to default5) Startup image: DOWNLOAD NEW6) Program RAM image into Boot Media: ENABLED8) Kernel Debugger: ENABLED9) Format Boot Media for BinFSA) DOWNLOAD From: SDMMC
B) Support BinFS: ENABLEDD) DOWNLOAD image nowF) Low-level FORMAT Boot MediaL) LAUNCH existing Boot Media imageR) Read ConfigurationW) Write Configuration Right NowX) DOWNLOAD image to boot media, then LAUNCH it off the media---------------------------------------
Boota Linux
● Bootloader: HARET– Finns bara binärer på nätet och de fungerar
inte för mig– Finns lite gammal källkod– Nyare versioner fungerar på n30
● Skriv något eget: boot.exe– Börja enkelt: mmap av register och blinka
med den blå lysdioden
Boota Linux
● Lite svårare– Allokera minne– Kopiera lite kod till minnet– Krascha Windows CE
● Stäng av alla interrupt
– Hoppa till den fysiska adressen– Blinka med blå lysdiod
Boota Linux
● Lite mer användbar bootloader– Konfigurera serieporten– Skriv ut lite meddelanden
Boota Linux
● Lite bättre version– Läs en zImage från disk– Allokera minne >32MiByte och lägg den där– Bygg upp en struktur som pekar ut
minnesblocken– Bootloader som pusslar ihop de olika
minnesblocken till <32MiByte– Hoppa till zImage– Se “Uncompressing Kernel”
Boota Linux
● Bild på skräp på skärmen– IMG_0952.jpg
Boota Linux
● Fast det fungerar inte– Stäng av DMA– Rensa cachen
● Linux bootar!– Bara seriekonsol– Hårdkodad minnesstorlek– Okänd maskintyp– Inget rootfilsystem
Linux på riktigt
● Modifiera bootloadern så att den sätter upp en tag-struktur– Machine Type
● Gör att samma kärna kan användas på flera olika enheter
– Hur mycket RAM som finns i systemet– Kommandorad– Peka ut en ramdisk-image
Fungerande system
● Kan boota Linux-kärna och ramdisk● Kan logga in via serieporten● Program för att dumpa registren igen● Hitta några pinnar som jag inte kunde
hitta under Windows CE– Power-knapp– Reset-knapp
● Styra pinnar och se vad som händer
Linux kan redan
● Ben Dooks har gjort mycket jobb på Samsung S3C2410-stödet i Linux 2.6
● Arnaud Patard har skrivit en hel del drivrutiner, bland annat för LCD
● HP Ipaq H1940
Lägg till hårdvara
● Struktur som beskriver vilken hårdvara som finns
linux/arch/arm/mach-s3c2410/mach-n30.c
static struct platform_device *n30_devices[] = { &s3c_device_lcd,};
Konfigurera hårdvaran
● Mer specifik information om hårdvaranstatic struct s3c2410fb_mach_info n30_lcdcfg = { .width = 240, .height = 320, .xres = {240,240,240}, .yres = {320,320,320}, .bpp = {16,16,16},
.lpcsel = 0x06, .fixed_syncs = 1, .regs = { .lcdcon1 = S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(0x0A),
.lcdcon2 = S3C2410_LCDCON2_VBPD(1) | S3C2410_LCDCON2_LINEVAL(319) | S3C2410_LCDCON2_VFPD(2) | S3C2410_LCDCON2_VSPW(1),
.lcdcon3 = S3C2410_LCDCON3_HBPD(39) | S3C2410_LCDCON3_HOZVAL(239) | S3C2410_LCDCON3_HFPD(2),
Fungerar ju
● Bild på Linux som bootat– IMG_0954.jpg
Bygg en ramdisk
● OpenEmbedded– Stor och klumpig
● Gör nåt eget– Jobbigt– Jag har gjort det för många gånger redan
● Buildroot– Avknoppning från uClibc-projektet
Mer hårdvara
● Lägg till mer hårdvarustöd– USB HOST
● Standard OHCI● USB-tangentbord
– USB Device– SD/MMC– NAND-flash
● Bara read/only än så länge, jag vågar inte skriva till flash än
Ännu mer hårdvara
● Touchen strulade, drivrutinen var inte riktigt färdig– Drivrutinshackande– Instabil touch med samma inställningar som
för H9140– Dumpa register under Windows CE igen och
försök lista ut hur det gör där– Stabil touch
Microcontroller
● Mät på microcontrollern– En I2C-buss– ...tror jag– Verkar vara en klocka och data– Mät lite mer– Enklare än vad jag trodde– Windows CE läser från en enda adress– Får tillbaka en byte med procent batteri kvar
● Testa samma sak under Linux
Status efter två veckor
● Mycket hårdvara fungerar● Det som saknas är
– Ljud● ljudchipet har en I2C-buss och en I2S-buss● Processorn har en I2C-buss och en I2C-buss● Hur svårt kan det vara?
– Skrivning till NAND-flash● Inte svårt, men jag vågar inte
– Sleep mode● Svårt
Skriva till Flash
● Få igång JTAG● Löd på en JTAG-kabel
– IMG_1062.jpg– jtag.jpg
● Titta på lite olika JTAG-program● Till slut blev det sjflash från Samsungs
sidor– Kass kod men gick fort att modifiera
Skriva till Flash
● Dumpa innehållet i flash från Linux● Dumpa innehållet i flash via JTAG● Lista ut att GPC5 styr Write Protect● Radera och skriv en tom sida
Windows CE Bootloader
● Börja titta på vad den inbyggda bootloadern gör
● Titta på meddelanden från serieporten● Uppgradera Windows CE med hjälp av
bootloadern● Titta på meddelanden på serieporten● Hitta motsvarande värden i Flash och i
Windows CE-imagen
Windows CE Bootloader
● msdn.microsoft.com● xda-developers.com● Strukturer
– TOCEntry– ROMHDR– PTABLE– PartEntry– XIPEntry
● Bygg en Linux-image i samma format
Laga drivrutiner
● Förut så litade jag på att Windows CE hade initierat allt
● Nu var jag tvungen att fixa drivrutinerna så att de klarar av att initiera hårdvaran själva
● Skapa ett JFFS2-filsystem i resten av flash
Sleep mode
● Bra om PDAn kan sova● Ska klara sig nån vecka på en laddning
och normalt användande● Disassemblera den existerande
bootloadern– Den väcker up RAM – Hoppar till 0x20100
● Lägg lite kod på samma plats som hoppar till rätt ställe i Linux-kärnan
Ljud
● Läs datablad● Modifiera en existerande drivrutin● Inse att ljudchipet inte alls pratar I2C utan
bitbangar via några andra pinnar● Fungerande ljud till slut
Resultat
● Jag har en fungerande Linux-PDA● Allt fungerar● Tyvärr så säljs inte Acer n30 längre
Saker man kan handla
● Acer n35– Samma grunddesign– Ett halvdussin pinnar som har andra
funktioner– Bluetooth är utbytt mot en GPS-mottagare
● Navman PiN 570– 99% samma design som Acer n35
● Båda går att handla idag
Sammanfattning
● Så mycket känd hårdvara som möjligt● Plocka isär och identifiera hårdvaran● Läs datablad● Mät, oscilloskop, mätinstrument● Serieportar är bra● JTAG● Undersök befintliga system● Tänk
Länkar
● Min Acer n30-sida– http://zoo.weinigel.se/n30/
● Handhelds n30-wiki– http://handhelds.org/moin/moin.cgi/AcerN30
● XDA-Developers, HTC-hackande– http://www.xda-developers.com/