Skip to content

Commit

Permalink
Add initial support for SA868 v1.1 OpenRTX#3
Browse files Browse the repository at this point in the history
  • Loading branch information
edgetriggered committed Jul 16, 2024
1 parent 4b5f038 commit 6556eb4
Show file tree
Hide file tree
Showing 9 changed files with 2,109 additions and 12 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
*.o
*.elf
*.bin
*.s28
*.s37
*.sif
*.map
/src/version.h
89 changes: 77 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
PREFIX ?= rl78-elf-

CC = $(PREFIX)gcc
AS = $(PREFIX)as
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump
PREFIX_RL78 ?= rl78-elf-
PREFIX_M16C ?= m32c-elf-

NAME = sa8x8-fw

Expand All @@ -12,18 +8,36 @@ all: sa868s_vhf sa868s_350 sa868s_uhf

.PHONY: sa868s_vhf
sa868s_vhf: MODEL = SA868S-VHF
sa868s_vhf: PREFIX = $(PREFIX_RL78)
sa868s_vhf: rl78

.PHONY: sa868s_350
sa868s_350: MODEL = SA868S-350
sa868s_350: PREFIX = $(PREFIX_RL78)
sa868s_350: rl78

.PHONY: sa868s_uhf
sa868s_uhf: MODEL = SA868S-UHF
sa868s_uhf: PREFIX = $(PREFIX_RL78)
sa868s_uhf: rl78

.PHONY: sa868_vhf
sa868_vhf: MODEL = SA868-VHF
sa868_vhf: PREFIX = $(PREFIX_M16C)
sa868_vhf: m16c

.PHONY: sa868_uhf
sa868_uhf: MODEL = SA868-UHF
sa868_uhf: PREFIX = $(PREFIX_M16C)
sa868_uhf: m16c

CC = $(PREFIX)gcc
AS = $(PREFIX)as
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump

CFLAGS_RL78 = \
-Isrc -g -Os --param=min-pagesize=0 -mcpu=g13 \
-Isrc -Os --param=min-pagesize=0 -mcpu=g13 \
-ffunction-sections \
-fdata-sections \
-fdiagnostics-parseable-fixits \
Expand All @@ -41,6 +55,7 @@ LDFLAGS_RL78 = \
-nostartfiles \
-Wl,-z,noexecstack \
-Wl,-e_PowerOnReset \
-Wl,--print-memory-usage \
-Wl,--gc-sections \
-Wl,--cref \
-Wl,-Map,$(TARGET).map \
Expand All @@ -53,18 +68,53 @@ OBJECTS_RL78 = \
src/r5f1026a/platform.o \
src/sa8x8.o

CFLAGS_M16C = \
-Isrc -Os -mcpu=r8c \
-ffunction-sections \
-fdata-sections \
-Wunused \
-Wuninitialized \
-Wall \
-Wextra \
-Wmissing-declarations \
-Wconversion \
-Wpointer-arith \
-Wshadow \
-Waggregate-return

LDFLAGS_M16C = \
-nostartfiles \
-Wl,-z,noexecstack \
-Wl,-e_start \
-Wl,--print-memory-usage \
-Wl,--cref \
-Wl,-Map,$(TARGET).map \
-T ./src/r5r0c002/r5r0c002.ld

OBJECTS_M16C = \
src/r5r0c002/crt0.o \
src/r5r0c002/vectors.o \
src/r5r0c002/interrupts.o \
src/r5r0c002/platform.o \
src/sa8x8.o

GIT_DIR ?= .git
ifneq ($(and $(wildcard $(GIT_DIR)),$(shell which git)),)
GIT_INFO = $(shell git describe --long --tags --abbrev=7 | sed 's/\([^-]*-g\)/r\1/;s/-/./g')
else
GIT_INFO = "unknown"
endif

OUTPUTS = \
OUTPUTS_RL78 = \
$(TARGET).elf \
$(TARGET).bin \
$(TARGET).s37

OUTPUTS_M16C = \
$(TARGET).elf \
$(TARGET).bin \
$(TARGET).s28

VERSION_HEADER = src/version.h

.PHONY: $(VERSION_HEADER)
Expand All @@ -88,6 +138,12 @@ src/sa8x8.o: $(VERSION_HEADER)
$(TARGET).elf: $(VERSION_HEADER) $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $(TARGET).elf

$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin

$(TARGET).s28: $(TARGET).elf
$(OBJCOPY) -O srec --srec-forceS3 --srec-len 24 $(TARGET).elf $(TARGET).s28

$(TARGET).s37: $(TARGET).elf
$(OBJCOPY) -O srec --srec-forceS3 --srec-len 32 $(TARGET).elf $(TARGET).s37

Expand All @@ -101,15 +157,24 @@ rl78: TARGET = $(NAME)-$(call LOWER,$(MODEL))
rl78: OBJECTS = $(OBJECTS_RL78)
rl78: CFLAGS += $(CFLAGS_RL78)
rl78: LDFLAGS += $(LDFLAGS_RL78)
rl78: $(OBJECTS_RL78)
rl78: common
rl78: $(OBJECTS_RL78)
rl78: $(OUTPUTS_RL78)

.PHONY: m16c
m16c: TARGET = $(NAME)-$(call LOWER,$(MODEL))
m16c: OBJECTS = $(OBJECTS_M16C)
m16c: CFLAGS += $(CFLAGS_M16C)
m16c: LDFLAGS += $(LDFLAGS_M16C)
m16c: common
m16c: $(OBJECTS_M16C)
m16c: $(OUTPUTS_M16C)

.PHONY: common
common: $(VERSION_HEADER)
common: $(OUTPUTS)

.PHONY: clean
clean:
rm -f $(OBJECTS_RL78) $(VERSION_HEADER)
rm -f *.elf *.bin *.s37 *.map
rm -f $(OBJECTS_M16C) $(OBJECTS_RL78) $(VERSION_HEADER)
rm -f *.elf *.bin *.s28 *.s37 *.map

186 changes: 186 additions & 0 deletions src/r5r0c002/crt0.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
/*
Copyright (c) 2005,2008 Red Hat Incorporated.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
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.
The name of Red Hat Incorporated may not 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 RED HAT INCORPORATED 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 defined(__r8c_cpu__) || defined(__m16c_cpu__)
#define A16
#define A(n,w) n
#define W w
#define ALIGN 1
#else
#define A24
#define A(n,w) w
#define W l
#define ALIGN 2
#endif

.section ".resetvec","ax",@progbits
.long _start

.text

.global _start
_start:
.LFB2:
fclr U /* One stack for user and interrupts */
ldc #__stack,sp

#ifdef A16
mov.b #%hi8(__romdatastart),r1h
mov.w #%lo16(__romdatastart),a0
mov.w #__datastart,a1
#else
mov.l #__romdatastart,a0
mov.l #__datastart,a1
#endif
mov.w #__romdatacopysize,r3
shl.w #-1,r3
smovf.w

#ifdef A16
mov.w #__bssstart,a1
#else
mov.l #__bssstart,a1
#endif
mov.w #__bsssize,r3
shl.w #-1,r3
mov.w #0,r0
sstr.w

#ifdef A16
ldc #%lo16(__var_vects),intbl
ldc #%hi16(__var_vects),intbh
#else
ldc #__var_vects,intb
#endif

fset I
jsr.a __m32c_init

jsr.a _main
.LFE2:

#ifdef A24
/* rv in r0, ok for arg0 */
#else
mov.w r0,r1
#endif

jsr.a _exit

.text

.global _m32c_run_preinit_array
.type _m32c_run_preinit_array,@function
_m32c_run_preinit_array:
mov.W #__preinit_array_start,a0
mov.W #__preinit_array_end,a1
jmp.w _m32c_run_inilist

.global _m32c_run_init_array
.type _m32c_run_init_array,@function
_m32c_run_init_array:
mov.W #__init_array_start,a0
mov.W #__init_array_end,a1
jmp.w _m32c_run_inilist

.global _m32c_run_fini_array
.type _m32c_run_fini_array,@function
_m32c_run_fini_array:
mov.W #__fini_array_start,a0
mov.W #__fini_array_end,a1
/* fall through */

_m32c_run_inilist:
next_inilist:
cmp.W a0,a1
jeq done_inilist
pushm a0,a1
mov.W [a0],a0
#ifdef A16
mov.b:s #0,a1 /* zero extends */
jsri.a a1a0
#else
jsri.a a0
#endif
popm a0,a1
add.W A(#2,#4),a0
jmp.b next_inilist
done_inilist:
rts

.section .init,"ax",@progbits

.global __m32c_init
__m32c_init:
enter #0

.section .fini,"ax",@progbits

.global __m32c_fini
__m32c_fini:
enter #0
jsr.a _m32c_run_fini_array


;;; Provide Dwarf unwinding information that will help GDB stop
;;; backtraces at the right place. This is stolen from assembly
;;; code generated by GCC with -dA.
.section .debug_frame,"",@progbits
.Lframe0:
.4byte .LECIE0-.LSCIE0 ; Length of Common Information Entry
.LSCIE0:
.4byte 0xffffffff ; CIE Identifier Tag
.byte 0x1 ; CIE Version
.ascii "\0" ; CIE Augmentation
.uleb128 0x1 ; CIE Code Alignment Factor
.sleb128 -1 ; CIE Data Alignment Factor
.byte 0xd ; CIE RA Column
.byte 0xc ; DW_CFA_def_cfa
.uleb128 0xc
.uleb128 0x3
.byte 0x8d ; DW_CFA_offset, column 0xd
.uleb128 0x3
.p2align ALIGN
.LECIE0:
.LSFDE0:
.4byte .LEFDE0-.LASFDE0 ; FDE Length
.LASFDE0:
.4byte .Lframe0 ; FDE CIE offset
.4byte .LFB2 ; FDE initial location
.4byte .LFE2-.LFB2 ; FDE address range
.byte 0xf ; DW_CFA_def_cfa_expression
.uleb128 1 ; length of expression
.byte 0x30 ; DW_OP_lit0
.p2align ALIGN
.LEFDE0:

.text
40 changes: 40 additions & 0 deletions src/r5r0c002/interrupts.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/***************************************************************************
* Copyright (C) 2024 by Niccolò Izzo IU2KIN *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/

#include "interrupts.h"
#include "common.h"
#include "registers.h"

void INT_BRK_I(void) {}
void INT_KI(void) {}
void INT_AD(void) {}
void INT_IIC(void) {}
void INT_CMP1(void) {}
void INT_ST0(void) {}
void INT_SR0(void) {
ring_put(&rx, (char)u0rb);
ir_s0ric = 0U;
}
void INT_ST1(void) {}
void INT_SR1(void) {}
void INT_TMRX(void) {}
void INT_TMRZ(void) {}
void INT_INT1(void) {}
void INT_INT3(void) {}
void INT_TMRC(void) {}
void INT_CMP0(void) {}
void INT_INT0(void) {}
Loading

0 comments on commit 6556eb4

Please sign in to comment.