From 71f793e3e93ed247586a033d3e36588b231cd697 Mon Sep 17 00:00:00 2001 From: wuyangyong Date: Sun, 17 Jul 2011 05:57:07 +0000 Subject: update mini2440 git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1634 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/mini2440/dm9000.c | 152 ++++++++++++++++++++++++++----------------------- bsp/mini2440/startup.c | 4 +- 2 files changed, 81 insertions(+), 75 deletions(-) diff --git a/bsp/mini2440/dm9000.c b/bsp/mini2440/dm9000.c index 44c38917c1..1563a331dd 100644 --- a/bsp/mini2440/dm9000.c +++ b/bsp/mini2440/dm9000.c @@ -153,75 +153,66 @@ void rt_dm9000_isr(int irqno) rt_uint16_t last_io; rt_uint32_t eint_pend; - eint_pend = EINTPEND; - /* EINT7 for DM9000 */ - //if((eint_pend & 0x80) == 0x80) - { + last_io = DM9000_IO; - last_io = DM9000_IO; + /* Disable all interrupts */ + dm9000_io_write(DM9000_IMR, IMR_PAR); - /* Disable all interrupts */ - dm9000_io_write(DM9000_IMR, IMR_PAR); + /* Got DM9000 interrupt status */ + int_status = dm9000_io_read(DM9000_ISR); /* Got ISR */ + dm9000_io_write(DM9000_ISR, int_status); /* Clear ISR status */ - /* Got DM9000 interrupt status */ - int_status = dm9000_io_read(DM9000_ISR); /* Got ISR */ - dm9000_io_write(DM9000_ISR, int_status); /* Clear ISR status */ + DM9000_TRACE("dm9000 isr: int status %04x\n", int_status); - DM9000_TRACE("dm9000 isr: int status %04x\n", int_status); + /* receive overflow */ + if (int_status & ISR_ROS) + { + rt_kprintf("overflow\n"); + } - /* receive overflow */ - if (int_status & ISR_ROS) - { - rt_kprintf("overflow\n"); - } + if (int_status & ISR_ROOS) + { + rt_kprintf("overflow counter overflow\n"); + } - if (int_status & ISR_ROOS) - { - rt_kprintf("overflow counter overflow\n"); - } + /* Received the coming packet */ + if (int_status & ISR_PRS) + { + /* a frame has been received */ + eth_device_ready(&(dm9000_device.parent)); + } - /* Received the coming packet */ - if (int_status & ISR_PRS) - { - /* a frame has been received */ - eth_device_ready(&(dm9000_device.parent)); - } + /* Transmit Interrupt check */ + if (int_status & ISR_PTS) + { + /* transmit done */ + int tx_status = dm9000_io_read(DM9000_NSR); /* Got TX status */ - /* Transmit Interrupt check */ - if (int_status & ISR_PTS) + if (tx_status & (NSR_TX2END | NSR_TX1END)) { - /* transmit done */ - int tx_status = dm9000_io_read(DM9000_NSR); /* Got TX status */ - - if (tx_status & (NSR_TX2END | NSR_TX1END)) + dm9000_device.packet_cnt --; + if (dm9000_device.packet_cnt > 0) { - dm9000_device.packet_cnt --; - if (dm9000_device.packet_cnt > 0) - { - DM9000_TRACE("dm9000 isr: tx second packet\n"); + DM9000_TRACE("dm9000 isr: tx second packet\n"); - /* transmit packet II */ - /* Set TX length to DM9000 */ - dm9000_io_write(DM9000_TXPLL, dm9000_device.queue_packet_len & 0xff); - dm9000_io_write(DM9000_TXPLH, (dm9000_device.queue_packet_len >> 8) & 0xff); + /* transmit packet II */ + /* Set TX length to DM9000 */ + dm9000_io_write(DM9000_TXPLL, dm9000_device.queue_packet_len & 0xff); + dm9000_io_write(DM9000_TXPLH, (dm9000_device.queue_packet_len >> 8) & 0xff); - /* Issue TX polling command */ - dm9000_io_write(DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */ - } - - /* One packet sent complete */ - rt_sem_release(&sem_ack); + /* Issue TX polling command */ + dm9000_io_write(DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */ } - } - /* Re-enable interrupt mask */ - dm9000_io_write(DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM); - - DM9000_IO = last_io; + /* One packet sent complete */ + rt_sem_release(&sem_ack); + } } - /* clear EINT pending bit */ - EINTPEND = eint_pend; + /* Re-enable interrupt mask */ + dm9000_io_write(DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM); + + DM9000_IO = last_io; } /* RT-Thread Device Interface */ @@ -282,12 +273,13 @@ static rt_err_t rt_dm9000_init(rt_device_t dev) if (dm9000_device.mode == DM9000_AUTO) { + i = 0; while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */ - rt_thread_delay( 10 ); + rt_thread_delay( RT_TICK_PER_SECOND/10 ); i++; - if (i > 20) + if (i > 30 ) /* wait 3s */ { rt_kprintf("could not establish link\n"); return 0; @@ -580,6 +572,22 @@ __error_retry: #define B4_Tacp 0x0 #define B4_PMC 0x0 +void INTEINT4_7_handler(int irqno) +{ + rt_uint32_t eint_pend; + + eint_pend = EINTPEND; + + /* EINT7 : DM9000AEP */ + if( eint_pend & (1<<7) ) + { + rt_dm9000_isr(0); + } + + /* clear EINT pending bit */ + EINTPEND = eint_pend; +} + void rt_hw_dm9000_init() { /* Set GPF7 as EINT7 */ @@ -608,7 +616,7 @@ void rt_hw_dm9000_init() * Packet Transmitted, Packet Received */ - dm9000_device.dev_addr[0] = 0x01; + dm9000_device.dev_addr[0] = 0x00; dm9000_device.dev_addr[1] = 0x60; dm9000_device.dev_addr[2] = 0x6E; dm9000_device.dev_addr[3] = 0x11; @@ -617,9 +625,9 @@ void rt_hw_dm9000_init() dm9000_device.parent.parent.init = rt_dm9000_init; dm9000_device.parent.parent.open = rt_dm9000_open; - dm9000_device.parent.parent.close = rt_dm9000_close; + dm9000_device.parent.parent.close = rt_dm9000_close; dm9000_device.parent.parent.read = rt_dm9000_read; - dm9000_device.parent.parent.write = rt_dm9000_write; + dm9000_device.parent.parent.write = rt_dm9000_write; dm9000_device.parent.parent.control = rt_dm9000_control; dm9000_device.parent.parent.user_data = RT_NULL; @@ -629,26 +637,26 @@ void rt_hw_dm9000_init() eth_device_init(&(dm9000_device.parent), "e0"); /* instal interrupt */ - rt_hw_interrupt_install(INTEINT4_7, rt_dm9000_isr, RT_NULL); + rt_hw_interrupt_install(INTEINT4_7, INTEINT4_7_handler, RT_NULL); rt_hw_interrupt_umask(INTEINT4_7); } void dm9000a(void) { rt_kprintf("\n"); - rt_kprintf("NCR (0x00): %02x\n", dm9000_io_read(DM9000_NCR)); - rt_kprintf("NSR (0x01): %02x\n", dm9000_io_read(DM9000_NSR)); - rt_kprintf("TCR (0x02): %02x\n", dm9000_io_read(DM9000_TCR)); - rt_kprintf("TSRI (0x03): %02x\n", dm9000_io_read(DM9000_TSR1)); - rt_kprintf("TSRII (0x04): %02x\n", dm9000_io_read(DM9000_TSR2)); - rt_kprintf("RCR (0x05): %02x\n", dm9000_io_read(DM9000_RCR)); - rt_kprintf("RSR (0x06): %02x\n", dm9000_io_read(DM9000_RSR)); - rt_kprintf("ORCR (0x07): %02x\n", dm9000_io_read(DM9000_ROCR)); - rt_kprintf("CRR (0x2C): %02x\n", dm9000_io_read(DM9000_CHIPR)); - rt_kprintf("CSCR (0x31): %02x\n", dm9000_io_read(DM9000_CSCR)); - rt_kprintf("RCSSR (0x32): %02x\n", dm9000_io_read(DM9000_RCSSR)); - rt_kprintf("ISR (0xFE): %02x\n", dm9000_io_read(DM9000_ISR)); - rt_kprintf("IMR (0xFF): %02x\n", dm9000_io_read(DM9000_IMR)); + rt_kprintf("NCR (%02X): %02x\n", DM9000_NCR, dm9000_io_read(DM9000_NCR)); + rt_kprintf("NSR (%02X): %02x\n", DM9000_NSR, dm9000_io_read(DM9000_NSR)); + rt_kprintf("TCR (%02X): %02x\n", DM9000_TCR, dm9000_io_read(DM9000_TCR)); + rt_kprintf("TSRI (%02X): %02x\n", DM9000_TSR1, dm9000_io_read(DM9000_TSR1)); + rt_kprintf("TSRII (%02X): %02x\n", DM9000_TSR2, dm9000_io_read(DM9000_TSR2)); + rt_kprintf("RCR (%02X): %02x\n", DM9000_RCR, dm9000_io_read(DM9000_RCR)); + rt_kprintf("RSR (%02X): %02x\n", DM9000_RSR, dm9000_io_read(DM9000_RSR)); + rt_kprintf("ORCR (%02X): %02x\n", DM9000_ROCR, dm9000_io_read(DM9000_ROCR)); + rt_kprintf("CRR (%02X): %02x\n", DM9000_CHIPR, dm9000_io_read(DM9000_CHIPR)); + rt_kprintf("CSCR (%02X): %02x\n", DM9000_CSCR, dm9000_io_read(DM9000_CSCR)); + rt_kprintf("RCSSR (%02X): %02x\n", DM9000_RCSSR, dm9000_io_read(DM9000_RCSSR)); + rt_kprintf("ISR (%02X): %02x\n", DM9000_ISR, dm9000_io_read(DM9000_ISR)); + rt_kprintf("IMR (%02X): %02x\n", DM9000_IMR, dm9000_io_read(DM9000_IMR)); rt_kprintf("\n"); } diff --git a/bsp/mini2440/startup.c b/bsp/mini2440/startup.c index 3475c4ac6a..cf8ff261c2 100644 --- a/bsp/mini2440/startup.c +++ b/bsp/mini2440/startup.c @@ -156,10 +156,8 @@ void rtthread_startup(void) int main(void) { - rt_uint32_t UNUSED level; - /* disable interrupt first */ - level = rt_hw_interrupt_disable(); + rt_hw_interrupt_disable(); /* startup RT-Thread RTOS */ rtthread_startup(); -- cgit v1.3.1