⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traps.c

📁 ADS环境下的类似linux内核的操作系统
💻 C
字号:
/* MShowTec - www.mshowtec.com
** msLinux tarps.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
** 
*/

#define MSLINUX_TRAPS_C

#include "cpu_reg.h"
#include "traps.h"
#include "sched.h"
#include "align.h"
#include "malloc.h"
#include "msg.h"

#define KBD_INT_SENDR	(-2)
#define TIM_INT_SENDR	(-3)

#define IRQ_STACK_SIZE	(1025)
#define SWI_STACK_SIZE	(1025)

unsigned char mslinux_irq_nesting = 0;
DEFINE_IRQ_STACK(stack,IRQ_STACK_SIZE);
unsigned char *mslinux_top_irq_stack = 0;

DEFINE_SWI_STACK(stack,SWI_STACK_SIZE);
unsigned char *mslinux_top_swi_stack = 0;

extern int  MSGUI_PID;

void mslinux_int_kbd()
{
	unsigned char state,code;
	unsigned short *pmsg = 0;
	struct message kbd_msg;
	
	state = *(unsigned long*)ARM7_KBDSTATE & 0x03;
	code = *(unsigned long*)ARM7_KBDBUF & 0xff;

	pmsg = (unsigned short*)malloc(sizeof(short));

	*pmsg = (state<<8)|(code);

	kbd_msg.msg_receiver = MSGUI_PID;
	kbd_msg.msg_sender = KBD_INT_SENDR;
	kbd_msg.msg_pointer = (long)pmsg;

	if(MSGUI_PID){
		if(!state){//press
			message_send(&kbd_msg);
		}
	}
		
}

void mslinux_int_touch()
{
	unsigned char state,x,y;
	
	state = *(unsigned long*)ARM7_TOUCHSTATE & 0x03;
	x = *(unsigned long*)ARM7_TOUCHBUF & 0xff;
	y = ((*(unsigned long*)ARM7_TOUCHBUF)>>8) & 0xff;

#if 0
	if(state == 0)
		tty_out("Touch down\r\n");
	if(state == 1)
		tty_out("Touch up\r\n");
	if(state == 2)
		tty_out("Touch Move\r\n");	
#endif	
	
}

void(* const Ext0InterruptRoutTableIRQ[])(void) = {
	0,
};

void(* const Ext1InterruptRoutTableIRQ[])(void) = {
	mslinux_int_kbd,
	mslinux_int_touch,
	0,
};

void mslinux_int_ext0()
{
	unsigned short subIntNo;
	
	*(unsigned long*)ARM7_INTPEND &= ~0x01;
	subIntNo = *(unsigned long*)ARM7_INTROUTER & 0x0000ffff;
	Ext0InterruptRoutTableIRQ[subIntNo]();
}

void mslinux_int_ext1()
{
	unsigned short subIntNo;
	
	*(unsigned long*)ARM7_INTPEND &= ~0x02;
	subIntNo = (*(unsigned long*)ARM7_INTROUTER>>16) & 0x0000ffff;
	Ext1InterruptRoutTableIRQ[subIntNo]();
	
}

char tty_str_buf[128],tty_buf[128],tty_cnt=0;

void mslinux_int_tty_tx()
{
	*(unsigned long*)ARM7_INTPEND &= ~0x04;	
}

void mslinux_int_tty_rx()
{
	char c,i;

	*(unsigned long*)ARM7_INTPEND &= ~0x08;
	c = (char)(*(unsigned long*)ARM7_URXBUF);
	
	if(c == 13){
		tty_buf[tty_cnt] = 0;
		for(i=0;i<=tty_cnt;i++){
			tty_str_buf[i] = tty_buf[i];
		}
		tty_cnt = 0;
		
		*(unsigned long*)ARM7_UTXBUF=(13);
		*(unsigned long*)ARM7_UTXBUF=(10);
		
		semaphore_give(1);		
		return;
	}
	
	 tty_buf[tty_cnt++] = c;
	 
	 *(unsigned long*)ARM7_UTXBUF=(c);

}

void mslinux_int_timer()
{
	struct message tim_msg;
	
	*(unsigned long*)ARM7_INTPEND &= ~0x10;
	jiffies++;
	do_timer();
	
	tim_msg.msg_receiver = MSGUI_PID;
	tim_msg.msg_sender = TIM_INT_SENDR;
	tim_msg.msg_pointer = 0;

	if(MSGUI_PID){
		message_send(&tim_msg);
	}
}

void mslinux_set_lcd_light(int lvl)
{
	lvl ++;
	if(lvl == 11)lvl = 0;
	*(unsigned long*)ARM7_LCDDATA = lvl;
}

void(* const InterruptRoutTableIRQ[])(void) = {
	mslinux_int_ext0,
	mslinux_int_ext1,
	mslinux_int_tty_tx,
	mslinux_int_tty_rx,
	mslinux_int_timer,
	0,
};

void mslinux_irq_handler()
{	
	int irq_idx = 0;
	int i = 0,b = 1;

	for(i = 0; i<5;i++){
		if((*(unsigned long*)ARM7_INTPEND)&b){
			irq_idx = i;
			break;
		}
		b <<= 1;
	}
	if(i == 5)
		return;
	//InterruptRoutTableIRQ [*(unsigned long*)ARM7_INTOFFSET]();
	InterruptRoutTableIRQ [irq_idx]();
}

void (* trap_arm_irq)(void);

void trap_init(void)
{
	mslinux_irq_nesting = 0;
	mslinux_top_irq_stack = irq_stack+IRQ_STACK_SIZE-1;	
	mslinux_top_swi_stack = swi_stack+SWI_STACK_SIZE-1;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -