Obsolete support for the 8051 family. Trying to maintain compatibility with this family is too much effort and there has never really been a successful NuttX impplementation on these parts

This commit is contained in:
Gregory Nutt
2014-09-01 12:27:17 -06:00
parent 42f5a0ca31
commit 998740e75a
41 changed files with 0 additions and 6119 deletions
-48
View File
@@ -1,48 +0,0 @@
#
# For a description of the syntax of this configuration file,
# see misc/tools/kconfig-language.txt.
#
if ARCH_8051
comment "ARM Options"
choice
prompt "8051 Chip Selection"
default ARCH_CHIP_8052
config ARCH_CHIP_8051
bool "8051"
config ARCH_CHIP_8052
bool "8052"
endchoice # 8051 Chip Selection
comment "Bring-up Debug Options"
config ARCH_8051_BRINGUP
bool "Bring-up debug"
default n
---help---
Enable bring-up debug instrumentation
config ARCH_8051_NOSYSTIMER
bool "No system timer"
---help---
By default, Timer0 will be used as the system timer. Use of the
system timer can be suppressed with the setting. This is useful
during bring-up.
config ARCH_8051_BRINGUP
bool "Bring-up debug"
default n
---help---
Enable bring-up debug instrumentation
config ARCH_8051_SUPRESS_INTERRUPTS
bool "Suppress interrupts"
default n
---help---
It is useful during low-level bring-up to suppress all interrupts.
endif # ARCH_8051
-86
View File
@@ -1,86 +0,0 @@
/************************************************************************
* arch.h
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
************************************************************************/
/* This file should never be included directed but, rather,
* only indirectly through nuttx/arch.h
*/
#ifndef __ARCH_ARCH_H
#define __ARCH_ARCH_H
/************************************************************************
* Included Files
************************************************************************/
#include <stdint.h>
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Public Types
************************************************************************/
/************************************************************************
* Public Variables
************************************************************************/
/************************************************************************
* Public Function Prototypes
************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/* The 805x family has a tiny, 256 stack and can be easily
* overflowed. The following macro can be used to instrument
* code to dump the stack pointer at critical locations.
*/
void up_showsp(uint8_t ch) __naked;
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __ARCH_ARCH_H */
-206
View File
@@ -1,206 +0,0 @@
/************************************************************************
* irq.h
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
************************************************************************/
/* This file should never be included directed but, rather,
* only indirectly through nuttx/irq.h
*/
#ifndef __ARCH_IRQ_H
#define __ARCH_IRQ_H
/************************************************************************
* Included Files
************************************************************************/
#include <nuttx/config.h>
#ifndef __ASSEMBLY__
# include <stdint.h>
#endif
/************************************************************************
* Definitions
************************************************************************/
#define EXT_INT0_IRQ 0
#define TIMER0_IRQ 1
#define EXT_INT1_IRQ 2
#define TIMER1_IRQ 3
#define UART_IRQ 4
#define TIMER2_IRQ 5
#define NR_IRQS 6
/* The stack for all tasks/threads lie at the same position
* in IRAM. On context switches, the STACK contents will be
* copied into the TCB.
*/
#define IRAM_BASE 0x0000
#ifdef CONFIG_ARCH_CHIP_8052
# define IRAM_SIZE 0x0100
#else
# define IRAM_SIZE 0x0080
#endif
#define STACK_BASE 0x0024
#define STACK_SIZE (IRAM_SIZE - STACK_BASE)
/* This is the form of initial stack frame
*
* This initial stack frame will be configured to hold.
* (1) The 16-bit return address of either:
*
* void task_start(void);
* void pthread_start(void)
*
* The return address is stored at the top of stack.
* so that the RETI instruction will work:
*
* PC15-8 <- ((SP))
* (SP) <- (SP) -1
* PC7-0 <- ((SP))
* (SP) <- (SP) -1
*/
#define FRAME_RETLS 0
#define FRAME_RETMS 1
/* Then a partial context context save area that can be
* indexed with the following definitions (relative to the
* beginning of the initial frame.
*/
#define FRAME_ACC 2
#define FRAME_IE 3
#define FRAME_DPL 4
#define FRAME_DPH 5
#define FRAME_SIZE 6
/* The remaining registers are not saved on the stack (due
* to the limited stack size of the 8051/2) but in an array
* in the TCB:
*/
#define REGS_B 0
#define REGS_R2 1
#define REGS_R3 2
#define REGS_R4 3
#define REGS_R5 4
#define REGS_R6 5
#define REGS_R7 6
#define REGS_R0 7
#define REGS_R1 8
#define REGS_PSW 9
#define REGS_BP 10
#define REGS_SIZE 11
/* Note that the stack pointer is not saved. Rather, the
* size of the saved stack frame is saved in the 'nbytes'
* field. Since that stack begins at a fixed location, the
* top-of-stack pointer can be derived from the saved size.
*/
/* These are offsets into struct xcptcontext that can be
* used from assembly language to access the structure.
*/
#define XCPT_NBYTES 0
#define XCPT_STACK 1
#define XCPT_REGS (STACK_SIZE+1)
#define XCPT_SIZE (STACK_SIZE+REGS_SIZE+1)
/************************************************************************
* Public Types
************************************************************************/
/* This struct defines the way the registers are stored */
#ifndef __ASSEMBLY__
struct xcptcontext
{
/* This is the number of valid bytes currently saved in
* stack[]. Since that stack begins at a fixed location,
* the top-of-stack pointer can be derived from this size.
*/
uint8_t nbytes;
/* This is the saved stack. Space is allocated for the
* entire 256 byte IRAM (minus register and bit usage at
* the beginning).
*/
uint8_t stack[STACK_SIZE];
/* These are save 8051/2 registers. These are saved
* separately from the stack to increase the effective
* stack size.
*/
uint8_t regs[REGS_SIZE];
};
#endif /* __ASSEMBLY */
/************************************************************************
* Public Variables
************************************************************************/
/************************************************************************
* Public Function Prototypes
************************************************************************/
#ifndef __ASSEMBLY__
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif
EXTERN irqstate_t irqsave(void);
EXTERN void irqrestore(irqstate_t flags);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __ASSEMBLY */
#endif /* __ARCH_IRQ_H */
-84
View File
@@ -1,84 +0,0 @@
/************************************************************
* arch/8051/include/limits.h
*
* Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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.
*
************************************************************/
#ifndef __ARCH_8051_INCLUDE_LIMITS_H
#define __ARCH_8051_INCLUDE_LIMITS_H
/************************************************************
* Included Files
************************************************************/
/************************************************************
* Definitions
************************************************************/
#define CHAR_BIT 8
#define SCHAR_MIN (-SCHAR_MAX - 1)
#define SCHAR_MAX 127
#define UCHAR_MAX 255
/* These could be different on machines where char is unsigned */
#ifdef __CHAR_UNSIGNED__
#define CHAR_MIN 0
#define CHAR_MAX UCHAR_MAX
#else
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX
#endif
#define SHRT_MIN (-SHRT_MAX - 1)
#define SHRT_MAX 32767
#define USHRT_MAX 65535U
#define INT_MIN (-INT_MAX - 1)
#define INT_MAX 32767
#define UINT_MAX 65535U
/* These change on 32-bit and 64-bit platforms */
#define LONG_MIN (-LONG_MAX - 1)
#define LONG_MAX 2147483647L
#define ULONG_MAX 4294967295UL
/* For SDCC, a Generic pointer is 3 bytes in length with the
* first byte holding data space information.
*/
#define PTR_MIN (-PTR_MAX - 1)
#define PTR_MAX 8388607
#define UPTR_MAX 16777215U
#endif /* __ARCH_8051_INCLUDE_LIMITS_H */
-82
View File
@@ -1,82 +0,0 @@
/****************************************************************************
* arch/8051/include/syscall.h
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
****************************************************************************/
/* This file should never be included directed but, rather, only indirectly
* through include/syscall.h or include/sys/sycall.h
*/
#ifndef __ARCH_8051_INCLUDE_SYSCALL_H
#define __ARCH_8051_INCLUDE_SYSCALL_H
/****************************************************************************
* Included Files
****************************************************************************/
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Public Types
****************************************************************************/
/****************************************************************************
* Inline functions
****************************************************************************/
/****************************************************************************
* Public Variables
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifndef __ASSEMBLY__
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif
#endif /* __ARCH_8051_INCLUDE_SYSCALL_H */
-98
View File
@@ -1,98 +0,0 @@
/************************************************************************
* arch/8051/include/types.h
*
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
************************************************************************/
/* This file should never be included directed but, rather,
* only indirectly through sys/types.h
*/
#ifndef __ARCH_8051_INCLUDE_TYPES_H
#define __ARCH_8051_INCLUDE_TYPES_H
/************************************************************************
* Included Files
************************************************************************/
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Type Declarations
************************************************************************/
#ifndef __ASSEMBLY__
/* These are the sizes of the standard integer types. NOTE that these type
* names have a leading underscore character. This file will be included
* (indirectly) by include/stdint.h and typedef'ed to the final name without
* the underscore character. This roundabout way of doings things allows
* the stdint.h to be removed from the include/ directory in the event that
* the user prefers to use the definitions provided by their toolchain header
* files
*
*
* For SDCC, sizeof(int) is 16 and sizeof(long) is 32.
* long long and double are not supported.
*/
typedef signed char _int8_t;
typedef unsigned char _uint8_t;
typedef signed int _int16_t;
typedef unsigned int _uint16_t;
typedef signed long _int32_t;
typedef unsigned long _uint32_t;
/* For SDCC, a Generic pointer is 3 bytes in length with the
* first byte holding data space information.
*/
typedef signed long _intptr_t;
typedef unsigned long _uintptr_t;
/* This is the size of the interrupt state save returned by
* irqsave()
*/
typedef unsigned char irqstate_t;
#endif /* __ASSEMBLY__ */
/************************************************************************
* Global Function Prototypes
************************************************************************/
#endif /* __ARCH_8051_INCLUDE_TYPES_H */
-16
View File
@@ -1,16 +0,0 @@
Make.dep
.depend
up_mem.h
*.sym
*.asm
*.rel
*.lst
*.adb
*.rst
*.lib
*.lnk
*.map
*.mem
*.ihx
*.hex
-54
View File
@@ -1,54 +0,0 @@
############################################################################
# arch/8051/src/Makefile
#
# Copyright (C) 2007, 2008, 2011-2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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.
#
############################################################################
# Makefile fragments
-include $(TOPDIR)/Make.defs
-include chip/Make.defs
-include board/Make.defs
# Check for SDCC native windows build
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
# SDCC Windows native build
include Makefile.sdccw
else
# SDCC in a POSIX environment (Linux, OSX, or Cygwin/MSYS)
include Makefile.sdccl
endif
-278
View File
@@ -1,278 +0,0 @@
############################################################################
# arch/8051/src/Makefile.sdccl
#
# Copyright (C) 2007, 2008, 2011-2012, 2014 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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.
#
############################################################################
-include $(TOPDIR)/Make.defs
# Tools
# CFLAGS, CPPFLAGS, ASFLAGS, LDFLAGS are set in $(TOPDIR)/Make.defs
CFLAGS += -I$(TOPDIR)/sched
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -D__ASSEMBLY__
LDFLAGS += --model-large --nostdlib --data-loc $(DEF_STACK_BASE) \
--iram-size $(IRAM_SIZE) --code-loc 0x2100 --code-size 0x5f40 \
--xram-loc $(IRAM_SIZE) --xram-size 0x1f00
# Files and directories
# There should be one head source (.asm file)
HEAD_SSRC = up_head.S
HEAD_ASRC = $(HEAD_SSRC:.S=$(ASMEXT))
HEAD_OBJ = $(HEAD_ASRC:$(ASMEXT)=$(OBJEXT))
# Assembly sources and objects
SSRCS =
ASRCS = $(SSRCS:.S=$(ASMEXT))
AOBJS = $(ASRCS:$(ASMEXT)=$(OBJEXT))
# C sources and objects
CSRCS = up_initialize.c up_idle.c up_interruptcontext.c up_initialstate.c \
up_unblocktask.c up_blocktask.c up_releasepending.c \
up_reprioritizertr.c up_exit.c up_assert.c up_allocateheap.c \
up_irq.c up_savecontext.c up_restorecontext.c up_putc.c \
up_debug.c up_delay.c
ifneq ($(CONFIG_SCHED_TICKLESS),y)
CSRCS += up_timerisr.c
endif
COBJS = $(CSRCS:.c=$(OBJEXT))
# All sources and objcts
SRCS = $(SSRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
DEPSRCS = $(SRCS) $(HEAD_SSRC)
# Board path
BOARDDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src/board
# Source path
VPATH = chip:common:board
# Libraries
SDCCLIBS = -llibfloat.lib -llibint.lib -lliblong.lib -llibmysdcc.lib -lmcs51.lib
LINKLIBS ?=
LIBPATHS = -L"$(TOPDIR)/lib"
LDLIBS = $(patsubst %.a,%,$(patsubst lib%,-l%,$(LINKLIBS)))
# Test sources
TESTSRCS = up_irqtest.c
TESTOBJS = $(TESTSRCS:.c=$(OBJEXT))
TESTLINKOBJS = up_head$(OBJEXT)
TESTEXTRAOBJS = up_savecontext$(OBJEXT) up_restorecontext$(OBJEXT)
# Memory
HEAP1_BASE = ${shell \
if [ -e pass1.mem ]; then \
cat pass1.mem | grep "EXTERNAL RAM" | \
sed -e "s/[ ][ ]*/ /g" | cut -d' ' -f5 ; \
else \
echo $(IRAM_SIZE) ; \
fi \
}
DEF_HEAP2_BASE = 0x6000
HEAP2_BASE = ${shell \
if [ -e pass1.mem ]; then \
cat pass1.mem | grep "ROM/EPROM/FLASH" | \
sed -e "s/[ ][ ]*/ /g" | cut -d' ' -f4 ; \
else \
echo $(DEF_HEAP2_BASE) ; \
fi \
}
STACK_BASE = ${shell \
if [ -e pass1.mem ]; then \
cat pass1.mem | grep "Stack starts" | \
cut -d' ' -f4 ; \
else \
echo $(DEF_STACK_BASE) ; \
fi \
}
# Targets
all: up_head$(OBJEXT) libarch$(LIBEXT)
.PHONY: board/libboard$(LIBEXT)
$(ASRCS) $(HEAD_ASRC): %$(ASMEXT): %.S
$(CPP) -P $(CPPFLAGS) $< -o $@
$(AOBJS) $(HEAD_OBJ): $(ASRCS) $(HEAD_ASRC)
$(call ASSEMBLE, $<, $@)
$(COBJS) $(TESTOBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
# This is a kludge to work around some conflicting symbols in the SDCC libraries
$(TOPDIR)/lib/$(SDCCLIB): $(SDCC_LIBDIR)/$(SDCCLIB)
$(Q) cp $(SDCC_LIBDIR)/$(SDCCLIB) $(TOPDIR)/lib/$(SDCCLIB)
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _calloc.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _malloc.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _realloc.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _free.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) printf_large.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) sprintf.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) vprintf.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) strcpy.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) strlen.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strcat.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strchr.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strcmp.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strcspn.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strncat.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strncmp.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strncpy.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strpbrk.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strrchr.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strspn.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strstr.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _strtok.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _memchr.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _memcmp.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _memcpy.rel
$(Q) sdar d $(TOPDIR)/lib/$(SDCCLIB) _memset.rel
# Create a header file that contains addressing information needed by the code
up_mem.h: pass1.mem
@echo "#ifndef __ARCH_MEM_H" >up_mem.h
@echo "#define __ARCH_MEM_H" >>up_mem.h
@echo "" >>up_mem.h
@echo "#define UP_DEFAULT_STACK_BASE $(DEF_STACK_BASE)" >>up_mem.h
@echo "#define UP_DEFAULT_HEAP1_BASE $(IRAM_SIZE)" >> up_mem.h
@echo "#define UP_DEFAULT_HEAP2_BASE $(DEF_HEAP2_BASE)" >> up_mem.h
@echo "" >>up_mem.h
@echo "#define UP_STACK_BASE $(STACK_BASE)" >>up_mem.h
@echo "#if UP_STACK_BASE > UP_DEFAULT_STACK_BASE" >>up_mem.h
@echo "# error \"Stack overlap: $(DEF_STACK_BASE) < $(STACK_BASE)\"" >>up_mem.h
@echo "#elif UP_STACK_BASE < UP_DEFAULT_STACK_BASE" >>up_mem.h
@echo "# warning \"Wasted stack: $(DEF_STACK_BASE) > $(STACK_BASE)\"" >>up_mem.h
@echo "#endif" >>up_mem.h
@echo "" >>up_mem.h
@echo "#define UP_HEAP1_BASE $(HEAP1_BASE)" >> up_mem.h
@echo "#define UP_HEAP1_END 0x2000" >> up_mem.h
@echo "" >>up_mem.h
@echo "#define UP_HEAP2_BASE $(HEAP2_BASE)" >> up_mem.h
@echo "#define UP_HEAP2_END 0x8000" >> up_mem.h
@echo "" >>up_mem.h
@echo "#endif /* __ARCH_MEM_H */" >>up_mem.h
# Combine all objects in this directory into a library
libarch$(LIBEXT): up_mem.h $(OBJS)
$(call ARCHIVE, $@, $(OBJS))
# This builds the libboard library in the board/ subdirectory
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board TOPDIR="$(TOPDIR)" libboard$(LIBEXT) EXTRADEFINES=$(EXTRADEFINES)
# This target builds the final executable
pass1.hex: up_mem.h $(TOPDIR)/lib/$(SDCCLIB) $(HEAD_OBJ) board/libboard$(LIBEXT)
@echo "LD: $@"
$(Q) "$(CC)" $(LDFLAGS) $(LIBPATHS) -L$(BOARDDIR) $(SDCCPATH) $(HEAD_OBJ) \
$(LDLIBS) -llibboard$(LIBEXT) $(SDCCLIBS) -o $@
$(Q) rm -f up_mem.h
$(Q) rm -f up_allocateheap$(OBJEXT) libarch$(LIBEXT)
$(Q) $(MAKE) TOPDIR=$(TOPDIR) libarch$(LIBEXT)
nuttx.hex: up_mem.h $(TOPDIR)/lib/$(SDCCLIB) $(HEAD_OBJ)
@echo "LD: $@"
$(Q) "$(CC)" $(LDFLAGS) $(LIBPATHS) -L$(BOARDDIR) $(SDCCPATH) $(HEAD_OBJ) \
$(LDLIBS) -llibboard$(LIBEXT) $(SDCCLIBS) -o $@
nuttx$(EXEEXT): pass1.hex nuttx.hex
$(Q) rm -f pass1.*
$(Q) packihx nuttx.hex > $(TOPDIR)/nuttx$(EXEEXT)
$(Q) cp -f nuttx.map $(TOPDIR)/.
# This is part of the top-level export target
export_head: board/libboard$(LIBEXT) p_head$(OBJEXT)
$(Q) if [ -d "$(EXPORT_DIR)/startup" ]; then \
cp -f up_head$(OBJEXT) "$(EXPORT_DIR)/startup"; \
else \
echo "$(EXPORT_DIR)/startup does not exist"; \
exit 1; \
fi
# This target builds a test program to verify interrupt context switching. irqtest is
# a PHONY target that just sets upt the up_irqtest build correctly
up_irqtest.hex: $(TESTOBJS)
$(Q) "$(CC)" $(LDFLAGS) -L. $(SDCCPATH) $(TESTLINKOBJS) $(TESTOBJS) $(TESTEXTRAOBJS) $(SDCCLIBS) -o $@
irqtest:
$(Q) $(MAKE) TOPDIR=../../.. up_irqtest.hex
# Build dependencies
.depend: Makefile up_mem.h $(DEPSRCS)
$(Q) if [ -e board/Makefile ]; then \
$(MAKE) -C board TOPDIR=$(TOPDIR) depend ; \
fi
$(Q) $(MKDEP) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
$(Q) touch $@
depend: .depend
clean:
$(Q) if [ -e board/Makefile ]; then \
$(MAKE) -C board TOPDIR=$(TOPDIR) clean ; \
fi
$(call DELFILE, libarch$(LIBEXT))
$(call DELFILE, up_mem.h)
$(call CLEAN)
distclean: clean
$(Q) if [ -e board/Makefile ]; then \
$(MAKE) -C board TOPDIR=$(TOPDIR) distclean ; \
fi
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
-include Make.dep
-89
View File
@@ -1,89 +0,0 @@
/************************************************************
* up_allocateheap.c
*
* Copyright (C) 2007, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <sys/types.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/arch.h>
#include <nuttx/kmalloc.h>
#include "up_internal.h"
#include "up_mem.h"
/************************************************************
* Private Definitions
************************************************************/
/************************************************************
* Private Data
************************************************************/
/************************************************************
* Private Functions
************************************************************/
/************************************************************
* Public Functions
************************************************************/
/************************************************************
* Name: up_allocate_heap
*
* Description:
* This function will be called to dynamically set aside
* the heap region.
*
************************************************************/
void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
{
*heap_start = (FAR void*)UP_HEAP1_BASE;
*heap_size = UP_HEAP1_END - UP_HEAP1_BASE;
board_led_on(LED_HEAPALLOCATE);
}
#if CONFIG_MM_REGIONS > 1
void up_addregion(void)
{
kmm_addregion((FAR void*)UP_HEAP2_BASE, UP_HEAP2_END - UP_HEAP2_BASE);
}
#endif
-145
View File
@@ -1,145 +0,0 @@
/************************************************************************
* up_assert.c
*
* Copyright (C) 2007, 2009, 2012-2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdlib.h>
#include <assert.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/usb/usbdev_trace.h>
#include <8052.h>
#include "sched/sched.h"
#include "up_internal.h"
#include "up_mem.h"
/************************************************************************
* Pre-processor Definitions
************************************************************************/
/* USB trace dumping */
#ifndef CONFIG_USBDEV_TRACE
# undef CONFIG_ARCH_USBDUMP
#endif
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Name: _up_assert
************************************************************************/
static void _up_assert(int errorcode) noreturn_function;
static void _up_assert(int errorcode)
{
/* Are we in an interrupt handler or the idle task? */
if (g_irqtos || ((FAR struct tcb_s*)g_readytorun.head)->pid == 0)
{
(void)irqsave();
for (;;)
{
#ifdef CONFIG_ARCH_LEDS
board_led_on(LED_PANIC);
up_delay(250);
board_led_off(LED_PANIC);
up_delay(250);
#endif
}
}
else
{
exit(errorcode);
}
}
/****************************************************************************
* Name: assert_tracecallback
****************************************************************************/
#ifdef CONFIG_ARCH_USBDUMP
static int assert_tracecallback(struct usbtrace_s *trace, void *arg)
{
usbtrace_trprintf((trprintf_t)lowsyslog, trace->event, trace->value);
return 0;
}
#endif
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: up_assert
************************************************************************/
void up_assert(const uint8_t *filename, int lineno)
{
#if CONFIG_TASK_NAME_SIZE > 0
struct tcb_s *rtcb = (struct tcb_s*)g_readytorun.head;
#endif
board_led_on(LED_ASSERTION);
#if CONFIG_TASK_NAME_SIZE > 0
lldbg("Assertion failed at file:%s line: %d task: %s\n",
filename, lineno, rtcb->name);
#else
lldbg("Assertion failed at file:%s line: %d\n",
filename, lineno);
#endif
up_dumpstack();
#ifdef CONFIG_ARCH_USBDUMP
/* Dump USB trace data */
(void)usbtrace_enumerate(assert_tracecallback, NULL);
#endif
_up_assert(EXIT_FAILURE);
}
-167
View File
@@ -1,167 +0,0 @@
/************************************************************************
* up_blocktask.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdbool.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/arch.h>
#include "sched/sched.h"
#include "up_internal.h"
/************************************************************************
* Private Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Funtions
************************************************************************/
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: up_block_task
*
* Description:
* The currently executing task at the head of
* the ready to run list must be stopped. Save its context
* and move it to the inactive list specified by task_state.
*
* Inputs:
* tcb: Refers to a task in the ready-to-run list (normally
* the task at the head of the list). It most be
* stopped, its context saved and moved into one of the
* waiting task lists. It it was the task at the head
* of the ready-to-run list, then a context to the new
* ready to run task must be performed.
* task_state: Specifies which waiting task list should be
* hold the blocked task TCB.
*
************************************************************************/
void up_block_task(FAR struct tcb_s *tcb, tstate_t task_state)
{
FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
bool switch_needed;
/* Verify that the context switch can be performed */
ASSERT((tcb->task_state >= FIRST_READY_TO_RUN_STATE) &&
(tcb->task_state <= LAST_READY_TO_RUN_STATE));
dbg("Blocking TCB=%p\n", tcb);
/* Remove the tcb task from the ready-to-run list. If we
* are blocking the task at the head of the task list (the
* most likely case), then a context switch to the next
* ready-to-run task is needed. In this case, it should
* also be true that rtcb == tcb.
*/
switch_needed = sched_removereadytorun(tcb);
/* Add the task to the specified blocked task list */
sched_addblocked(tcb, (tstate_t)task_state);
/* If there are any pending tasks, then add them to the g_readytorun
* task list now
*/
if (g_pendingtasks.head)
{
switch_needed |= sched_mergepending();
}
/* Now, perform the context switch if one is needed */
if (switch_needed)
{
/* Are we in an interrupt handler? */
if (g_irqtos)
{
/* Yes, then we have to do things differently.
* Just copy the current registers into the OLD rtcb.
*/
up_saveirqcontext(&tcb->xcp);
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then setup so that the context will be performed on exit
* from the interrupt.
*/
g_irqcontext = &rtcb->xcp;
}
/* Copy the user C context into the TCB at the (old) head of the
* g_readytorun Task list. if up_savecontext returns a non-zero
* value, then this is really the previously running task restarting!
*/
else if (!up_savecontext(&rtcb->xcp))
{
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then switch contexts */
up_restorecontext(&rtcb->xcp);
}
}
}
-255
View File
@@ -1,255 +0,0 @@
/************************************************************************
* arch/8051/src/up_debug.c
*
* Copyright (C) 2007, 2009, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <sys/types.h>
#include <stdint.h>
#include <debug.h>
#include <8052.h>
#include <nuttx/arch.h>
#include <arch/irq.h>
#include "up_internal.h"
#include "up_mem.h"
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Functions
************************************************************************/
#if defined(CONFIG_FRAME_DUMP) && defined(CONFIG_ARCH_8051_BRINGUP)
static void up_putspace(void) __naked
{
_asm
mov a, #0x20
ljmp PM2_ENTRY_COUT
_endasm;
}
static void _up_putcolon(void) __naked
{
_asm
mov a, #0x3a
ljmp PM2_ENTRY_COUT
_endasm;
}
static void _up_dump16(__code char *ptr, uint8_t msb, uint8_t lsb)
{
up_puts(ptr);
up_puthex(msb);
up_puthex(lsb);
up_putnl();
}
static void _up_dump8(__code char *ptr, uint8_t b)
{
up_puts(ptr);
up_puthex(b);
up_putnl();
}
#endif
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: up_puthex, up_puthex16, up_putnl, up_puts
************************************************************************/
#if defined(CONFIG_ARCH_8051_BRINGUP)
void up_puthex(uint8_t hex) __naked
{
hex; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
ljmp PM2_ENTRY_PHEX
_endasm;
}
void up_puthex16(int hex) __naked
{
hex; /* To avoid unreferenced argument warning */
_asm
ljmp PM2_ENTRY_PHEX16
_endasm;
}
void up_putnl(void) __naked
{
_asm
ljmp PM2_ENTRY_NEWLINE
_endasm;
}
void up_puts(__code char *ptr)
{
for (; *ptr; ptr++)
{
up_putc(*ptr);
}
}
#endif
/************************************************************************
* Name: up_dumpstack
************************************************************************/
#if defined(CONFIG_FRAME_DUMP) && defined(CONFIG_ARCH_8051_BRINGUP)
void up_dumpstack(void)
{
NEAR uint8_t *start = (NEAR uint8_t *)(STACK_BASE & 0xf0);
NEAR uint8_t *end = (NEAR uint8_t *)SP;
uint8_t i;
while (start < end)
{
up_puthex((uint8_t)start);
_up_putcolon();
for (i = 0; i < 8; i++)
{
up_putspace();
if (start < (NEAR uint8_t *)(STACK_BASE) ||
start > end)
{
up_putspace();
up_putspace();
}
else
{
up_puthex(*start);
}
start++;
}
up_putnl();
}
}
#endif
/************************************************************************
* Name: up_dumpframe
************************************************************************/
#if defined(CONFIG_FRAME_DUMP) && defined(CONFIG_ARCH_8051_BRINGUP)
void up_dumpframe(FAR struct xcptcontext *context)
{
#ifdef CONFIG_FRAME_DUMP_SHORT
FAR uint8_t *stack = &context->stack[context->nbytes - FRAME_SIZE];
FAR uint8_t *regs = context->regs;
_up_dump16(" RET ", stack[FRAME_RETMS], stack[FRAME_RETLS]);
_up_dump8 (" IE ", stack[FRAME_IE]);
_up_dump16(" DPTR ", stack[FRAME_DPH], stack[FRAME_DPL]);
_up_dump8 (" PSW ", regs[REGS_PSW]);
_up_dump8 (" SP ", context->nbytes + (STACK_BASE-1));
#else
FAR uint8_t *stack = &context->stack[context->nbytes - FRAME_SIZE];
FAR uint8_t *regs = context->regs;
uint8_t i, j, k;
_up_dump8 (" NBYTES ", context->nbytes);
for (i = 0; i < context->nbytes; i += 8)
{
up_puthex(i);
_up_putcolon();
for (j = 0; j < 8; j++)
{
k = i + j;
up_putspace();
if (k >= context->nbytes)
{
up_putspace();
up_putspace();
}
else
{
up_puthex(context->stack[k]);
}
}
up_putnl();
}
up_puts(" REGS:");
for (i = 0; i < REGS_SIZE; i++)
{
up_putspace();
up_puthex(context->regs[i]);
}
up_putnl();
#endif
}
#endif
/************************************************************************
* Name: up_dumpframe
************************************************************************/
/* The 805x family has a tiny, 256 stack and can be easily
* overflowed. The following macro can be used to instrument
* code to dump the stack pointer at critical locations.
*/
#ifdef CONFIG_ARCH_8051_BRINGUP
void up_showsp(uint8_t ch) __naked
{
ch;
_asm
mov a, dpl
lcall PM2_ENTRY_COUT
mov a, sp
lcall PM2_ENTRY_PHEX
lcall PM2_ENTRY_NEWLINE
_endasm;
}
#endif
-93
View File
@@ -1,93 +0,0 @@
/************************************************************************
* up_delay.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include "up_internal.h"
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Private Types
************************************************************************/
/************************************************************************
* Private Function Prototypes
************************************************************************/
/************************************************************************
* Private Variables
************************************************************************/
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: up_delay
*
* Description:
* Delay inline for the requested number of milliseconds.
* NOT multi-tasking friendly.
*
************************************************************************/
void up_delay(uint8_t milliseconds) __naked
{
_asm
mov r0, dpl
00001$: mov r1, #230
00002$: nop
nop
nop
nop
nop
nop
djnz r1, 00002$
djnz r0, 00001$
ret
_endasm;
}
-106
View File
@@ -1,106 +0,0 @@
/****************************************************************************************
* up_exit.c
*
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <sched.h>
#include <debug.h>
#include <8052.h>
#include <nuttx/arch.h>
#include "task/task.h"
#include "sched/sched.h"
#include "up_internal.h"
/****************************************************************************************
* Private Definitions
****************************************************************************************/
/****************************************************************************************
* Private Data
****************************************************************************************/
/****************************************************************************************
* Private Functions
****************************************************************************************/
/****************************************************************************************
* Public Functions
****************************************************************************************/
/****************************************************************************************
* Name: _exit
*
* Description:
* This function causes the currently executing task to cease
* to exist. This is a special case of task_delete() where the task to
* be deleted is the currently executing task. It is more complex because
* a context switch must be perform to the next ready to run task.
*
****************************************************************************************/
void _exit(int status)
{
FAR struct tcb_s* tcb;
dbg("TCB=%p exiting\n", tcb);
/* Disable interrupts. Interrupts will remain disabled until
* the new task is resumed below when the save IE is restored.
*/
EA = 0;
/* Destroy the task at the head of the ready to run list. */
(void)task_exit();
/* Now, perform the context switch to the new ready-to-run task at the
* head of the list.
*/
tcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", tcb);
/* Then switch contexts */
up_restorecontext(&tcb->xcp);
}
-471
View File
@@ -1,471 +0,0 @@
/************************************************************
* arch/8051/src/up_head.S
*
* Copyright (C) 2007, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <nuttx/irq.h>
#include "up_internal.h"
.module up_head
.optsdcc -mmcs51 --model-large
/************************************************************
* Private Data
************************************************************/
.area REG_BANK_0 (REL,OVR,DATA)
.ds 8
#ifndef CONFIG_ARCH_8051_NOSYSTIMER
.area XSEG
_g_timer0tick:
.ds 1
#endif
/************************************************************
* Public Data
************************************************************/
.globl _g_irqtos
.globl _g_irqcontext
.globl _g_irqregs
/************************************************************
* Public Functions
************************************************************/
.globl _irq_dispatch
.globl _up_restoreregisters
/************************************************************
* Program entry points
************************************************************/
/* Program entry is through PROGRAM_BASE. This is just a
* branch to our start up logic.
*/
.area CODE1 (ABS)
.org PROGRAM_BASE
ljmp start
/* These are indirect interrupt vectors. Logic in PAULMON2,
* captures the interrupt vectors (near address 0x0000) and
* re-routes them through the following entry points.
*
* Each of these saves acc and ie then passes the IRQ number
* to higher level logic in a
*/
.org PM2_VECTOR_EXTINT0
push acc
mov a, #EXT_INT0_IRQ
ljmp _up_interrupt
.org PM2_VECTOR_TIMER0
push acc
#ifdef CONFIG_ARCH_8051_NOSYSTIMER
mov a, #TIMER0_IRQ
ljmp _up_interrupt
#else
ljmp _up_timer0
#endif
.org PM2_VECTOR_EXTINT1
push acc
mov a, #EXT_INT1_IRQ
ljmp _up_interrupt
.org PM2_VECTOR_TIMER1
push acc
mov a, #TIMER1_IRQ
ljmp _up_interrupt
.org PM2_VECTOR_UART
push acc
mov a, #UART_IRQ
ljmp _up_interrupt
.org PM2_VECTOR_TIMER2
push acc
mov a, #TIMER2_IRQ
ljmp _up_interrupt
/************************************************************
* Name: start
*
* Description:
* This is the initial entry point into NuttX
*
************************************************************/
start:
mov sp, #(STACK_BASE-1)
#ifdef CONFIG_ARCH_LEDS
lcall _board_led_initialize
#endif
ljmp _os_start
/************************************************************
* Name: up_timer0
*
* Description:
* Timer 0, mode 0 can be used as a system timer. In that
* mode, the 1.8432 MHz clock is divided by 32. A single
* 8-bit value is incremented at 57600 Hz, which results
* in 225 Timer 0 overflow interrupts per second.
*
* The Timer0 interrupt vectors to this point which then
* does a software divide by 2 to get a system timer of
* 112.5Hz.
*
* On Entry:
*
* (1) acc on the stack and
* (2) the IRQ number(TIMER0_IRQ) in the accumulator
*
************************************************************/
#ifndef CONFIG_ARCH_8051_NOSYSTIMER
_up_timer0:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
/* ACC already on the stack; push IE. Then disable interrupts */
push ie
clr ea
/* Save the remaining registers with interrupts disabled
*
* a, ie, and dptr go on the stack.
*/
push dpl
push dph
/* Increment the tick counter */
mov dptr, #_g_timer0tick
movx a, @dptr
inc a
movx @dptr, a
/* If bit 0 is '0', then just return from the interrupt */
anl a, #0x01
jnz 00101$
ljmp _up_timer0exit
/* If bit 0 is '1', then process the interrupt */
00101$:
mov a, #TIMER0_IRQ
sjmp _up_timer0join
#endif
/************************************************************
* Name: up_interrupt
*
* Description:
* All interrupts vector to this point with:
*
* (1) acc on the stack and
* (2) the IRQ number in the accumulator
*
************************************************************/
_up_interrupt:
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
/* ACC already on the stack; push IE. Then disable interrupts */
push ie
clr ea
/* Save the remaining registers with interrupts disabled
*
* a, ie, and dptr go on the stack.
*/
push dpl
push dph
_up_timer0join:
/* Other registers go into the IRQ register save area */
push acc
mov dptr, #_g_irqregs
lcall _up_saveregisters
/* Show interrupt status on the LEDs */
#ifdef CONFIG_ARCH_LEDS
mov dpl, #LED_INIRQ
lcall _board_led_on
#endif
/* Save the IRQ number in r2 */
pop ar2
/* Mark that we are in an interrupt and provide the top
* of stack pointer to the context switching logic.
*/
mov dptr, #_g_irqtos
mov a, sp
movx @dptr, a
/* Nullify the context pointer. If a context switch is
* needed, this will be set to the address of the context
* structure.
*/
mov dptr, #_g_irqcontext
clr a
movx @dptr,a
inc dptr
movx @dptr,a
/* Now call void irq_dispatch(int irq, FAR void *context)
*
* First, create the first argument as (int)irqno
*/
mov dpl, r2
mov dph, #0
/* Create the second argument (void *context) on the stack */
push sp
clr a
push acc
/* Then dispatch the IRQ. */
lcall _irq_dispatch
pop acc
pop acc
/* Indicate that we are no longer in an interrupt */
mov dptr, #_g_irqtos
clr a
movx @dptr, a
/* Check if a context switch is pending */
mov dptr,#_g_irqcontext
movx a, @dptr
mov r2, a
inc dptr
movx a, @dptr
mov r3, a
orl a, r2
jnz 00001$
/* No context switch is pending. Restore registers
* from the interrupt register save area.
*/
mov dptr, #_g_irqregs
sjmp 00004$
00001$: /****************************************************/
/* A context switch is pending, clear g_irqcontext */
mov dpl, r2
mov dph, r3
clr a
movx @dptr, a
inc dptr
movx @dptr, a
#ifdef CONFIG_INTERRUPT_FRAME_DUMP
mov dpl, r2
mov dph, r3
push ar2
push ar3
lcall _up_dumpframe
pop ar3
pop ar2
#endif
/* Register usage in the following:
*
* R0 - Holds working the 8-bit IRAM pointer
* R1 - Not used
* R2-3 - Holds the working 16-bit XRAM pointer
* R4 - Holds the working byte count
* R5 - Holds the new stack pointer
* R6-7 - Not used
*/
/* Fetch r4 = context->nbytes */
mov dpl, r2
mov dph, r3
movx a, @dptr
mov r4, a
/* Save the new stack pointer in r5 */
add a, #(STACK_BASE-1)
mov r5, a
/* Save r2-3 = &context->stack */
inc dptr
push dpl
push dph
mov r2, dpl
mov r3, dph
/* Set r0 = stack base address */
mov r0, #STACK_BASE
/* Top of the copy loop */
00002$:
mov a, r4 /* a = bytes left to transfer */
dec r4 /* (for next time through the loop) */
jz 00003$ /* Jump if a = 0 (done) */
/* Fetch the next byte from context->stack */
mov dpl, r2
mov dph, r3
movx a,@dptr
/* Increment the XRAM pointer */
inc dptr
mov r2, dpl
mov r3, dph
/* Save the next byte into IRAM */
mov @r0, a
/* Increment the IRAM pointer */
inc r0
sjmp 00002$
/* The entire stack has been copied from XRAM into
* IRAM. Set the new stack pointer
*/
00003$:
pop dph
pop dpl
mov sp, r5
#ifdef CONFIG_INTERRUPT_FRAME_DUMP
push dpl
push dph
lcall _up_dumpstack
pop dph
pop dpl
#endif
/* Get the pointer to the register save area */
mov a, #STACK_SIZE
add a, dpl
mov dpl, a
clr a
addc a, dph
mov dph, a
00004$: /****************************************************/
/* Restore the context from the register save area
* and return from the interrupt. At this point, dptr
* holds the pointer to the memory region that holds
* the register save area. This could be either
* g_irqregs (no context switch) or &g_irqcontext->regs
* (context switch).
*/
#ifdef CONFIG_ARCH_LEDS
push dpl
push dph
mov dpl, #LED_INIRQ
lcall _board_led_off
pop dph
pop dpl
#endif
/* Restore registers from the register save area */
lcall _up_restoreregisters
_up_timer0exit:
/* Restore registers from the stack and return */
pop dph
pop dpl
/* Restore the interrupt state per the stored IE value */
pop acc
jb acc.7,00005$
clr ie.7
sjmp 00006$
00005$:
setb ie.7
00006$:
pop acc
reti
-95
View File
@@ -1,95 +0,0 @@
/************************************************************************
* arch/8051/src/up_idle.c
*
* Copyright (C) 2007, 2009, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <nuttx/arch.h>
#include "up_internal.h"
/************************************************************************
* Pre-processor Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
#if defined(CONFIG_ARCH_LEDS) && defined(CONFIG_ARCH_8051_BRINGUP)
static uint8_t g_ledtoggle = 0;
#endif
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: up_idle
*
* Description:
* up_idle() is the logic that will be executed when their
* is no other ready-to-run task. This is processor idle
* time and will continue until some interrupt occurs to
* cause a context switch from the idle task.
*
* Processing in this state may be processor-specific. e.g.,
* this is where power management operations might be
* performed.
*
************************************************************************/
void up_idle(void)
{
#if defined(CONFIG_ARCH_LEDS) && defined(CONFIG_ARCH_8051_BRINGUP)
g_ledtoggle++;
if (g_ledtoggle == 0x80)
{
board_led_on(LED_IDLE);
}
else if (g_ledtoggle == 0x00)
{
board_led_off(LED_IDLE);
}
#endif
}
-144
View File
@@ -1,144 +0,0 @@
/************************************************************************
* arch/8051/src/up_initialize.c
*
* Copyright (C) 2007, 2009, 2011, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <nuttx/arch.h>
#include <nuttx/fs/fs.h>
#include "up_internal.h"
/************************************************************************
* Private Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/* This is the top of the stack containing the interrupt
* stack frame. It is set when processing an interrupt. It
* is also cleared when the interrupt returns so this can
* also be used like a boolean indication that we are in an
* interrupt.
*/
volatile uint8_t g_irqtos;
/* Registers are saved in the following global array during
* interrupt processing. If a context switch is performed
* during the interrupt handling, these registers will be
* copied into the TCB again (NOTE: We could save a copy
* if the interrupt handling logic saved the registers
* directly into (struct tcb_s*)g_readytorun.head->xcp.regs).
*/
uint8_t g_irqregs[REGS_SIZE];
/* If during execution of an interrup handler, a context
* switch must be performed, the follwing will be set to
* to that address of the relevant context structure. The
* actual switch will be deferred until the time that the
* the interrupt exits.
*/
FAR struct xcptcontext *g_irqcontext;
/* It is faster to look up 8-bit shifts in this table than
* to comput them.
*/
const uint8_t g_ntobit[8] =
{ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: up_initialize
*
* Description:
* up_initialize will be called once during OS
* initialization after the basic OS services have been
* initialized. The architecture specific details of
* initializing the OS will be handled here. Such things as
* setting up interrupt service routines, starting the
* clock, and registering device drivers are some of the
* things that are different for each processor and hardware
* platform.
*
* up_initialize is called after the OS initialized but
* before the init process has been started and before the
* libraries have been initialized. OS services and driver
* services are available.
*
************************************************************************/
void up_initialize(void)
{
/* Initialize global variables */
g_irqtos = 0;
/* Add extra memory fragments to the memory manager */
#if CONFIG_MM_REGIONS > 1
up_addregion();
#endif
/* Initialize the interrupt subsystem */
up_irqinitialize();
/* Initialize the system timer interrupt */
#ifndef CONFIG_ARCH_8051_SUPRESS_INTERRUPTS
up_timer_initialize();
#endif
board_led_on(LED_IRQSENABLED);
}
-119
View File
@@ -1,119 +0,0 @@
/************************************************************************
* up_initialstate.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <sched.h>
#include "up_internal.h"
/************************************************************************
* Private Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: up_initial_state
*
* Description:
* A new thread is being started and a new TCB
* has been created. This function is called to initialize
* the processor specific portions of the new TCB.
*
* This function must setup the intial architecture registers
* and/or stack so that execution will begin at tcb->start
* on the next context switch.
*
************************************************************************/
void up_initial_state(FAR struct tcb_s *tcb)
{
FAR uint8_t *frame = tcb->xcp.stack;
FAR uint8_t *regs = tcb->xcp.regs;
/* This is the form of initial stack frame
*
* This initial stack frame will be configured to hold.
* (1) The 16-bit return address of either:
*
* void task_start(void);
* void pthread_start(void)
*
* The return address is stored at the top of stack.
* so that the RETI instruction will work:
*
* PC15-8 <- ((SP))
* (SP) <- (SP) -1
* PC7-0 <- ((SP))
* (SP) <- (SP) -1
*/
frame[FRAME_RETLS] = (((uint16_t)tcb->start) & 0xff);
frame[FRAME_RETMS] = (((uint16_t)tcb->start) >> 8);
/* The context save area for registers a, ie, and dpstr
* follows the return address in the stack frame.
*/
frame[FRAME_IE] = 0x80;
/* Save the number of bytes in the frame (which will be used
* to initialize the stack pointer when the task is started).
*/
tcb->xcp.nbytes = FRAME_SIZE;
/* Initialize the remaining register save area which is
* outside of the stack save area.
*/
tcb->xcp.regs[REGS_PSW] = 0;
}
-153
View File
@@ -1,153 +0,0 @@
/**************************************************************************
* arch/8051/src/up_internal.h
*
* Copyright (C) 2007, 2009, 2011, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
**************************************************************************/
#ifndef __ARCH_8051_SRC_UP_INTERNAL_H
#define __ARCH_8051_SRC_UP_INTERNAL_H
/**************************************************************************
* Included Files
**************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <arch/irq.h>
#if defined(CONFIG_ARCH_BOARD_PJRC_87C52)
# include <arch/board/pjrc.h>
#else
# warning "805x board not recognized"
#endif
/**************************************************************************
* Public Definitions
**************************************************************************/
/**************************************************************************
* Public Types
**************************************************************************/
/**************************************************************************
* Public Variables
**************************************************************************/
#ifndef __ASSEMBLY__
/* This is the top of the stack containing the interrupt
* stack frame. It is set when processing an interrupt. It
* is also cleared when the interrupt returns so this can
* also be used like a boolean indication that we are in an
* interrupt.
*/
extern volatile uint8_t g_irqtos;
/* Registers are saved in the following global array during
* interrupt processing. If a context switch is performed
* during the interrupt handling, these registers will be
* copied into the TCB again (NOTE: We could save a copy
* if the interrupt handling logic saved the registers
* directly into (struct tcb_s*)g_readytorun.head->xcp.regs).
*/
extern uint8_t g_irqregs[REGS_SIZE];
/* If during execution of an interrup handler, a context
* switch must be performed, the follwing will be set to
* to that address of the relevant context structure. The
* actual switch will be deferred until the time that the
* the interrupt exits.
*/
extern FAR struct xcptcontext *g_irqcontext;
/* It is faster to look up 8-bit shifts in this table than
* to comput them.
*/
extern const uint8_t g_ntobit[8];
#endif /* __ASSEMBLY */
/**************************************************************************
* Public Function Prototypes
**************************************************************************/
#ifndef __ASSEMBLY__
#if CONFIG_MM_REGIONS > 1
void up_addregion(void);
#endif
void up_delay(uint8_t milliseconds) __naked;
void up_irqinitialize(void);
void up_restorecontext(FAR struct xcptcontext *context) _naked;
void up_restoreregisters(FAR uint8_t *regs) _naked;
uint8_t up_savecontext(FAR struct xcptcontext *context) __naked;
void up_saveregisters(FAR uint8_t *regs) _naked;
void up_saveirqcontext(FAR struct xcptcontext *context);
void up_timer_initialize(void);
/* Defined in up_debug.c */
#if defined(CONFIG_ARCH_8051_BRINGUP)
void up_puthex(uint8_t hex) __naked;
void up_puthex16(int hex) __naked;
void up_putnl(void) __naked;
void up_puts(__code char *ptr);
void up_showsp(uint8_t ch) __naked;
#endif
#if defined(CONFIG_FRAME_DUMP) && defined(CONFIG_ARCH_8051_BRINGUP)
void up_dumpstack(void);
void up_dumpframe(FAR struct xcptcontext *context);
#else
# define up_dumpstack()
# define up_dumpframe(x)
#endif
/* Defined in board/up_leds.c */
#ifdef CONFIG_ARCH_LEDS
void board_led_initialize(void);
void board_led_on(uint8_t led);
void board_led_off(uint8_t led);
#else
# define board_led_initialize()
# define board_led_on(led)
# define board_led_off(led)
#endif
#endif /* __ASSEMBLY */
#endif /* __ARCH_8051_SRC_UP_INTERNAL_H */
-70
View File
@@ -1,70 +0,0 @@
/************************************************************************
* up_interruptcontext.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdbool.h>
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include "up_internal.h"
/************************************************************************
* Private Types
************************************************************************/
/************************************************************************
* Private Function Prototypes
************************************************************************/
/************************************************************************
* Global Functions
************************************************************************/
/************************************************************************
* Name: up_interrupt_context
*
* Description: Return true is we are currently executing in
* the interrupt handler context.
************************************************************************/
bool up_interrupt_context(void)
{
return g_irqtos != 0;
}
-152
View File
@@ -1,152 +0,0 @@
/************************************************************************
* arch/8051/src/up_irq.c
*
* Copyright (C) 2007, 2009, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <nuttx/irq.h>
#include <debug.h>
#include <8052.h>
#include "up_internal.h"
extern int g_nints;
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Public Data
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: irq_initialize
************************************************************************/
void up_irqinitialize(void)
{
/* Set interrupt priorities (all low) */
IP = 0;
#ifdef CONFIG_ARCH_8051_SUPRESS_INTERRUPTS
/* Disable all interrupts */
IE = 0;
#else
/* Enable interrupts globally, but disable all interrupt
* sources.
*/
IE = 0x80;
#endif
}
/************************************************************************
* Name: irqsave
*
* Description:
* Disable all IRQs
*
************************************************************************/
irqstate_t irqsave(void)
{
irqstate_t ret = IE;
EA = 0;
return ret;
}
/************************************************************************
* Name: irqrestore
*
* Description:
* Restore a previous interrupt state
*
************************************************************************/
void irqrestore(irqstate_t flags)
{
IE = flags;
}
/************************************************************************
* Name: up_disable_irq
*
* Description:
* Disable the IRQ specified by 'irq'
*
************************************************************************/
void up_disable_irq(int irq)
{
if ((unsigned)irq < NR_IRQS)
{
IE &= ~(g_ntobit[irq]);
}
}
/************************************************************************
* Name: up_enable_irq
*
* Description:
* Enable the IRQ specified by 'irq'
*
************************************************************************/
void up_enable_irq(int irq)
{
if ((unsigned)irq < NR_IRQS)
{
IE |= g_ntobit[irq];
}
}
-272
View File
@@ -1,272 +0,0 @@
/************************************************************************
* arch/8051/src/up_irqtest.c
*
* Copyright (C) 2007, 2011, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <nuttx/arch.h>
#include <8052.h>
#include "up_internal.h"
/************************************************************************
* Definitions
************************************************************************/
#define up_extint0 ((vector_t)PM2_VECTOR_EXTINT0)
#define up_timer0 ((vector_t)PM2_VECTOR_TIMER0)
#define up_extint1 ((vector_t)PM2_VECTOR_EXTINT1)
#define up_timer1 ((vector_t)PM2_VECTOR_TIMER1)
#define up_uart ((vector_t)PM2_VECTOR_UART)
#define up_timer2 ((vector_t)PM2_VECTOR_TIMER2)
/************************************************************************
* Private Types
************************************************************************/
typedef void (*vector_t)(void);
/************************************************************************
* Public Variables
************************************************************************/
bool g_irqtest;
volatile uint8_t g_irqtos;
uint8_t g_irqregs[REGS_SIZE];
int g_nirqs;
FAR struct xcptcontext *g_irqcontext;
/************************************************************************
* Private Functions
************************************************************************/
/************************************************************************
* Name: utility functions
************************************************************************/
static void _up_putc(uint8_t ch) __naked
{
ch; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
ljmp PM2_ENTRY_COUT
_endasm;
}
void _up_puthex(uint8_t hex) __naked
{
hex; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
ljmp PM2_ENTRY_PHEX
_endasm;
}
void _up_puthex16(int hex) __naked
{
hex; /* To avoid unreferenced argument warning */
_asm
ljmp PM2_ENTRY_PHEX16
_endasm;
}
void _up_putnl(void) __naked
{
_asm
ljmp PM2_ENTRY_NEWLINE
_endasm;
}
void _up_puts(__code char *ptr)
{
for (; *ptr; ptr++)
{
_up_putc(*ptr);
}
}
void _up_delay(uint8_t milliseconds) __naked
{
_asm
mov r0, dpl
00001$: mov r1, #230
00002$: nop
nop
nop
nop
nop
nop
djnz r1, 00002$
djnz r0, 00001$
ret
_endasm;
}
/************************************************************************
* Public Functions
************************************************************************/
/************************************************************************
* Name: os_start
*
* Description:
* "Fake" OS entry point.
*
************************************************************************/
void os_start(void)
{
int i;
/* Disable all interrupts */
IE = 0;
/* Then verify all of the interrupts */
g_irqtest = false;
up_extint0();
#ifdef CONFIG_ARCH_8051_NOSYSTIMER
up_timer0();
#endif
up_extint1();
up_timer1();
up_uart();
up_timer2();
/* Now a real interrupt ... */
/* Configure timer 0 */
TR0 = 0; /* Make sure timer 0 is stopped */
TF0 = 0; /* Clear the overflow flag */
TMOD &= 0xF0; /* Set to mode 0 (without changing timer1) */
TL0 = 0; /* Clear timer 0 value */
TH0 = 0;
TR0 = 1; /* Start the timer */
/* Start timer interrupts */
g_irqtest = true;
g_nirqs = 0;
IE = 0x82; /* Enable interrupts */
/* Wait a about 500 MS */
_up_delay(500);
/* Disable the timer */
TR0 = 0; /* Stop timer 0 */
IE = 0; /* Disable interrupts */
_up_puts("IRQs in 500 MS=");
_up_puthex16(g_nirqs);
_up_putnl();
/* end of test */
_up_puts("Test complete");
_up_putnl();
for (;;);
}
/************************************************************************
* Name: irq_dispatch
*
* Description:
* "Fake" IRQ dispatcher
*
***********************************************************************/
void irq_dispatch(int irq, FAR void *context)
{
context;
if (g_irqtest)
{
g_nirqs++;
}
else
{
_up_puts("Dispatch IRQ=");
_up_puthex(irq);
_up_putnl();
}
}
/************************************************************************
* Name: up_dumpstack / up_dumpframe
*
* Description:
* "Fake" debug routines if needed.
*
************************************************************************/
void up_dumpstack(void)
{
}
void up_dumpframe(FAR struct xcptcontext *context)
{
}
/************************************************************************
* Name: board_led_initialize, board_led_on, board_led_off
*
* Description:
* "Fake" LED routines if needed
*
************************************************************************/
void board_led_initialize(void)
{
}
void board_led_on(uint8_t led)
{
led;
}
void board_led_off(uint8_t led)
{
led;
}
-81
View File
@@ -1,81 +0,0 @@
/************************************************************************
* up_putc.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <nuttx/arch.h>
#include "up_internal.h"
/************************************************************************
* Private Functions
************************************************************************/
static void _up_putc(int ch) __naked
{
#if 1
ch; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
ljmp PM2_ENTRY_COUT
_endasm;
#else
ch; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
cout: jnb ti, cout
clr ti
mov sbuf, a
ret
_endasm;
#endif
}
/************************************************************************
* Public Functions
************************************************************************/
int up_putc(int ch)
{
_up_putc(ch);
if (ch == '\n')
{
_up_putc('\r');
}
return ch;
}
-135
View File
@@ -1,135 +0,0 @@
/************************************************************************
* up_releasepending.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/arch.h>
#include "sched/sched.h"
#include "up_internal.h"
/************************************************************************
* Private Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Funtions
************************************************************************/
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: up_release_pending
*
* Description:
* Release and ready-to-run tasks that have
* collected in the pending task list. This can call a
* context switch if a new task is placed at the head of
* the ready to run list.
*
************************************************************************/
void up_release_pending(void)
{
FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("From TCB=%p\n", rtcb);
/* Merge the g_pendingtasks list into the g_readytorun task list */
/* sched_lock(); */
if (sched_mergepending())
{
/* The currently active task has changed! We will need to
* switch contexts. First check if we are operating in
* interrupt context:
*/
if (g_irqtos)
{
/* Yes, then we have to do things differently.
* Just copy the current registers into the OLD rtcb.
*/
up_saveirqcontext(&rtcb->xcp);
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then setup so that the context will be performed on exit
* from the interrupt.
*/
g_irqcontext = &rtcb->xcp;
}
/* Copy the exception context into the TCB of the task that
* was currently active. if up_savecontext returns a non-zero
* value, then this is really the previously running task
* restarting!
*/
else if (!up_savecontext(&rtcb->xcp))
{
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then switch contexts */
up_restorecontext(&rtcb->xcp);
}
}
}
-190
View File
@@ -1,190 +0,0 @@
/****************************************************************************
* up_reprioritizertr.c
*
* Copyright (C) 2007, 2009, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/arch.h>
#include "sched/sched.h"
#include "up_internal.h"
/****************************************************************************
* Private Definitions
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Funtions
****************************************************************************/
/****************************************************************************
* Public Funtions
****************************************************************************/
/****************************************************************************
* Name: up_reprioritize_rtr
*
* Description:
* Called when the priority of a running or
* ready-to-run task changes and the reprioritization will
* cause a context switch. Two cases:
*
* 1) The priority of the currently running task drops and the next
* task in the ready to run list has priority.
* 2) An idle, ready to run task's priority has been raised above the
* the priority of the current, running task and it now has the
* priority.
*
* Inputs:
* tcb: The TCB of the task that has been reprioritized
* priority: The new task priority
*
****************************************************************************/
void up_reprioritize_rtr(FAR struct tcb_s *tcb, uint8_t priority)
{
/* Verify that the caller is sane */
if (tcb->task_state < FIRST_READY_TO_RUN_STATE ||
tcb->task_state > LAST_READY_TO_RUN_STATE
#if SCHED_PRIORITY_MIN > 0
|| priority < SCHED_PRIORITY_MIN
#endif
#if SCHED_PRIORITY_MAX < UINT8_MAX
|| priority > SCHED_PRIORITY_MAX
#endif
)
{
PANIC();
}
else
{
FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
bool switch_needed;
dbg("TCB=%p PRI=%d\n", tcb, priority);
/* Remove the tcb task from the ready-to-run list.
* sched_removereadytorun will return true if we just
* remove the head of the ready to run list.
*/
switch_needed = sched_removereadytorun(tcb);
/* Setup up the new task priority */
tcb->sched_priority = (uint8_t)priority;
/* Return the task to the specified blocked task list.
* sched_addreadytorun will return true if the task was
* added to the new list. We will need to perform a context
* switch only if the EXCLUSIVE or of the two calls is non-zero
* (i.e., one and only one the calls changes the head of the
* ready-to-run list).
*/
switch_needed ^= sched_addreadytorun(tcb);
/* Now, perform the context switch if one is needed */
if (switch_needed)
{
/* If we are going to do a context switch, then now is the right
* time to add any pending tasks back into the ready-to-run list.
* task list now
*/
if (g_pendingtasks.head)
{
sched_mergepending();
}
/* Are we in an interrupt handler? */
if (g_irqtos)
{
/* Yes, then we have to do things differently.
* Just copy the current registers into the OLD rtcb.
*/
up_saveirqcontext(&tcb->xcp);
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then setup so that the context will be performed on exit
* from the interrupt.
*/
g_irqcontext = &tcb->xcp;
}
/* Copy the exception context into the TCB at the (old) head of the
* g_readytorun Task list. if up_savecontext returns a non-zero
* value, then this is really the previously running task restarting!
*/
else if (!up_savecontext(&rtcb->xcp))
{
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then switch contexts */
up_restorecontext(&rtcb->xcp);
}
}
}
}
-296
View File
@@ -1,296 +0,0 @@
/**************************************************************************
* up_restorecontext.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <nuttx/irq.h>
#include "up_internal.h"
/**************************************************************************
* Private Definitions
**************************************************************************/
/**************************************************************************
* Private Types
**************************************************************************/
/**************************************************************************
* Private Function Prototypes
**************************************************************************/
/**************************************************************************
* Global Variables
**************************************************************************/
/**************************************************************************
* Private Variables
**************************************************************************/
/**************************************************************************
* Private Functions
**************************************************************************/
/**************************************************************************
* Public Functions
**************************************************************************/
/**************************************************************************
* Name: up_restoreregisters
*
* Description:
* Restore the saved registers from the context save area. This function
* is called from up_restorecontext (below) and also from interrupt
* handling logic.
*
* Note that this function does not restore:
* a, dptr, ie - these are saved in the stack area
* sp - this can be inferred from g_irqtos or struct xcptontext.nbytes.
*
* Inputs:
* context - the context register array from which to restore the
* register values
*
* Return:
* None
*
**************************************************************************/
void up_restoreregisters(FAR uint8_t *regs) _naked
{
_asm
movx a, @dptr
mov b, a
inc dptr
movx a, @dptr
mov r2, a
inc dptr
movx a, @dptr
mov r3, a
inc dptr
movx a, @dptr
mov r4, a
inc dptr
movx a, @dptr
mov r5, a
inc dptr
movx a, @dptr
mov r6, a
inc dptr
movx a, @dptr
mov r7, a
inc dptr
movx a, @dptr
mov r0, a
inc dptr
movx a, @dptr
mov r1, a
inc dptr
movx a, @dptr
mov psw, a
inc dptr
movx a, @dptr
mov _bp, a
ret
_endasm;
}
/**************************************************************************
* Name: up_restorecontext
*
* Description:
* Restore the stack specified in the context structure and return to
* that context
*
* Inputs:
* context - Holds the stack content of the context to return to
*
* Return:
* This function does not return.
*
**************************************************************************/
void up_restorecontext(FAR struct xcptcontext *context) __naked
{
_asm
ar2 = 0x02
ar3 = 0x03
ar4 = 0x04
ar5 = 0x05
ar6 = 0x06
ar7 = 0x07
ar0 = 0x00
ar1 = 0x01
/* Dump the contents of the saved frame before it is copied back
* to memory/registers.
*/
#ifdef CONFIG_SWITCH_FRAME_DUMP
push dpl
push dph
lcall _up_dumpframe
pop dph
pop dpl
#endif
/* Interrupts should be disabled for the following. up_popcontext() will
* set the new interrupt state correctly.
*/
clr ea
/* The following logic will copy the stack from the
* context save structure into IRAM. We cannot use
* the stack in anyway during this copy. Instead,
* we will use registers as follows:
*
* R0 - Holds the working 8-bit IRAM pointer
* R1 - Not used
* R2-3 - Holds the working 16-bit XRAM pointer
* R4 - Holds the working byte count
* R5 - Holds the new stack pointer
* R6-7 - Saved context pointer
*/
/* Fetch r4 = context->nbytes */
movx a, @dptr
mov r4, a
/* Save the new stack pointer in r5 */
add a, #(STACK_BASE-1)
mov r5, a
/* Save r2-3 and r6-r7 = &context->stack */
inc dptr
mov r2, dpl
mov r3, dph
mov r6, dpl
mov r7, dph
/* Set r0 = stack base address */
mov r0, #STACK_BASE
/* Top of the copy loop -- we cannot use the stack
* again until we finish the copy and set the new
* stack pointer (saved in r5)
*/
00001$:
mov a, r4 /* a = bytes left to transfer */
dec r4 /* (for next time through the loop) */
jz 00002$ /* Jump if a = 0 (done) */
/* Fetch the next byte from context->stack */
mov dpl, r2
mov dph, r3
movx a, @dptr
/* Increment the XRAM pointer */
inc dptr
mov r2, dpl
mov r3, dph
/* Save the next byte into IRAM */
mov @r0, a
/* Increment the IRAM pointer */
inc r0
sjmp 00001$
00002$:
/* Set the new stack pointer and recover the
* context->stack pointer.
*/
mov sp, r5
mov dpl, r6
mov dph, r7
/* Dump the stack contents after they have
* been restored to IRAM
*/
#ifdef CONFIG_SWITCH_FRAME_DUMP
push dpl
push dph
lcall _up_dumpstack
pop dph
pop dpl
#endif
/* Get the pointer to the register save area */
mov a, #STACK_SIZE
add a, dpl
mov dpl, a
clr a
addc a, dph
mov dph, a
/* Restore registers from the register save area */
lcall _up_restoreregisters
/* Restore registers from the new stack */
pop dph
pop dpl
/* Restore the interrupt state per the stored IE value */
pop acc
jb acc.7,00003$
clr ie.7
sjmp 00004$
00003$:
setb ie.7
00004$:
pop acc
ret
_endasm;
}
-362
View File
@@ -1,362 +0,0 @@
/**************************************************************************
* up_savecontext.c
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <nuttx/irq.h>
#include "up_internal.h"
/**************************************************************************
* Private Definitions
**************************************************************************/
/**************************************************************************
* Private Types
**************************************************************************/
/**************************************************************************
* Private Function Prototypes
**************************************************************************/
/**************************************************************************
* Global Variables
**************************************************************************/
/**************************************************************************
* Private Variables
**************************************************************************/
/**************************************************************************
* Private Functions
**************************************************************************/
/**************************************************************************
* Name: up_savestack
*
* Description:
* Save the entire interrupt stack contents in the provided context
* structure.
*
* Inputs:
* context - the context structure in which to save the stack info
*
* Return:
* None
*
* Assumptions:
* - Interrupts are disabled
*
**************************************************************************/
static void up_savestack(FAR struct xcptcontext *context, uint8_t tos)
{
/* Copy the current stack frame from internal RAM to XRAM. */
uint8_t nbytes = tos - (STACK_BASE-1);
NEAR uint8_t *src = (NEAR uint8_t*)STACK_BASE;
FAR uint8_t *dest = context->stack;
context->nbytes = nbytes;
while (nbytes--)
{
*dest++ = *src++;
}
}
/**************************************************************************
* Name: up_saveregs
*
* Description:
* Save the interrupt registers into the TCB.
*
* Inputs:
* context - the context structure in which to save the register info
*
* Return:
* None
*
* Assumptions:
* - Interrupts are disabled
*
**************************************************************************/
static void up_saveregs(FAR struct xcptcontext *context, uint8_t tos)
{
/* Copy the irq register save area into the TCB */
FAR uint8_t *src = g_irqregs;
FAR uint8_t *dest = context->regs;
uint8_t nbytes = REGS_SIZE;
while (nbytes--)
{
*dest++ = *src++;
}
}
/**************************************************************************
* Public Functions
**************************************************************************/
/**************************************************************************
* Name: up_saveregisters
*
* Description:
* Save the current registers in the context save area. This function
* is called from up_savecontext (below) and also from interrupt
* handling logic.
*
* Note that this function does not save:
* a, dptr, ie - these are saved in the stack area
* sp - this can be inferred from g_irqtos or struct xcptontext.nbytes.
*
* Inputs:
* regs - the context register array in which to save the register info
*
* Return:
* None
*
**************************************************************************/
void up_saveregisters(FAR uint8_t *regs) _naked
{
_asm
mov a, b
movx @dptr, a
inc dptr
mov a, r2
movx @dptr, a
inc dptr
mov a, r3
movx @dptr, a
inc dptr
mov a, r4
movx @dptr, a
inc dptr
mov a, r5
movx @dptr, a
inc dptr
mov a, r6
movx @dptr, a
inc dptr
mov a, r7
movx @dptr, a
inc dptr
mov a, r0
movx @dptr, a
inc dptr
mov a, r1
movx @dptr, a
inc dptr
mov a, psw
movx @dptr, a
clr psw
inc dptr
mov a, _bp
movx @dptr, a
ret
_endasm;
}
/**************************************************************************
* Name: up_savecontext
*
* Description:
* Push the current execution context onto the stack, then save the
* entire stack contents in the provided context structure.
*
* Inputs:
* context - the context structure in which to save the stack info
*
* Return:
* 0 = Normal state save return
* 1 = This is the matching return from up_restorecontext()
*
**************************************************************************/
uint8_t up_savecontext(FAR struct xcptcontext *context) _naked
{
_asm
/* Create the stack frame that we want when it is time to restore
* this context. The return address will be the return address
* of this function, the return value will be zero.
*
* ...
* return address (2 bytes, already on the stack)
* register a=0 (1 byte)
* register ie (1 byte)
* register dptr (2 bytes)
*/
clr a
push acc /* ACC = 0 */
push ie
mov a, #1
push acc /* DPL = 1 */
clr a
push acc /* DPH = 0 */
/* Dump the stack contents before they are occupied into XRAM */
#ifdef CONFIG_SWITCH_FRAME_DUMP
push dpl
push dph
lcall _up_dumpstack
pop dph
pop dpl
#endif
/* Disable interrupts while we create a snapshot of the stack
* and registers. At this point, we have 5 bytes on the stack
* to account for.
*/
push ie
mov ea, 0
/* Save the registers in the context save area */
push dpl
push dph
mov a, #XCPT_REGS
add a, dpl
mov dpl, a
clr a
addc a, dph
mov dph, a
lcall _up_saveregisters
pop dph
pop dpl
#ifdef CONFIG_SWITCH_FRAME_DUMP
/* Save the address of the context structure. We will
* need this later to dump the saved frame. Now we have
* 7 bytes on the stack to account for.
*/
push dpl
push dph
/* Push the top of frame stack pointer. We need to
* decrement the current SP value by three to account
* for dptr+IE on the stack above the end of the frame.
*/
mov a, sp
subb a, #3
#else
/* Push the top of frame stack pointer. We need to
* decrement the current stack pointer by one to account
* for IE that we saved on the stack.
*/
mov a, sp
dec a
#endif
push acc
/* Copy the current stack frame from internal RAM to XRAM. */
lcall _up_savestack
pop acc
/* Dump the contents of the saved frame after it has been
* copied from memory/registers.
*/
#ifdef CONFIG_SWITCH_FRAME_DUMP
pop dph
pop dpl
push dpl
push dph
lcall _up_dumpframe
pop dph
pop dpl
lcall _up_dumpstack
#endif
/* Restore the interrupt state */
pop ie
/* Now that we have a snapshot of the desired stack frame saved,
* we can release the stack frame (all but the return address)
*/
mov a, sp
subb a, #4
mov sp, a
mov dpl,#0
ret
_endasm;
}
/**************************************************************************
* Name: up_saveirqcontext
*
* Description:
* The interrupt context was saved in g_irqtos and g_irqregs when the
* interrupt was taken. If a context switch from the interrupted task
* will be made at the interrupt level, then these saved values must be
* copied into the TCB.
*
* Inputs:
* context - the structure in which to save the context info
*
* Return:
* None
*
* Assumptions:
* - Interrupts are disabled
*
**************************************************************************/
void up_saveirqcontext(FAR struct xcptcontext *context)
{
/* Save the number of bytes in the stack */
context->nbytes = g_irqtos - (STACK_BASE-1);
/* Copy the current stack frame from internal RAM to XRAM. */
up_savestack(context, g_irqtos);
/* Copy the saved registers into the TCB */
up_saveregisters(context->regs);
}
-147
View File
@@ -1,147 +0,0 @@
/************************************************************************
* arch/8051/src/up_timerisr.c
*
* Copyright (C) 2007, 2009, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <stdint.h>
#include <debug.h>
#include <nuttx/arch.h>
#include <8052.h>
#include "clock/clock.h"
#include "up_internal.h"
/************************************************************************
* Definitions
************************************************************************/
/************************************************************************
* Private Types
************************************************************************/
/************************************************************************
* Private Function Prototypes
************************************************************************/
/************************************************************************
* Global Functions
************************************************************************/
/************************************************************************
* Function: up_timerisr
*
* Description:
* The timer ISR will perform a variety of services for
* various portions of the systems.
*
************************************************************************/
int up_timerisr(int irq, FAR uint8_t *frame)
{
/* Process timer interrupt */
sched_process_timer();
return 0;
}
/************************************************************************
* Function: up_timer_initialize
*
* Description:
* This function is called during start-up to initialize
* the timer interrupt.
*
************************************************************************/
void up_timer_initialize(void)
{
#ifdef CONFIG_ARCH_8051_NOSYSTIMER
up_disable_irq(TIMER2_IRQ);
/* Set up timer 2 -- See pjrc.h for details */
T2MOD = 0;
/* Set up the capture count to generate 100Hz system
* interrupts.
*/
RCAP2L = TIMER2_CAPTURE_LOW;
RCAP2H = TIMER2_CAPTURE_HIGH;
TL2 = TIMER2_CAPTURE_LOW;
TH2 = TIMER2_CAPTURE_HIGH;
/* Configure for interrupts */
T2CON = 0x04;
/* Attach and enable the timer interrupt */
irq_attach(TIMER2_IRQ, (xcpt_t)up_timerisr);
up_enable_irq(TIMER2_IRQ);
#else
/* Timer 0, mode 0 can be used as a system timer. In that mode, the
* 1.8432 MHz clock is divided by 32. A single 8-bit value is incremented
* at 57600 Hz, which results in 225 Timer 0 overflow interrupts per
* second.
*/
up_disable_irq(TIMER0_IRQ);
/* Initialize timer 0 */
TR0 = 0; /* Make sure timer 0 is stopped */
TF0 = 0; /* Clear the overflow flag */
TMOD &= 0xF0; /* Set to mode 0 (without changing timer1) */
TL0 = 0; /* Clear timer 0 value */
TH0 = 0;
/* Attach and enable the timer interrupt */
irq_attach(TIMER0_IRQ, (xcpt_t)up_timerisr);
TR0 = 1; /* Start the timer */
up_enable_irq(TIMER0_IRQ);
#endif
}
-161
View File
@@ -1,161 +0,0 @@
/************************************************************************
* up_unblocktask.c
*
* Copyright (C) 2007, 2009, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 <nuttx/config.h>
#include <sched.h>
#include <debug.h>
#include <nuttx/arch.h>
#include "clock/clock.h"
#include "sched/sched.h"
#include "up_internal.h"
/************************************************************************
* Private Definitions
************************************************************************/
/************************************************************************
* Private Data
************************************************************************/
/************************************************************************
* Private Funtions
************************************************************************/
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: up_unblock_task
*
* Description:
* A task is currently in an inactive task list
* but has been prepped to execute. Move the TCB to the
* ready-to-run list, restore its context, and start execution.
*
* Inputs:
* tcb: Refers to the tcb to be unblocked. This tcb is
* in one of the waiting tasks lists. It must be moved to
* the ready-to-run list and, if it is the highest priority
* ready to run taks, executed.
*
************************************************************************/
void up_unblock_task(FAR struct tcb_s *tcb)
{
FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head;
/* Verify that the context switch can be performed */
ASSERT((tcb->task_state >= FIRST_BLOCKED_STATE) &&
(tcb->task_state <= LAST_BLOCKED_STATE));
dbg("Unblocking TCB=%p\n", tcb);
/* Remove the task from the blocked task list */
sched_removeblocked(tcb);
/* Reset its timeslice. This is only meaningful for round
* robin tasks but it doesn't here to do it for everything
*/
#if CONFIG_RR_INTERVAL > 0
tcb->timeslice = MSEC2TICK(CONFIG_RR_INTERVAL);
#endif
/* Add the task in the correct location in the prioritized
* g_readytorun task list
*/
if (sched_addreadytorun(tcb))
{
/* The currently active task has changed! We need to do
* a context switch to the new task.
*
* Are we in an interrupt handler?
*/
if (g_irqtos)
{
/* Yes, then we have to do things differently.
* Just copy the current stack into the OLD rtcb.
*/
up_saveirqcontext(&rtcb->xcp);
/* Restore the exception context of the rtcb at the (new) head
* of the g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then setup so that the context will be performed on exit
* from the interrupt.
*/
g_irqcontext = &rtcb->xcp;
}
/* We are not in an interrupt andler. Copy the user C context
* into the TCB of the task that was previously active. if
* up_savecontext returns a non-zero value, then this is really the
* previously running task restarting!
*/
else if (!up_savecontext(&rtcb->xcp))
{
/* Restore the exception context of the new task that is ready to
* run (probably tcb). This is the new rtcb at the head of the
* g_readytorun task list.
*/
rtcb = (FAR struct tcb_s*)g_readytorun.head;
dbg("New Active Task TCB=%p\n", rtcb);
/* Then switch contexts */
up_restorecontext(&rtcb->xcp);
}
}
}
-7
View File
@@ -1,7 +0,0 @@
#
# For a description of the syntax of this configuration file,
# see misc/tools/kconfig-language.txt.
#
if ARCH_BOARD_PJRC_87C52
endif
-170
View File
@@ -1,170 +0,0 @@
############################################################################
# configs/pjrc-8051/Make.defs
#
# Copyright (C) 2007, 2008, 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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.
#
############################################################################
include ${TOPDIR}/.config
include ${TOPDIR}/tools/Config.mk
# These are the directories where the SDCC toolchain is installed. NOTE
# that short 8.3 path names are used in order to avoid spaces. On my machine
# I have:
#
# C:\PROGRA~1\ = C:\Profram Files\
# C:\PROGRA~2\ = C:\Program Files (x86)\
#
# Your PC may be configured differently.
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
SDCC_INSTALLDIR = C:\PROGRA~2\SDCC
SDCC_BINDIR = $(SDCC_INSTALLDIR)\bin
SDCC_LIBDIR = $(SDCC_INSTALLDIR)\lib\large-stack-auto
else
SDCC_INSTALLDIR = /usr/local
SDCC_BINDIR = $(SDCC_INSTALLDIR)/bin
SDCC_LIBDIR = $(SDCC_INSTALLDIR)/share/sdcc/lib/large-stack-auto
endif
CROSSDEV =
CC = sdcc
CPP = sdcpp
LD = sdld
AS = sdas8051
AR = sdar -r
IRAM_SIZE = 0x100
DEF_STACK_BASE = 0x24
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
ARCHOPTIMIZATION = --debug
else
ARCHOPTIMIZATION =
endif
ARCHCPUFLAGS = -mmcs51 --stack-auto --model-large --int-long-reent --float-reent
ARCHPICFLAGS =
ARCHWARNINGS =
ARCHDEFINES =
ARCHINCLUDES = -I. -I$(TOPDIR)/include
CFLAGS = $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
AFLAGS = -x -j -g -l -s -p
SDCCLIB = libsdcc.lib
ASMEXT = .asm
OBJEXT = .rel
LIBEXT = .lib
EXEEXT = .hex
# Custom ASSEMBLE definition. The most common toolchain, GCC, uses the
# compiler to assemble files because this has the advantage of running the C
# Pre-Processor against. This is not possible with other SDCC; we need to
# define AS and over-ride the common definition in order to use the assembler
# directly.
define ASSEMBLE
@echo "AS: $1"
@$(AS) $(AFLAGS) $1
endef
# Custom CLEAN definition
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
define CLEAN
$(Q) if exist *.o (del /f /q *.o)
$(Q) if exist *.asm (del /f /q *.asm)
$(Q) if exist *.rel (del /f /q *.rel)
$(Q) if exist *.lst (del /f /q *.lst)
$(Q) if exist *.rst (del /f /q *.rst)
$(Q) if exist *.sym (del /f /q *.sym)
$(Q) if exist *.adb (del /f /q *.adb)
$(Q) if exist *.lnk (del /f /q *.lnk)
$(Q) if exist *.map (del /f /q *.map)
$(Q) if exist *.mem (del /f /q *.mem)
$(Q) if exist *.hex (del /f /q *.hex)
$(Q) if exist *.cmd (del /f /q *.cmd)
endef
else
define CLEAN
$(Q) rm -f *.o *.asm *.rel *.lst *.rst *.sym *.adb *.lnk *.map *.mem *.hex *.cmd
endef
endif
# Windows native host tool definitions
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
HOSTCC = mingw32-gcc.exe
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =
HOSTEXEEXT = .exe
# Windows-native host tools
MKDEP = $(TOPDIR)\tools\mkdeps.exe --winnative
# Use NTFS links or directory copies
ifeq ($(CONFIG_WINDOWS_MKLINK),y)
DIRLINK = $(TOPDIR)$(DELIM)tools$(DELIM)link.bat
else
DIRLINK = $(TOPDIR)$(DELIM)tools$(DELIM)copydir.bat
endif
DIRUNLINK = $(TOPDIR)$(DELIM)tools$(DELIM)unlink.bat
else
# Linux/Cygwin host tool definitions
HOSTCC = gcc
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =
# This is the tool to use for dependencies (i.e., none)
MKDEP = $(TOPDIR)$(DELIM)tools$(DELIM)mknulldeps.sh
# SDCC for Linux, OSX, or Cygwin understands symbolic links. Windows SDCC
# running under Cygwin does not
ifeq ($(WINTOOL),y)
DIRLINK = $(TOPDIR)$(DELIM)tools$(DELIM)copydir.sh
else
DIRLINK = $(TOPDIR)$(DELIM)tools$(DELIM)link.sh
endif
DIRUNLINK = $(TOPDIR)$(DELIM)tools$(DELIM)unlink.sh
endif
-54
View File
@@ -1,54 +0,0 @@
pjrc-8051 README
^^^^^^^^^^^^^^^^
This port uses the PJRC 87C52 development system and the SDCC toolchain.
The PJRC 87C52 development system can be obtained from http://www.pjrc.com/.
The SDCC toolchain is available from http://sdcc.sourceforge.net/. All
testing has been performed using verison 2.6.0 of the SDDC toolchain.
Building the SDCC toolchain
^^^^^^^^^^^^^^^^^^^^^^^^^^^
The SDCC toolchain is built with the standard configure/make/make install
sequence. However, some special actions are required to generate libraries
compatible with this build. First start with the usual steps
download
unpack
cd sdcc
./configure
make
But before installing, we need to apply a patch to the SDCC 2.6.0 source.
WARNING: This patch is specific to the particular combination of CFLAGS
that are used in the compilation. If you change Make.defs, then you will
likely have to change the patch as well.
Apply sdcc-2.6.0.patch
cd sdcc/device/lib
make model-mcs51-stack-auto
Then
cd sdcc
make install
Status
^^^^^^
On December 9, 2012, I made updates so that the 8051 port could use the
newest SDCC toolchain (a pre-3.2.1 at that time). However, when I attempted
to build the PJRC-8051 configuration, I got type incompatibility errors
from sched/os_bringup.c. From what I gather by googling, this is a compiler
bug related to the --stack-auto option.
I have not been successful working around those bugs and I believe that
these are 8051-related bugs in the SDCC toolchain. This needs to be
revisited with a later version of SDCC.
This configuration was last successfully built and tested with a ca.
2.6.0 SDCC release. Support for that older toolchain was removed in
NuttX revision -r5423. If you wanted to used those older toolchains,
you would need to revert to a pre-r5423 revision.
File diff suppressed because it is too large Load Diff
-51
View File
@@ -1,51 +0,0 @@
/************************************************************
* board/board.h
*
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
************************************************************/
#ifndef __ARCH_BOARD_BOARD_H
#define __ARCH_BOARD_BOARD_H
/************************************************************
* Included Files
************************************************************/
/************************************************************
* Definitions
************************************************************/
/************************************************************
* Inline Functions
************************************************************/
#endif /* __ARCH_BOARD_BOARD_H */
-215
View File
@@ -1,215 +0,0 @@
/**************************************************************************
* pjrc.h
*
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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.
*
**************************************************************************/
#ifndef __PJRC_H
#define __PJRC_H
/**************************************************************************
* Included Files
**************************************************************************/
#include <stdint.h>
/**************************************************************************
* Public Definitions
**************************************************************************/
/**************************************************************************
* Public Types
**************************************************************************/
/**************************************************************************
* Public Variables
**************************************************************************/
/* Memory Map
*
* BEGIN END DESCRIPTION
* 0x0000 0x1fff CODE: ROM containg PAULMON2
* DATA: RAM for program variables
* 0x2000 0x7fff COMMON: RAM for program code or
* variables
* 0x8000 0xf7ff COMMON: FLASH for program code
* 0xf800 0xfeff COMMON: Peripherals
* 0xff00 0xffff COMMON: unused
*
* Program code may be loaded at the RAM location 0x2000-0x7fff
* for testing. If loaded into the FLASH location at
* 0x8000-0xf7ff, PAULMON2 will automatically write the program
* into flash. The program is configured in the RAM-based test
* configuration:
*/
#define RAM_BLOCK_START IRAM_SIZE
#define RAM_BLOCK_END 0x1fff
#define PROGRAM_BASE 0x2000
#define PROGRAM_END 0x7fff
#define FLASH_BASE 0x8000
#define FLASH_END 0xf7ff
/* Well-known entry points to access PAULMON2's built-in functions */
#define PM2_ENTRY_PHEX1 0x002e
#define PM2_ENTRY_COUT 0x0030
#define PM2_ENTRY_CIN 0x0032
#define PM2_ENTRY_PHEX 0x0034
#define PM2_ENTRY_PHEX16 0x0036
#define PM2_ENTRY_PSTR 0x0038
#define PM2_ENTRY_ESC 0x003e
#define PM2_ENTRY_UPPER 0x0040
#define PM2_ENTRY_PINT8U 0x004D
#define PM2_ENTRY_PINT8 0x0050
#define PM2_ENTRY_PINT16U 0x0053
#define PM2_ENTRY_NEWLINE 0x0048
#define PM2_ENTRY_PRGM 0x0059
#define PM2_ENTRY_ERBLOCK 0x0067
/* PAULMON2 captures all interrupt vectors in ROM but relays them
* through the following RAM addresses:
*/
#define PM2_VECTOR_BASE PROGRAM_BASE
#define PM2_VECTOR_EXTINT0 (PM2_VECTOR_BASE + 3)
#define PM2_VECTOR_TIMER0 (PM2_VECTOR_BASE + 11)
#define PM2_VECTOR_EXTINT1 (PM2_VECTOR_BASE + 19)
#define PM2_VECTOR_TIMER1 (PM2_VECTOR_BASE + 27)
#define PM2_VECTOR_UART (PM2_VECTOR_BASE + 35)
#define PM2_VECTOR_TIMER2 (PM2_VECTOR_BASE + 43)
/* Peripheral Mapping
*
* Begin End Peripheral Addr Acc Function
* F800 F8FF 82C55 (A, B, C) F800 R/W Port A
* F801 R/W Port B
* F802 R/W Port C
* F803 W Config A,B,C
* F900 F9FF 82C55 (D, E, F) F900 R/W Port D
* F901 R/W Port E (LEDs)
* F902 R/W Port F
* F903 W Config D,E,F
* FA00 FAFF User Expansion
* FB00 FBFF User Expansion
* FC00 FCFF User Expansion
* FD00 FDFF User Expansion
* FE00 FEFF LCD Port FE00 W Command Register
* FE01 R Status Register
* FE02 W Display or CGRAM Buffer
* FE03 R " " "" " " " "
*
* These are the memory-mapped locations used to access the two 82C55
* chips
*/
#ifndef __ASSEMBLY__
xdata at 0xF800 uint8_t p82c55_port_a;
xdata at 0xF801 uint8_t p82c55_port_b;
xdata at 0xF802 uint8_t p82c55_port_c;
xdata at 0xF803 uint8_t p82c55_abc_config;
xdata at 0xF900 uint8_t p82c55_port_d;
xdata at 0xF901 uint8_t p82c55_port_e;
xdata at 0xF902 uint8_t p82c55_port_f;
xdata at 0xF903 uint8_t p82c55_def_config;
#endif
/* LED (Port E) bit definitions */
#define LED_STARTED 0
#define LED_HEAPALLOCATE 1
#define LED_IRQSENABLED 2
#define LED_IDLE 3
#define LED_UNUSED2 4
#define LED_INIRQ 5
#define LED_ASSERTION 6
#define LED_PANIC 7
/* Registers. 8052 regiser definitions are provided in the SDCC header
* file 8052.h. However, a few SFR registers are missing from that
* file (they can be found in mcs51reg.h, but that file is too much
* when the following simple addtions do the job).
*/
#ifndef __ASSEMBLY__
sfr at 0xc9 T2MOD ;
#endif
/* Timing information.
*
* The PJRC board is based on a standard 87C52 CPU clocked at 22.1184 MHz.
* The CPU clock is divided by 12 to yield a clock frequency of 1.8432 MHz.
*/
#define CPU_CLOCK_HZ 22118400L
#define TIMER_CLOCK_HZ 1843200L
/* The 87C52 has three timers, timer 0, timer 1, and timer 2. On the PJRC
* board, timer 1 and 2 have dedicated functions. They provide baud support
* support for the boards two serial ports. Unfortunately, only timer 2
* can generate the accurate 100Hz timer desired by the OS.
*
* Timer 0 provides only a 8-bit auto-reload mode.
*/
#ifdef CONFIG_8052_TIMER2
/* To use timer 2 as the 100Hz system timer, we need to calculate a 16-bit
* reload value that results in 100Hz overflow interrupts. That value
* is given by:
*
* Timer ticks = TIMER_CLOCK_HZ / (desired ticks-per-second)
* = 18432
* Capture value = 0xffff - (Timer ticks)
* = 47103 = 0x67ff
*/
# define TIMER2_CAPTURE_LOW 0xff
# define TIMER2_CAPTURE_HIGH 0x67
#else
/* Timer 0, mode 0 can be used as a system timer. In that mode, the
* 1.8432 is further divided by 32. A single 8-bit value is incremented
* at 57600 Hz, which results in 225 Timer 0 overflow interrupts per
* second.
*/
#endif
/**************************************************************************
* Public Function Prototypes
**************************************************************************/
#endif /* __PJRC_H */
-28
View File
@@ -1,28 +0,0 @@
diff -u sdcc/device/lib/Makefile.orig sdcc/device/lib/Makefile
--- sdcc/device/lib/Makefile.orig 2007-03-06 09:55:01.000000000 -0600
+++ sdcc/device/lib/Makefile 2007-03-06 09:58:32.000000000 -0600
@@ -242,7 +242,7 @@
model-mcs51-stack-auto:
if [ "`grep mcs51 $(top_builddir)ports.build`" = mcs51 ]; then \
for model in $(MODELS); do \
- $(MAKE) MODELFLAGS="--model-$$model --stack-auto" PORT=$$model PORTDIR=$(BUILDDIR)/$$model-stack-auto PORTINCDIR=$(INCDIR)/mcs51 objects; \
+ $(MAKE) MODELFLAGS="--model-$$model --stack-auto --int-long-reent --float-reent" PORT=$$model PORTDIR=$(BUILDDIR)/$$model-stack-auto PORTINCDIR=$(INCDIR)/mcs51 objects; \
done \
fi
diff -u sdcc/device/include/stdarg.h.orig sdcc/device/include/stdarg.h
--- sdcc/device/include/stdarg.h.orig 2007-03-11 13:21:15.000000000 -0600
+++ sdcc/device/include/stdarg.h 2007-03-11 13:26:59.000000000 -0600
@@ -25,9 +25,9 @@
#else
-typedef unsigned char __data * va_list ;
-#define va_arg(marker,type) *((type __data * )(marker -= sizeof(type)))
-#define va_start(marker,first) { marker = (va_list) ((char __data * )&first); }
+typedef unsigned char * va_list ;
+#define va_arg(marker,type) *((type * )(marker -= sizeof(type)))
+#define va_start(marker,first) { marker = (va_list) ((char * )&first); }
#endif
-65
View File
@@ -1,65 +0,0 @@
#!/bin/bash
# configs/pjrc-8051/setenv.sh
#
# Copyright (C) 2007-2008, 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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.
#
if [ "$_" = "$0" ] ; then
echo "You must source this script, not run it!" 1>&2
exit 1
fi
WD=`pwd`
if [ ! -x "setenv.sh" ]; then
echo "This script must be executed from the top-level NuttX build directory"
exit 1
fi
if [ -z "${PATH_ORIG}" ]; then
export PATH_ORIG="${PATH}"
fi
#
# This is the normal installation directory for SDCC under Linux, OSX
# or Linux:
#
export TOOLCHAIN_BIN=/usr/local/bin
#
# This is the normal installation directory for SDCC under Windows
#
#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/SDCC/bin"
#
# Add the path to the toolchain to the PATH varialble
#
export PATH="${TOOLCHAIN_BIN}":/sbin:/usr/sbin:${PATH_ORIG}
echo "PATH : ${PATH}"
-15
View File
@@ -1,15 +0,0 @@
/Make.dep
/.depend
/up_mem.h
/*.sym
/*.asm
/*.rel
/*.lst
/*.adb
/*.rst
/*.lib
/*.lnk
/*.map
/*.mem
/*.ihx
/*.hex
-75
View File
@@ -1,75 +0,0 @@
############################################################################
# configs/pjrc-8051/src/Makefile
#
# Copyright (C) 2007, 2008, 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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.
#
############################################################################
-include $(TOPDIR)/Make.defs
CFLAGS += -I$(TOPDIR)/sched
ASRCS =
AOBJS = $(ASRCS:.S=$(OBJEXT))
CSRCS = up_leds.c
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
CFLAGS += -I $(TOPDIR)/arch/$(CONFIG_ARCH)/src
all: libboard$(LIBEXT)
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS) $(LINKOBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libboard$(LIBEXT): $(OBJS)
$(call ARCHIVE, $@, $(OBJS))
.depend: Makefile $(SRCS)
$(Q) $(MKDEP) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
$(Q) touch $@
depend: .depend
clean:
$(call DELFILE, libboard$(LIBEXT))
$(call CLEAN)
distclean: clean
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
-include Make.dep
-207
View File
@@ -1,207 +0,0 @@
/************************************************************************
* up_leds.c
*
* Copyright (C) 2007, 2009, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <stdint.h>
#include "up_internal.h"
/************************************************************************
* Definitions
************************************************************************/
#define RESET_KLUDGE_NEEDED 1
/************************************************************************
* Private Data
************************************************************************/
static uint8_t g_ledstate;
/************************************************************************
* Private Functions
************************************************************************/
#if defined(CONFIG_DEBUG_LEDS) && defined(CONFIG_ARCH_LEDS)
static void _up_puthex(uint8_t hex) __naked
{
hex; /* To avoid unreferenced argument warning */
_asm
mov a, dpl
ljmp PM2_ENTRY_PHEX
_endasm;
}
static void _up_putch(uint8_t ch) __naked
{
_asm
mov a, dpl
ljmp PM2_ENTRY_COUT
_endasm;
}
static void _up_putnl(void) __naked
{
_asm
ljmp PM2_ENTRY_NEWLINE
_endasm;
}
# define _up_showledinit() \
_up_putch('I'); \
_up_puthex(g_ledstate); _up_putch(':'); \
_up_puthex(p82c55_port_e); _up_putnl();
# define _up_showledreset() \
_up_putch('R'); \
_up_puthex(led); _up_putch(':'); \
_up_puthex(g_ledstate); _up_putch(':'); \
_up_puthex(p82c55_port_e); _up_putnl();
# define _up_showledon() \
_up_putch('+'); \
_up_puthex(led); _up_putch(':'); \
_up_puthex(g_ledstate); _up_putch(':'); \
_up_puthex(p82c55_port_e); _up_putnl();
# define _up_showledoff() \
_up_putch('-'); \
_up_puthex(led); _up_putch(':'); \
_up_puthex(g_ledstate); _up_putch(':'); \
_up_puthex(p82c55_port_e); _up_putnl();
#else
# define _up_showledinit()
# define _up_showledreset()
# define _up_showledon()
# define _up_showledoff()
#endif
/************************************************************************
* Public Funtions
************************************************************************/
/************************************************************************
* Name: board_led_initialize
************************************************************************/
#ifdef CONFIG_ARCH_LEDS
void board_led_initialize(void)
{
/* Set all ports as outputs */
p82c55_def_config = 128;
/* Turn LED 1-7 off; turn LED 0 on */
g_ledstate = 0xfe;
p82c55_port_e = g_ledstate;
_up_showledinit();
}
/************************************************************************
* Name: board_led_on
************************************************************************/
void board_led_on(uint8_t led)
{
/* This may be called from an interrupt handler */
irqstate_t flags = irqsave();
#ifdef RESET_KLUDGE_NEEDED
/* I don't understand why this happens yet, but sometimes
* it is necessary to reconfigure port E.
*/
if (g_ledstate != p82c55_port_e)
{
_up_showledreset();
p82c55_def_config = 128;
}
#endif
/* Clear the bit in port E corresponding to LED to turn it on */
if (led < 8)
{
g_ledstate &= ~(g_ntobit[led]);
p82c55_port_e = g_ledstate;
}
_up_showledon();
irqrestore(flags);
}
/************************************************************************
* Name: board_led_off
************************************************************************/
void board_led_off(uint8_t led)
{
/* This may be called from an interrupt handler */
irqstate_t flags = irqsave();
#ifdef RESET_KLUDGE_NEEDED
/* I don't understand why this happens yet, but sometimes
* it is necessary to reconfigure port E.
*/
if (g_ledstate != p82c55_port_e)
{
_up_showledreset();
p82c55_def_config = 128;
}
#endif
/* Set the bit in port E corresponding to LED to turn it off */
if (led < 8)
{
g_ledstate |= g_ntobit[led];
p82c55_port_e = g_ledstate;
}
_up_showledoff();
irqrestore(flags);
}
#endif /* CONFIG_ARCH_LEDS */