Skip to content
Closed
41 changes: 21 additions & 20 deletions bsp/at91sam9260/at91_mci.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ struct at91_mci {
rt_uint32_t current_status;
};

static struct at91_mci *at_mci;

/*
* Reset the controller and restore most of the state
*/
Expand Down Expand Up @@ -592,8 +590,9 @@ static void at91_mci_completed_command(struct at91_mci *mci, rt_uint32_t status)
/*
* Handle an interrupt
*/
static void at91_mci_irq(int irq)
static void at91_mci_irq(int irq, void *param)
{
struct at91_mci *mci = (struct at91_mci *)param;
rt_int32_t completed = 0;
rt_uint32_t int_status, int_mask;

Expand Down Expand Up @@ -635,13 +634,13 @@ static void at91_mci_irq(int irq)
if (int_status & AT91_MCI_TXBUFE)
{
mci_dbg("TX buffer empty\n");
at91_mci_handle_transmitted(at_mci);
at91_mci_handle_transmitted(mci);
}

if (int_status & AT91_MCI_ENDRX)
{
mci_dbg("ENDRX\n");
at91_mci_post_dma_read(at_mci);
at91_mci_post_dma_read(mci);
}

if (int_status & AT91_MCI_RXBUFF)
Expand All @@ -668,7 +667,7 @@ static void at91_mci_irq(int irq)
if (int_status & AT91_MCI_BLKE)
{
mci_dbg("Block transfer has ended\n");
if (at_mci->req->data && at_mci->req->data->blks > 1)
if (mci->req->data && mci->req->data->blks > 1)
{
/* multi block write : complete multi write
* command and send stop */
Expand All @@ -684,7 +683,7 @@ static void at91_mci_irq(int irq)
rt_mmcsd_signal_sdio_irq(host->mmc);*/

if (int_status & AT91_MCI_SDIOIRQB)
sdio_irq_wakeup(at_mci->host);
sdio_irq_wakeup(mci->host);

if (int_status & AT91_MCI_TXRDY)
mci_dbg("Ready to transmit\n");
Expand All @@ -695,15 +694,15 @@ static void at91_mci_irq(int irq)
if (int_status & AT91_MCI_CMDRDY)
{
mci_dbg("Command ready\n");
completed = at91_mci_handle_cmdrdy(at_mci);
completed = at91_mci_handle_cmdrdy(mci);
}
}

if (completed)
{
mci_dbg("Completed command\n");
at91_mci_write(AT91_MCI_IDR, 0xffffffff & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
at91_mci_completed_command(at_mci, int_status);
at91_mci_completed_command(mci, int_status);
}
else
at91_mci_write(AT91_MCI_IDR, int_status & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
Expand Down Expand Up @@ -791,7 +790,7 @@ static const struct rt_mmcsd_host_ops ops = {
at91_mci_enable_sdio_irq,
};

void at91_mci_detect(int irq)
void at91_mci_detect(int irq, void *param)
{
rt_kprintf("mmcsd gpio detected\n");
}
Expand Down Expand Up @@ -819,22 +818,22 @@ static void mci_gpio_init()
rt_int32_t at91_mci_init(void)
{
struct rt_mmcsd_host *host;
//struct at91_mci *mci;
struct at91_mci *mci;

host = mmcsd_alloc_host();
if (!host)
{
return -RT_ERROR;
}

at_mci = rt_malloc(sizeof(struct at91_mci));
if (!at_mci)
mci = rt_malloc(sizeof(struct at91_mci));
if (!mci)
{
rt_kprintf("alloc mci failed\n");
goto err;
}

rt_memset(at_mci, 0, sizeof(struct at91_mci));
rt_memset(mci, 0, sizeof(struct at91_mci));

host->ops = &ops;
host->freq_min = 375000;
Expand All @@ -846,7 +845,7 @@ rt_int32_t at91_mci_init(void)
host->max_blk_size = 512;
host->max_blk_count = 4096;

at_mci->host = host;
mci->host = host;

mci_gpio_init();
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_MCI); //enable MCI clock
Expand All @@ -855,22 +854,24 @@ rt_int32_t at91_mci_init(void)
at91_mci_enable();

/* instal interrupt */
rt_hw_interrupt_install(AT91SAM9260_ID_MCI, at91_mci_irq, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_MCI, at91_mci_irq,
(void *)mci, "MMC");
rt_hw_interrupt_umask(AT91SAM9260_ID_MCI);
rt_hw_interrupt_install(gpio_to_irq(AT91_PIN_PA7), at91_mci_detect, RT_NULL);
rt_hw_interrupt_install(gpio_to_irq(AT91_PIN_PA7),
at91_mci_detect, RT_NULL, "MMC_DETECT");
rt_hw_interrupt_umask(gpio_to_irq(AT91_PIN_PA7));

rt_timer_init(&at_mci->timer, "mci_timer",
rt_timer_init(&mci->timer, "mci_timer",
at91_timeout_timer,
at_mci,
mci,
RT_TICK_PER_SECOND,
RT_TIMER_FLAG_PERIODIC);

//rt_timer_start(&mci->timer);

//rt_sem_init(&mci->sem_ack, "sd_ack", 0, RT_IPC_FLAG_FIFO);

host->private_data = at_mci;
host->private_data = mci;

mmcsd_change(host);

Expand Down
28 changes: 17 additions & 11 deletions bsp/at91sam9260/board.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,10 @@ struct rt_device uart4_device;
/**
* This function will handle serial
*/
void rt_serial_handler(int vector)
void rt_serial_handler(int vector, void *param)
{
int status;
struct rt_device *dev = (rt_device_t)param;

switch (vector)
{
Expand All @@ -105,7 +106,7 @@ void rt_serial_handler(int vector)
{
return;
}
rt_hw_serial_isr(&uart1_device);
rt_hw_serial_isr(dev);
break;
#endif
#ifdef RT_USING_UART1
Expand All @@ -115,7 +116,7 @@ void rt_serial_handler(int vector)
{
return;
}
rt_hw_serial_isr(&uart2_device);
rt_hw_serial_isr(dev);
break;
#endif
#ifdef RT_USING_UART2
Expand All @@ -125,7 +126,7 @@ void rt_serial_handler(int vector)
{
return;
}
rt_hw_serial_isr(&uart3_device);
rt_hw_serial_isr(dev);
break;
#endif
#ifdef RT_USING_UART3
Expand All @@ -135,7 +136,7 @@ void rt_serial_handler(int vector)
{
return;
}
rt_hw_serial_isr(&uart4_device);
rt_hw_serial_isr(dev);
break;
#endif
default: break;
Expand Down Expand Up @@ -176,7 +177,8 @@ void rt_hw_uart_init(void)
at91_sys_write(AT91_PIOB + PIO_PDR, (1<<4)|(1<<5));
uart_port_init(AT91SAM9260_BASE_US0);
/* install interrupt handler */
rt_hw_interrupt_install(AT91SAM9260_ID_US0, rt_serial_handler, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_US0, rt_serial_handler,
(void *)&uart1_device, "UART0");
rt_hw_interrupt_umask(AT91SAM9260_ID_US0);
#endif
#ifdef RT_USING_UART1
Expand All @@ -188,7 +190,8 @@ void rt_hw_uart_init(void)
at91_sys_write(AT91_PIOB + PIO_PDR, (1<<6)|(1<<7));
uart_port_init(AT91SAM9260_BASE_US1);
/* install interrupt handler */
rt_hw_interrupt_install(AT91SAM9260_ID_US1, rt_serial_handler, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_US1, rt_serial_handler,
(void *)&uart2_device, "UART1");
rt_hw_interrupt_umask(AT91SAM9260_ID_US1);
#endif
#ifdef RT_USING_UART2
Expand All @@ -200,7 +203,8 @@ void rt_hw_uart_init(void)
at91_sys_write(AT91_PIOB + PIO_PDR, (1<<8)|(1<<9));
uart_port_init(AT91SAM9260_BASE_US2);
/* install interrupt handler */
rt_hw_interrupt_install(AT91SAM9260_ID_US2, rt_serial_handler, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_US2, rt_serial_handler,
(void *)&uart3_device, "UART2");
rt_hw_interrupt_umask(AT91SAM9260_ID_US2);
#endif
#ifdef RT_USING_UART3
Expand All @@ -212,7 +216,8 @@ void rt_hw_uart_init(void)
at91_sys_write(AT91_PIOB + PIO_PDR, (1<<10)|(1<<11));
uart_port_init(AT91SAM9260_BASE_US3);
/* install interrupt handler */
rt_hw_interrupt_install(AT91SAM9260_ID_US3, rt_serial_handler, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_US3, rt_serial_handler,
(void *)&uart4_device, "UART3");
rt_hw_interrupt_umask(AT91SAM9260_ID_US3);

#endif
Expand Down Expand Up @@ -246,7 +251,7 @@ static rt_uint32_t pit_cnt; /* access only w/system irq blocked */
/**
* This function will handle rtos timer
*/
void rt_timer_handler(int vector)
void rt_timer_handler(int vector, void *param)
{
#ifdef RT_USING_DBGU
if (at91_sys_read(AT91_DBGU + AT91_US_CSR) & 0x1) {
Expand Down Expand Up @@ -309,7 +314,8 @@ static void at91sam926x_pit_init(void)
at91sam926x_pit_init();

/* install interrupt handler */
rt_hw_interrupt_install(AT91_ID_SYS, rt_timer_handler, RT_NULL);
rt_hw_interrupt_install(AT91_ID_SYS, rt_timer_handler,
RT_NULL, "system");
rt_hw_interrupt_umask(AT91_ID_SYS);

}
Expand Down
22 changes: 16 additions & 6 deletions bsp/at91sam9260/macb.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,9 @@ static void udelay(rt_uint32_t us)
for (len = 0; len < 10; len++ );
}

static void rt_macb_isr(int irq)
static void rt_macb_isr(int irq, void *param)
{
struct rt_macb_eth *macb = &macb_device;
struct rt_macb_eth *macb = (struct rt_macb_eth *)param;
rt_device_t dev = &(macb->parent.parent);
rt_uint32_t status, rsr, tsr;

Expand Down Expand Up @@ -150,7 +150,7 @@ static void rt_macb_isr(int irq)

}

static void macb_mdio_write(struct rt_macb_eth *macb, rt_uint8_t reg, rt_uint16_t value)
static int macb_mdio_write(struct rt_macb_eth *macb, rt_uint8_t reg, rt_uint16_t value)
{
unsigned long netctl;
unsigned long netstat;
Expand Down Expand Up @@ -179,7 +179,7 @@ static void macb_mdio_write(struct rt_macb_eth *macb, rt_uint8_t reg, rt_uint16_
rt_sem_release(&macb->mdio_bus_lock);
}

static rt_uint16_t macb_mdio_read(struct rt_macb_eth *macb, rt_uint8_t reg)
static int macb_mdio_read(struct rt_macb_eth *macb, rt_uint8_t reg)
{
unsigned long netctl;
unsigned long netstat;
Expand Down Expand Up @@ -298,12 +298,21 @@ void macb_update_link(void *param)
{
struct rt_macb_eth *macb = (struct rt_macb_eth *)param;
rt_device_t dev = &macb->parent.parent;
rt_uint32_t status, status_change = 0;
int status, status_change = 0;
rt_uint32_t link;
rt_uint32_t media;
rt_uint16_t adv, lpa;

/* Do a fake read */
status = macb_mdio_read(macb, MII_BMSR);
if (status < 0)
return;

/* Read link and autonegotiation status */
status = macb_mdio_read(macb, MII_BMSR);
if (status < 0)
return;

if ((status & BMSR_LSTATUS) == 0)
link = 0;
else
Expand Down Expand Up @@ -403,7 +412,8 @@ static rt_err_t rt_macb_init(rt_device_t dev)
| MACB_BIT(HRESP)));

/* instal interrupt */
rt_hw_interrupt_install(AT91SAM9260_ID_EMAC, rt_macb_isr, RT_NULL);
rt_hw_interrupt_install(AT91SAM9260_ID_EMAC, rt_macb_isr,
(void *)macb, "emac");
rt_hw_interrupt_umask(AT91SAM9260_ID_EMAC);

rt_timer_init(&macb->timer, "link_timer",
Expand Down
7 changes: 4 additions & 3 deletions include/rthw.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ rt_uint8_t *rt_hw_stack_init(void *entry,
void rt_hw_interrupt_init(void);
void rt_hw_interrupt_mask(int vector);
void rt_hw_interrupt_umask(int vector);
void rt_hw_interrupt_install(int vector,
rt_isr_handler_t new_handler,
rt_isr_handler_t *old_handler);
rt_isr_handler_t rt_hw_interrupt_install(int vector,
rt_isr_handler_t handler,
void *param,
char *name);
void rt_hw_interrupt_handle(int vector);

rt_base_t rt_hw_interrupt_disable(void);
Expand Down
10 changes: 9 additions & 1 deletion include/rtthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,15 @@ void rt_module_unload_sethook(void (*hook)(rt_module_t module));
/*
* interrupt service
*/
typedef void (*rt_isr_handler_t)(int vector);
typedef void (*rt_isr_handler_t)(int vector, void *param);

struct rt_irq_desc {
char irq_name[RT_NAME_MAX];
rt_isr_handler_t isr_handle;
void *param;
rt_uint32_t interrupt_cnt;
};


/*
* rt_interrupt_enter and rt_interrupt_leave only can be called by BSP
Expand Down
Loading