t-kernel team mailing list archive
-
t-kernel team
-
Mailing list archive
-
Message #00065
[PATCH] mx28: icoll test ok
From: Du Huanpeng <u74147@xxxxxxxxx>
Signed-off-by: Du Huanpeng <u74147@xxxxxxxxx>
---
tkernel_source/monitor/Makefile | 4 +-
.../monitor/hwdepend/arm/cpu/eitent-start.S | 15 +++-
.../monitor/hwdepend/arm/mach-mx28/icoll.c | 3 +-
.../monitor/hwdepend/arm/mach-mx28/system.c | 40 +++++++++++
tkernel_source/monitor/tmmain/kernel.c | 81 +++++++++++++++++++---
tkernel_source/monitor/tmmain/monkey.S | 1 -
6 files changed, 129 insertions(+), 15 deletions(-)
diff --git a/tkernel_source/monitor/Makefile b/tkernel_source/monitor/Makefile
index 9847e11..863ee4c 100755
--- a/tkernel_source/monitor/Makefile
+++ b/tkernel_source/monitor/Makefile
@@ -11,7 +11,7 @@ GPL := -gpl
include Makefile.src
-CROSS_COMPILE ?= arm-none-eabi-
+CROSS_COMPILE ?= arm-none-linux-gnueabi-
HOST ?= windows
@@ -44,7 +44,7 @@ INCLUDE = \
-I../include \
-Icmdsvc
-CFLAGS := -msoft-float -mthumb-interwork -mstructure-size-boundary=8 -ffreestanding -Wno-pointer-sign -D_TEF_EM1D_ -nostdlib
+CFLAGS := -msoft-float -mthumb-interwork -mstructure-size-boundary=8 -ffreestanding -Wno-pointer-sign -D_TEF_EM1D_ -nostdlib -g
-include hwdepend/$(ARCH)/Makefile
diff --git a/tkernel_source/monitor/hwdepend/arm/cpu/eitent-start.S b/tkernel_source/monitor/hwdepend/arm/cpu/eitent-start.S
index 7af6624..b389210 100644
--- a/tkernel_source/monitor/hwdepend/arm/cpu/eitent-start.S
+++ b/tkernel_source/monitor/hwdepend/arm/cpu/eitent-start.S
@@ -179,13 +179,24 @@ syscall:
irq_entry:
push {r0-r12, lr}
- mrs lr, spsr
+ mrs lr, cpsr
orr lr, #(1<<7)
- msr spsr, lr
+ msr cpsr, lr
+
+ ldr lr, =flag
+ str lr, [lr]
ldr r0, =irqmsg
bl printk
+
+ mrs r0, cpsr
+ ldr lr, =1f
+ blx lr
+1: mrs r1, cpsr
+ ldr lr, =do_irq
+ blx lr
+
pop {r0-r12, lr}
subs pc, lr, #4
irqmsg:
diff --git a/tkernel_source/monitor/hwdepend/arm/mach-mx28/icoll.c b/tkernel_source/monitor/hwdepend/arm/mach-mx28/icoll.c
index 3427085..30a9c30 100644
--- a/tkernel_source/monitor/hwdepend/arm/mach-mx28/icoll.c
+++ b/tkernel_source/monitor/hwdepend/arm/mach-mx28/icoll.c
@@ -35,7 +35,8 @@ volatile void *g_icoll_base;
/*
* IRQ handling
*/
-static void icoll_ack_irq(unsigned int irq)
+//static
+void icoll_ack_irq(unsigned int irq)
{
w_out(0, g_icoll_base + HW_ICOLL_VECTOR);
diff --git a/tkernel_source/monitor/hwdepend/arm/mach-mx28/system.c b/tkernel_source/monitor/hwdepend/arm/mach-mx28/system.c
index 8ddfc7b..cb3036a 100644
--- a/tkernel_source/monitor/hwdepend/arm/mach-mx28/system.c
+++ b/tkernel_source/monitor/hwdepend/arm/mach-mx28/system.c
@@ -1,4 +1,9 @@
/*
+ * i.MX280 board
+ * orignal: monitor/hwdepend/tef_em1d/src/system.c
+ * Copyright (C) 2016 Du Huanpeng<u74147@xxxxxxxxx>
+ */
+/*
*----------------------------------------------------------------------
* T-Kernel 2.0 Software Package
*
@@ -51,6 +56,39 @@ IMPORT void _defaultHdr(void);
#define EnbCacheMMU(x) setCacheMMU(ENB_CACHEMMU)
#define DisCacheMMU(x) setCacheMMU(ENB_MMUONLY) /* MMU can't be turned off */
+
+#define HW_ICOLL_LEVELACK 0x80000010
+
+int do_fiq(int r0, int r1, int r2, int r3)
+{
+ static int rand = 0;
+ int vec;
+
+ rand++;
+
+ void (*isr)();
+
+
+ isr = (void *)in_w(0x80000000);
+ printk("isr:%d\n", isr);
+
+ printk("lr:[%x]\n", r0);
+
+ vec = in_w(0x80000070);
+ printk("irq line: [%d]\n", vec);
+
+
+
+ out_w(0x80000010, 0x1);
+ printk("levelack!\n");
+
+ return 0;
+}
+
+void do_abort(void)
+{
+ printk("DATA ABORT\n");
+}
/* ------------------------------------------------------------------------ */
IMPORT char __loadaddr; /* monitor load address */
@@ -196,7 +234,9 @@ setup_vec:
}
SCArea->intvec[EIT_DEFAULT] = helloworld; /* default handler */
SCArea->intvec[EIT_UNDEF] = helloworld; /* undefined instruction */
+ SCArea->intvec[EIT_FIQ] = do_fiq;
SCArea->intvec[SWI_MONITOR] = _defaultHdr; /* SWI - monitor SVC */
+ SCArea->intvec[EIT_DABORT] = do_abort;
// for (i=0; i<256; i++) {
// syscall(i);
diff --git a/tkernel_source/monitor/tmmain/kernel.c b/tkernel_source/monitor/tmmain/kernel.c
index 3abf1bd..91bb80a 100644
--- a/tkernel_source/monitor/tmmain/kernel.c
+++ b/tkernel_source/monitor/tmmain/kernel.c
@@ -7,10 +7,60 @@ int get_cpsr(void);
extern int getr(int *);
extern int syscall(int);
-void start_timer(unsigned r0, unsigned r1, unsigned r2, unsigned r3);
+
+int flag = 0;
+
+void start_timer();
void icoll_unmask_irq(unsigned int irq);
+/* ICOLL */
+#define HW_ICOLL_VECTOR 0x80000000
+#define HW_ICOLL_LEVELACK 0x80000010
+#define HW_ICOLL_CTRL 0x80000020
+#define HW_ICOLL_VBASE 0x80000040
+#define HW_ICOLL_STAT 0x80000070
+#define HW_ICOLL_RAW0 0x800000A0
+#define HW_ICOLL_RAW1 0x800000B0
+#define HW_ICOLL_RAW2 0x800000C0
+#define HW_ICOLL_RAW3 0x800000D0
+
+
+#define HW_TIMROT_TIMCTRL1 0x80068060
+#define HW_TIMROT_TIMCTRL1_CLR 0x80068068
+
+int do_irq(unsigned r0, unsigned r1, unsigned r2, unsigned r3)
+{
+ int vec;
+ int intno;
+ int timerctrl;
+
+ vec = in_w(HW_ICOLL_VECTOR);
+ out_w(HW_ICOLL_VECTOR, 0);
+ intno = in_w(HW_ICOLL_STAT);
+
+
+
+ putchar('\n');
+ printk("CPSR(irq): %X\n", r0);
+ printk("CPSR(blx): %X\n", r1);
+
+ printk("irq no: %d\n", intno);
+ printk("vecisr: %x\n", vec);
+
+ timerctrl = in_w(HW_TIMROT_TIMCTRL1);
+ printk("timer-ctrl: %016b\n", timerctrl);
+ out_w(HW_TIMROT_TIMCTRL1, timerctrl);
+
+ out_w(HW_TIMROT_TIMCTRL1_CLR, 1<<15);
+
+ out_w(HW_ICOLL_LEVELACK, 0x1);
+// out_w(HW_ICOLL_LEVELACK, 0x2);
+// out_w(HW_ICOLL_LEVELACK, 0x4);
+// out_w(HW_ICOLL_LEVELACK, 0x8);
+
+}
+
int start_kernel(int argc, char *argv[])
{
@@ -132,7 +182,7 @@ void start_timer(unsigned r0, unsigned r1, unsigned r2, unsigned r3)
#define IRQ_EN (1<<14)
#define MATCH_MODE (1<<11)
#define POLARITY (1<<8)
-#define UPDATA (1<<7)
+#define UPDATE (1<<7)
#define RELOAD (1<<6)
#define PRESCALE(n) ((n)<<4)
#define DIV_BY_8 (0x3)
@@ -144,14 +194,22 @@ void start_timer(unsigned r0, unsigned r1, unsigned r2, unsigned r3)
#define CLR 2
#define TOG 3
- hw_timer_rotary[1]->HW_TIMROT_FIXED_COUNT[0] = 0x00001000;
- val = IRQ_EN | UPDATA | PRESCALE(TICK_ALWAYS) | SELECT(0xB);
- hw_timer_rotary[1]->HW_TIMROT_TIMCTRL[0] = val;
- hw_timer_rotary[1]->HW_TIMROT_TIMCTRL[SET] = RELOAD;
-
+ hw_timer_rotary[1]->HW_TIMROT_FIXED_COUNT[0] = 0x00011000;
+ val = IRQ_EN | UPDATE | RELOAD | PRESCALE(TICK_ALWAYS) | SELECT(0xB);
+ out_w(HW_TIMROT_TIMCTRL1, val);
+
+ while(1){
+ static int random = 0;
+
+ random++;
+ printk("[%04d]wait timer1 irq\n", random);
+ waitMsec(300);
+ val = hw_timer_rotary[1]->HW_TIMROT_TIMCTRL[0];
+ printk("%016b\n", val);
+ }
- for(i=0; i<30; i++) {
- val = (unsigned long)&(hw_timer_rotary[1]->HW_TIMROT_RUNNING_COUNT[0]);
+ for(i=0; i<300; i++) {
+ val = (unsigned long)(hw_timer_rotary[1]->HW_TIMROT_RUNNING_COUNT[0]);
printk("Reading register [%016x]:\n", val);
printk("Reading register [% 16x]:\n", val);
printk("Reading register [%-16x]:\n", val);
@@ -170,6 +228,11 @@ void start_timer(unsigned r0, unsigned r1, unsigned r2, unsigned r3)
in_w(HW_ICOLL_RAW3));
printk("hw_icoll_raw[%d][%d]\n", 49, !!hw_icoll_raw(49));
+ if(hw_icoll_raw(49)) {
+ icoll_ack_irq(49);
+ //hw_timer_rotary[1]->HW_TIMROT_ROTCTRL[CLR] = 1<<15;
+ out_w((0x80068060+CLR), (1<<15));
+ }
waitMsec(300);
diff --git a/tkernel_source/monitor/tmmain/monkey.S b/tkernel_source/monitor/tmmain/monkey.S
index 42b0406..a69fb13 100644
--- a/tkernel_source/monitor/tmmain/monkey.S
+++ b/tkernel_source/monitor/tmmain/monkey.S
@@ -61,4 +61,3 @@ set_cpsr:
mask_cpsr:
bl printk
bx lr
-
--
1.9.1