#@TYPE: Machine
#@NAME: Iomega NAS 100d
#@DESCRIPTION: Machine configuration for the Iomega NAS 100d product

#-------------------------------------------------------------------------------
# INPUTS
#-------------------------------------------------------------------------------
# conf/${DISTRO}.conf is included after this file and should be used to modify
# variables identified as 'INPUTS' to the required values for the DISTRO, this
# will cause the board specific settings (which depend for the most part on the
# exact CPU used) to be set correctly within this file.  The results are the
# variables identifies here as 'OUTPUTS'
#
#variable = "default"
# <possible values>
#    description

ARCH_BYTE_SEX = "be"
# "be" "le"
#    The memory byte sex and (on correctly implemented hardware - the NAS100D is
#    correct) the byte sex of the buses within the system.  'be' (big-endian)
#    means that the first byte is the most significant byte on a bus, 'le'
#    (little-endian) means that the first byte is the least significant byte.

ARM_INSTRUCTION_SET = "arm"
# "arm" "thumb"
#    The instruction set the compiler should use when generating application
#    code.  The kernel is always compiled with arm code at present.  arm code
#    is the original 32 bit ARM instruction set, thumb code is the 16 bit
#    encoded RISC sub-set.  Thumb code is smaller (maybe 70% of the ARM size)
#    but requires more instructions (140% for 70% smaller code) so may be
#    slower.

THUMB_INTERWORK = "yes"
# "yes" "no"
#    Whether to compile with code to allow interworking between the two
#    instruction sets.  This allows thumb code to be executed on a primarily
#    arm system and vice versa.  It is strongly recommended that DISTROs not
#    turn this off - the actual cost is very small.

DISTRO_BASE = ""
# "" ":<base>"
#    If given this must be the name of a 'distro' to add to the bitbake OVERRIDES
#    after ${DISTRO}, this allows different distros to share a common base of
#    overrides.  The value given must include a leading ':' or chaos will result.

#-------------------------------------------------------------------------------
# OUTPUTS
#-------------------------------------------------------------------------------

#OVERRIDES
#    The standard ':' separated list of overrides used by bitbake - see the
#    basic setting in bitbake.conf.  This list is based on that used for the
#    standard setting however :<base>, :thumb and :thumb-interwork will be
#    inserted at appropriate points if a base distro, default use of thumb or
#    arm/thumb interworking are enabled in the inputs.
OVERRIDE_THUMB = "${@['', ':thumb'][bb.data.getVar('ARM_INSTRUCTION_SET', d, 1) == 'thumb']}"
OVERRIDE_INTERWORK = "${@['', ':thumb-interwork'][bb.data.getVar('THUMB_INTERWORK', d, 1) == 'yes']}"
OVERRIDES = "local:${MACHINE}:${DISTRO}${DISTRO_BASE}:${TARGET_OS}:${TARGET_ARCH}${OVERRIDE_THUMB}${OVERRIDE_INTERWORK}:build-${BUILD_OS}"

# TARGET_CC_ARCH
# TARGET_CC_KERNEL_ARCH
# TARGET_LD_ARCH
# TARGET_LD_KERNEL_ARCH
#    Compiler and linker options for application code and kernel code.  These
#    options ensure that the compiler has the correct settings for the selected
#    instruction set and interworking.
ARM_INTERWORK_M_OPT = "${@['-mno-thumb-interwork', '-mthumb-interwork'][bb.data.getVar('THUMB_INTERWORK', d, 1) == 'yes']}"
ARM_THUMB_M_OPT = "${@['-mno-thumb', '-mthumb'][bb.data.getVar('ARM_INSTRUCTION_SET', d, 1) == 'thumb']}"
#
TARGET_CC_ARCH = "-march=armv5te -mtune=xscale ${ARM_INTERWORK_M_OPT} ${ARM_THUMB_M_OPT}"
TARGET_CC_KERNEL_ARCH = "-march=armv5te -mtune=xscale -mno-thumb-interwork -mno-thumb"
TARGET_LD_ARCH = ""
TARGET_LD_KERNEL_ARCH = ""

# FULL_OPTIMIZATION
#    Optimization settings.  Os works fine and is significantly better than O2.
#    The other settings are somewhat arbitrary.  The optimisations chosen here
#    include the ones which 'break' symbolic debugging (because the compiler does
#    not include enough information to allow the debugger to know where given
#    values are.)  The -fno options are an attempt to cancel explicit use of space
#    consuming options found in some packages (this isn't a complete list, this is
#    just the ones which package writers seem to know about and abuse).
FULL_OPTIMIZATION = "-Os -fomit-frame-pointer -frename-registers \
	-fno-unroll-loops -fno-inline-functions \
	-fweb -funit-at-a-time"

# TARGET_ARCH
#    The correct setting for the system endianness (ARCH_BYTE_SEX).  This will
#    be arm (le) or armeb (be) - it is difficult to be more precise in the
#    setting because of the large number of ways it is used within OpenEmbedded.
TARGET_ARCH = "${@['armeb', 'arm'][bb.data.getVar('ARCH_BYTE_SEX', d, 1) == 'le']}"

# PACKAGE_ARCH
#    The correct setting for the generated packages.  This corresponds to the
#    -march flag passed to the compiler because that limits the architectures
#    on which the generated code will run.
BYTE_SEX_CHAR = "${@['b', 'l'][bb.data.getVar('ARCH_BYTE_SEX', d, 1) == 'le']}"
PACKAGE_ARCH_BASE = "${@['armv5te', 'thumbv5t'][bb.data.getVar('ARM_INSTRUCTION_SET', d, 1) == 'thumb']}"
PACKAGE_ARCH = "${PACKAGE_ARCH_BASE}${BYTE_SEX_CHAR}"

# IPKG_ARCHS
#    The full list of package architectures which should run on the system.
#    This takes into account both the board level issues and the INPUTS set
#    by the distro.  The arm list is derived from the architecture settings
#    known to gcc, the thumb list is then derived from that (only the 't'
#    architectures of course).
ARM_ARCHITECTURES = "${TARGET_ARCH} armv2${BYTE_SEX_CHAR} armv2a${BYTE_SEX_CHAR} armv3${BYTE_SEX_CHAR} armv3m${BYTE_SEX_CHAR} armv4${BYTE_SEX_CHAR} armv4t${BYTE_SEX_CHAR} armv5${BYTE_SEX_CHAR} armv5t${BYTE_SEX_CHAR} armv5e${BYTE_SEX_CHAR} armv5te${BYTE_SEX_CHAR} xscale${BYTE_SEX_CHAR}"
THUMB_ARCHITECTURES = "thumbe${BYTE_SEX_CHAR} thumbv4t${BYTE_SEX_CHAR} thumbv5t${BYTE_SEX_CHAR}"

#    NOTE: this list contains just the things which rootfs_ipk.bbclass does
#    not add, rootfs_ipk.bbclass evaluates:
#
#        ipkgarchs="all any noarch ${TARGET_ARCH} ${IPKG_ARCHS} ${MACHINE}"
#
#    This is a priority ordered list - most desireable architecture at the end,
#    so put <ARM_INSTRUCTION_SET>_ARCHITECTURES at the end and, if
#    THUMB_INTERWORK precede this with the other architectures.
IPKG_ARCHS = "${@(lambda arch_thumb, arch_arm, is_arm, interwork: \
		(interwork and (is_arm and arch_thumb or arch_arm) + ' ' or '') \
		+ (is_arm and arch_arm or arch_thumb)) \
	       (bb.data.getVar('THUMB_ARCHITECTURES', d, 1), \
		bb.data.getVar('ARM_ARCHITECTURES', d, 1), \
		bb.data.getVar('ARM_INSTRUCTION_SET', d, 1) != 'thumb', \
		bb.data.getVar('THUMB_INTERWORK', d, 1) == 'yes')}"

#-------------------------------------------------------------------------------
# Miscellany
#-------------------------------------------------------------------------------
# The correct settings for the NAS100D board:
SERIAL_CONSOLE = "115200 ttyS0"
KERNEL_CONSOLE = "ttyS0,115200n8"
USE_VT = "0"

#-------------------------------------------------------------------------------
# Package versions
#-------------------------------------------------------------------------------
CVSDATE_gnu-config ?= "20050713"
CVSDATE_gnu-config-native ?= "20050713"
CVSDATE_ipkg-utils ?= "20050713"
CVSDATE_ipkg-utils-native ?= "20050713"
CVSDATE_ipkg-link ?= "20050713"
CVSDATE_irssi ?= "20050930"

CVS_TARBALL_STASH = "http://sources.nslu2-linux.org/sources/"
INHERIT += "nslu2-mirrors"

PREFERRED_VERSION_ipkg ?= "0.99.152"
PREFERRED_VERSION_ipkg-native ?= "0.99.152"