Difference between revisions of "Linux"

From freemyipod.org
Jump to: navigation, search
Line 20: Line 20:
 
First, wInd3x: this will be used to run u-boot.
 
First, wInd3x: this will be used to run u-boot.
  
  $ git clone https://github.com/freemyipod/wInd3x
+
$ git clone https://github.com/freemyipod/wInd3x
  $ cd wInd3x
+
$ cd wInd3x
  $ go build ./cmd/wInd3x
+
$ go build ./cmd/wInd3x
  
 
Second, U-Boot:
 
Second, U-Boot:
  
  $ git clone https://github.com/freemyipod/u-boot
+
$ git clone https://github.com/freemyipod/u-boot
  $ cd u-boot
+
$ cd u-boot
  $ git checkout s5l87xx
+
$ git checkout s5l87xx
  $ make apple_ipodnano2g_defconfig # for Nano 2G OR
+
$ make apple_ipodnano2g_defconfig # for Nano 2G OR
  $ make apple_n33_defconfig # for Nano 5G OR
+
$ make apple_n33_defconfig # for Nano 5G OR
  $ make apple_n31_defconfig # for Nano 7G
+
$ make apple_n31_defconfig # for Nano 7G
  $ make CROSS_COMPILE=arm-none-eabi- u-boot.bin -j $(nproc)
+
$ make CROSS_COMPILE=arm-none-eabi- u-boot.bin -j $(nproc)
  
 
Third, Linux:
 
Third, Linux:
  
  $ git clone https://github.com/freemyipod/linux
+
$ git clone https://github.com/freemyipod/linux
  $ cd linux
+
$ cd linux
  $ git checkout n5g-wip # for Nano 5G OR
+
$ git checkout n5g-wip # for Nano 5G OR
  $ git checkout n7g-wip # for Nano 7G
+
$ git checkout n7g-wip # for Nano 7G
  $ make ARCH=arm nano5g_defconfig
+
$ make ARCH=arm nano5g_defconfig
  $ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j $(nproc) zImage
+
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j $(nproc) zImage
  
 
By this point, have a initramfs ready. If you wanna boot directly from nfs, edit CMDLINE in the kernel .config accordingly.
 
By this point, have a initramfs ready. If you wanna boot directly from nfs, edit CMDLINE in the kernel .config accordingly.
Line 47: Line 47:
 
Finally, bundle together an u-boot image containing the kernel, your initramfs, and the device-tree (built by u-boot):
 
Finally, bundle together an u-boot image containing the kernel, your initramfs, and the device-tree (built by u-boot):
  
  $ mkimage -A arm -C none -O linux -T multi -a 0x08000000 -e 0x08000000 -d arch/arm/boot/zImage:initramfs.gz:../u-boot/arch/arm/dts/s5l8730.dtb mImage
+
$ mkimage -A arm -C none -O linux -T multi -a 0x08000000 -e 0x08000000 -d arch/arm/boot/zImage:initramfs.gz:../u-boot/arch/arm/dts/s5l8730.dtb mImage
  
 
''mImage'' is your combined image.
 
''mImage'' is your combined image.
Line 57: Line 57:
 
Run u-boot using wInd3x:
 
Run u-boot using wInd3x:
  
  $ ./wInd3x cfw run ../u-boot/u-boot.bin
+
$ ./wInd3x cfw run ../u-boot/u-boot.bin
  
 
This should start u-boot. Running this for the first time will take a while, as some bootloader stages need to be downloaded, decrypted and modified. A new USB device (05ac:2137) appear on your host. Use dfu-util to upload mImage:
 
This should start u-boot. Running this for the first time will take a while, as some bootloader stages need to be downloaded, decrypted and modified. A new USB device (05ac:2137) appear on your host. Use dfu-util to upload mImage:
  
  dfu-util -d 05ac:2137 -D linux/mImage -R
+
dfu-util -d 05ac:2137 -D linux/mImage -R
  
 
Then, in the serial console you'll see Linux booting:
 
Then, in the serial console you'll see Linux booting:
  
  ## Booting kernel from Legacy Image at 08000000 ...
+
## Booting kernel from Legacy Image at 08000000 ...
  ...
+
...
  Starting kernel ...
+
Starting kernel ...
 
+
  [    0.000000] Booting Linux on physical CPU 0x0
+
[    0.000000] Booting Linux on physical CPU 0x0
  [    0.000000] Linux version 6.2.0-rc4-00476-g4c4af4d7e53c (q3k@mimeomia) (arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release), GNU ld (GNU Arm Embedded Toolchain 10.3-2021.10) 2.36.1.20210621) #70 Fri Jan 20 18:02:56 CET 2023
+
[    0.000000] Linux version 6.2.0-rc4-00476-g4c4af4d7e53c (q3k@mimeomia) (arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release), GNU ld (GNU Arm Embedded Toolchain 10.3-2021.10) 2.36.1.20210621) #70 Fri Jan 20 18:02:56 CET 2023
  ...
+
...
  
 
The LCD display should start up and show a boot log. If not, try adding <code>console=tty0</code> to your CMDLINE? You might also use <code>fbcon=rotate:1</code> to rotate the framebuffer 90 degrees.
 
The LCD display should start up and show a boot log. If not, try adding <code>console=tty0</code> to your CMDLINE? You might also use <code>fbcon=rotate:1</code> to rotate the framebuffer 90 degrees.
  
 
If everything goes well, the kernel should boot up and attempt to mount a rootfs. It's up to you to get this part working, at least until we streamline the process. The USB CDC EEM ethernet gadget should also appear on your host (probably as usb0, or some long systemd predictable name). The other end will be visible as 'usb0' on the device.
 
If everything goes well, the kernel should boot up and attempt to mount a rootfs. It's up to you to get this part working, at least until we streamline the process. The USB CDC EEM ethernet gadget should also appear on your host (probably as usb0, or some long systemd predictable name). The other end will be visible as 'usb0' on the device.
 +
 +
On [[Nano 7G]] you'll need a DCSD cable (Alex/Magico), and the command line to get proper serial output:
 +
 +
picocom --baud 115200 --imap lfcrlf /dev/ttyUSB0
  
 
Now go on and have a go at reverse-engineering some peripherals! :)
 
Now go on and have a go at reverse-engineering some peripherals! :)

Revision as of 13:13, 27 December 2025

Current: Freemyipod Linux

We are working on supporting Samsung/S5L-based devices which have an MMU. Currently our main focus is the iPod nano (5th generation), there are also builds for iPod nano (2nd generation) and iPod nano (7th generation). An experimental source tree is available on github.com/freemyipod/linux.

User Guide

Not yet available, as the Linux port isn't yet practical to use. We have no storage drivers, no screen driver, no sound driver...

Developer Guide

If you're somewhat familiar with embedded Linux, you can get started by building wInd3x, U-Boot and the Kernel as described below. However, you will have to provide your own userland (eg. buildroot, archlinux arm, ... anything armv6 compatible) and either run it from an initramfs or over NFS. A serial cable is not necessary, but very useful to troubleshoot boot issues.

Build everything

These are not copy-paste instructions. You are expected to understand what's happening.'

You will need an arm-none-eabi- toolchain into your $PATH, eg. gcc-arm-embedded from your package manager.

First, wInd3x: this will be used to run u-boot.

$ git clone https://github.com/freemyipod/wInd3x
$ cd wInd3x
$ go build ./cmd/wInd3x

Second, U-Boot:

$ git clone https://github.com/freemyipod/u-boot
$ cd u-boot
$ git checkout s5l87xx
$ make apple_ipodnano2g_defconfig # for Nano 2G OR
$ make apple_n33_defconfig # for Nano 5G OR
$ make apple_n31_defconfig # for Nano 7G
$ make CROSS_COMPILE=arm-none-eabi- u-boot.bin -j $(nproc)

Third, Linux:

$ git clone https://github.com/freemyipod/linux
$ cd linux
$ git checkout n5g-wip # for Nano 5G OR
$ git checkout n7g-wip # for Nano 7G
$ make ARCH=arm nano5g_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j $(nproc) zImage

By this point, have a initramfs ready. If you wanna boot directly from nfs, edit CMDLINE in the kernel .config accordingly.

Finally, bundle together an u-boot image containing the kernel, your initramfs, and the device-tree (built by u-boot):

$ mkimage -A arm -C none -O linux -T multi -a 0x08000000 -e 0x08000000 -d arch/arm/boot/zImage:initramfs.gz:../u-boot/arch/arm/dts/s5l8730.dtb mImage

mImage is your combined image.

Running

Connect your Nano 5G in DFU mode.

Run u-boot using wInd3x:

$ ./wInd3x cfw run ../u-boot/u-boot.bin

This should start u-boot. Running this for the first time will take a while, as some bootloader stages need to be downloaded, decrypted and modified. A new USB device (05ac:2137) appear on your host. Use dfu-util to upload mImage:

dfu-util -d 05ac:2137 -D linux/mImage -R

Then, in the serial console you'll see Linux booting:

## Booting kernel from Legacy Image at 08000000 ...
...
Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 6.2.0-rc4-00476-g4c4af4d7e53c (q3k@mimeomia) (arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release), GNU ld (GNU Arm Embedded Toolchain 10.3-2021.10) 2.36.1.20210621) #70 Fri Jan 20 18:02:56 CET 2023
...

The LCD display should start up and show a boot log. If not, try adding console=tty0 to your CMDLINE? You might also use fbcon=rotate:1 to rotate the framebuffer 90 degrees.

If everything goes well, the kernel should boot up and attempt to mount a rootfs. It's up to you to get this part working, at least until we streamline the process. The USB CDC EEM ethernet gadget should also appear on your host (probably as usb0, or some long systemd predictable name). The other end will be visible as 'usb0' on the device.

On iPod nano (7th generation) you'll need a DCSD cable (Alex/Magico), and the command line to get proper serial output:

picocom --baud 115200 --imap lfcrlf /dev/ttyUSB0

Now go on and have a go at reverse-engineering some peripherals! :)

Legacy: iPodLinux

The iPodLinux project supports all the PortalPlayer based iPods: iPod 1G-4G, Photo/Color, Video/5G/5.5G, Mini, iPod Nano 1G. It is currently semi-abandoned, and uses a very old ucLinux kernel build.