Your first run of FreeBSD on Genesi Efika MX Smartbook

Hi everyone!

Think you already know, what framebuffer console already works on Genesi Efika MX Smartbook.

So how to done that?

Begin Now, since SD/MMC support still a bit broken we need not only SD card, but USB flash stick also. So:

  1. SD card;
  2. USB flash stick;
  3. FreeBSD system :)
  4. Genesi Efika MX Smartbook :)
  5. and U-Boot’s mkimage utility;

mkimage utility Extract, make and install U-Boot mkimage utility.

fetch http://people.freebsd.org/~ray/u-boot.new.tar.gz
tar xvzf u-boot.new.tar.gz
cd u-boot.new
make install

If I remember correct,it will install uboot_mkimage into /usr/local/bin/, otherwise rename it by hand mv /usr/local/bin/mkimage /usr/local/bin/uboot_mkimage I don’t think mkimage is good name for such special utility :)

Build Get sources Get your own copy of project files:

mkdir efika_mx
cd efika_mx
svn co svn://svn.freebsd.org/base/projects/efika_mx/

Prepare USB Flash stick Better to have to slices (while we still not have UFS support in U-Boot)

  • for small MSDOS filesystem, we will store kernel here
  • for UFS rootfs

for example, you have empty USB Flash stick as /dev/da0, then do:

# Create MBR partitioning scheme
gpart create -s MBR da0
# Create 128MB fat32 slice
gpart add -t fat32 -i 1 -s 128m da0
# Create space for swap (better at least 1G)
gpart add -t freebsd -i 2 -s 512M da0
# Anything left for FreeBSD filesystems
gpart add -t freebsd -i 3 da0
# BSD partitioning
gpart create -s BSD da0s3
# Give everything to rootfs
gpart add -t freebsd-ufs da0s3
# Make filesystems
newfs /dev/da0s3a
newfs -t msdosfs /dev/da0s1
# Done, now mount filesystems
mount -t msdosfs /dev/da0s1 /mnt/imx/dos
mount -t ufs /dev/da0s3a /mnt/imx/ufs

Don’t forget to change mount point in kernel config (sys/arm/conf/EFIKA_MX) to ufs:da0s3a. Script to build everything Set environment variables: SRCDIR - path to your copy of project; OBJDIR - place to keep object files and other stuff for build, better to have it in your home and run build as regular user (not root) then you will not break your system by wrong install. TFTPDIR - place to where kernel will be copied, so U-Boot will be able to load it by tftp. DSTDIR - where to install world, can be NFS directory or root of mounted USB flash

And mandatory: TARGET - architecture for which we will build everthing TARGET_ARCH - architecture subtype TARGET_CPUTYPE - CPU type KERNCONF - file name of kernel configuration

Example, as build script:

#!/bin/sh

SRCDIR=/usr/home/ray/work/FreeBSD/Projects/Efika_MX/src/efika_mx/
OBJDIR=/usr/obj/
TFTPDIR="/tftpboot/efika_mx/"
DSTDIR=${OBJDIR}/ARMV6

TARGET=arm
TARGET_ARCH=armv6
TARGET_CPUTYPE=armv6
KERNCONF=EFIKA_MX

KERNOBJDIR="${OBJDIR}/${TARGET}.${TARGET_ARCH}/${SRCDIR}/sys/${KERNCONF}"

export TARGET
export TARGET_ARCH
export TARGET_CPUTYPE
# Hope someday somebody fix aicasm to not break builds for special case :)
export WITHOUT_AICASM=yes

echo -n "Start at "
date

# Uncomment next line if don't want to rebuild everithing
#FLAGS=-DNO_CLEAN

make KERNCONF=${KERNCONF} ${FLAGS} toolchain || exit 1
make KERNCONF=${KERNCONF} ${FLAGS} buildworld || exit 1
make KERNCONF=${KERNCONF} ${FLAGS} buildkernel || exit 1
# Kernel we will install into separate place (installkernel)
make DESTDIR=${DSTDIR} ${FLAGS} installworld || exit 1
make DESTDIR=${DSTDIR} ${FLAGS} distribution || exit 1

uboot_mkimage -A ARM -O Linux -T kernel -C none -a 0x90100000 -e 0x90100100 -n "FreeBSD kernel" -d "${KERNOBJDIR}/kernel" "${TFTPDIR}/kernel.uboot"

echo -n "Done at "
date

————-8<————————————————————-

Now you can just run the script:

sh ./script_file_name

Don’t forget to enable watchdogd and virtual terminals.

First:

echo 'watchdogd_enable="YES"' >> ${WHERE_IS_NEW_ROOTFS_MOUNTED}/etc/rc.conf

For second one, open ${WHERE_IS_NEW_ROOTFS_MOUNTED}/etc/ttys in your editor and replace “off” with “on” on lines with /dev/ttyv0 - ttyv7

Without first devices will reset after 127 seconds lefts after “run bsd” command in U-Boot. Without second one - you will not get login prompt.

Prepare card

Fetch U-Boot image here 
Insert unused SD card
WARNING! Check your /dev/da devices first, to not damage other cards, of SCSI HDD, or USB flash stick. Assuming your unused SD is /dev/da0 
dd if=u-boot_efiks_mx_smartbook.imx of=/dev/da0 bs=1k seek=1 conv=sync 
Invert DIP switch under keyboard (1-OFF, 2-OFF, 3-OFF, 4-ON)
Power up device (Press power button)


\ 	smarttop	smartbook

DIP norm On|On|On|Off On|On|On|Off DIP sd.imx Off|Off|Off|Off Off|Off|Off|On Link u-boot_st.imx u-boot_sb.imx

If you connect ASIX based USB Ethernet adapter and type “run bsd”, U-Boot will try to assign IP 192.168.10.85 to axe0 and ask efika_mx/kernel.uboot by TFTP on host 192.168.10.90.

[0] http://people.freebsd.org/~ray/u-boot_efika_mx_smartbook.imx

Currently I use SD card to only boot machine with U-Boot.

Boot So after power up, U-Boot will stop and show you command prompt. If you prepare tftp boot for kernel as I say in previous paragraph, then just type:

run bsd

this line do:

setenv ipaddr 192.168.10.85
setenv serverip 192.168.10.85
tftp 0x91000000 efika_mx/kernel.uboot
mw.w 0x73f98000 0xff3c 1
bootm 0x91000000

two top lines already in environment, so they not executed actually. tftp … load firnel.uboot from dir efika_mx on tftp server mw.w … is simple command for write word (4bytes) into memory, with that args it’s enable Watchdog. Watchdog will reset board after 128 seconds, if device will hang or not start watchdogd. So you have two ways: 1) start kernel with tftp 0x91000000 efika_mx/kernel.uboot ; bootm 0x91000000 or enable watchdogd

That U-Boot binary also have fat command. This command do:

fat=ide reset
fatload ide 0:1 0x91000000 kernel.uboot
bootm 0x91000000

Reset/init PATA controller, load kernel.uboot from first slice which have FAT fs and boot it.

Overview of boot process

  1. If DIP switch set as 1-OFF, 2-OFF, 3-OFF, 4-ON, system try to load image from SD card at offset 1024 bytes (think if we will prepare USB flash same way it will boot also, but not checked it yet) to memory at address 0x97800000.
  2. execute program at address 0x97800000. (We get U-Boot prompt)
  3. We run U-Boot command to start kernel.
  4. If kernel found mountpoint specified in option ROOTDEVNAME of kernel config file, it continue to boot. Otherwise stops and ask you to specify it manually (not sure usb keyboard works here or not). Anyway, better to compile kernel to mount from flash drive “da0s1a” (or “da0s2a” if you make FAT slice first). But then rebuild with “ada0s2a”, to get kernel which will mount internal SSD drive.

Ok, enough for now :) Let me know, if I forget something important. Mail me ray@…

Oleksandr Rybalko a.k.a. Ray
Oleksandr Rybalko a.k.a. Ray
SRE/DevOps/Engineer SW/HW

The man who love HW and SW. And know!