FreeBSD
From Openmoko
FreeBSD is NOT ready to be used on the Neo Freerunner or Neo 1973, do not try unless you know what you are doing and are able to help porting. It will only get to single user mode with a very cut down root filesystem.
Interested in using FreeBSD on the Neo1973 or as a Host OS? Get in touch with andrew -at- fubar.geek.nz, they are currently exploring what to do about this.
Contents |
Running FreeBSD in Qemu-neo1973
A FreeBSD port is only ready for kernel developers.
Required tools
You will need:
- mkimage from u-boot. It's available in ports in devel/u-boot
- makefs from ports in sysutils/makefs
Qemu
To build Qemu on FreeBSD to test and develop FreeBSD on the Neo's:
- Use subversion to checkout https://svn.openmoko.org/trunk/src/host/qemu-neo1973
- In gnokiigsm/device.h comment out the declaration for device_read and device_write, see Talk:Openmoko under QEMU#FreeBSD_and_Qemu...
- Edit Makefile.target, search for the line LIBS+=-lm and insert "-L/usr/lib" before "-lm"
- If your running FreeBSD on an AMD64 edit x86_64.ld and remove all occurrences of ONLY_IF_RO and ONLY_IF_RW
- Run ./configure --target-list=arm-softmmu and gmake
- Edit openmoko/flash.sh to add kernel_image="/path/to/kernel.boot" between the calls to most_recent and where it prints the kernel image it will use
Building FreeBSD
You will need to download http://fubar.geek.nz/files/freebsd/neo1973/neo-20080629.tar.bz2 to build FreeBSD for the Neo1973.
From the FreeBSD src tree run:
make buildworld TARGET=arm TARGET_ARCH=arm TARGET_CPUTYPE=arm920t make installworld TARGET=arm TARGET_ARCH=arm TARGET_CPUTYPE=arm920t DESTDIR=/path/to/root/fs
You will now need to trim down /path/to/root to remove things noot needed to test in single user mode
makefs -B little /path/to/root.ufs /path/to/root/fs make buildkernel TARGET=arm TARGET_ARCH=arm TARGET_CPUTYPE=arm920t KERNCONF=NEO1973 -DNO_MODULES MFS_IMAGE=/path/to/root.ufs mkimage -A arm -O freebsd -T kernel -C none -a 30008000 -e 300080e0 -n "FreeBSD" -d /usr/obj/path/to/kernel /usr/obj/same/path/kernel.boot
You will now have a copy of FreeBSD that is able to be loaded by u-boot.
Running FreeBSD
From the qemu directory run
./openmoko/download.sh ./openmoko/flash.sh
This will fetch the required parts and create an image to run. They require you to have bash installed.
Finally run qemu with
arm-softmmu/qemu-system-arm -M gta01 -m 130 -mtdblock openmoko/openmoko-flash.image -kernel openmoko/openmoko-kernel.bin -usb -show-cursor
It will display "Kernel loading..." with no further messages.
You can append
-serial telnet:localhost:1200,server
to the qemu startup line to start a telnet server which represents the serial console, just
telnet localhost 1200
and qemu will go on with the startup process.
Useful pages
Next steps
- DMA
- Drivers:
- LCD
- USB
Using a Kernel Testimage
Another method of getting the kernel into the neo is to use an image for the emulated sd card. I already have a file called sd.img ( dd'ed from a 32mb usb stick).
cp /usr/obj/arm/usr/src/sys/NEO1973/kernel . /usr/obj/arm/usr/src/tmp/usr/bin/objcopy -O binary kernel sudo mdconfig -a -t vnode -f sd.img sudo mount_msdosfs /dev/md0s1 /mnt/tmp sudo cp kernel /mnt/tmp/ sudo umount /mnt/tmp sudo mdconfig -d -u 0 arm-softmmu/qemu-system-arm -M neo -m 130 -mtdblock openmoko/openmoko-flash.image -kernel openmoko/openmoko-kernel.bin -sd sd.img -usb -show-cursor -serial telnet:localhost:1200,server
In another terminal:
telnet localhost 1200 mmcinit fatload mmc 0 0x30008000 kernel go 0x30008000
And wait for the crash :)
Kernel Constants
- KERNVIRTADDR is the virtual address at which the kernel is loaded (and linked) (0xc0008000)
- KERNPHYSADDR is the physical address at which the kernel is loaded (0x30008000)
- PHYSADDR is the physical address of the RAM (0x30000000)
- KERNBASE is the virtual address of the beginning of the kernel virtual address space (0xc0000000)
- STARTUP_PAGETABLE_ADDR is a physical address, suitable for the very early pagetable we build in locore.S (0x30800000)
- FLASHADDR is the address of the flash, virtual or physical depending on what the loader does (??)
- LOADERRAMADDR the address at which the loader maps the RAM if we're running with the MMU enabled, and the physical address if not (??)
Headers
u-boot header size: 64 Bytes elf header size: ??