From b0611894f6e987fcffb3b07e052310c4c831dcd3 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sun, 18 Feb 2007 23:46:29 +0000 Subject: [PATCH] Preparing to test on the C5471 git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@7 42af7a65-404d-4744-a932-0658087f49c3 --- Makefile | 12 +- arch/c5471/defconfig | 8 + arch/c5471/src/Makefile | 3 +- arch/c5471/src/up_lowputc.S | 127 +++++++++++++++ arch/sim/defconfig | 8 + tools/mkimage.sh | 305 ++++++++++++++++++++++++++++++++++++ 6 files changed, 459 insertions(+), 4 deletions(-) create mode 100644 arch/c5471/src/up_lowputc.S create mode 100755 tools/mkimage.sh diff --git a/Makefile b/Makefile index 34bb7ab895..48fab7bda6 100644 --- a/Makefile +++ b/Makefile @@ -105,15 +105,21 @@ examples/$(CONFIG_EXAMPLE)/lib$(CONFIG_EXAMPLE).a: context $(BIN): context depend $(OBJS) $(LIBS) ifeq ($(CONFIG_ARCH),sim) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) $(LDLIBS) - $(NM) $(BIN) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map + @$(NM) $(BIN) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map else $(LD) --entry=__start $(LDFLAGS) -o $@ $(OBJS) $(LIBS) $(LDLIBS) - $(NM) $(BIN) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map + @$(NM) $(BIN) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map @export vflashstart=`$(OBJDUMP) --all-headers $(BIN) | grep _vflashstart | cut -d' ' -f1`; \ if [ ! -z "$$vflashstart" ]; then \ $(OBJCOPY) --adjust-section-vma=.vector=0x$$vflashstart $(BIN) $(BIN).flashimage; \ mv $(BIN).flashimage $(BIN); \ fi +ifeq ($(CONFIG_RRLOAD_BINARY),y) + @tools/mkimage.sh nuttx nuttx.rr + @if [ -w /tftpboot ] ; then \ + cp -f nuttx.rr /tftpboot/nuttx.rr.${CONFIG_ARCH}; \ + fi +endif endif depend: @@ -127,7 +133,7 @@ clean: done $(MAKE) -C tools -f Makefile.mkconfig TOPDIR=$(TOPDIR) clean $(MAKE) -C mm -f Makefile.test TOPDIR=$(TOPDIR) clean - rm -f $(BIN) context mm_test System.map *~ *.flashimage + rm -f $(BIN) $(BIN).rr $(BIN).stripped $(BIN).flashimage mm_test System.map *~ distclean: clean clean_context @for dir in $(SUBDIRS) ; do \ diff --git a/arch/c5471/defconfig b/arch/c5471/defconfig index c48d0b8379..efb0d7cc6d 100644 --- a/arch/c5471/defconfig +++ b/arch/c5471/defconfig @@ -98,12 +98,20 @@ CONFIG_ARCH_KMALLOC=n CONFIG_ARCH_KZMALLOC=n CONFIG_ARCH_KFREE=n +# # General Compile environment setup # # CONFIG_HAVE_LONG_LONG - enable if your architecture supports # long long types and if you plan to use them CONFIG_HAVE_LONG_LONG=n +# +# General build options +# +# CONFIG_RRLOAD_BINY - make the rrload binary format used with +# BSPs from www.ridgerun.com +CONFIG_RRLOAD_BINARY=y + # # Sizes of configurable things (0 disables) # diff --git a/arch/c5471/src/Makefile b/arch/c5471/src/Makefile index d5dc016e1e..a9c0fb117d 100644 --- a/arch/c5471/src/Makefile +++ b/arch/c5471/src/Makefile @@ -38,7 +38,8 @@ MKDEP = $(TOPDIR)/tools/mkdeps.sh CFLAGS += -I$(TOPDIR)/sched -ASRCS = up_vectors.S up_saveusercontext.S up_fullcontextrestore.S +ASRCS = up_vectors.S up_saveusercontext.S up_fullcontextrestore.S \ + up_lowputc.S AOBJS = $(ASRCS:.S=.o) CSRCS = up_initialize.c up_initialstate.c up_idle.c \ diff --git a/arch/c5471/src/up_lowputc.S b/arch/c5471/src/up_lowputc.S new file mode 100644 index 0000000000..24bf551feb --- /dev/null +++ b/arch/c5471/src/up_lowputc.S @@ -0,0 +1,127 @@ +/************************************************************************** + * up_lowputc.S + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************/ + +/************************************************************************** + * Included Files + **************************************************************************/ + +#include +#include "up_internal.h" +#include "c5471.h" + +/************************************************************************** + * Private Definitions + **************************************************************************/ + +/************************************************************************** + * Private Types + **************************************************************************/ + +/************************************************************************** + * Private Function Prototypes + **************************************************************************/ + +/************************************************************************** + * Global Variables + **************************************************************************/ + +/************************************************************************** + * Private Variables + **************************************************************************/ + +/************************************************************************** + * Private Functions + **************************************************************************/ + +/************************************************************************** + * Public Functions + **************************************************************************/ + +/************************************************************************** + * Name: up_lowputc + **************************************************************************/ + +/* This assembly language version has the advantage that it can does not + * require a C stack and uses only r0-r1. Hence it can be used during + * early boot phases. + */ + + .text + .global up_putc + .type up_lowputc, function +up_lowputc: + /* On entry, r0 holds the character to be printed */ + +#ifdef CONFIG_SERIAL_IRDA_CONSOLE + ldr r2, =UART_IRDA_BASE /* r2=IRDA UART base */ +#else + ldr r2, =UART_MODEM_BASE /* r2=Modem UART base */ +#endif + + /* Poll bit 0 of the UART_SSR register. When the bit + * is clear, the TX FIFO is no longer full + */ + +1: ldr r1, [r2, #UART_SSR_OFFS] + tst r1, #UART_SSR_TXFULL + bne 1b + + /* Send the character by writing it into the UART_THR + * register. + */ + + str r0, [r2, #UART_THR_OFFS] + + /* Wait for the tranmsit holding regiser (THR) to be + * emptied. This is detemined when bit 6 of the LSR + * is set. + */ + +2: ldr r1, [r2, #UART_LSR_OFFS] + tst r1, #0x00000020 + beq 2b + + /* If the character that we just sent was a linefeed, + * then send a carriage return as well. + */ + + teq r0, #'\n' + moveq r0, #'\r' + beq 1b + + /* And return */ + + mov pc, lr + diff --git a/arch/sim/defconfig b/arch/sim/defconfig index 60656fce38..ab62eb4525 100644 --- a/arch/sim/defconfig +++ b/arch/sim/defconfig @@ -96,12 +96,20 @@ CONFIG_ARCH_KMALLOC=n CONFIG_ARCH_KZMALLOC=n CONFIG_ARCH_KFREE=n +# # General Compile environment setup # # CONFIG_HAVE_LONG_LONG - enable if your architecture supports # long long types and if you plan to use them CONFIG_HAVE_LONG_LONG=n +# +# General build options +# +# CONFIG_RRLOAD_BINY - make the rrload binary format used with +# BSPs from www.ridgerun.com +CONFIG_RRLOAD_BINARY=n + # # Sizes of configurable things (0 disables) # diff --git a/tools/mkimage.sh b/tools/mkimage.sh new file mode 100755 index 0000000000..8a32cc0304 --- /dev/null +++ b/tools/mkimage.sh @@ -0,0 +1,305 @@ +#!/bin/sh +# +# File: mkimage.sh +# +# Copyright (C) 2002 RidgeRun, Inc. +# Author: RidgeRun, Inc +# - Adapted for the Cadenux environment, 9-6-02, Gregory Nutt +# - Added --EAddr option, 6-18-03, Gregory Nutt +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 675 Mass Ave, Cambridge, MA 02139, USA. +# +######################################################## +# Description: +# ----------- +# Scenario #1 +# ----------- +# This utility was developed by RidgeRun for the +# purpose of converting a standard binary executable +# image (such as ELF) into a special format (RR +# format) suitable for quick downloads to the target +# TI925 RidgeRun Bootloader (rrload). The image is +# produced by constructing a special header which is +# then tacked onto the front of the supplied binary +# image. The resulting binary image is smaller than +# what would normally be encountered with traditional +# download formats (such as SREC or uuencoded; both +# ascii based). The special header at the front of the +# image is used to guide the target's rrload (a +# booloader developed by RidgeRun Inc). The header +# data contains a field representing the total byte +# count of the binary data following the header as +# well as a field that indicates the load address of +# run image. Additionally, a field exists in the +# header which indicates the image's entry point which +# could be called by the bootloader to invoked the +# just downloaded program. +# ----------- +# Scenario #2 +# ----------- +# If the supplied image is not a standard binary +# executagle image then that is ok too, a header is +# constructed and tacked onto the front of the supplied +# binary data forming the new binary image (in rr format). +# In this case the EntryAddr is set to 0xFFFFFFFF by +# default and the LoadAddr is set to 0x00000000 by +# default unless otherwise indicated by command line +# arguments -LEntry and -LAddr which if used are assumed +# to be in hexidecimal units. +# +# ----------- +# Scenario #3 +# ----------- +# +# Read/Write file system (like JFFS) that will not +# work if rrload stores a 20 byte header at the beginning +# of the flashed component image +# +# mkimage [--NoHeader ] +# +# Usage: +# mkimage [--LAddr h] [--EAddr h] [--NoHeader] +# +# Examples: +# $ mkimage linux linux.rr +# ..or.. +# $ mkimage -LAddr 10008000 -EAddr 10008000 vmlinux vmlinux.rr +# ..or.. +# $ mkimage --NoHeader fileSys.gz fileSys.gz.rr +# ..or.. +# $ mkimage --LAddr A00 fileSys.gz fileSys.gz.rr +# ..or.. +# $ mkimage --LAddr A00 fileSys.gz fileSys.gz.rr +# ^ +# | +# Assumed hex units. +# Please omit the +# leading "0x". +######################################################## + +if [ "${CADENUX_ARCH}" = "dsc21" ] ; then + prefix="arm-uclinux-" +elif [ "${CADENUX_ARCH}" = "dsc24" ] ; then + prefix="arm-uclinux-" +elif [ "${CADENUX_ARCH}" = "dsc25" ] ; then + prefix="arm-uclinux-" +elif [ "${CADENUX_ARCH}" = "dm270" ] ; then + prefix="arm-uclinux-" +elif [ "${CADENUX_ARCH}" = "c5471" ] ; then + prefix="arm-uclinux-" +elif [ "${CADENUX_ARCH}" = "ti925" ] ; then + prefix="arm-linux-" +elif [ "${CADENUX_ARCH}" = "omap710" ] ; then + prefix="arm-linux-" +elif [ "${CADENUX_ARCH}" = "omap1510" ] ; then + prefix="arm-linux-" +elif [ "${CADENUX_ARCH}" = "dm310" ] ; then + prefix="arm-linux-" +else + prefix="" +fi + +if [ $# -lt 2 ] ; then + echo "Error: missing argument" + echo "Usage: mkimage [--LAddr n] [--EAddr n] [--NoHeader] " + exit 1 +fi + +# Pleae Note the following formatting inconsistency. +# (Sorry, for now this is necessary) +LoadAddr="00000000" # Note: hex val *without* proceeding "0x" +EntryAddr="0xFFFFFFFF" # Note: hex val *with* procedding "0x" + +Header="y" +LAddrSupplied="n" +EAddrSupplied="n" +compress="n" + +while [ $# -gt 0 ] ; do + case "$1" in + --LAddr ) + shift + LoadAddr="$1" + # Next, make the supplied LAddr exactly 8 hex chars long. + LoadAddr="0000000${LoadAddr}" + LoadAddr=$(echo $LoadAddr | sed -e "s/^.*\(........\)$/\1/g") + LAddrSupplied="y" + shift + ;; + --EAddr ) + shift + EntryAddr="$1" + # Next, make the supplied LEntry exactly 8 hex chars long. + EntryAddr="0000000${EntryAddr}" + EntryAddr=$(echo $EntryAddr | sed -e "s/^.*\(........\)$/\1/g") + EntryAddr=0x$EntryAddr + EAddrSupplied="y" + shift + ;; + --NoHeader ) + Header="n" + shift + ;; + --compress ) + compress="y" + shift + ;; + *) + break + ;; + esac +done + +if [ ! $# -eq 2 ] ; then + echo "Error: invalid argument set." + echo "Usage: mkimage [--LAddr h] " + exit 1 +fi + +binary=$1.stripped +outbin=$2 + +cp $1 $binary +FileTypeExec=$(${prefix}objdump -f $binary 2>/dev/null | egrep "EXEC_P") + +if [ ! -z "$FileTypeExec" ] ; then + + # ----------- + # Scenario #1 + # ----------- + # We have an executable style binary (like ELF, etc). + # So... + # --------------------------------- + # Next | Create the binary image data. + # --------------------------------- + ${prefix}strip ${binary} + ${prefix}objcopy -S -O binary $binary ${binary}.binary + # --------------------------------- + # Next | Create compress image if requested + # --------------------------------- + image_file=${binary}.binary + if [ "$compress" = "y" ] ; then + gzip -f -9 -c ${binary}.binary > ${binary}.binary.gz + image_file=${binary}.binary.gz + fi + # --------------------------------- + # Next | Create the header information (ascii) needed + # | by the TI925 bootloader. This includes the + # | load address, entry address and byte count of + # | the binary executable data which will follow it. + # --------------------------------- + if [ "$LAddrSupplied" = "n" ] ; then + # Next, Since LoadAddr not already supplied by user we'll + # derive it by consulting the binary executable file. + LoadAddr=$(${prefix}objdump -h ${binary} | grep " 0 \.") + LoadAddr=$(echo $LoadAddr | cut -d' ' -f4) # eight hex chars + fi + if [ "$EAddrSupplied" = "n" ] ; then + # Next, Since EntryAddr not already supplied by user we'll + # derive it by consulting the binary executable file. + EntryAddr=$(${prefix}objdump -f ${binary} | grep -i "start") + EntryAddr=$(echo $EntryAddr | cut -d' ' -f3) # eight hex chars + fi + # Next, Compute byte length of binary portion. + numBytes=$(wc --bytes $image_file) + numBytes=$(echo $numBytes | cut -d' ' -f1) + numBytes=$(echo 16o $numBytes p | dc) # converts to hex. + # Next, make the numBytes string exactly 8 hex chars long. + numBytes="0000000${numBytes}" + numBytes=$(echo $numBytes | sed -e "s/^.*\(........\)$/\1/g") + # --------------------------------- + # Next | Combine the ascii header information + # | with the binary image to make the + # | final downloadable *mostly* binary + # | image. + # --------------------------------- + rm -f ${outbin} + echo ">LoadAddr :0x${LoadAddr}" >> ${outbin} + if [ "${Header}" = "y" ]; then + echo ">EntryAddr:${EntryAddr}" >> ${outbin} + else + echo ">NoHeader" >> ${outbin} + fi + echo ">NumBytes :0x${numBytes}" >> ${outbin} + cat $image_file >> ${outbin} + # --------------------------------- + # Cleanup and exit + # --------------------------------- + rm -f ${binary}.binary $image_file + exit 0 + +else + + # ----------- + # Scenario #2 + # ----------- + # Just a binary image but not a standard executable + # style binary (like ELF, etc). Might be a compressed + # filesystem image, etc. + # So... + # --------------------------------- + # Next | Create the header information (ascii) needed + # | by the TI925 bootloader. This includes the + # | load address, entry address and byte count of + # | the binary file which will follow it. + # --------------------------------- + # | Create compress image if requested + # --------------------------------- + # + image_file=${binary} + if [ "$compress" = "y" ] ; then + gzip -f -9 -c ${image_file} > ${image_file}.gz + image_file=${image_file}.gz + fi + # + # Note: The LoadAddr and EntryAddr are already established + # for us at this point, but we will need to compute the + # byte length of binary portion next. + # + numBytes=$(wc --bytes ${image_file}) + numBytes=$(echo $numBytes | cut -d' ' -f1) + numBytes=$(echo 16o $numBytes p | dc) # converts to hex. + # Next, make the numBytes string exactly 8 hex chars long. + numBytes="0000000${numBytes}" + numBytes=$(echo $numBytes | sed -e "s/^.*\(........\)$/\1/g") + # + # --------------------------------- + # Next | Combine the ascii header information + # | with the binary image to make the + # | final downloadable *mostly* binary + # | image. + # --------------------------------- + # + rm -f ${outbin} + echo ">LoadAddr :0x${LoadAddr}" >> ${outbin} + if [ ${Header} = "y" ]; then + echo ">EntryAddr:${EntryAddr}" >> ${outbin} + else + echo ">NoHeader" >> ${outbin} + fi + echo ">NumBytes :0x${numBytes}" >> ${outbin} + cat ${image_file} >> ${outbin} + # --------------------------------- + # Cleanup and exit + # --------------------------------- + rm -f ${image_file}.gz + exit 0 +fi