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.
Running FreeBSD in Qemu-neo1973
A FreeBSD port is only ready for kernel developers.
You will need:
- mkimage from u-boot. It's available in ports in devel/u-boot
- makefs from ports in sysutils/makefs
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
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.
From the qemu directory run
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
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.
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 :)
- 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 (??)
u-boot header size: 64 Bytes elf header size: ??