mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
software: interrupt driven UART working
This commit is contained in:
parent
58f4f78d2c
commit
4aaf48afb0
4 changed files with 27 additions and 26 deletions
|
@ -16,10 +16,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <hw/interrupts.h>
|
#include <hw/interrupts.h>
|
||||||
|
#include <hw/uart.h>
|
||||||
#include <irq.h>
|
#include <irq.h>
|
||||||
|
#include <uart.h>
|
||||||
|
|
||||||
void isr(void)
|
void isr(void)
|
||||||
{
|
{
|
||||||
unsigned int irqs;
|
unsigned int irqs;
|
||||||
|
|
||||||
irqs = irq_pending() & irq_getmask();
|
irqs = irq_pending() & irq_getmask();
|
||||||
|
|
||||||
|
if(irqs & IRQ_UART)
|
||||||
|
uart_isr();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
#include <hw/uart.h>
|
#include <stdio.h>
|
||||||
|
#include <irq.h>
|
||||||
static void print(const char *s)
|
#include <uart.h>
|
||||||
{
|
|
||||||
while(*s) {
|
|
||||||
while(CSR_UART_EV_STAT & UART_EV_TX);
|
|
||||||
CSR_UART_RXTX = *s;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
print("Hello World\n");
|
irq_setmask(0);
|
||||||
|
irq_setie(1);
|
||||||
|
uart_init();
|
||||||
|
|
||||||
|
printf("Hello World with IRQs\n");
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,16 @@
|
||||||
#ifndef __IRQ_H
|
#ifndef __IRQ_H
|
||||||
#define __IRQ_H
|
#define __IRQ_H
|
||||||
|
|
||||||
static inline void irq_enable(unsigned int en)
|
static inline unsigned int irq_getie(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("wcsr IE, %0" : : "r" (en));
|
unsigned int ie;
|
||||||
|
__asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
|
||||||
|
return ie;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void irq_setie(unsigned int ie)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int irq_getmask(void)
|
static inline unsigned int irq_getmask(void)
|
||||||
|
@ -47,16 +54,4 @@ static inline void irq_ack(unsigned int mask)
|
||||||
__asm__ __volatile__("wcsr IP, %0" : : "r" (mask));
|
__asm__ __volatile__("wcsr IP, %0" : : "r" (mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int irq_getie(void)
|
|
||||||
{
|
|
||||||
unsigned int ie;
|
|
||||||
__asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
|
|
||||||
return ie;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void irq_setie(unsigned int ie)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __IRQ_H */
|
#endif /* __IRQ_H */
|
||||||
|
|
|
@ -44,7 +44,9 @@ static volatile int tx_cts;
|
||||||
|
|
||||||
void uart_isr(void)
|
void uart_isr(void)
|
||||||
{
|
{
|
||||||
unsigned int stat = CSR_UART_EV_PENDING;
|
unsigned int stat;
|
||||||
|
|
||||||
|
stat = CSR_UART_EV_PENDING;
|
||||||
|
|
||||||
if(stat & UART_EV_RX) {
|
if(stat & UART_EV_RX) {
|
||||||
rx_buf[rx_produce] = CSR_UART_RXTX;
|
rx_buf[rx_produce] = CSR_UART_RXTX;
|
||||||
|
|
Loading…
Reference in a new issue