In case you missed our , Elimo Engineering designed a small, powerful Linux System-on-Module, designed for low cost and fast system integration. It’s FOSS and OSHW and sports all of the following: latest update M.2/NGFF 42mm Form Factor WiFi IEEE 802. 11abgn Bluetooth 4.2/BLE RGB LCD Interface MIPI Camera Interface IEEE 802. 3u Ethernet MAC+PHY USB2.0 (Host, Device, OTG) PWM, ADC, UART uSD, eMMC, SPI Flash Support Audio Line In/Out This week we received the first prototypes of both the module and its first carrier board, so we started work on getting to boot on it! buildroot TL;DR The name of our Allwinner S3 based module is , it now has a working tree that you can find on ! Impetus buildroot our public GitHub repo To receive updates about our work on the board and how to buy some, watch this space or subscribe to our ! We also offer bespoke embedded electronics design services - to find out how we can help to make your electronic product idea a reality RSS feed get in touch It needs a name We couldn’t stand calling this “the S3 board” any longer, so we thought long and hard about a name for this. To be honest, we’ve been bouncing ideas around for weeks, but none seemed to stick: some were overused, some had horrible SEO-ness (yes, that’s a word now!) some were unpronounceable, some were … Please welcome the ! Impetus Impetus, noun Something that makes a process or activity happen, or happen more quickly. The idea was Simon’s, and we liked it because it not only it checks all the boxes, but it also keeps with the Latin language theme of Elimo. DRAM, u-boot and all that jazz As you can read in , mainline u-boot currently does not support the DDR3 DRAM on the S3; the S3 is very similar to the V3s, and you could use a mainline V3s build of u-boot if it wasn’t for that pesky, faster, bigger on-die RAM. What’s the opposite of the expression “a blessing in disguise”? our previous post almost Luckily the FOSS universe is always helpful <imagine a “so proud of this community” meme here>: has recently released the PineCube, based on the Allwinner S3L, and Daniel Fullmer wrote a for it, including 3 patches for u-boot. They apply cleanly on u-boot 2020.10, so that’s what we did. PINE64 NixOS recipe We forked buildroot/master, added the patches, our board configuration and, with some polishing and tidy up, we got a nice console out of UART0. The current defconfig is based on: mainline u-boot 2020.10 + patches mainline Linux 5.3.5 a minimal rootfs The whole thing boots in ~4 seconds, half of which is just u-boot waiting for human input and could be shaved off. For those that want to see the full gory detail, this is a boot sequence right now: U-Boot SPL . (Oct - : : + ) DRAM: MiB Trying to boot from MMC1 U-Boot . (Oct - : : + )- Elimo Engineering CPU: Allwinner V3s (SUN8I ) Model: Elimo Impetus DRAM: MiB MMC: mmc@ : Loading Environment from FAT... *** Warning - bad CRC, using default environment In: serial@ Out: serial@ Err: serial@ Net: phy interface0 eth0: ethernet@ starting USB... No working controllers found Hit any key to stop autoboot: switch to partitions # , OK mmc0 is current device Scanning mmc : ... Found U-Boot script /boot.scr bytes read in ms ( . KiB/s) ## Executing script at bytes read in ms ( . MiB/s) bytes read in ms ( . MiB/s) ## Flattened Device Tree blob at Booting using the fdt blob at Loading Device Tree to fa000, end ff350 ... OK Starting kernel ... [ ] Booting Linux on physical CPU x0 [ ] Linux version . . (matteo@elimo) (gcc version . . (Buildroot . - -g36edacce9c-dirty)) # SMP Fri Oct BST [ ] CPU: ARMv7 Processor [ fc075] revision (ARMv7), cr= c5387d [ ] CPU: div instructions available: patching division code [ ] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ ] OF: fdt: Machine model: Lichee Pi Zero with Dock [ ] Memory policy: Data cache writealloc [ ] cma: Reserved MiB at [ ] psci: probing for conduit method from DT. [ ] psci: Using PSCI v0. Function IDs from DT [ ] percpu: Embedded pages/cpu s30412 r8192 d22836 u61440 [ ] Built zonelists, mobility grouping on. Total pages: [ ] Kernel command line: console=ttyS panic= console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw [ ] Dentry cache hash table entries: (order: , bytes, linear) [ ] Inode-cache hash table entries: (order: , bytes, linear) [ ] mem auto-init: stack:off, heap alloc:off, heap free:off [ ] Memory: K/ K available ( K kernel code, K rwdata, K rodata, K init, K bss, K reserved, K cma-reserved, K highmem) [ ] SLUB: HWalign= , Order= - , MinObjects= , CPUs= , Nodes= [ ] rcu: Hierarchical RCU implementation. [ ] rcu: RCU restricting CPUs from NR_CPUS= to nr_cpu_ids= . [ ] rcu: RCU calculated value of scheduler-enlistment delay is jiffies. [ ] rcu: Adjusting geometry for rcu_fanout_leaf= , nr_cpu_ids= [ ] NR_IRQS: , nr_irqs: , preallocated irqs: [ ] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set [ ] random: get_random_bytes called from start_kernel+ x2f with crng_init= [ ] arch_timer: cp15 timer(s) running at . MHz (phys). [ ] clocksource: arch_sys_counter: mask: xffffffffffffff max_cycles: x588fe9dc0, max_idle_ns: ns [ ] sched_clock: bits at MHz, resolution ns, wraps every ns [ ] Switching to timer-based delay loop, resolution ns [ ] clocksource: timer: mask: xffffffff max_cycles: xffffffff, max_idle_ns: ns [ ] Console: colour dummy device x30 [ ] printk: console [tty0] enabled [ ] Calibrating delay loop (skipped), value calculated using timer frequency.. . BogoMIPS (lpj= ) [ ] pid_max: default: minimum: [ ] Mount-cache hash table entries: (order: , bytes, linear) [ ] Mountpoint-cache hash table entries: (order: , bytes, linear) [ ] CPU: Testing write buffer coherency: ok [ ] /cpus/cpu@ missing clock-frequency property [ ] CPU0: thread - , cpu , socket , mpidr [ ] Setting up static identity map for - [ ] rcu: Hierarchical SRCU implementation. [ ] smp: Bringing up secondary CPUs ... [ ] smp: Brought up node, CPU [ ] SMP: Total of processors activated ( . BogoMIPS). [ ] CPU: All CPU(s) started in HYP mode. [ ] CPU: Virtualization extensions available. [ ] devtmpfs: initialized [ ] VFP support v0. : implementor architecture part variant rev [ ] clocksource: jiffies: mask: xffffffff max_cycles: xffffffff, max_idle_ns: ns [ ] futex hash table entries: (order: , bytes, linear) [ ] pinctrl core: initialized pinctrl subsystem [ ] NET: Registered protocol family [ ] DMA: preallocated KiB pool for atomic coherent allocations [ ] hw-breakpoint: found (+ reserved) breakpoint and watchpoint registers. [ ] hw-breakpoint: maximum watchpoint size is bytes. [ ] SCSI subsystem initialized [ ] usbcore: registered new interface driver usbfs [ ] usbcore: registered new interface driver hub [ ] usbcore: registered new device driver usb [ ] pps_core: LinuxPPS API ver. registered [ ] pps_core: Software ver. . . - Copyright Rodolfo Giometti <giometti@linux.it> [ ] PTP clock support registered [ ] Advanced Linux Sound Architecture Driver Initialized. [ ] clocksource: Switched to clocksource arch_sys_counter [ ] thermal_sys: Registered thermal governor 'step_wise' [ ] NET: Registered protocol family [ ] tcp_listen_portaddr_hash hash table entries: (order: , bytes, linear) [ ] TCP established hash table entries: (order: , bytes, linear) [ ] TCP bind hash table entries: (order: , bytes, linear) [ ] TCP: Hash tables configured (established bind ) [ ] UDP hash table entries: (order: , bytes, linear) [ ] UDP-Lite hash table entries: (order: , bytes, linear) [ ] NET: Registered protocol family [ ] RPC: Registered named UNIX socket transport module. [ ] RPC: Registered udp transport module. [ ] RPC: Registered tcp transport module. [ ] RPC: Registered tcp NFSv4. backchannel transport module. [ ] workingset: timestamp_bits= max_order= bucket_order= [ ] NFS: Registering the id_resolver key type [ ] Key type id_resolver registered [ ] Key type id_legacy registered [ ] Block layer SCSI generic (bsg) driver version . loaded (major ) [ ] io scheduler mq-deadline registered [ ] io scheduler kyber registered [ ] sun4i-usb-phy .phy: Couldn't request ID GPIO [ ] sun8i-v3s-pinctrl .pinctrl: initialized sunXi PIO driver [ ] Serial: driver, ports, IRQ sharing disabled [ ] sun8i-v3s-pinctrl .pinctrl: .pinctrl supply vcc-pb not found, using dummy regulator [ ] printk: console [ttyS0] disabled [ ] .serial: ttyS0 at MMIO (irq = , base_baud = ) is a U6_16550A [ ] printk: console [ttyS0] enabled [ ] libphy: Fixed MDIO Bus: probed [ ] CAN device driver interface [ ] ehci_hcd: USB . 'Enhanced' Host Controller (EHCI) Driver [ ] ehci-platform: EHCI generic platform driver [ ] ohci_hcd: USB . 'Open' Host Controller (OHCI) Driver [ ] ohci-platform: OHCI generic platform driver [ ] input: .lradc as /devices/platform/soc/ .lradc/input/input0 [ ] sun6i-rtc .rtc: registered as rtc0 [ ] sun6i-rtc .rtc: RTC enabled [ ] i2c /dev entries driver [ ] sunxi-wdt c20ca0.watchdog: Watchdog enabled (timeout= sec, nowayout= ) [ ] sun8i-v3s-pinctrl .pinctrl: .pinctrl supply vcc-pf not found, using dummy regulator [ ] sunxi-mmc .mmc: initialized, max. request size: KB [ ] sun8i-v3s-pinctrl .pinctrl: .pinctrl supply vcc-pg not found, using dummy regulator [ ] sunxi-mmc .mmc: initialized, max. request size: KB [ ] usbcore: registered new interface driver usbhid [ ] usbhid: USB HID core driver [ ] NET: Registered protocol family [ ] can: controller area network core (rev abi ) [ ] NET: Registered protocol family [ ] can: raw protocol (rev ) [ ] can: broadcast manager protocol (rev t) [ ] can: netlink gateway (rev ) max_hops= [ ] Key type dns_resolver registered [ ] Registering SWP/SWPB emulation handler [ ] usb_phy_generic usb_phy_generic. .auto: usb_phy_generic. .auto supply vcc not found, using dummy regulator [ ] musb-hdrc musb-hdrc. .auto: MUSB HDRC host driver [ ] musb-hdrc musb-hdrc. .auto: new USB bus registered, assigned bus number [ ] hub : USB hub found [ ] hub : port detected [ ] sun6i-rtc .rtc: setting system clock to - : UTC ( ) [ ] ALSA device list: [ ] No soundcards found. [ ] Waiting for root device /dev/mmcblk0p2... [ ] mmc0: host does not support reading read-only switch, assuming write-enable [ ] mmc0: Problem switching card into high-speed mode! [ ] mmc0: new SDHC card at address [ ] mmcblk0: mmc0: SD16G . GiB [ ] mmcblk0: p1 p2 [ ] mmc1: queuing unknown CIS tuple x80 ( bytes) [ ] mmc1: queuing unknown CIS tuple x80 ( bytes) [ ] mmc1: queuing unknown CIS tuple x80 ( bytes) [ ] mmc1: queuing unknown CIS tuple x80 ( bytes) [ ] mmc1: queuing unknown CIS tuple x81 ( bytes) [ ] random: fast init done [ ] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ ] VFS: Mounted root (ext4 filesystem) on device : . [ ] devtmpfs: mounted [ ] Freeing unused kernel memory: K [ ] Run /sbin/init as init process [ ] mmc1: new high speed SDIO card at address [ ] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null) [ ] random: dd: uninitialized urandom read ( bytes read) Welcome to Buildroot for the Elimo Impetus impetus login: 2020 10 23 2020 15 37 41 0100 128 2020 10 23 2020 15 37 41 0100 1681 128 01c0f000 0 01c28000 01c28000 01c28000 1c30000 0 0 0 1 293 3 94 7 41900000 4170248 195 20 4 9041 6 1 4 41800000 0x41800000 42d 42d 0.000000 0 0.000000 5 3 5 9 3 0 2020 08 949 1 23 14:12:04 2020 0.000000 410 5 10 0.000000 0.000000 0.000000 0.000000 0.000000 16 0x46c00000 0.000000 0.000000 1 0.000000 15 0.000000 1 32512 0.000000 0,115200 5 0.000000 16384 4 65536 0.000000 8192 3 32768 0.000000 0.000000 103492 131072 6144 431 1668 1024 242 11196 16384 0 0.000000 64 0 3 0 1 1 0.000000 0.000000 8 1 0.000000 10 0.000000 16 1 0.000000 16 16 16 0.000000 0.000000 0 8/0x498 0 0.000000 24 00 0.000000 0 0 440795202592 0.000007 56 24 41 4398046511097 0.000020 41 0.000221 0 0 79635851949 0.000458 80 0.000792 0.000848 48 00 240000 0.000879 32768 301 0.001055 1024 0 4096 0.001088 1024 0 4096 0.001967 0.002528 0 0.002581 1 0 0 80000000 0.003405 0x40100000 0x40100060 0.003656 0.004188 0.004233 1 1 0.004249 1 48 00 0.004265 0.004277 0.005133 0.008129 3 41 2 30 7 5 0.008481 0 0 19112604462750000 0.008535 256 2 16384 0.009349 0.010803 16 0.012352 256 0.013623 5 1 4 0.013672 8 0.029302 0.030042 0.030266 0.030373 0.030629 1 0.030653 5 3 6 2005-2007 0.030690 0.030982 0.032313 0.043211 0.043558 2 0.044274 512 0 6144 0.044337 1024 0 4096 0.044375 1024 1 8192 0.044410 1024 1024 0.044573 256 1 8192 0.044638 256 1 8192 0.044904 1 0.045830 0.045882 0.045898 0.045912 1 0.047970 30 15 0 0.056014 0.056097 0.056114 0.056242 0 4 248 0.056271 0.056286 0.057209 1c19400 0.061020 1c20800 0.126477 8250/16550 8 0.128910 1c20800 1c20800 0.130103 0.150435 1c28000 0x1c28000 32 1500000 0.723100 0.752623 0.756764 0.761079 2 0 0.767697 0.773087 1 1 0.779307 0.785691 1c22800 1c22800 0.794923 1c20400 0.800014 1c20400 0.804831 0.809567 1 16 0 0.818348 1c20800 1c20800 0.855124 1c0f000 16384 0.862482 1c20800 1c20800 0.897315 1c10000 16384 0.905436 0.911038 0.917082 17 0.921593 20170425 9 0.928019 29 0.932534 20170425 0.936817 20170425 0.942512 20170425 1 0.948335 0.952841 0.966191 0 0 0.977816 1 0.983707 1 1 0.993399 1-0:1.0 0.997401 1-0:1.0 1 1.003049 1c20400 1970 01-01T00:13 43 823 1.011509 1.014606 1.018521 1.023780 1.033774 1.039820 0001 1.046315 0001 3 75 1.053775 1.061311 0 2 1.068448 0 3 1.075493 0 3 1.084740 0 7 1.094870 0 9 1.109730 1.114205 1.122557 179 2 1.130786 1.135369 1024 1.140098 1.187960 0001 1.295833 1.479864 512 Previously published at https://blog.elimo.io/2020/10/23/buildroot-support/