ODROID-C1 was a $35 quad-core SBC from Hardkernel. ODROID-C1 support was introduced in NetBSD 7.0. It has been succeeded by the ODROID-C1+, which is supported by the same NetBSD kernel.
Supported hardware
- CPU: Cortex-A5: Amlogic S805 (4-core) at 1.5GHz
- CPU frequency scaling is supported with machdep.cpu sysctl tree
- SMP supported
- PL310 L2 cache controller
- GIC
- A5 global timer
- Watchdog timer
- "SDHC" and "SDIO" SD/MMC controllers (DMA)
- Serial console
- Framebuffer console
- USB host (OTG)
- Gigabit Ethernet (GMAC)
- RTL8211F PHY
- Hardware random number generator
- RTC
- GPIO
TODO
- USB device mode
- IR receiver
- I2C
- Audio
Installation (NetBSD 8.0 and later)
- Start with an ARMv7 image from evbarm-earmv7hf/binary/gzimg/ such as armv7.img, the latest is here.
- Build U-Boot for ODROID-C1 https://github.com/jaredmcneill/u-boot-odroid
- Write the bootloader to the empty space at the start of the base image:
# dd if=bl1.bin.hardkernel of=armv7.img bs=1 count=442 conv=notrunc # dd if=bl1.bin.hardkernel of=armv7.img bs=512 skip=1 seek=1 conv=notrunc # dd if=u-boot.bin.odroidc1 of=armv7.img bs=512 seek=64 conv=notrunc
Write the image to an SD card.
Tested 2021-02-19 with NetBSD-current, christos
- serial fights with ucb keyboard. (avoid by short circuiting cngetc in meson_uart.c to return -1)
- awge0 does not work reliably (can't even get a dhcp address, stops receiving packets after less than a minute)
- machine crashes under load
Installation (NetBSD 7.0/7.1)
- Start with an ARMv7 image from evbarm-earmv7hf/binary/gzimg/ such as armv7.img
- Build U-Boot for ODROID-C1 https://github.com/jaredmcneill/u-boot-odroid
- Pre-built binaries here: https://ftp.netbsd.org/pub/NetBSD/arch/evbarm/odroid-c1/u-boot-odroidc-v2011.03-20220520.tar.gz
- Note the location and size of the FFS partition in the armv7.img disklabel:
# $TOOLDIR/bin/nbdisklabel -M evbarm -B le armv7.img ... 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 1359312 385024 4.2BSD 0 0 0 # (Cyl. 188 - 851*) b: 262144 122880 swap # (Cyl. 60 - 187) c: 1744336 0 unused 0 0 # (Cyl. 0 - 851*) d: 1744336 0 unused 0 0 # (Cyl. 0 - 851*) e: 114688 8192 MSDOS # (Cyl. 4 - 59)
- Write the bootloader to the empty space at the start of the base image:
# dd if=bl1.bin.hardkernel of=armv7.img bs=1 count=442 conv=notrunc # dd if=bl1.bin.hardkernel of=armv7.img bs=512 skip=1 seek=1 conv=notrunc # dd if=u-boot.bin of=armv7.img bs=512 seek=64 conv=notrunc
- Since the bootloader has overwritten the disklabel, we need to re-add partition "a" from the disklabel to the MBR partition table:
# $TOOLDIR/bin/armv7--netbsdelf-eabihf-fdisk -u armv7.img ... Which partition do you want to change?: [none] 1 The data for partition 1 is: sysid: [0..255 default: 169] start: [0..109cyl default: 63, 0cyl, 0MB] 385024 size: [0..85cyl default: 1359312, 85cyl, 664MB] 1359312 ... Which partition do you want to change?: [none] ... Should we write new partition table? [n] y
- Write the image to an SD card.
- Edit boot.ini on the MS-DOS partition. Note that the default boot.ini has
console=fb
inbootargs
, which you should remove if you want serial console:
ODROIDC-UBOOT-CONFIG setenv bootargs "root=ld0f awge0.mac-address=${ethaddr} console=fb" setenv bootcmd "fatload mmc 0:1 0x21000000 netbsd.ub; bootm 0x21000000" run bootcmd
- On first boot, it will stop because of the wrong device in /etc/fstab. Take this opportunity to grow the root file-system:
# fdisk -u ld0 ... Which partition do you want to change?: [none] 1 The data for partition 1 is: NetBSD (sysid 169) start 385024, size 1359312 (664 MB, Cyls 23/246/32-108/147/55) PBR is not bootable: All bytes are identical (0x00) sysid: [0..255 default: 169] start: [0..966cyl default: 385024, 24cyl, 188MB] size: [0..942cyl default: 1359312, 85cyl, 664MB] $ ... Which partition do you want to change?: [none] ... Should we write new partition table? [n] y # resize_ffs -y /dev/rld0f # reboot
- Next boot, create a new /etc/fstab:
# mount -u -o rw /dev/ld0f / # cat > /etc/fstab << EOF /dev/ld0f / ffs rw 1 1 /dev/ld0e /boot msdos rw 1 1 kernfs /kern kernfs rw ptyfs /dev/pts ptyfs rw procfs /proc procfs rw tmpfs /var/shm tmpfs rw,-m1777,-sram%25 EOF # reboot
HDMI
Framebuffer console
Simply add console=fb to the bootargs variable in boot.ini.
Video mode
HDMI video mode can be selected in U-Boot with the video command, e.g.:
odroidc#video dev open 1080P
To make this change permanent, add it to the bootcmd variable in boot.ini:
setenv bootcmd "video dev open 1080P; fatload mmc 0:1 0x21000000 netbsd.ub; bootm 0x21000000"
16 or 24 bpp?
ODROID-C1 defaults to 16bpp. If you want to try 24bpp, add fb.depth=24 to the kernel cmdline options in boot.ini. There are some issues with 24bpp mode and Xorg; see http://gnats.netbsd.org/49812.
Overscan compensation
If you have ODROID-C1 plugged into a TV, the edges of the screen may not be visible. You can scale down the framebuffer console with the hw.genfb0.scale sysctl, e.g.:
# sysctl -w hw.genfb0.scale=95
Setting scale to 100 disables scaling, any other value enables the scaler. Values between 10 and 100 are allowed.
To set this value at boot, you can add fb.scale=95 to the kernel cmdline options in boot.ini.
SYS_LED
The blue SYS_LED on the board is wired to GPIOAO_13. To control the LED from userland, set gpio=YES in rc.conf and add this to /etc/gpio.conf:
gpio4 13 set out sys_led
After rebooting, the LED state can be controlled with gpioctl(8).
# turn the light on gpioctl gpio4 sys_led on # turn the light off gpioctl gpio4 sys_led off # toggle the light state gpioctl gpio4 sys_led toggle
U-Boot Environment
To read/write U-Boot environment variables from NetBSD, download and compile the following program: http://ftp.netbsd.org/pub/NetBSD/misc/jmcneill/odroidc1/uenv.c
Automatically booting a backup kernel
These instructions assume the kernels live on eMMC. Adjust devices accordingly for SD card setup.
To setup an ODROID-C1 to fall back to a recovery kernel in the event of a boot failure, install the recovery kernel as /boot/onetbsd.ub.
Create /boot/boot.ini as follows:
ODROIDC-UBOOT-CONFIG setenv bootargs "root=ld0f awge0.mac-address=${ethaddr}" fatload mmc 0:1 0x22000000 boot.scr source 0x22000000
Create /boot/boot.txt:
# regenerate with: # mkubootimage -A arm -C none -O netbsd -T script -a 0 -n "NetBSD/odroidc1 boot" boot.txt boot.scr setenv rescue_kernel "onetbsd.ub" setenv kernel "netbsd.ub" if test ${boot_rescue} = false; then setenv boot_rescue true saveenv fatload mmc 0:1 0x21000000 ${kernel} mw.l c1109900 0f08ffff # arm watchdog bootm 0x21000000 else fatload mmc 0:1 0x21000000 ${rescue_kernel} bootm 0x21000000 fi
Generate boot.scr from boot.txt:
mkubootimage -A arm -C none -O netbsd -T script -a 0 -n "NetBSD/odroidc1 boot" /boot/boot.txt /boot/boot.scr
Install the uenv tool from above and add the following to root's crontab:
@reboot /usr/local/sbin/uenv ld0 boot_rescue false
Documentation
Amlogic S805 datasheet: http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
ODROID-C1 UART pins
From ODROID Forum:
___UART____ |Pin 4 - GND| |Pin 3 - RXD| |Pin 2 - TXD| |Pin 1 - VCC| \___________| 3.3V LVTTL
Hello, nice news (even if published almost 2 years ago ) and information. I would like to ask you how complex could be the porting on the Odroid U3. Do you have some hints or links to find some information? Is there any work in progress? Many thanks in advance for your support.