2012-12-27

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)
  1. for small MSDOS filesystem, we will store kernel here
  2. 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


  1. Fetch U-Boot image here 
  2. Insert unused SD card
  3. 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 
  4. dd if=u-boot_efiks_mx_smartbook.imx of=/dev/da0 bs=1k seek=1 conv=sync 
  5. Invert DIP switch under keyboard (1-OFF, 2-OFF, 3-OFF, 4-ON)
  6. Power up device (Press power button)

    \ smarttopsmartbook
DIP normOn|On|On|OffOn|On|On|Off
DIP sd.imxOff|Off|Off|OffOff|Off|Off|On
Linku-boot_st.imxu-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@...








Efika MX Smartbook, your first run

Since FreeBSD port currently not require any special features, then it's
possible to boot kernel from original (first) uboot.


1. Fetch U-Boot image here
http://people.freebsd.org/~ray/u-boot_efiks_mx_smartbook.imx
2. Insert unused SD card
3. 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
4. Invert DIP switch under keyboard (1-OFF, 2-OFF, 3-OFF, 4-ON)
5. Power up device (Press power button)

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




My build script (it's updated version https://raw.github.com/rayddteam/efika_mx/master/MAKE_EFIKA_MX.sh)
--------------------------------------------------------------------
#!/bin/sh

SRCDIR=/usr/home/ray/work/FreeBSD/Projects/Efika_MX/src/efika_mx/
OBJDIR=/usr/obj/
TARGET=arm
TARGET_ARCH=armv6
TARGET_CPUTYPE=armv6
KERNCONF=EFIKA_MX
KERNOBJDIR="${OBJDIR}/${TARGET}.
${TARGET_ARCH}/${SRCDIR}/sys/${KERNCONF}"

TFTPDIR="/tftpboot/efika_mx/"

DSTDIR=${OBJDIR}/ARMV6

export TARGET
export TARGET_ARCH
export TARGET_CPUTYPE
export WITHOUT_AICASM=yes

echo -n "Start at "
date
FLAGS=-DNO_CLEAN

make KERNCONF=${KERNCONF} ${FLAGS} toolchain || exit 1
make KERNCONF=${KERNCONF} ${FLAGS} buildworld || exit 1
make KERNCONF=${KERNCONF} ${FLAGS} buildkernel || exit 1
echo uboot_mkimage -A ARM -O Linux -T kernel -C none -a 0x90100000 -e 0x90100100 -n "FreeBSD kernel" -d "${KERNOBJDIR}/kernel" "${TFTPDIR}/kernel.uboot"
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

--------------------------------------------------------------------

Preparing card

Assuming you have connected to your PC SD card and it have device name /dev/da0.

# 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


# Done, now mount filesystems
mount -t msdosfs /dev/da0s1 /mnt/imx/dos
mount -t ufs /dev/da0s3a /mnt/imx/ufs

Preparing files for boot

No fill with data. We need boot script and kernel.

boot script

Create file boot and add following lines to it:

echo Initialize MMC subsystemmmcinit
echo Loading kernel ...
fatload mmc 0 0x91000000 kernel.uboot
echo Start kernel
bootm 0x91000000


Pack script into U-Boot image:
mkimage -T script -d boot boot.scr

Поиск по этому блогу

Readers