diff -ruN porting01/command.c porting02/command.c --- porting01/command.c Sun Mar 8 20:19:46 2009 +++ porting02/command.c Mon Apr 6 21:29:44 2009 @@ -4,9 +4,8 @@ #include "lib.h" -#define CONSOLE_NO 0 - -int command_id; +int command0_id; +int command1_id; int command_dummy; static int dummy_func(int n) @@ -19,64 +18,64 @@ return sum; } -static void send_use() +static void send_use(int index) { char *p; p = kz_kmalloc(3); p[0] = EXTINTR_CMD_CONSOLE; - p[1] = '0' + CONSOLE_NO; + p[1] = '0' + index; p[2] = EXTINTR_CMD_CONSOLE_USE; kz_send(extintr_id, 3, p); } -static void send_enable() +static void send_enable(int index) { char *p; p = kz_kmalloc(3); p[0] = EXTINTR_CMD_CONSOLE; - p[1] = '0' + CONSOLE_NO; + p[1] = '0' + index; p[2] = EXTINTR_CMD_CONSOLE_ENABLE; kz_send(extintr_id, 3, p); } #if 0 -static void send_disable() +static void send_disable(int index) { char *p; p = kz_kmalloc(3); p[0] = EXTINTR_CMD_CONSOLE; - p[1] = '0' + CONSOLE_NO; + p[1] = '0' + index; p[2] = EXTINTR_CMD_CONSOLE_DISABLE; kz_send(extintr_id, 3, p); } #endif -static void send_write(char *str) +static void send_write(int index, char *str) { char *p; int len; len = strlen(str); p = kz_kmalloc(len + 3); p[0] = EXTINTR_CMD_CONSOLE; - p[1] = '0' + CONSOLE_NO; + p[1] = '0' + index; p[2] = EXTINTR_CMD_CONSOLE_WRITE; memcpy(&p[3], str, len); kz_send(extintr_id, len + 3, p); } -static int command_proc() +static int command_proc(int index) { char *p; char buffer[128]; int len, size; len = 0; - send_write("> "); - send_enable(); + send_write(index, "> "); + send_enable(index); while (1) { size = kz_recv(NULL, &p); - send_enable(); + send_enable(index); if ((size == 0) || memchr(p, 0x04, size) /* Ctrl-D対応 */ || memchr(p, 0xff, size) /* Ctrl-C対応 */ @@ -90,7 +89,11 @@ if (p == NULL) continue; if (!strncmp(buffer, "echo", 4)) { - send_write(buffer + 4); + send_write(index, buffer + 4); + } else if (!strncmp(buffer, "index", 5)) { + strcpy(buffer, "X\n"); + buffer[0] = '0' + index; + send_write(index, buffer); } else if (!strncmp(buffer, "call", 4)) { dummy_func(10); } else if (!strncmp(buffer, "down", 4)) { @@ -106,15 +109,15 @@ for (i = 0; i < THREAD_NUM; i++) { thp = &threads[i]; if (!thp->id) continue; - send_write(thp->name); - send_write("\n"); + send_write(index, thp->name); + send_write(index, "\n"); } } else if (!strncmp(buffer, "exit", 4)) { break; } len = 0; - send_write("OK\n> "); + send_write(index, "OK\n> "); } return 0; @@ -122,10 +125,12 @@ int command_main(int argc, char *argv[]) { - send_use(); + int index = argc; + + send_use(index); while (1) { - command_proc(); + command_proc(index); } return 0; diff -ruN porting01/extintr.c porting02/extintr.c --- porting01/extintr.c Sun Mar 8 20:19:46 2009 +++ porting02/extintr.c Mon Apr 6 21:29:44 2009 @@ -83,19 +83,19 @@ static int cons_mask(struct interrupts *intp) { - serial_intr_disable(); + serial_intr_disable(intp - interrupts); return 0; } static int cons_unmask(struct interrupts *intp) { - serial_intr_enable(); + serial_intr_enable(intp - interrupts); return 0; } static int cons_checkintr(struct interrupts *intp) { - return serial_tstc(); + return serial_tstc(intp - interrupts); } static int cons_intr(struct interrupts *intp) @@ -110,10 +110,10 @@ #endif size = 1; - buffer[0] = serial_getc(); + buffer[0] = serial_getc(intp - interrupts); if (buffer[0] == '\r') buffer[0] = '\n'; - serial_putc(buffer[0]); /* echo back */ + serial_putc(intp - interrupts, buffer[0]); /* echo back */ if ((size >= 0) && intp->id) #ifdef USE_MESSAGE @@ -139,18 +139,18 @@ break; case EXTINTR_CMD_CONSOLE_ENABLE: - serial_intr_enable(); + serial_intr_enable(intp - interrupts); break; case EXTINTR_CMD_CONSOLE_DISABLE: - serial_intr_disable(); + serial_intr_disable(intp - interrupts); break; case EXTINTR_CMD_CONSOLE_WRITE: { int i; for (i = 1; i < size; i++) - serial_putc(command[i]); + serial_putc(intp - interrupts, command[i]); } break; @@ -170,6 +170,9 @@ intp->intr = cons_intr; intp->command = cons_command; intp->regs.cons->interrupt = intp; + + serial_init(intp - interrupts); + return 0; } @@ -234,6 +237,7 @@ interrupts_init(); extintr_intr_regist(&interrupts[0], &consreg[0], cons_init); + extintr_intr_regist(&interrupts[1], &consreg[1], cons_init); extintr_mainloop(); diff -ruN porting01/extintr.h porting02/extintr.h --- porting01/extintr.h Sun Mar 8 20:19:46 2009 +++ porting02/extintr.h Mon Apr 6 21:29:44 2009 @@ -1,37 +1,19 @@ #ifndef _KOZOS_EXTINTR_H_INCLUDED_ #define _KOZOS_EXTINTR_H_INCLUDED_ -#define EXTINTR_TIMER_NUM 4 -#define EXTINTR_CONSOLE_NUM 4 +#define EXTINTR_CONSOLE_NUM 2 #define EXTINTR_CONSOLE_SOCKET_PORT 12345 #define EXTINTR_INTERRUPTS_NUM 8 -#define EXTINTR_CMD_TIMER 't' #define EXTINTR_CMD_CONSOLE 'c' -#define EXTINTR_CMD_TIMER_USE 'u' -#define EXTINTR_CMD_TIMER_START 's' -#define EXTINTR_CMD_TIMER_MASK 'm' -#define EXTINTR_CMD_TIMER_UNMASK 'M' #define EXTINTR_CMD_CONSOLE_USE 'u' #define EXTINTR_CMD_CONSOLE_ENABLE 'e' #define EXTINTR_CMD_CONSOLE_DISABLE 'd' #define EXTINTR_CMD_CONSOLE_WRITE 'w' #define EXTCONT_CMD_CONTROL_DUMMY '0' -#define EXTCONT_CMD_TIMER_START 's' -#define EXTCONT_CMD_TIMER_MASK 'm' -#define EXTCONT_CMD_TIMER_UNMASK 'M' #define EXTCONT_CMD_CONSOLE_ENABLE 'e' #define EXTCONT_CMD_CONSOLE_DISABLE 'd' -#define EXTCONT_INT_TIMER_EXPIRE 'e' - -int extchild_main(int pid, - int cnt_fildes[2], - int timer_r_fildes[EXTINTR_TIMER_NUM][2], - int timer_cnt_fildes[EXTINTR_TIMER_NUM][2], - int cons_r_fildes[EXTINTR_CONSOLE_NUM][2], - int cons_w_fildes[EXTINTR_CONSOLE_NUM][2], - int cons_cnt_fildes[EXTINTR_CONSOLE_NUM][2]); #endif diff -ruN porting01/kozos.c porting02/kozos.c --- porting01/kozos.c Sun Mar 8 20:19:46 2009 +++ porting02/kozos.c Mon Apr 6 21:29:44 2009 @@ -4,7 +4,8 @@ { extintr_id = kz_run(extintr_main, "extintr", 1, 0, NULL); idle_id = kz_run(idle_main, "idle", 31, 0, NULL); - command_id = kz_run(command_main, "command", 11, 0, NULL); + command0_id = kz_run(command_main, "command0", 11, 0, NULL); + command1_id = kz_run(command_main, "command1", 11, 1, NULL); return 0; } diff -ruN porting01/kozos.h porting02/kozos.h --- porting01/kozos.h Sun Mar 8 20:19:46 2009 +++ porting02/kozos.h Mon Apr 6 21:29:44 2009 @@ -47,20 +47,13 @@ extern int extintr_id; extern int idle_id; extern int stubd_id; -int outlog_main(int argc, char *argv[]); -int timerd_main(int argc, char *argv[]); int extintr_main(int argc, char *argv[]); int idle_main(int argc, char *argv[]); int stubd_main(int argc, char *argv[]); /* user thread */ -extern int clock_id; -extern int clock2_id; -extern int clock3_id; -extern int command_id; -int clock_main(int argc, char *argv[]); -int clock2_main(int argc, char *argv[]); -int clock3_main(int argc, char *argv[]); +extern int command0_id; +extern int command1_id; int command_main(int argc, char *argv[]); #endif diff -ruN porting01/main.c porting02/main.c --- porting01/main.c Sun Mar 8 20:19:46 2009 +++ porting02/main.c Mon Apr 6 21:29:44 2009 @@ -121,7 +121,7 @@ set_dec(0xffffffff); - serial_init(ub_gd->baudrate, ub_gd->ipb_clk); + serial_initialize(ub_gd->baudrate, ub_gd->ipb_clk); /* 外部割り込み有効化 */ msr = get_msr(); diff -ruN porting01/serial.c porting02/serial.c --- porting01/serial.c Sun Mar 8 20:19:46 2009 +++ porting02/serial.c Mon Apr 6 21:29:44 2009 @@ -12,14 +12,34 @@ #include "serial.h" -static volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)MPC5XXX_PSC1; +#define SERIAL_NUM 2 + #define ICTL_PER_MASK_PSC1 0x40000000 #define ICTL_PER_MASK_PSC2 0x20000000 -#define ICTL_PER_MASK_PSC ICTL_PER_MASK_PSC1 -int serial_init(int baudrate, int clk) +static struct { + volatile struct mpc5xxx_psc *psc; + int mask; +} regs[SERIAL_NUM] = { + { (struct mpc5xxx_psc *)MPC5XXX_PSC1, ICTL_PER_MASK_PSC1 }, + { (struct mpc5xxx_psc *)MPC5XXX_PSC2, ICTL_PER_MASK_PSC2 } +}; + +static int save_baudrate, save_clk; + +int serial_initialize(int baudrate, int clk) { + save_baudrate = baudrate; + save_clk = clk; + return 0; +} + +int serial_init(int index) +{ + volatile struct mpc5xxx_psc *psc = regs[index].psc; unsigned int counter_timer; + int baudrate = save_baudrate; + int clk = save_clk; psc->command = PSC_RX_DISABLE | PSC_TX_DISABLE; psc->sicr = 0; @@ -41,7 +61,7 @@ /* 受信割り込み有効にする */ psc->psc_imr = PSC_IMR_RXRDY; - serial_intr_enable(); + serial_intr_enable(index); *(int *)MPC5XXX_GPS_PORT_CONFIG |= 0x00000040; @@ -52,15 +72,18 @@ return 0; } -int serial_tstc() +int serial_tstc(int index) { + volatile struct mpc5xxx_psc *psc = regs[index].psc; return psc->psc_status & PSC_SR_RXRDY; } -void serial_putc(char c) +void serial_putc(int index, char c) { + volatile struct mpc5xxx_psc *psc = regs[index].psc; + if (c == '\n') - serial_putc('\r'); + serial_putc(index, '\r'); while (!(psc->psc_status & PSC_SR_TXEMP)) { /* waiting */ @@ -69,21 +92,25 @@ psc->psc_buffer_8 = c; } -int serial_getc() +int serial_getc(int index) { - while (!serial_tstc()) { + volatile struct mpc5xxx_psc *psc = regs[index].psc; + + while (!serial_tstc(index)) { /* waiting */ } return psc->psc_buffer_8; } -void serial_intr_enable() +void serial_intr_enable(int index) { - *(int *)MPC5XXX_ICTL_PER_MASK &= ~ICTL_PER_MASK_PSC; /* PSC割り込み有効化 */ + int mask = regs[index].mask; + *(int *)MPC5XXX_ICTL_PER_MASK &= ~mask; /* PSC割り込み有効化 */ } -void serial_intr_disable() +void serial_intr_disable(int index) { - *(int *)MPC5XXX_ICTL_PER_MASK |= ICTL_PER_MASK_PSC; /* PSC割り込み無効化 */ + int mask = regs[index].mask; + *(int *)MPC5XXX_ICTL_PER_MASK |= mask; /* PSC割り込み無効化 */ } diff -ruN porting01/serial.h porting02/serial.h --- porting01/serial.h Sun Mar 8 20:19:46 2009 +++ porting02/serial.h Mon Apr 6 21:29:44 2009 @@ -1,11 +1,12 @@ #ifndef _SERIAL_H_INCLUDED_ #define _SERIAL_H_INCLUDED_ -int serial_init(int baudrate, int clk); -int serial_tstc(); -void serial_putc(char c); -int serial_getc(); -void serial_intr_enable(); -void serial_intr_disable(); +int serial_initialize(int baudrate, int clk); +int serial_init(int index); +int serial_tstc(int index); +void serial_putc(int index, char c); +int serial_getc(int index); +void serial_intr_enable(int index); +void serial_intr_disable(int index); #endif diff -ruN porting01/startup.s porting02/startup.s --- porting01/startup.s Sun Mar 8 20:19:46 2009 +++ porting02/startup.s Mon Apr 6 21:29:44 2009 @@ -48,33 +48,14 @@ mtlr 2 blrl - lwz 2,128(1) - mtlr 2 - lwz 2,132(1) - mtcr 2 - lwz 2,136(1) - mtctr 2 - lwz 2,140(1) - mtxer 2 - lwz 2,144(1) - mtsrr0 2 - lwz 2,148(1) - andi. 2,2,0xffff - mtsrr1 2 - - lmw 2,8(1) - lwz 0,4(1) - lwz 1,0(1) - - sync - isync - rfi + b return_from_interrupt .globl dispatch .type dispatch,@function dispatch: mr 1,3 +return_from_interrupt: lwz 2,128(1) mtlr 2 lwz 2,132(1)