software: add videomixer base files
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Thu, 21 Mar 2013 09:42:31 +0000 (10:42 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Thu, 21 Mar 2013 09:42:31 +0000 (10:42 +0100)
software/videomixer/Makefile [new file with mode: 0644]
software/videomixer/crt0.S [new file with mode: 0644]
software/videomixer/isr.c [new file with mode: 0644]
software/videomixer/linker.ld [new file with mode: 0644]
software/videomixer/main.c [new file with mode: 0644]

diff --git a/software/videomixer/Makefile b/software/videomixer/Makefile
new file mode 100644 (file)
index 0000000..4b6bf27
--- /dev/null
@@ -0,0 +1,44 @@
+M2DIR=../..
+include $(M2DIR)/software/common.mak
+
+OBJECTS=crt0.o isr.o main.o
+
+all: videomixer.bin
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+%.bin: %.elf
+       $(OBJCOPY) -O binary $< $@
+       chmod -x $@
+
+videomixer.elf: linker.ld $(OBJECTS) libs
+
+%.elf:
+       $(LD) $(LDFLAGS) -T $< -N -o $@ $(OBJECTS) \
+               -L$(M2DIR)/software/libbase \
+               -L$(M2DIR)/software/libcompiler-rt \
+               -lbase -lcompiler-rt
+       chmod -x $@
+
+main.o: main.c
+       $(compile-dep)
+
+%.o: %.c
+       $(compile-dep)
+
+%.o: %.S
+       $(assemble)
+
+libs:
+       make -C $(M2DIR)/software/libcompiler-rt
+       make -C $(M2DIR)/software/libbase
+
+load: videomixer.bin
+       make -C $(M2DIR)/tools
+       $(M2DIR)/tools/flterm --port /dev/ttyUSB0 --kernel videomixer.bin
+
+clean:
+       rm -f $(OBJECTS) $(OBJECTS:.o=.d) videomixer.elf videomixer.bin .*~ *~
+
+.PHONY: main.o clean libs load
diff --git a/software/videomixer/crt0.S b/software/videomixer/crt0.S
new file mode 100644 (file)
index 0000000..6279720
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * LatticeMico32 C startup code.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+/* Exception handlers - Must be 32 bytes long. */
+.section    .text, "ax", @progbits
+.global     _start
+_start:
+_reset_handler:
+       xor     r0, r0, r0
+       wcsr    IE, r0
+       mvhi    r1, hi(_reset_handler)
+       ori     r1, r1, lo(_reset_handler)
+       wcsr    EBA, r1
+       bi      _crt0
+       nop
+       nop
+
+_breakpoint_handler:
+       bi _breakpoint_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_instruction_bus_error_handler:
+       bi _instruction_bus_error_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_watchpoint_hander:
+       bi _watchpoint_hander
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_data_bus_error_handler:
+       bi _data_bus_error_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_divide_by_zero_handler:
+       bi _divide_by_zero_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_interrupt_handler:
+       sw      (sp+0), ra
+       calli   .save_all
+       calli   isr
+       bi      .restore_all_and_eret
+       nop
+       nop
+       nop
+       nop
+
+macaddress:
+       .byte 0x10
+       .byte 0xe2
+       .byte 0xd5
+       .byte 0x00
+       .byte 0x00
+       .byte 0x00
+
+       /* padding to align to a 32-bit boundary */
+       .byte 0x00
+       .byte 0x00
+
+_crt0:
+       /* Setup stack and global pointer */
+       mvhi    sp, hi(_fstack)
+       ori     sp, sp, lo(_fstack)
+       mvhi    gp, hi(_gp)
+       ori     gp, gp, lo(_gp)
+
+       /* Clear BSS */
+       mvhi    r1, hi(_fbss)
+       ori     r1, r1, lo(_fbss)
+       mvhi    r3, hi(_ebss)
+       ori     r3, r3, lo(_ebss)
+.clearBSS:
+       be      r1, r3, .callMain
+       sw      (r1+0), r0
+       addi    r1, r1, 4
+       bi      .clearBSS
+
+.callMain:
+       bi      main
+
+.save_all:
+       addi    sp, sp, -56
+       sw      (sp+4), r1
+       sw      (sp+8), r2
+       sw      (sp+12), r3
+       sw      (sp+16), r4
+       sw      (sp+20), r5
+       sw      (sp+24), r6
+       sw      (sp+28), r7
+       sw      (sp+32), r8
+       sw      (sp+36), r9
+       sw      (sp+40), r10
+       sw      (sp+48), ea
+       sw      (sp+52), ba
+       /* ra needs to be moved from initial stack location */
+       lw      r1, (sp+56)
+       sw      (sp+44), r1
+       ret
+
+.restore_all_and_eret:
+       lw      r1, (sp+4)
+       lw      r2, (sp+8)
+       lw      r3, (sp+12)
+       lw      r4, (sp+16)
+       lw      r5, (sp+20)
+       lw      r6, (sp+24)
+       lw      r7, (sp+28)
+       lw      r8, (sp+32)
+       lw      r9, (sp+36)
+       lw      r10, (sp+40)
+       lw      ra, (sp+44)
+       lw      ea, (sp+48)
+       lw      ba, (sp+52)
+       addi    sp, sp, 56
+       eret
diff --git a/software/videomixer/isr.c b/software/videomixer/isr.c
new file mode 100644 (file)
index 0000000..74dbe34
--- /dev/null
@@ -0,0 +1,15 @@
+#include <hw/uart.h>
+#include <interrupt.h>
+#include <irq.h>
+#include <uart.h>
+
+void isr(void);
+void isr(void)
+{
+       unsigned int irqs;
+       
+       irqs = irq_pending() & irq_getmask();
+       
+       if(irqs & (1 << UART_INTERRUPT))
+               uart_isr();
+}
diff --git a/software/videomixer/linker.ld b/software/videomixer/linker.ld
new file mode 100644 (file)
index 0000000..fd17edb
--- /dev/null
@@ -0,0 +1,56 @@
+OUTPUT_FORMAT("elf32-lm32")
+ENTRY(_start)
+
+__DYNAMIC = 0;
+
+MEMORY {
+       sdram  : ORIGIN = 0x40000000, LENGTH = 0x08000000 /* 128M */
+}
+
+SECTIONS
+{
+       .text :
+       {
+               _ftext = .;
+               *(.text .stub .text.* .gnu.linkonce.t.*)
+               _etext = .;
+       } > sdram
+
+       .rodata :
+       {
+               . = ALIGN(4);
+               _frodata = .;
+               *(.rodata .rodata.* .gnu.linkonce.r.*)
+               *(.rodata1)
+               _erodata = .;
+       } > sdram
+
+       .data :
+       {
+               . = ALIGN(4);
+               _fdata = .;
+               *(.data .data.* .gnu.linkonce.d.*)
+               *(.data1)
+               _gp = ALIGN(16);
+               *(.sdata .sdata.* .gnu.linkonce.s.*)
+               _edata = .;
+       } > sdram
+
+       .bss :
+       {
+               . = ALIGN(4);
+               _fbss = .;
+               *(.dynsbss)
+               *(.sbss .sbss.* .gnu.linkonce.sb.*)
+               *(.scommon)
+               *(.dynbss)
+               *(.bss .bss.* .gnu.linkonce.b.*)
+               *(COMMON)
+               . = ALIGN(4);
+               _ebss = .;
+               . = ALIGN(8);
+               _heapstart = .;
+       } > sdram
+}
+
+PROVIDE(_fstack = ORIGIN(sdram) + LENGTH(sdram) - 4);
diff --git a/software/videomixer/main.c b/software/videomixer/main.c
new file mode 100644 (file)
index 0000000..e00e497
--- /dev/null
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+#include <irq.h>
+#include <uart.h>
+
+int main(void)
+{
+       irq_setmask(0);
+       irq_setie(1);
+       uart_init();
+       
+       puts("Minimal video mixer software built "__DATE__" "__TIME__"\n");
+       
+       while(1);
+       
+       return 0;
+}