So, I have a barebones version of MeeGo (barely) running on the Nexus S. I can't really do much with it on my own, but I'm posting the info here so you can build it and try it for yourself.
I have my boot.img (kernel + ramdisk) and a MeeGo kickstart file at http://blog.steventroughtonsmith.com/2011/01/nexus-s-meego.html; you can use fastboot to boot the image, or flash it to the recovery partition to dual boot. The actual MeeGo rootfs is run from a rootfs.ext2 file you can drop onto the Nexus S using Mass Storage mode - no need for messy flashing or the like, you can thank me later).
There's not much else I can do on my own right now, so if you want to see anything become of this do get involved!
My kernel is Samsung stock; you will need to modify it to get X11 to run:
The only change was modifying the .config file to turn on CONFIG_VT (needed for X11, unless we recompile X11 without VT support).
Will add this to a newer kickstart, but for the time being, you can bring the brightness to full by doing:
dmesg output is available on Talk:ARM/Hummingbird.
WORK IN PROGRESS, I'M STILL ADDING INFO! - 16/2/2011 If you're in a desperate hurry then feel free to catch me (lardman) on #meego-arm and pick my brain/add info/make changes here/etc. :)
Not tried yet:
If you would like to help, have questions, ideas, etc., please catch me (lardman) in #meego-arm
The idea here is to boot Meego from the external SD card (similar to the N900 Meego boot process.)
Currently this requires that you flash a new, slightly modified, kernel to your Tab.
The Tab kernel contains an initramfs which contains an Android version of init which brings the system up.
With Android devices, there is normally a hardware key you can press at boot time to specify whether you want to enter flashing mode or recovery mode (and no keypress indicates a normal startup.) On the Tab the flashing key is the volume down button and the recovery button is the volume up button.
With most Android devices the normal and recovery boots load different kernels (located on different partitions.) This is nice as it means one does not need to modify the normal Android kernel at all, but can still mess about with other kernels in the recovery kernel partition (e.g. to try booting Meego, at the expense of no recovery mode, which is not a big problem.) But, in their infinite wisdom, Samsung decided that both normal and recovery modes would use the same kernel on the Tab. Rather than booting a completely separate kernel, the Tab boots the same kernel and the Android-specific init somehow recognises which mode was selected at boot time. It then proceeds to process either init.rc or recovery.rc. (the init binary looks for bootmode=* that gets added to the kernel command line --lilstevie)
Now this would give us an option of modifying the boot process, but the major problem is that while the Android init should support an exec command, this is not implemented in the version we have, and therefore even if we modify the recovery.rc file to try to start our own script to switch_root, etc., it won't work. The Android init used in the Tab is not stock Google code and there is no source available for the modifications. (gingerbread samsung init supports exec, fingers crossed it is released soon --lilstevie)
Therefore I've renamed the Android init and replaced with it an init script which searches for Meego installations (btrfs partitions on the external SD card, or loop images) and if these are not found exec's the renamed Android init, which goes on its merry way and starts Android just like normal.
Work in progress!
We only actually alter the kernel, so this is the only one you need to backup, but you may as well do the whole lot just in case. Note that you need to "root" your Tab to be able to use these commands. Also note that this assumes you know how to use adb.
Chose a location to create the backups, e.g. /sdcard
mkdir backup cd backup adb shell su -c "dd if=/dev/block/bml1 of=/sdcard/boot.bin bs=4096" adb shell su -c "dd if=/dev/block/bml2 of=/sdcard/pit.pit bs=4096" adb shell su -c "dd if=/dev/block/stl3 of=/sdcard/efs.rfs bs=4096" adb shell su -c "dd if=/dev/block/bml4 of=/sdcard/Sbl.bin bs=4096" adb shell su -c "dd if=/dev/block/stl6 of=/sdcard/param.lfs bs=4096" adb shell su -c "dd if=/dev/block/bml7 of=/sdcard/zImage bs=4096" adb shell su -c "dd if=/dev/block/stl9 of=/sdcard/factoryfs.rfs bs=4096" adb shell su -c "dd if=/dev/block/stl10 of=/sdcard/dbdata.rfs bs=4096" adb shell su -c "dd if=/dev/block/stl11 of=/sdcard/cache.rfs bs=4096" adb shell su -c "dd if=/dev/block/bml12 of=/sdcard/modem.bin bs=4096" adb shell su -c "tar -czvf /sdcard/data.tar.gz /data" adb pull /sdcard/param.lfs . adb pull /sdcard/zImage . adb pull /sdcard/factoryfs.rfs . adb pull /sdcard/dbdata.rfs . adb pull /sdcard/cache.rfs . adb pull /sdcard/modem.bin . adb pull /sdcard/efs.rfs . adb pull /sdcard/boot.bin . adb pull /sdcard/Sbl.bin . adb pull /sdcard/pit.pit . adb pull /sdcard/data.tar.gz .
Grab the kernel source code from http://opensource.samsung.com/ Follow: Mobile > Mobile Phone > GT-P1000 > GT-P1000_OpenSource.zip. There is a new GT-P1000_OpenSource_Update1.zip but I've not tried that, please do tell if it works or works better ;)
[GERO@LIKEMAG] Please note that the GT-P1000_OpenSource_Update1.zip has been updated at least twice on the Samsung server. I got the newest version today. They included some more drivers and fixed some minor bugs but removed the TinyFSR config option (by accident?) - You have to manually modify Kbuild and Makefile in drivers to get TinyFSR!!!
Extract the source, follow the instructions in the readme.txt to grab the cross-compiler and edit the relevant settings in the build_kernel.sh script.
Note that we use the same source and toolchain so that the PVR kernel modules will still work (as we're dual booting Android)
Try compiling to see if it all works. It should do. If you get the following warning "WARNING: modpost: Found 13 section mismatch(es).", don't worry, that appears to be normal (!)
Note that we could try enabling kexec if we find that keeping compatibility with the Android kernel is too limiting and then kexec away to our less constrained kernel. Need to test this.
Steph added the following line to the beginning of the %post section to create the modules directory: i.e. mkdir -p $INSTALL_ROOT/lib/modules/184.108.40.206/kernel/
The kickstart has a bunch of configuration changes versus a typical N900 one, largely pertaining to the touchscreen and virtual keyboard behaviour. The other major change is the inclusion of several files into the image from both the Android initramfs and Galaxy Tab filesystem. These need to be prepared before building the image with MIC2 (We could extract these at runtime, but currently are setup for them to be pre-extracted and added to the Meego partition. Make some notes about location of these files and alternative methods of extracting at runtime.)
The adbd daemon, wireless driver blob and configuration must be pulled from the Tab with adb (the following assumes that the 'extras' directory is in the the directory from where you're going to be launching mic-image-creator):
mkdir -p extras/wifi adb pull /sbin/adbd extras/ adb pull /system/etc/wifi/bcm4329_sta.bin extras/wifi/ adb pull /system/etc/wifi/nvram_mfg.txt extras/wifi/
The following must be pulled from the initramfs, itself extracted from the Galaxy Tab /zImage. initramfs_extractor.sh was retrieved from here:
adb pull /zImage . ./initramfs_extractor.sh zImage mkdir exploded && cd exploded # This throws an error but seems to get far enough for what we need cpio --no-absolute-filenames -ivd < ../initramfs.cpio cd ../ # Got two sets of modules here, we need both? mkdir extras/modules cp -R exploded/modules/* extras/modules/ cp -R exploded/lib/modules/* extras/modules/
Where does rc.local come from? is it also the one from the initramfs or is it lardman's from here (Steph suspects the latter?)
sudo mic-image-creator --run-mode=0 \ --cache=/home/simon/development/meego/build/mycachedir/ \ --format=raw \ --arch=armv7l \ --config=./meego-handset-armv7l-galaxy-tab-220.127.116.11.20110118.5.ks
Once the image has been built, copy it to the microSD card:
dd if=<image name> of=/dev/<sd card device> bs=4M
Not Yet Tested:
The 2 options for RootFS are Download a prebuilt image or generate your own.
rootstock --fqdn GalaxyTab --login ubuntu --password ubuntu --imagesize 5G --seed netbook-launcher-efl,onboard,ubuntu-netbook-efl-default-settings,wicd,wicd-curses,wicd-cli
After following these steps you will have your own generated rootfs.tgz ready to be extracted in to your Galaxy tab, A pre-prepared image will be available for download soon.
Before Continuing any further please follow the steps provided above in the tutorial above about backing up your system, The install process is destructive to /data so backing it up if you want to go back to android is a good idea.
This step is done in recovery and requires running some commands via ADB, if you are not comfortable with this DO NOT PROCEED. This part of the install will have a script to help the install some time in the future.
Adding more info today as I do a new build (to help me remember the steps!) - lardman 9th April 2011
This assumes that you have experience building your own kernel.
These instructions are by no means complete at this time, more concise instructions will come soon, as well as prebuilt images to make installation slightly easier (Prebuilt combined with install scripts should be easier than all of this ever could be)