HOWTO: Custom kernel and linux distro for ODROID-C

Prepare the environment

In this example i used a old gcc version, you can try the newer 4.8

  wget https://releases.linaro.org/13.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux.tar.bz2
  mkdir -p $HOME/Apps/toolchains
  tar -xf gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux.tar.bz2 -C $HOME/Apps/toolchains/

Next you must prepare the environment variables:

  echo 'export ARCH=arm
  export CROSS_COMPILE=arm-linux-gnueabihf-
  export PATH=/home/capi_x/Apps/toolchains/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin:$PATH' > $HOME/Apps/arm.sh

  chmod a+x $HOME/Apps/arm.sh

And load it in every session what you want cross-compile

  . $HOME/Apps/arm.sh

Also we need the u-boot tools

  apt-get install u-boot-tools

Now we will make a temporal folder.

  mkdir -p /tmp/odroidc/boot
  mkdir -p /tmp/odroidc/root

Next download the linux 3.10.x based kernel for odroidc (or check if we have a new odroidc-xxx branch)

  git clone https://github.com/hardkernel/linux.git -b odroidc-3.10.y

And compile it!

Prepare the image

  cd linux
  make odroidc_defconfig
  make uImage -j8
  make dtbs

And the kernel modules for the root file system.

  make ARCH=arm INSTALL_MOD_PATH=/tmp/odroidc/root modules_install

And copy the compiled elements to the boot temporal folder.

  cp ./arch/arm/boot/uImage                  /tmp/odroidc/boot
  cp ./arch/arm/boot/dts/meson8b_odroidc.dtb /tmp/odroidc/boot

For prepare the initrd we can use other valid initrd image (e.g. from the default ubuntu img)

  # fdisk ubuntu-14.04.1lts-lubuntu-odroid-c1-20150102.img

  Welcome to fdisk (util-linux 2.25.2).
  Changes will remain in memory only, until you decide to write them.
  Be careful before using the write command.

  Command (m for help): p
  Disk ubuntu-14.04.1lts-lubuntu-odroid-c1-20150102.img: 4.6 GiB, 4930404352 bytes, 9629696 sectors
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: dos
  Disk identifier: 0x000cde21

  Device                                            Boot  Start     End Sectors   Size Id Type
  ubuntu-14.04.1lts-lubuntu-odroid-c1-20150102.img1        3072  266239  263168 128.5M  6 FAT16
  ubuntu-14.04.1lts-lubuntu-odroid-c1-20150102.img2      266240 9629695 9363456   4.5G 83 Linux

  Command (m for help): q

  # mount -o loop,offset=1572864 ubuntu-14.04.1lts-lubuntu-odroid-c1-20150102.img /mnt/loop

The last files on boot...

  cp /mnt/loop/boot.ini /tmp/odroidc/boot/
  mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d /mnt/loop/uInitrd /tmp/odroidc/boot/uInitrd

In this point you have all files to make a custom linux distribution for ODROID-C.

For example, you can take the ubuntu img, mount the boot (FAT16) and replace the files with the content of "/tmp/odroidc/boot/" and modify the boot.ini to have other root.

  $ cat boot.ini 
  ODROIDC-UBOOT-CONFIG

  # Possible screen resolutions
  # Uncomment only a single Line! The line with setenv written.
  # At least one mode must be selected.

  # setenv m "vga"          # VGA 640x480
  # setenv m "480p"         # 480p 720x480
  # setenv m "576p"         # 576p 720x576
  # setenv m "800x480p60hz" # WVGA 800x480
  # setenv m "720p"         # 720p 1280x720
  # setenv m "800p"         # 800p(WXGA) 1280x800
  # setenv m "sxga"         # SXGA 1280x1024
  setenv m "1080p"          # 1080P 1920x1080
  # setenv m "1920x1200"    # 1920x1200

  # HDMI/DVI Mode Configuration
  setenv vout_mode "hdmi"
  # setenv vout_mode "dvi"

  # HDMI BPP Mode
  setenv m_bpp "32"
  # setenv m_bpp "16"

  # UHS Card Configuration
  # Uncomment the line below to __DISABLE__ UHS-1 MicroSD support
  # This might break boot for some brand/models of cards.
  setenv disableuhs "disableuhs"

  setenv bootargs "console=ttyS0,115200n8 root=/dev/sda3 rootfstype=ext4 rootwait ro no_console_suspend vdaccfg=0xa000 logo=osd1,loaded,0x7900000,720p,full dmfc=3 cvbsmode=576cvbs hdmimode=${m} m_bpp=${m_bpp} vout=${vout_mode} ${disableuhs}"
  setenv bootcmd "fatload mmc 0:1 0x21000000 uImage; fatload mmc 0:1 0x22000000 uInitrd; fatload mmc 0:1 0x21800000 meson8b_odroidc.dtb; bootm 0x21000000 0x22000000 0x21800000"
  run bootcmd

For example, if you have the root in the mmc partition 2 you can use the root=/dev/mmcblk0p2

Later you can put a root image (e.g. debian armhf image, arch linux ARMv7, etc.) as a partition in the img file mount it and copy the contents of /tmp/odroidc/root on it.

To write the image, you can use the micro-sd adapter from Kingston (some are saying bullshit about that it's wrong on forums... fuck off!) Kingston MicroSD adapter

And i recommend to write the image to the microSD card using dd on byte by byte copy mode.

Serial port

If something goes wrong or you need the boot output or have an a shell, you can use the serial port. ODROID-C board

Ok this is the pin set. (Hardkernel, don't piss me off and label the fucking pins the next time)

  _____
  |   |
  | * | 4. GND
  | * | 3. RX
  | * | 2. TX
  | * | 1. VCC
   \__|

It uses 3v3 and you can use a cheap ebay usb to serial and remember to not wire the VCC between adapter and board.

OT. The board design and the soldering work are very good quality. Hardkernel, good work! :-)

P.S. You can download my custom image (only boot). (12MB)