modified dbg() macro

corrected irq6 handler
reimplemented MFP interrupt LED blinker in C
This commit is contained in:
Markus Fröschle
2014-05-10 13:21:11 +00:00
parent 995494ac45
commit 0ff272562e
4 changed files with 724 additions and 660 deletions

View File

@@ -509,7 +509,7 @@ irq6: // MFP interrupt from FPGA
movem.l (sp),d0-d1/a0-a1 // restore registers saved above
lea 4 * 4(sp),sp // adjust stack
beq irq6_os // call OS handler
bra irq6_os // call OS handler
rte
irq6_os: // call native OS irq6 handler

View File

@@ -39,7 +39,7 @@ extern void (*rt_vbr[])(void);
#define IRQ_DEBUG
#if defined(IRQ_DEBUG)
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
#define dbg(format, arg...) do { xprintf("DEBUG %s(): " format, __FUNCTION__, ##arg); } while (0)
#else
#define dbg(format, arg...) do { ; } while (0)
#endif
@@ -60,7 +60,7 @@ int register_interrupt_handler(uint8_t source, uint8_t level, uint8_t priority,
if (source < 1 || source > 63)
{
dbg("%s: interrupt source %d not defined\r\n", __FUNCTION__, source);
dbg("interrupt source %d not defined\r\n", source);
return -1;
}
@@ -71,7 +71,7 @@ int register_interrupt_handler(uint8_t source, uint8_t level, uint8_t priority,
{
if (ICR[i] == lp)
{
dbg("%s: level %d and priority %d already used for interrupt source %d!\r\n", __FUNCTION__,
dbg("level %d and priority %d already used for interrupt source %d!\r\n",
level, priority, i);
return -1;
}
@@ -135,7 +135,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
if ((vector == 0) || (handler == NULL))
{
dbg("%s: illegal vector or handler!\r\n", __FUNCTION__);
dbg("illegal vector or handler!\r\n");
return false;
}
@@ -144,7 +144,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
if (isrtab[index].vector == vector)
{
/* one cross each, only! */
dbg("%s: already set handler with this vector (%d, %d)\r\n", __FUNCTION__, vector);
dbg("already set handler with this vector (%d, %d)\r\n", vector);
return false;
}
@@ -158,7 +158,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
return true;
}
}
dbg("%s: no available slots to register handler for vector %d\n\r", __FUNCTION__, vector);
dbg("no available slots to register handler for vector %d\n\r", vector);
return false; /* no available slots */
}
@@ -183,7 +183,7 @@ void isr_remove_handler(int (*handler)(void *, void *))
return;
}
}
dbg("%s: no such handler registered (handler=%p\r\n", __FUNCTION__, handler);
dbg("no such handler registered (handler=%p\r\n", handler);
}
@@ -197,7 +197,7 @@ bool isr_execute_handler(int vector)
bool retval = false;
/*
* First locate a BaS Interrupt Service Routine handler.
* locate a BaS Interrupt Service Routine handler.
*/
for (index = 0; index < MAX_ISR_ENTRY; index++)
{
@@ -211,10 +211,14 @@ bool isr_execute_handler(int vector)
}
}
}
dbg("%s: no BaS isr handler for vector %d found\r\n", __FUNCTION__, vector);
dbg("no BaS isr handler for vector %d found\r\n", vector);
return retval;
}
/*
* PIC interrupt handler for Firebee
*/
void pic_interrupt_handler(void)
{
uint8_t rcv_byte;
@@ -247,7 +251,7 @@ void video_addr_timeout(void)
uint32_t *dst;
uint32_t asid;
dbg("%s:\r\n", __FUNCTION__);
dbg("video address timeout\r\n");
flush_and_invalidate_caches();
do
@@ -331,17 +335,77 @@ void video_addr_timeout(void)
video_sbt = 0;
}
static uint32_t blinker = 0;
/*
* blink the Firebee's LED to show we are still alive
*/
void blink_led(void)
{
if ((blinker++ & 0x80) > 0)
{
MCF_GPIO_PODR_FEC1L |= (1 << 4); /* LED off */
}
else
{
MCF_GPIO_PODR_FEC1L &= ~(1 << 4); /* LED on */
}
}
/*
* Atari MFP interrupt registers.
*
* TODO: should go into a header file
*/
#define FALCON_MFP_IERA *((volatile uint8_t *) 0xfffffa07)
#define FALCON_MFP_IERB *((volatile uint8_t *) 0xfffffa09)
#define FALCON_MFP_IPRA *((volatile uint8_t *) 0xfffffa0b)
#define FALCON_MFP_IPRB *((volatile uint8_t *) 0xfffffa0d)
#define FALCON_MFP_IMRA *((volatile uint8_t *) 0xfffffa13)
#define FALCON_MFP_IMRB *((volatile uint8_t *) 0xfffffa15)
bool irq6_acsi_dma_interrupt(void)
{
dbg("ACSI DMA interrupt\r\n");
/*
* TODO: implement handler
*/
return false;
}
bool irq6_interrupt_handler(uint32_t sf1, uint32_t sf2)
{
MCF_EPORT_EPFR = 0x40; /* clear int6 from edge port */
bool handled = false;
dbg("%s: irq6!\r\n", __FUNCTION__);
MCF_EPORT_EPFR &= (1 << 6); /* clear int6 from edge port */
if (video_sbt != 0 && (video_sbt - 0x70000000) > MCF_SLT0_SCNT)
{
video_addr_timeout();
handled = true;
}
return false;
/*
* check if ACSI DMA interrupt
*/
if (FALCON_MFP_IERA & (1 << 7))
{
/* ACSI interrupt is enabled */
if (FALCON_MFP_IPRA & (1 << 7))
{
irq6_acsi_dma_interrupt();
handled = true;
}
}
if (FALCON_MFP_IPRA || FALCON_MFP_IPRB)
{
blink_led();
}
return handled;
}

View File

@@ -44,7 +44,7 @@
#define DBG_MMU
#ifdef DBG_MMU
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg);} while(0)
#define dbg(format, arg...) do { xprintf("DEBUG %s(): " format, __FUNCTION__, ##arg);} while(0)
#else
#define dbg(format, arg...) do {;} while (0)
#endif /* DBG_MMU */
@@ -248,7 +248,7 @@ static struct mmu_mapping memory_map[] =
/* FASTRAM */
0x1000000,
0x1000000,
_FASTRAM_END - 0x1000000,
(uint32_t) _FASTRAM_END - 0x1000000,
MMU_PAGE_SIZE_1M,
{ CACHE_WRITETHROUGH, SV_USER, 0, ACCESS_READ | ACCESS_WRITE | ACCESS_EXECUTE },
},
@@ -434,7 +434,7 @@ bool access_exception(uint32_t pc, uint32_t format_status)
case 0x8020000: /* TLB miss on data write */
case 0xc020000: /* TLB miss on data read or read-modify-write */
fault_address = MCF_MMU_MMUAR;
//dbg("%s: access fault - TLB miss at %p. Fault status = 0x0%x\r\n", __FUNCTION__, pc, fault_status);
dbg("access fault - TLB miss at %p. Fault status = 0x0%x\r\n", pc, fault_status);
break;
default:
@@ -506,7 +506,7 @@ void mmu_map_page(uint32_t virt, uint32_t phys, uint32_t map_size, struct map_fl
MCF_MMU_MMUOR = MCF_MMU_MMUOR_ITLB | /* instruction */
MCF_MMU_MMUOR_ACC | /* access TLB */
MCF_MMU_MMUOR_UAA; /* update allocation address field */
dbg("%s: mapped virt=%p to phys=%p\r\n", __FUNCTION__, virt, phys);
dbg("mapped virt=%p to phys=%p\r\n", virt, phys);
}

View File

@@ -95,10 +95,10 @@ void init_gpio(void)
*
* for DMA operation
*/
MCF_PAD_PAR_DMA = MCF_PAD_PAR_DMA_PAR_DACK0(0b11) |
MCF_PAD_PAR_DMA_PAR_DACK1(0b11) |
MCF_PAD_PAR_DMA_PAR_DREQ1(0b11) |
MCF_PAD_PAR_DMA_PAR_DREQ0(0b11);
MCF_PAD_PAR_DMA = MCF_PAD_PAR_DMA_PAR_DACK0(0x3) |
MCF_PAD_PAR_DMA_PAR_DACK1(0x3) |
MCF_PAD_PAR_DMA_PAR_DREQ1(0x3) |
MCF_PAD_PAR_DMA_PAR_DREQ0(0x3);
/*
* configure FEC0 pin assignment on GPIO module as FEC0