#include #define __KERNEL__ #include #define __ASSEMBLY__ #include #undef __ASSEMBLY__ #include #include #include #include "serial.h" #define SERIAL_NUM 2 #define ICTL_PER_MASK_PSC1 0x40000000 #define ICTL_PER_MASK_PSC2 0x20000000 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; psc->command = PSC_SEL_MODE_REG_1; psc->mode = PSC_MODE_8_BITS | PSC_MODE_PARNONE; psc->mode = PSC_MODE_ONE_STOP; #if 0 psc->psc_clock_select = 0; #else psc->psc_clock_select = 0xdd00; #endif counter_timer = (clk / 32 + (baudrate / 2)) / baudrate; psc->ctur = (counter_timer>> 8) & 0xff; psc->ctlr = counter_timer & 0xff; /* 受信割り込み有効にする */ psc->psc_imr = PSC_IMR_RXRDY; serial_intr_enable(index); *(int *)MPC5XXX_GPS_PORT_CONFIG |= 0x00000040; psc->command = PSC_RST_RX; psc->command = PSC_RST_TX; psc->command = PSC_RX_ENABLE | PSC_TX_ENABLE; return 0; } int serial_tstc(int index) { volatile struct mpc5xxx_psc *psc = regs[index].psc; return psc->psc_status & PSC_SR_RXRDY; } static void udelay(int usec) { volatile int i; /* とりあえずてきとうな回数でのダミーループでウエイトを置く */ for (i = 0; i < (save_clk / 1000000) * usec; i++) ; } void serial_putc(int index, char c) { volatile struct mpc5xxx_psc *psc = regs[index].psc; if (c == '\n') serial_putc(index, '\r'); while (!(psc->psc_status & PSC_SR_TXEMP)) { /* waiting */ } /* * フロー制御が無い場合のバッファ溢れ防止として,ウエイトを置く. * データの取りこぼしが発生しているようなら,ウエイトを増やすこと. */ udelay(20); psc->psc_buffer_8 = c; } int serial_getc(int index) { volatile struct mpc5xxx_psc *psc = regs[index].psc; while (!serial_tstc(index)) { /* waiting */ } return psc->psc_buffer_8; } void serial_intr_enable(int index) { int mask = regs[index].mask; *(int *)MPC5XXX_ICTL_PER_MASK &= ~mask; /* PSC割り込み有効化 */ } void serial_intr_disable(int index) { int mask = regs[index].mask; *(int *)MPC5XXX_ICTL_PER_MASK |= mask; /* PSC割り込み無効化 */ }

AltStyle によって変換されたページ (->オリジナル) /