update lpc176x eth driver
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1766 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
2d98e4990e
commit
3d9e766c86
@ -42,6 +42,11 @@ void rt_hw_timer_handler(void)
|
|||||||
rt_interrupt_leave();
|
rt_interrupt_leave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
rt_hw_timer_handler();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function will initial LPC17xx board.
|
* This function will initial LPC17xx board.
|
||||||
*/
|
*/
|
||||||
|
@ -19,7 +19,8 @@ struct lpc17xx_emac
|
|||||||
rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
|
rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
|
||||||
};
|
};
|
||||||
static struct lpc17xx_emac lpc17xx_emac_device;
|
static struct lpc17xx_emac lpc17xx_emac_device;
|
||||||
static struct rt_semaphore sem_slot, sem_lock;
|
static struct rt_semaphore sem_lock;
|
||||||
|
static struct rt_event tx_event;
|
||||||
|
|
||||||
/* Local Function Prototypes */
|
/* Local Function Prototypes */
|
||||||
static void write_PHY (rt_uint32_t PhyReg, rt_uint32_t Value);
|
static void write_PHY (rt_uint32_t PhyReg, rt_uint32_t Value);
|
||||||
@ -32,10 +33,7 @@ void ENET_IRQHandler(void)
|
|||||||
/* enter interrupt */
|
/* enter interrupt */
|
||||||
rt_interrupt_enter();
|
rt_interrupt_enter();
|
||||||
|
|
||||||
status = LPC_EMAC->IntStatus & LPC_EMAC->IntEnable;
|
status = LPC_EMAC->IntStatus;
|
||||||
|
|
||||||
/* Clear the interrupt. */
|
|
||||||
LPC_EMAC->IntClear = status;
|
|
||||||
|
|
||||||
if (status & INT_RX_DONE)
|
if (status & INT_RX_DONE)
|
||||||
{
|
{
|
||||||
@ -47,10 +45,23 @@ void ENET_IRQHandler(void)
|
|||||||
}
|
}
|
||||||
else if (status & INT_TX_DONE)
|
else if (status & INT_TX_DONE)
|
||||||
{
|
{
|
||||||
/* release one slot */
|
/* set event */
|
||||||
rt_sem_release(&sem_slot);
|
rt_event_send(&tx_event, 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status & INT_RX_OVERRUN)
|
||||||
|
{
|
||||||
|
rt_kprintf("rx overrun\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & INT_TX_UNDERRUN)
|
||||||
|
{
|
||||||
|
rt_kprintf("tx underrun\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the interrupt. */
|
||||||
|
LPC_EMAC->IntClear = status;
|
||||||
|
|
||||||
/* leave interrupt */
|
/* leave interrupt */
|
||||||
rt_interrupt_leave();
|
rt_interrupt_leave();
|
||||||
}
|
}
|
||||||
@ -344,8 +355,22 @@ rt_err_t lpc17xx_emac_tx( rt_device_t dev, struct pbuf* p)
|
|||||||
struct pbuf *q;
|
struct pbuf *q;
|
||||||
rt_uint8_t *ptr;
|
rt_uint8_t *ptr;
|
||||||
|
|
||||||
/* take a slot */
|
/* calculate next index */
|
||||||
rt_sem_take(&sem_slot, RT_WAITING_FOREVER);
|
IndexNext = LPC_EMAC->TxProduceIndex + 1;
|
||||||
|
if(IndexNext > LPC_EMAC->TxDescriptorNumber) IndexNext = 0;
|
||||||
|
|
||||||
|
/* check whether block is full */
|
||||||
|
while (IndexNext == LPC_EMAC->TxConsumeIndex)
|
||||||
|
{
|
||||||
|
rt_err_t result;
|
||||||
|
rt_uint32_t recved;
|
||||||
|
|
||||||
|
/* there is no block yet, wait a flag */
|
||||||
|
result = rt_event_recv(&tx_event, 0x01,
|
||||||
|
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recved);
|
||||||
|
|
||||||
|
RT_ASSERT(result == RT_EOK);
|
||||||
|
}
|
||||||
|
|
||||||
/* lock EMAC device */
|
/* lock EMAC device */
|
||||||
rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
|
rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
|
||||||
@ -435,19 +460,20 @@ struct pbuf *lpc17xx_emac_rx(rt_device_t dev)
|
|||||||
|
|
||||||
void lpc17xx_emac_hw_init(void)
|
void lpc17xx_emac_hw_init(void)
|
||||||
{
|
{
|
||||||
rt_sem_init(&sem_slot, "tx_slot", NUM_TX_FRAG, RT_IPC_FLAG_FIFO);
|
rt_event_init(&tx_event, "tx_event", RT_IPC_FLAG_FIFO);
|
||||||
rt_sem_init(&sem_lock, "eth_lock", 1, RT_IPC_FLAG_FIFO);
|
rt_sem_init(&sem_lock, "eth_lock", 1, RT_IPC_FLAG_FIFO);
|
||||||
|
|
||||||
/* set autonegotiation mode */
|
/* set autonegotiation mode */
|
||||||
lpc17xx_emac_device.phy_mode = EMAC_PHY_AUTO;
|
lpc17xx_emac_device.phy_mode = EMAC_PHY_AUTO;
|
||||||
|
|
||||||
|
// OUI 00-60-37 NXP Semiconductors
|
||||||
|
lpc17xx_emac_device.dev_addr[0] = 0x00;
|
||||||
|
lpc17xx_emac_device.dev_addr[1] = 0x60;
|
||||||
|
lpc17xx_emac_device.dev_addr[2] = 0x37;
|
||||||
/* set mac address: (only for test) */
|
/* set mac address: (only for test) */
|
||||||
lpc17xx_emac_device.dev_addr[0] = 0x1E;
|
lpc17xx_emac_device.dev_addr[3] = 0x12;
|
||||||
lpc17xx_emac_device.dev_addr[1] = 0x30;
|
lpc17xx_emac_device.dev_addr[4] = 0x34;
|
||||||
lpc17xx_emac_device.dev_addr[2] = 0x6C;
|
lpc17xx_emac_device.dev_addr[5] = 0x56;
|
||||||
lpc17xx_emac_device.dev_addr[3] = 0xA2;
|
|
||||||
lpc17xx_emac_device.dev_addr[4] = 0x45;
|
|
||||||
lpc17xx_emac_device.dev_addr[5] = 0x5E;
|
|
||||||
|
|
||||||
lpc17xx_emac_device.parent.parent.init = lpc17xx_emac_init;
|
lpc17xx_emac_device.parent.parent.init = lpc17xx_emac_init;
|
||||||
lpc17xx_emac_device.parent.parent.open = lpc17xx_emac_open;
|
lpc17xx_emac_device.parent.parent.open = lpc17xx_emac_open;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user