📄 traps.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 + -