Mainline on Galaxy S3

After successfully getting UART working, the next thing to do is boot a mainline kernel. Fortunately, on i9300 we have something of a head start: Samsung has upstreamed some amount of support for "trats2", a variant of the GT-I9300 used as the reference device for Tizen. However, the i9300 and trats2 have different partition layouts and different bootloaders: I learned in IRC that trats2 has a version of Samsung's proprietary bootloader S-BOOT which chainloads u-boot.

Unfortunately, the older Samsung bootloader doesn't fully comply with Linux's requirements - namely, it doesn't properly disable the MMU before booting into Linux. Fortunately, a commit exists in the Android kernel to fix this. Nor do we get DTB support - so we have to use appended DTBs until another solution can be figured out. After applying that commit, and a few other commits from Wolfgang Wiedmeyer's experiments with running Replicant on mainline, we have a kernel that (should) boot. Now, we just have to boot it...

Coming from an Android background, I wasn't really sure where to start. Going straight to Android sounds attractive, but the overhead Android adds to a system is massive - spending an hour or two building an image, only to find it doesn't work is a big investment of time. Fortunately, buildroot exists. All it needs is a defconfig and two patches to build on Arch with a 4.13 target kernel, and we have something working (hopefully).

But first, one small hurdle: buildroot produces two files, rootfs.cpio.lzma and zImage.exynos4412-trats2 - we need to combine these, using abootimg. Fortunately, I have no shortage of reference boot.imgs for i9300 - all I need is the boot image config, and we're away:

$ abootimg --create boot.img -f bootimg-i9300.cfg -k zImage.exynos4412-trats2 -r rootfs.cpio.lzma

reading config file bootimg-i9300.cfg
reading kernel from zImage.exynos4412-trats2
reading ramdisk from rootfs.cpio.lzma
Writing Boot Image boot.img

The moment of truth

So, I flashed the boot.img from the device, using TWRP and dd, and rebooted.


(This image contains a few spoilers for upcoming posts, but you get the idea...)

And sure enough, on the serial console (after hitting "enter" once):

Welcome to Buildroot
(none) login:


What seems to be working in mainline for i9300 is:

  • Display (sort of - there seems to have been a regression in the DSI driver which causes some intermittent artifacting)
  • Touchscreen
  • Hardware keys
  • USB
  • UART
  • MMC

There's probably more that I haven't tested - but this is a pretty nice place to start hacking :)