@@ -6,6 +6,11 @@ LD=$(CROSS_COMPILE)ld
LOADADDR=0xa0008000
BINFMT=elf32-littlearm
+COMMON_OBJS = \
+ main.o \
+ print.o \
+ register.o
+
INPUT_OBJS = \
zimage.o \
dtb-raumfeld-controller-0.o \
@@ -29,7 +34,7 @@ zimage.o: input/zImage
%.o: %.c
$(GCC) $(CFLAGS) -c $^
-matcher: main.o print.o board.o led.o $(INPUT_OBJS)
+matcher: $(COMMON_OBJS) board.o $(INPUT_OBJS)
$(LD) $(LDFLAGS) -T matcher.lds -o $@ $^
matcher.bin: matcher
@@ -1,5 +1,8 @@
-#include "types.h"
+#include "atags.h"
#include "board.h"
+#include "print.h"
+#include "register.h"
+#include "types.h"
extern __u32 _binary_input_zImage_start;
extern __u32 _binary_input_raumfeld_controller_0_dtb_start;
@@ -75,14 +78,76 @@ static struct board boards[] = {
{ 0, 0, NULL, NULL } /* sentinel */
};
-struct board *match_board(__u32 machid, __u32 revision)
+static void wait(__u32 ticks)
+{
+ __u32 v;
+
+ /* OSCR */
+ writel(0, 0x40A00010);
+
+ do {
+ v = readl(0x40A00010);
+ } while (ticks > v);
+}
+
+static void led_init(void)
+{
+ writel(0, 0x40e10420); /* GPIO35 */
+ writel(0, 0x40e10424); /* GPIO36 */
+ writel(0x18, 0x40e00010); /* GPDR1 */
+}
+
+static void led_set(__u32 index, __u32 state)
+{
+ __u32 v = 1 << (index ? 3 : 4);
+
+ if (state)
+ writel(v, 0x40e0001c);
+ else
+ writel(v, 0x40e00028);
+}
+
+static void led_panic(void)
{
+ int i;
+
+ led_init();
+
+ for (i = 0;; i++) {
+ led_set(0, i & 1);
+ led_set(1, ~i & 1);
+ wait(500000);
+ }
+}
+struct board *match_board(__u32 machid, const struct tag *tags)
+{
+ const struct tag *t;
struct board *board;
+ __u32 system_rev = 0;
+
+ /* walk the atags to determine the system revision */
+ for_each_tag(t, tags)
+ switch (t->hdr.tag) {
+ case ATAG_REVISION:
+ system_rev = t->u.rev.rev;
+ break;
+ }
+
for (board = boards; board->machid; board++)
- if (board->machid == machid && board->system_rev == revision)
- return board;
+ if (board->machid == machid && board->system_rev == system_rev)
+ break;
- return NULL;
-}
+ if (board->compatible == NULL) {
+ putstr("ERROR MATCHING BOARD!\n");
+ putstr("MACHID: 0x");
+ printhex(machid);
+ putstr("\n");
+ putstr("SYSTEM_REV: 0x");
+ printhex(system_rev);
+ putstr("\n");
+ led_panic(); /* doesn't return */
+ }
+ return board;
+}
@@ -8,6 +8,6 @@ struct board {
const char *name;
};
-struct board *match_board(__u32 machid, __u32 revision);
+struct board *match_board(__u32 machid, const struct tag *);
#endif
deleted file mode 100644
@@ -1,54 +0,0 @@
-#include "types.h"
-#include "led.h"
-
-static inline void writel(__u32 val, __u32 addr)
-{
- *(volatile __u32 *) addr = val;
-}
-
-static inline __u32 readl(__u32 addr)
-{
- return *(volatile __u32 *) addr;
-}
-
-static void wait(__u32 ticks)
-{
- __u32 v;
-
- /* OSCR */
- writel(0, 0x40A00010);
-
- do {
- v = readl(0x40A00010);
- } while (ticks > v);
-}
-
-static void led_init(void)
-{
- writel(0, 0x40e10420); /* GPIO35 */
- writel(0, 0x40e10424); /* GPIO36 */
- writel(0x18, 0x40e00010); /* GPDR1 */
-}
-
-static void led_set(__u32 index, __u32 state)
-{
- __u32 v = 1 << (index ? 3 : 4);
-
- if (state)
- writel(v, 0x40e0001c);
- else
- writel(v, 0x40e00028);
-}
-
-void led_panic(void)
-{
- int i;
-
- led_init();
-
- for (i = 0;; i++) {
- led_set(0, i & 1);
- led_set(1, ~i & 1);
- wait(500000);
- }
-}
deleted file mode 100644
@@ -1,6 +0,0 @@
-#ifndef _LED_H_
-#define _LED_H_
-
-void led_panic(void);
-
-#endif
@@ -2,39 +2,22 @@
#include "atags.h"
#include "print.h"
#include "board.h"
-#include "led.h"
extern __u32 _binary_input_zImage_start;
void main(__u32 dummy, __u32 machid, const struct tag *tags)
{
- const struct tag *t;
struct board *board;
- __u32 system_rev = 0;
void (*start_kernel)(__u32 dummy, __u32 machid, void *dtb) =
(void *) &_binary_input_zImage_start;
putstr("++ Impedance Matcher (3rd stage loader) ++\n");
- /* walk the atags to determine the system revision */
- for_each_tag(t, tags)
- switch (t->hdr.tag) {
- case ATAG_REVISION:
- system_rev = t->u.rev.rev;
- break;
- }
-
- board = match_board(machid, system_rev & 0xff);
- if (!board) {
- putstr("ERROR MATCHING BOARD!\n");
- putstr("MACHID: 0x");
- printhex(machid);
- putstr("\n");
- putstr("SYSTEM_REV: 0x");
- printhex(system_rev);
- putstr("\n");
- led_panic();
- }
+ /*
+ * error resp. is board-specific, so won't return on error
+ * eg - raumfeld boards blink a led indefinitely
+ */
+ board = match_board(machid, tags);
putstr("Detected board: ");
putstr(board->name);
new file mode 100644
@@ -0,0 +1,11 @@
+#include "types.h"
+
+inline void writel(__u32 val, __u32 addr)
+{
+ *(volatile __u32 *) addr = val;
+}
+
+inline __u32 readl(__u32 addr)
+{
+ return *(volatile __u32 *) addr;
+}
new file mode 100644
@@ -0,0 +1,9 @@
+#ifndef _REGISTER_H
+#define _REGISTER_H
+
+#include "types.h"
+
+void writel(__u32, __u32);
+__u32 readl(__u32);
+
+#endif
Signed-off-by: Jason Cooper <jason@lakedaemon.net> --- Makefile | 7 +++++- board.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- board.h | 2 +- led.c | 54 ------------------------------------------- led.h | 6 ----- main.c | 27 ++++------------------ register.c | 11 +++++++++ register.h | 9 ++++++++ 8 files changed, 103 insertions(+), 90 deletions(-) delete mode 100644 led.c delete mode 100644 led.h create mode 100644 register.c create mode 100644 register.h