PS/2 test + doc update
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Thu, 12 Nov 2009 15:47:43 +0000 (16:47 +0100)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Thu, 12 Nov 2009 15:47:43 +0000 (16:47 +0100)
14 files changed:
cores/lm32/rtl/lm32_cpu.v
doc/system.tex
software/demo/Makefile
software/demo/isr.c
software/demo/main.c
software/demo/shell.c
software/include/hal/ps2.h [new file with mode: 0644]
software/include/hal/slowout.h
software/include/hw/fmlbrg.h
software/include/hw/hpdmc.h
software/include/hw/interrupts.h
software/include/hw/ps2.h [new file with mode: 0644]
software/libhal/Makefile
software/libhal/ps2.c [new file with mode: 0644]

index 494145e..ed6c018 100644 (file)
@@ -1070,7 +1070,7 @@ lm32_mc_arithmetic mc_arithmetic (
               
 `ifdef CFG_INTERRUPTS_ENABLED
 // Interrupt unit
-lm32_interrupt interrupt (
+lm32_interrupt interrupt_unit (
     // ----- Inputs -------
     .clk_i                  (clk_i),
     .rst_i                  (rst_i),
index c4ade71..b283c82 100644 (file)
@@ -14,7 +14,7 @@
 
 \title{Milkymist system reference manual}
 \author{S\'ebastien Bourdeauducq}
-\date{October 2009}
+\date{November 2009}
 \begin{document}
 \maketitle{}
 \section{What is Milkymist}
@@ -29,6 +29,8 @@ Open source components have been used as much as possible, and therefore a syste
 \end{itemize}
 
 \section{Supported boards}
+\subsection{Milkymist One}
+
 \subsection{Xilinx ML401 development board}
 This board is equipped with a Virtex-4 FPGA (XC4VLX25). Milkymist can use the on-board peripherals of the ML401:
 \begin{itemize}
@@ -38,6 +40,7 @@ This board is equipped with a Virtex-4 FPGA (XC4VLX25). Milkymist can use the on
 \item RS232 port
 \item LCD screen (Lumex LCM-S01602DTR/M, HD44780-compatible)
 \item LEDs
+\item PS/2
 \item Buttons
 \item Parallel flash
 \item DDRAM (two Infineon HYB25D256160BT-7 chips)
@@ -58,7 +61,7 @@ The following peripherals are supported:
 
 \begin{figure}[H]
 \centering
-\includegraphics[height=130mm]{soc_architecture.eps}
+\includegraphics[height=170mm]{soc_architecture.eps}
 \caption{SoC block diagram}
 \end{figure}
 
@@ -108,6 +111,9 @@ The engine performs texture mapping on a triangle strip. It is a central compone
 
 It has two FML master interfaces for fetching pixel data, a WISHBONE master to fetch the vertex data, and a CSR slave for control.
 
+\subsection{PS/2 controller}
+Milkymist supports standard PS/2 keyboard/mouse port in read-only mode. This is only implemented on the ML401 board.
+
 \section{GPIO map}
 
 \subsubsection{Inputs}
@@ -116,11 +122,11 @@ It has two FML master interfaces for fetching pixel data, a WISHBONE master to f
 \hline
 \bf{PIO bit} & \bf{Direction} & \bf{Description} \\
 \hline
-0 & Input & Pushbutton North \\
+0 & Input & Pushbutton North (ML401 only) \\
 \hline
 1 & Input & Pushbutton West \\
 \hline
-2 & Input & Pushbutton South \\
+2 & Input & Pushbutton South (ML401 only) \\
 \hline
 3 & Input & Pushbutton East \\
 \hline
@@ -134,13 +140,13 @@ It has two FML master interfaces for fetching pixel data, a WISHBONE master to f
 \hline
 8 & Input & DIP switch 4 \\
 \hline
-9 & Input & DIP switch 5 \\
+9 & Input & DIP switch 5 (ML401 only) \\
 \hline
-10 & Input & DIP switch 6 \\
+10 & Input & DIP switch 6 (ML401 only) \\
 \hline
-11 & Input & DIP switch 7 \\
+11 & Input & DIP switch 7 (ML401 only) \\
 \hline
-12 & Input & DIP switch 8 \\
+12 & Input & DIP switch 8 (ML401 only) \\
 \hline
 \end{tabularx}
 
@@ -150,33 +156,33 @@ It has two FML master interfaces for fetching pixel data, a WISHBONE master to f
 \hline
 \bf{PIO bit} & \bf{Direction} & \bf{Description} \\
 \hline
-0 & Output & LED 2 (NB. LED 0 and LED 1 respectively monitor UART transmission and reception) \\
+0 & Output & LED 2 (NB. ML401's LED 0 and LED 1 respectively monitor UART transmission and reception) \\
 \hline
 1 & Output & LED 3 \\
 \hline
-2 & Output & LED North \\
+2 & Output & LED North (ML401 only) \\
 \hline
-3 & Output & LED West \\
+3 & Output & LED West (ML401 only) \\
 \hline
-4 & Output & LED South \\
+4 & Output & LED South (ML401 only) \\
 \hline
-5 & Output & LED East \\
+5 & Output & LED East (ML401 only) \\
 \hline
-6 & Output & LED Center \\
+6 & Output & LED Center (ML401 only) \\
 \hline
-7 & Output & HD44780-compatible LCD -- E pin \\
+7 & Output & HD44780-compatible LCD (ML401 only) -- E pin \\
 \hline
-8 & Output & HD44780-compatible LCD -- RS pin \\
+8 & Output & HD44780-compatible LCD (ML401 only) -- RS pin \\
 \hline
-9 & Output & HD44780-compatible LCD -- RW pin \\
+9 & Output & HD44780-compatible LCD (ML401 only) -- RW pin \\
 \hline
-10 & Output & HD44780-compatible LCD -- D4 pin \\
+10 & Output & HD44780-compatible LCD (ML401 only) -- D4 pin \\
 \hline
-11 & Output & HD44780-compatible LCD -- D5 pin \\
+11 & Output & HD44780-compatible LCD (ML401 only) -- D5 pin \\
 \hline
-12 & Output & HD44780-compatible LCD -- D6 pin \\
+12 & Output & HD44780-compatible LCD (ML401 only) -- D6 pin \\
 \hline
-13 & Output & HD44780-compatible LCD -- D7 pin \\
+13 & Output & HD44780-compatible LCD (ML401 only) -- D7 pin \\
 \hline
 \end{tabularx}
 
@@ -212,7 +218,9 @@ It has two FML master interfaces for fetching pixel data, a WISHBONE master to f
 \hline
 \hspace{5mm} 0x80006000 & No & \hspace{5mm} TMU \\
 \hline
-0xa0000000 & No & SystemACE \\
+\hspace{5mm} 0x80007000 & No & \hspace{5mm} PS/2 (ML401 only) \\
+\hline
+0xa0000000 & No & SystemACE (ML401 only) \\
 \hline
 \end{tabularx}
 
@@ -243,6 +251,8 @@ It has two FML master interfaces for fetching pixel data, a WISHBONE master to f
 \hline
 10 & Texture Mapping Unit\\
 \hline
+11 & PS/2 (ML401 only)\\
+\hline
 \end{tabularx}
 
 \section{BIOS and boot process}
index a95991b..f0b70cc 100644 (file)
@@ -66,26 +66,23 @@ isr.o: ../../software/include/hw/interrupts.h ../../software/include/irq.h
 isr.o: ../../software/include/uart.h ../../software/include/hal/time.h
 isr.o: ../../software/include/hal/slowout.h ../../software/include/hal/snd.h
 isr.o: ../../software/include/hw/ac97.h ../../software/include/hw/common.h
-isr.o: ../../software/include/hal/tmu.h ../../software/include/hw/tmu.h
 isr.o: ../../software/include/hal/pfpu.h ../../software/include/hw/pfpu.h
-isr.o: ui.h cpustats.h
+isr.o: ../../software/include/hal/tmu.h ../../software/include/hw/tmu.h
+isr.o: ../../software/include/hal/ps2.h ui.h cpustats.h
 line.o: ../../software/include/stdlib.h ../../software/include/math.h color.h
 line.o: line.h
 main.o: ../../software/include/stdio.h ../../software/include/stdlib.h
 main.o: ../../software/include/console.h ../../software/include/uart.h
 main.o: ../../software/include/system.h ../../software/include/irq.h
 main.o: ../../software/include/board.h ../../software/include/version.h
-main.o: ../../software/include/hw/sysctl.h ../../software/include/hw/common.h
-main.o: ../../software/include/hw/gpio.h
-main.o: ../../software/include/hw/interrupts.h
 main.o: ../../software/include/hal/brd.h ../../software/include/hal/mem.h
 main.o: ../../software/include/hal/time.h ../../software/include/hal/vga.h
 main.o: ../../software/include/hal/snd.h ../../software/include/hw/ac97.h
-main.o: ../../software/include/hal/tmu.h ../../software/include/hw/tmu.h
-main.o: ../../software/include/hal/pfpu.h ../../software/include/hw/pfpu.h
-main.o: ../../software/include/hal/slowout.h
-main.o: ../../software/include/hal/hdlcd.h apipe.h rpipe.h renderer.h ui.h
-main.o: cpustats.h shell.h
+main.o: ../../software/include/hw/common.h ../../software/include/hal/pfpu.h
+main.o: ../../software/include/hw/pfpu.h ../../software/include/hal/tmu.h
+main.o: ../../software/include/hw/tmu.h ../../software/include/hal/slowout.h
+main.o: ../../software/include/hal/hdlcd.h ../../software/include/hal/ps2.h
+main.o: apipe.h rpipe.h renderer.h ui.h cpustats.h shell.h
 parser.o: ../../software/include/stdio.h ../../software/include/stdlib.h
 parser.o: ../../software/include/assert.h ../../software/include/string.h
 parser.o: ../../software/include/malloc.h ../../software/include/math.h ast.h
index 5171182..cad0d9e 100644 (file)
@@ -22,8 +22,9 @@
 #include <hal/time.h>
 #include <hal/slowout.h>
 #include <hal/snd.h>
-#include <hal/tmu.h>
 #include <hal/pfpu.h>
+#include <hal/tmu.h>
+#include <hal/ps2.h>
 
 #include "ui.h"
 #include "cpustats.h"
@@ -55,11 +56,14 @@ void isr()
        if(irqs & IRQ_AC97DMAW)
                snd_isr_dmaw();
 
+       if(irqs & IRQ_PFPU)
+               pfpu_isr();
+
        if(irqs & IRQ_TMU)
                tmu_isr();
 
-       if(irqs & IRQ_PFPU)
-               pfpu_isr();
+       if(irqs & IRQ_PS2)
+               ps2_isr();
 
        if(irqs & IRQ_GPIO)
                ui_isr_key();
index 852e2f4..1f04894 100644 (file)
 #include <hal/time.h>
 #include <hal/vga.h>
 #include <hal/snd.h>
-#include <hal/tmu.h>
 #include <hal/pfpu.h>
+#include <hal/tmu.h>
 #include <hal/slowout.h>
 #include <hal/hdlcd.h>
+#include <hal/ps2.h>
 
 #include "apipe.h"
 #include "rpipe.h"
@@ -64,13 +65,14 @@ int main()
        mem_init();
        vga_init();
        snd_init();
-       tmu_init();
        pfpu_init();
+       tmu_init();
        renderer_init();
        apipe_init();
        rpipe_init();
        slowout_init();
        hdlcd_init();
+       ps2_init();
        ui_init();
        shell_init();
        
index 1e62df9..be338c9 100644 (file)
@@ -38,6 +38,7 @@
 #include <hal/tmu.h>
 #include <hal/time.h>
 #include <hal/brd.h>
+#include <hal/ps2.h>
 
 #include "line.h"
 #include "wave.h"
@@ -381,6 +382,18 @@ static void echo()
        }
 }
 
+static void ps2()
+{
+       int r;
+
+       printf("PS/2 scancode test - send any key on UART to abort\n");
+       while(!readchar_nonblock()) {
+               r = ps2_read();
+               if(r != -1)
+                       printf("%02x\n", r);
+       }
+}
+
 static char *get_token(char **str)
 {
        char *c, *d;
@@ -420,6 +433,7 @@ static void do_command(char *c)
        else if(strcmp(command, "pfputest") == 0) pfputest();
        else if(strcmp(command, "tmutest") == 0) tmutest();
        else if(strcmp(command, "echo") == 0) echo();
+       else if(strcmp(command, "ps2") == 0) ps2();
 
        else if(strcmp(command, "") != 0) printf("Command not found: '%s'\n", command);
 }
diff --git a/software/include/hal/ps2.h b/software/include/hal/ps2.h
new file mode 100644 (file)
index 0000000..b538723
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Milkymist VJ SoC (Software)
+ * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ *
+ * 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, version 3 of the License.
+ *
+ * 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/>.
+ */
+
+#ifndef __HAL_PS2_H
+#define __HAL_PS2_H
+
+void ps2_init();
+void ps2_isr();
+int ps2_read();
+
+#endif /* __HAL_PS2_H */
index c65c090..73449a0 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ *
  * 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, version 3 of the License.
- * 
+ *
  * 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/>.
  */
index 3fc60c7..62697f8 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ *
  * 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, version 3 of the License.
- * 
+ *
  * 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/>.
  */
index a277b62..3288617 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ *
  * 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, version 3 of the License.
- * 
+ *
  * 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/>.
  */
index 7821a20..bb387f3 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ *
  * 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, version 3 of the License.
- * 
+ *
  * 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/>.
  */
@@ -29,5 +29,6 @@
 #define IRQ_AC97DMAW           (0x00000100)
 #define IRQ_PFPU               (0x00000200)
 #define IRQ_TMU                        (0x00000400)
+#define IRQ_PS2                        (0x00000800)
 
 #endif /* __INTERRUPTS_H */
diff --git a/software/include/hw/ps2.h b/software/include/hw/ps2.h
new file mode 100644 (file)
index 0000000..771bad6
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Milkymist VJ SoC (Software)
+ * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ *
+ * 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, version 3 of the License.
+ *
+ * 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/>.
+ */
+
+#ifndef __HW_PS2_H
+#define __HW_PS2_H
+
+#include <hw/common.h>
+
+#define CSR_PS2_RX     MMPTR(0x80007000)
+
+#endif /* __HW_PS2_H */
index b5911f7..8e9529e 100644 (file)
@@ -1,7 +1,7 @@
 MMDIR=../..
 include $(MMDIR)/software/include.mak
 
-OBJECTS=brd.o hdlcd.o mem.o pfpu.o slowout.o snd.o time.o tmu.o vga.o
+OBJECTS=brd.o hdlcd.o mem.o pfpu.o ps2.o slowout.o snd.o time.o tmu.o vga.o
 
 all: libhal.a
 
@@ -35,6 +35,10 @@ pfpu.o: ../../software/include/stdio.h ../../software/include/stdlib.h
 pfpu.o: ../../software/include/irq.h ../../software/include/hw/interrupts.h
 pfpu.o: ../../software/include/hw/pfpu.h ../../software/include/hw/common.h
 pfpu.o: ../../software/include/hal/pfpu.h
+ps2.o: ../../software/include/stdio.h ../../software/include/stdlib.h
+ps2.o: ../../software/include/irq.h ../../software/include/hw/interrupts.h
+ps2.o: ../../software/include/hw/ps2.h ../../software/include/hw/common.h
+ps2.o: ../../software/include/hal/ps2.h
 slowout.o: ../../software/include/stdio.h ../../software/include/stdlib.h
 slowout.o: ../../software/include/irq.h
 slowout.o: ../../software/include/hw/interrupts.h
diff --git a/software/libhal/ps2.c b/software/libhal/ps2.c
new file mode 100644 (file)
index 0000000..d0e988d
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Milkymist VJ SoC (Software)
+ * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ *
+ * 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, version 3 of the License.
+ *
+ * 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 <stdio.h>
+#include <irq.h>
+#include <hw/interrupts.h>
+#include <hw/ps2.h>
+
+#include <hal/ps2.h>
+
+#define QSIZE 64 /* < must be a power of 2 */
+#define QMASK (QSIZE-1)
+
+static unsigned char queue[QSIZE];
+static unsigned int produce;
+static unsigned int consume;
+static unsigned int level;
+
+void ps2_init()
+{
+       unsigned int mask;
+
+       produce = 0;
+       consume = 0;
+       level = 0;
+
+       mask = irq_getmask();
+       mask |= IRQ_PS2;
+       irq_setmask(mask);
+
+       printf("PS2: ready\n");
+}
+
+void ps2_isr()
+{
+       if(level >= QSIZE) {
+               printf("PS2: queue overflow\n");
+               return;
+       }
+
+       queue[produce] = CSR_PS2_RX;
+       produce = (produce + 1) & QMASK;
+       level++;
+}
+
+int ps2_read()
+{
+       unsigned int oldmask;
+       int r;
+
+       oldmask = irq_getmask();
+       irq_setmask(oldmask & (~IRQ_PS2));
+
+       if(level == 0) {
+               irq_setmask(oldmask);
+               return -1;
+       }
+
+       r = queue[consume];
+       consume = (consume + 1) & QMASK;
+       level--;
+
+       irq_setmask(oldmask);
+
+       return r;
+}