Switch-Linux
It's Linux for Switch.
Should I Be Using This?
Probably not, this repo has no hardware acceleration and I didn't anticipate fail0verflow releasing their Linux sources so soon (I thought I'd probably be developing this for at least another month or so). Either way, you probably want this and I don't really plan on contributing here.
I'll leave the repo up though to at least showcase how far I got with ~a week of development, probably could have gotten farther with some more time, maybe this will end up being retrofitted later :)
Requirements
- u-boot running from either TrustZone takeover or bootrom hax. Neither is provided currently, however Switch-compatible u-boot can be found here
- A properly-formatted SD card. Instructions can be found below in Compiling, Installation and Setup
Notes on PSCI
- Nintendo's Horizon OS TrustZone component can provide PSCI calls which work for Linux (given patches provided on the repo). By default, the device tree is configured for Linux running from u-boot packaged in Nintendo's package2, with all PSCI calls being sent to SMC #1 instead of SMC #0.
- Use of other trusted firmwares with PSCI on SMC #0 should be able to remove the need for these patches, however it is untested currently.
Notes on debugging
- By default, the right Joy-Con rail is used for UART logging output, with pin 5 being the console's TX, and pin 8 being the console's RX. See here for details.
Compiling, Installation and Setup
Installation of u-boot will depend on loading methods used. However once u-boot is installed, the following instructions can be used:
- Make sure your SD card is formatted with MBR partitioning, with the first partition being FAT32/exFAT and a second for ext3/ext4. If ext4 has issues booting, try ext3.
- Download the generic ALARM image here and follow the instructions provided to install the filesystem to the ext3/ext4 filesystem on your SD card. You may need a Linux box to do these steps.
- Clone linux-next using
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
cd linux-next && git checkout v4.15
- Apply the provided patches in the repo using
git am -3 -k <patch file>
- NVIDIA has microcode required for their host1x/DRM subsystems. This should be compiled into the kernel or initramfs for early screen init.
- Download the linux-firmware package from here
mkdir extra_firmware
- Copy
nvidia/tegra210/vic04_ucode.bin
andnvidia/tegra210/xusb.bin
from the package tolinux-next/extra_firmware/nvidia/tegra210/vic04_ucode.bin
andlinux-next/extra_firmware/nvidia/tegra210/xusb.bin
- It should be noted that while this may be useful for easy debugging, generated kernel images will be dirty and not strictly GPL compliant. It is recommended that, for image-based releases, that these files be installed to the initramfs.
- TODO: These are pulled from the actual root partition (with linux-firmware installed to it) if panels are loaded as modules.
- Ensure that you have an AArch64 cross-compiler installed.
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
mkdir -p build/hac-001/
make O=build/hac-001/ hac_defconfig
make O=build/hac-001/ -j4 Image
- Copy the Image file from
build/hac-001/arch/arm64/boot/Image
to theboot/
folder on your SD card's FAT partition. - In this repo,
mkimage -A arm -T script -O linux -d u-boot/boot.txt u-boot/boot.scr
and copyboot.scr
to theboot/
directory on the FAT partition of your SD card. make O=build/hac-001/ -j4 modules
sudo -E make O=build/hac-001/ modules_install INSTALL_MOD_PATH=/path/to/ALARM/rootfs/
- ALARM has a default initramfs which needs to be wrapped for u-boot.
mkimage -A arm -T ramdisk -C gzip -d /path/to/initramfs-linux.img /path/to/FAT/boot/initramfs.uImage
- In the repo,
cd device-tree && sh build.sh && cp tegra210-hac-001.dtb /path/to/FAT/boot/
- Your FAT
boot/
directory should haveImage
,initramfs.uImage
, andtegra210-hac-001.dtb
- Boot through u-boot. If an error has occurred, it will open a USB mass storage device for the SD card.
TODO
- Get USB working
- Get WiFi/BT(?) working
- Get nouveau working
- Get audio working
- Get touchscreen working
- DVFS work?
- DisplayPort? Switch dock drivers?
- Probably a lot more stuff.