mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
2007-09-07 Daniel Hellstrom <daniel@gaisler.com>
* shared/1553/b1553brm.c, shared/can/grcan.c, shared/can/grcan_rasta.c, shared/can/occan.c, shared/spw/grspw.c, shared/spw/grspw_pci.c, shared/uart/apbuart.c: Remove warnings.
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
2007-09-07 Daniel Hellstrom <daniel@gaisler.com>
|
||||
|
||||
* shared/1553/b1553brm.c, shared/can/grcan.c, shared/can/grcan_rasta.c,
|
||||
shared/can/occan.c, shared/spw/grspw.c, shared/spw/grspw_pci.c,
|
||||
shared/uart/apbuart.c: Remove warnings.
|
||||
|
||||
2007-09-06 Daniel Hellstrom <daniel@gaisler.com>
|
||||
|
||||
* shared/pci/pcifinddevice.c: New file.
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
#ifndef B1553BRM_REG_INT
|
||||
#define B1553BRM_REG_INT(handler,irqno,arg) set_vector(handler,(irqno)+0x10,1)
|
||||
#undef B1553BRM_DEFINE_INTHANDLER
|
||||
#define B1553BRM_DEFINE_INTHANDLER
|
||||
#endif
|
||||
|
||||
/* default to 128K memory layout */
|
||||
@@ -126,6 +128,11 @@ struct circ_buf_1 {
|
||||
};
|
||||
#endif
|
||||
|
||||
struct irq_log_list {
|
||||
volatile unsigned short iiw;
|
||||
volatile unsigned short iaw;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
||||
unsigned int memarea_base;
|
||||
@@ -167,10 +174,7 @@ typedef struct {
|
||||
unsigned short unused[(8*1024-(128*8+128*32))-16*2];
|
||||
#endif
|
||||
/* interrupt log at 64 bytes from end */
|
||||
struct {
|
||||
unsigned short iiw;
|
||||
unsigned short iaw;
|
||||
} irq_logs[16];
|
||||
struct irq_log_list irq_logs[16];
|
||||
} *bcmem;
|
||||
|
||||
#if defined(DMA_MEM_128K)
|
||||
@@ -203,10 +207,7 @@ typedef struct {
|
||||
unsigned short unused[(64*1024-(4*32*4+4*32*9*34))-16*2];
|
||||
|
||||
/* interrupt log at 64 bytes from end */
|
||||
struct {
|
||||
unsigned short iiw;
|
||||
unsigned short iaw;
|
||||
} irq_logs[16];
|
||||
struct irq_log_list irq_logs[16];
|
||||
} *rtmem;
|
||||
#elif defined(DMA_MEM_16K)
|
||||
/* Memory structure of a RT being inited, just used
|
||||
@@ -239,20 +240,14 @@ typedef struct {
|
||||
unsigned short unused[8*1024 -(4*32*4 +3*32*2*34 +1*32*1*34) -16*2];
|
||||
|
||||
/* interrupt log at 64 bytes from end */
|
||||
struct {
|
||||
unsigned short iiw;
|
||||
unsigned short iaw;
|
||||
} irq_logs[16];
|
||||
struct irq_log_list irq_logs[16];
|
||||
} *rtmem;
|
||||
#else
|
||||
#error You must define one DMA_MEM_???K
|
||||
#endif
|
||||
|
||||
/* Interrupt log list */
|
||||
struct irq_log_list {
|
||||
volatile unsigned short iiw;
|
||||
volatile unsigned short iaw;
|
||||
} *irq_log;
|
||||
struct irq_log_list *irq_log;
|
||||
unsigned int irq;
|
||||
|
||||
/* Received events waiting to be read */
|
||||
@@ -291,7 +286,9 @@ static unsigned int allbrm_cfg_clkdiv;
|
||||
static unsigned int allbrm_cfg_freq;
|
||||
|
||||
static void brm_interrupt(brm_priv *brm);
|
||||
#ifdef B1553BRM_DEFINE_INTHANDLER
|
||||
static void b1553brm_interrupt_handler(rtems_vector_number v);
|
||||
#endif
|
||||
|
||||
#define OFS(ofs) (((unsigned int)&ofs & 0x1ffff)>>1)
|
||||
|
||||
@@ -361,7 +358,7 @@ int B1553BRM_PREFIX(_register)(amba_confarea_type *bus, unsigned int clksel, uns
|
||||
#ifdef B1553BRM_LOCAL_MEM
|
||||
allbrm_memarea = B1553BRM_LOCAL_MEM_ADR;
|
||||
#else
|
||||
allbrm_memarea = NULL;
|
||||
allbrm_memarea = 0;
|
||||
#endif
|
||||
|
||||
/* Save clksel, clkdiv and brm_freq for later use */
|
||||
@@ -419,7 +416,7 @@ static rtems_device_driver rt_init(brm_priv *brm) {
|
||||
return RTEMS_NO_MEMORY;
|
||||
}
|
||||
|
||||
brm->irq_log = &brm->rtmem->irq_logs[0];
|
||||
brm->irq_log = (struct irq_log_list *)&brm->rtmem->irq_logs[0];
|
||||
|
||||
brm->regs->ctrl = 0x1912; /* enable both buses, circular 1 bufmode, broadcast, interrupt log */
|
||||
brm->regs->oper = 0x0900; /* configure as RT, with addr 1 */
|
||||
@@ -496,7 +493,7 @@ static rtems_device_driver bc_init(brm_priv *brm){
|
||||
|
||||
brm->bcmem = (void *)brm->mem;
|
||||
brm->rtmem = NULL;
|
||||
brm->irq_log = &brm->bcmem->irq_logs[0];
|
||||
brm->irq_log = (struct irq_log_list *)&brm->bcmem->irq_logs[0];
|
||||
|
||||
brm->head = brm->tail = 0;
|
||||
brm->rx_blocking = brm->tx_blocking = 1;
|
||||
@@ -543,7 +540,7 @@ static rtems_device_driver bm_init(brm_priv *brm) {
|
||||
}
|
||||
|
||||
/* end of 16K, fits all current modes (128K, 16K) */
|
||||
brm->irq_log = &brm->mem[8*1024-16*2];
|
||||
brm->irq_log = (struct irq_log_list *)&brm->mem[8*1024-16*2];
|
||||
|
||||
brm->regs->ctrl = 0x0006; /* ping pong enable and enable interrupt log */
|
||||
brm->regs->oper = 0x0A00; /* configure as BM */
|
||||
@@ -589,7 +586,7 @@ static rtems_device_driver brm_initialize(rtems_device_major_number major, rtems
|
||||
}
|
||||
|
||||
/* allocate & zero memory for the brm devices */
|
||||
brms = malloc(sizeof(*brms)*dev_cnt);
|
||||
brms = (brm_priv *)malloc(sizeof(*brms)*dev_cnt);
|
||||
if ( !brms ){
|
||||
printk("BRM: Failed to allocate SW memory\n\r");
|
||||
return -1;
|
||||
@@ -601,10 +598,10 @@ static rtems_device_driver brm_initialize(rtems_device_major_number major, rtems
|
||||
*/
|
||||
#define BRM_DESCS_PER_CTRL 128
|
||||
if ( allbrm_memarea ){
|
||||
mem = allbrm_memarea;
|
||||
mem = (char *)allbrm_memarea;
|
||||
}else{
|
||||
/* sizeof(struct desc_table) * BRM_DESCS_PER_CTRL * dev_cnt */
|
||||
mem = malloc( (128*1024) * (dev_cnt+1)); /* 128k per core + 128k for alignment */
|
||||
mem = (char *)malloc( (128*1024) * (dev_cnt+1)); /* 128k per core + 128k for alignment */
|
||||
if ( !mem ){
|
||||
free(brms);
|
||||
printk("BRM: Failed to allocate HW memory\n\r");
|
||||
@@ -680,7 +677,7 @@ static rtems_device_driver brm_initialize(rtems_device_major_number major, rtems
|
||||
brm->memarea_base = (unsigned int)&mem[(128*1024) * minor];
|
||||
brm->desc = (struct desc_table *) brm->memarea_base;
|
||||
brm->mem = (volatile unsigned short *) brm->memarea_base;
|
||||
brm->irq_log = (void *)(brm->memarea_base + (0xFFE0<<1)); /* last 64byte */
|
||||
brm->irq_log = (struct irq_log_list *)(brm->memarea_base + (0xFFE0<<1)); /* last 64byte */
|
||||
|
||||
brm->bm_event = NULL;
|
||||
brm->rt_event = NULL;
|
||||
@@ -1126,6 +1123,7 @@ static rtems_device_driver brm_control(rtems_device_major_number major, rtems_de
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
#ifdef B1553BRM_DEFINE_INTHANDLER
|
||||
static void b1553brm_interrupt_handler(rtems_vector_number v){
|
||||
int i;
|
||||
/* find minor */
|
||||
@@ -1136,14 +1134,15 @@ static void b1553brm_interrupt_handler(rtems_vector_number v){
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void brm_interrupt(brm_priv *brm) {
|
||||
unsigned short descriptor, current, pending, miw, wc, tmp;
|
||||
unsigned short msgadr, iaw, iiw;
|
||||
int len;
|
||||
int signal_event=0;
|
||||
unsigned int event_status;
|
||||
#define SET_ERROR_DESCRIPTOR(descriptor) (event_status = (event_status & 0x0000ffff) | descriptor<<16);
|
||||
unsigned int event_status=0;
|
||||
#define SET_ERROR_DESCRIPTOR(descriptor) (event_status = (event_status & 0x0000ffff) | descriptor<<16)
|
||||
|
||||
while( (iiw=READ_REG(&brm->irq_log[brm->irq].iiw)) != 0xffff ){
|
||||
iaw=READ_REG(&brm->irq_log[brm->irq].iaw);
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
|
||||
#ifndef GRCAN_REG_INT
|
||||
#define GRCAN_REG_INT(handler,irqno,arg) set_vector(handler,irqno+0x10,1)
|
||||
#undef GRCAN_DEFINE_INTHANDLER
|
||||
#define GRCAN_DEFINE_INTHANDLER
|
||||
#endif
|
||||
|
||||
#ifndef GRCAN_DEFAULT_BAUD
|
||||
@@ -227,7 +229,6 @@ struct grcan_priv {
|
||||
static int grcan_core_cnt;
|
||||
struct grcan_priv *grcans;
|
||||
static amba_confarea_type *amba_bus;
|
||||
static unsigned int ram_base;
|
||||
struct grcan_device_info *grcan_cores;
|
||||
static int grcan_core_cnt;
|
||||
|
||||
|
||||
@@ -58,17 +58,17 @@ void (*grcan_rasta_int_reg)(void *handler, int irq, void *arg) = 0;
|
||||
#define RX_BUF_SIZE 4096
|
||||
|
||||
#define STATIC_TX_BUF_ADDR(core) \
|
||||
(grcan_rasta_rambase+(core)*(STATIC_TX_BUF_SIZE+STATIC_RX_BUF_SIZE))
|
||||
((unsigned int *)\
|
||||
(grcan_rasta_rambase+(core)*(STATIC_TX_BUF_SIZE+STATIC_RX_BUF_SIZE)))
|
||||
|
||||
#define STATIC_RX_BUF_ADDR(core) \
|
||||
(grcan_rasta_rambase+(core)*(STATIC_TX_BUF_SIZE+STATIC_RX_BUF_SIZE)+STATIC_RX_BUF_SIZE)
|
||||
((unsigned int *) \
|
||||
(grcan_rasta_rambase+(core)*(STATIC_TX_BUF_SIZE+STATIC_RX_BUF_SIZE)+STATIC_RX_BUF_SIZE))
|
||||
|
||||
|
||||
#define GRCAN_DEVNAME "/dev/grcan0"
|
||||
#define GRCAN_DEVNAME_NO(devstr,no) ((devstr)[10]='0'+(no))
|
||||
|
||||
static int grcan_rasta_calc_memoffs(int maxcores, int corenum, unsigned int *mem_base, unsigned int *mem_end, unsigned int *bdtable_base);
|
||||
|
||||
void grcan_rasta_interrupt_handler(int irq, void *pDev);
|
||||
|
||||
unsigned int grcan_rasta_rambase;
|
||||
|
||||
@@ -65,6 +65,8 @@ rtems_assoc_t errno_assoc[] = {
|
||||
|
||||
#ifndef OCCAN_REG_INT
|
||||
#define OCCAN_REG_INT(handler,irq,arg) set_vector(handler,irq+0x10,1)
|
||||
#undef OCCAN_DEFINE_INTHANDLER
|
||||
#define OCCAN_DEFINE_INTHANDLER
|
||||
#endif
|
||||
|
||||
/* Default to 40MHz system clock */
|
||||
@@ -258,14 +260,14 @@ static int occan_set_speedregs(occan_priv *priv, occan_speed_regs *timing);
|
||||
static int pelican_speed_auto(occan_priv *priv);
|
||||
static void pelican_init(occan_priv *priv);
|
||||
static void pelican_open(occan_priv *priv);
|
||||
static void pelican_close(occan_priv *priv);
|
||||
static int pelican_start(occan_priv *priv);
|
||||
static void pelican_stop(occan_priv *priv);
|
||||
static void pelican_exit(occan_priv *priv);
|
||||
static int pelican_send(occan_priv *can, CANMsg *msg);
|
||||
static void pelican_set_accept(occan_priv *priv, unsigned char *acode, unsigned char *amask);
|
||||
static void occan_interrupt(occan_priv *can);
|
||||
#ifdef DEBUG_PRINT_REGMAP
|
||||
static void pelican_regadr_print(pelican_regs *regs);
|
||||
#endif
|
||||
|
||||
/***** Driver related interface *****/
|
||||
static rtems_device_driver occan_ioctl(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
|
||||
@@ -274,8 +276,9 @@ static rtems_device_driver occan_read(rtems_device_major_number major, rtems_dev
|
||||
static rtems_device_driver occan_close(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
|
||||
static rtems_device_driver occan_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
|
||||
static rtems_device_driver occan_initialize(rtems_device_major_number major, rtems_device_minor_number unused, void *arg);
|
||||
#ifdef OCCAN_DEFINE_INTHANDLER
|
||||
static void occan_interrupt_handler(rtems_vector_number v);
|
||||
|
||||
#endif
|
||||
static int can_cores;
|
||||
static occan_priv *cans;
|
||||
static amba_confarea_type *amba_bus;
|
||||
@@ -429,14 +432,6 @@ static void pelican_open(occan_priv *priv){
|
||||
tmp = READ_REG(&priv->regs->intflags);
|
||||
}
|
||||
|
||||
static void pelican_close(occan_priv *priv){
|
||||
|
||||
/* disable all interrupts */
|
||||
priv->regs->inten = 0;
|
||||
|
||||
priv->regs->mode = PELICAN_MOD_RESET;
|
||||
}
|
||||
|
||||
static int pelican_start(occan_priv *priv){
|
||||
unsigned char tmp;
|
||||
/* Start HW communication */
|
||||
@@ -509,11 +504,6 @@ static void pelican_stop(occan_priv *priv){
|
||||
}
|
||||
|
||||
|
||||
static void pelican_exit(occan_priv *priv){
|
||||
/* reset core */
|
||||
priv->regs->mode = PELICAN_MOD_RESET;
|
||||
}
|
||||
|
||||
/* Try to send message "msg", if hardware txfifo is
|
||||
* full, then -1 is returned.
|
||||
*
|
||||
@@ -595,6 +585,7 @@ static void pelican_set_accept(occan_priv *priv, unsigned char *acode, unsigned
|
||||
*amask3 = amask[3];
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static void pelican_regs_print(pelican_regs *regs){
|
||||
printk("--- PELICAN 0x%lx ---\n\r",(unsigned int)regs);
|
||||
printk(" MODE: 0x%02x\n\r",READ_REG(®s->mode));
|
||||
@@ -627,7 +618,9 @@ static void pelican_regs_print(pelican_regs *regs){
|
||||
printk(" CLKDIV: 0x%02x\n\r",READ_REG(®s->clkdiv));
|
||||
printk("-------------------\n\r");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_PRINT_REGMAP
|
||||
static void pelican_regadr_print(pelican_regs *regs){
|
||||
printk("--- PELICAN 0x%lx ---\n\r",(unsigned int)regs);
|
||||
printk(" MODE: 0x%lx\n\r",(unsigned int)®s->mode);
|
||||
@@ -717,7 +710,9 @@ static void pelican_regadr_print(pelican_regs *regs){
|
||||
printk(" CLKDIV: 0x%lx\n\r",(unsigned int)®s->clkdiv);
|
||||
printk("-------------------\n\r");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
static void occan_stat_print(occan_stats *stats){
|
||||
printk("----Stats----\n\r");
|
||||
printk("rx_msgs: %d\n\r",stats->rx_msgs);
|
||||
@@ -731,6 +726,7 @@ static void occan_stat_print(occan_stats *stats){
|
||||
printk("tx_buf_err: %d\n\r",stats->tx_buf_error);
|
||||
printk("-------------\n\r");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function calculates BTR0 BTR1 values for a given bitrate.
|
||||
* Heavily based on mgt_mscan_bitrate() from peak driver, which
|
||||
@@ -1391,7 +1387,6 @@ static rtems_device_driver occan_ioctl(rtems_device_major_number major, rtems_de
|
||||
rtems_libio_ioctl_args_t *ioarg = (rtems_libio_ioctl_args_t *) arg;
|
||||
struct occan_afilter *afilter;
|
||||
occan_stats *dststats;
|
||||
unsigned char btr0, btr1;
|
||||
unsigned int rxcnt,txcnt;
|
||||
|
||||
DBG("OCCAN: IOCTL %d\n\r",ioarg->command);
|
||||
@@ -1794,6 +1789,7 @@ static void occan_interrupt(occan_priv *can){
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef OCCAN_DEFINE_INTHANDLER
|
||||
static void occan_interrupt_handler(rtems_vector_number v){
|
||||
int minor;
|
||||
|
||||
@@ -1805,6 +1801,7 @@ static void occan_interrupt_handler(rtems_vector_number v){
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define OCCAN_DRIVER_TABLE_ENTRY { occan_initialize, occan_open, occan_close, occan_read, occan_write, occan_ioctl }
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@
|
||||
|
||||
#ifndef GRSPW_REG_INT
|
||||
#define GRSPW_REG_INT(handler,irqno,arg) set_vector(handler,irqno+0x10,1)
|
||||
#undef GRSPW_DEFINE_INTHANDLER
|
||||
#define GRSPW_DEFINE_INTHANDLER
|
||||
#endif
|
||||
|
||||
#include <bsp.h>
|
||||
@@ -303,8 +305,8 @@ static unsigned int _MEM_READ(void *addr) {
|
||||
#define SPW_PREPAREMASK_RX (SPW_DMACTRL_TXEN | SPW_DMACTRL_TXIE | SPW_DMACTRL_AI | SPW_DMACTRL_PR | SPW_DMACTRL_RA)
|
||||
|
||||
static int grspw_hw_init(GRSPW_DEV *pDev);
|
||||
static int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, unsigned char *hdr, unsigned int dlen, unsigned char *data);
|
||||
static int grspw_hw_receive(GRSPW_DEV *pDev,unsigned char *b,int c);
|
||||
static int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, char *hdr, unsigned int dlen, char *data);
|
||||
static int grspw_hw_receive(GRSPW_DEV *pDev,char *b,int c);
|
||||
static int grspw_hw_startup (GRSPW_DEV *pDev, int timeout);
|
||||
static int grspw_hw_stop (GRSPW_DEV *pDev, int rx, int tx);
|
||||
static void grspw_hw_wait_rx_inactive(GRSPW_DEV *pDev);
|
||||
@@ -500,6 +502,7 @@ static int grspw_buffer_alloc(GRSPW_DEV *pDev)
|
||||
|
||||
}
|
||||
|
||||
#ifdef GRSPW_DEFINE_INTHANDLER
|
||||
/*
|
||||
* Standard Interrupt handler
|
||||
*/
|
||||
@@ -514,6 +517,7 @@ static rtems_isr grspw_interrupt_handler(rtems_vector_number v)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void grspw_interrupt(GRSPW_DEV *pDev){
|
||||
int dmactrl;
|
||||
@@ -1464,7 +1468,7 @@ static int grspw_hw_stop (GRSPW_DEV *pDev, int rx, int tx)
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, unsigned char *hdr, unsigned int dlen, unsigned char *data)
|
||||
int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, char *hdr, unsigned int dlen, char *data)
|
||||
{
|
||||
|
||||
unsigned int dmactrl, ctrl;
|
||||
@@ -1539,7 +1543,7 @@ int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, unsigned char *hdr, unsign
|
||||
return hlen + dlen;
|
||||
}
|
||||
|
||||
static int grspw_hw_receive(GRSPW_DEV *pDev, unsigned char *b, int c) {
|
||||
static int grspw_hw_receive(GRSPW_DEV *pDev, char *b, int c) {
|
||||
unsigned int len, rxlen, ctrl;
|
||||
unsigned int cur;
|
||||
unsigned int tmp;
|
||||
|
||||
@@ -105,6 +105,7 @@ int grspw_pci_register(
|
||||
*/
|
||||
int grspwpci_interrupt_handler(int irq, void *arg){
|
||||
grspw_interrupt( (GRSPW_DEV *)arg );
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
|
||||
#ifndef APBUART_REG_INT
|
||||
#define APBUART_REG_INT(handler,irq,arg) set_vector(handler,irq+0x10,1)
|
||||
#undef APBUART_DEFINE_INTHANDLER
|
||||
#define APBUART_DEFINE_INTHANDLER
|
||||
#endif
|
||||
|
||||
/* Default to 40MHz system clock */
|
||||
@@ -117,7 +119,9 @@ static rtems_driver_address_table apbuart_driver = APBUART_DRIVER_TABLE_ENTRY;
|
||||
static amba_confarea_type *amba_bus;
|
||||
|
||||
static void apbuart_interrupt(apbuart_priv *uart);
|
||||
#ifdef APBUART_DEFINE_INTHANDLER
|
||||
static void apbuart_interrupt_handler(rtems_vector_number v);
|
||||
#endif
|
||||
static void apbuart_hw_close(apbuart_priv *uart);
|
||||
static void apbuart_hw_open(apbuart_priv *uart);
|
||||
|
||||
@@ -213,6 +217,7 @@ static void apbuart_hw_close(apbuart_priv *uart){
|
||||
uart->regs->ctrl = 0;
|
||||
}
|
||||
|
||||
#ifdef APBUART_DEFINE_INTHANDLER
|
||||
/* interrupt handler */
|
||||
static void apbuart_interrupt_handler(rtems_vector_number v){
|
||||
int minor;
|
||||
@@ -225,6 +230,7 @@ static void apbuart_interrupt_handler(rtems_vector_number v){
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The interrupt handler, taking care of the
|
||||
* APBUART hardware
|
||||
|
||||
Reference in New Issue
Block a user