← Back to team overview

t-kernel team mailing list archive

[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