modified dbg() macro
corrected irq6 handler reimplemented MFP interrupt LED blinker in C
This commit is contained in:
@@ -509,7 +509,7 @@ irq6: // MFP interrupt from FPGA
|
|||||||
movem.l (sp),d0-d1/a0-a1 // restore registers saved above
|
movem.l (sp),d0-d1/a0-a1 // restore registers saved above
|
||||||
lea 4 * 4(sp),sp // adjust stack
|
lea 4 * 4(sp),sp // adjust stack
|
||||||
|
|
||||||
beq irq6_os // call OS handler
|
bra irq6_os // call OS handler
|
||||||
rte
|
rte
|
||||||
|
|
||||||
irq6_os: // call native OS irq6 handler
|
irq6_os: // call native OS irq6 handler
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ extern void (*rt_vbr[])(void);
|
|||||||
|
|
||||||
#define IRQ_DEBUG
|
#define IRQ_DEBUG
|
||||||
#if defined(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
|
#else
|
||||||
#define dbg(format, arg...) do { ; } while (0)
|
#define dbg(format, arg...) do { ; } while (0)
|
||||||
#endif
|
#endif
|
||||||
@@ -60,7 +60,7 @@ int register_interrupt_handler(uint8_t source, uint8_t level, uint8_t priority,
|
|||||||
|
|
||||||
if (source < 1 || source > 63)
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ int register_interrupt_handler(uint8_t source, uint8_t level, uint8_t priority,
|
|||||||
{
|
{
|
||||||
if (ICR[i] == lp)
|
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);
|
level, priority, i);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
|
|||||||
|
|
||||||
if ((vector == 0) || (handler == NULL))
|
if ((vector == 0) || (handler == NULL))
|
||||||
{
|
{
|
||||||
dbg("%s: illegal vector or handler!\r\n", __FUNCTION__);
|
dbg("illegal vector or handler!\r\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
|
|||||||
if (isrtab[index].vector == vector)
|
if (isrtab[index].vector == vector)
|
||||||
{
|
{
|
||||||
/* one cross each, only! */
|
/* 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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ int isr_register_handler(int vector, int (*handler)(void *, void *), void *hdev,
|
|||||||
return true;
|
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 */
|
return false; /* no available slots */
|
||||||
}
|
}
|
||||||
@@ -183,7 +183,7 @@ void isr_remove_handler(int (*handler)(void *, void *))
|
|||||||
return;
|
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;
|
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++)
|
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;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PIC interrupt handler for Firebee
|
||||||
|
*/
|
||||||
void pic_interrupt_handler(void)
|
void pic_interrupt_handler(void)
|
||||||
{
|
{
|
||||||
uint8_t rcv_byte;
|
uint8_t rcv_byte;
|
||||||
@@ -247,7 +251,7 @@ void video_addr_timeout(void)
|
|||||||
uint32_t *dst;
|
uint32_t *dst;
|
||||||
uint32_t asid;
|
uint32_t asid;
|
||||||
|
|
||||||
dbg("%s:\r\n", __FUNCTION__);
|
dbg("video address timeout\r\n");
|
||||||
flush_and_invalidate_caches();
|
flush_and_invalidate_caches();
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -331,17 +335,77 @@ void video_addr_timeout(void)
|
|||||||
video_sbt = 0;
|
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)
|
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)
|
if (video_sbt != 0 && (video_sbt - 0x70000000) > MCF_SLT0_SCNT)
|
||||||
{
|
{
|
||||||
video_addr_timeout();
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
#define DBG_MMU
|
#define DBG_MMU
|
||||||
#ifdef 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
|
#else
|
||||||
#define dbg(format, arg...) do {;} while (0)
|
#define dbg(format, arg...) do {;} while (0)
|
||||||
#endif /* DBG_MMU */
|
#endif /* DBG_MMU */
|
||||||
@@ -248,7 +248,7 @@ static struct mmu_mapping memory_map[] =
|
|||||||
/* FASTRAM */
|
/* FASTRAM */
|
||||||
0x1000000,
|
0x1000000,
|
||||||
0x1000000,
|
0x1000000,
|
||||||
_FASTRAM_END - 0x1000000,
|
(uint32_t) _FASTRAM_END - 0x1000000,
|
||||||
MMU_PAGE_SIZE_1M,
|
MMU_PAGE_SIZE_1M,
|
||||||
{ CACHE_WRITETHROUGH, SV_USER, 0, ACCESS_READ | ACCESS_WRITE | ACCESS_EXECUTE },
|
{ 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 0x8020000: /* TLB miss on data write */
|
||||||
case 0xc020000: /* TLB miss on data read or read-modify-write */
|
case 0xc020000: /* TLB miss on data read or read-modify-write */
|
||||||
fault_address = MCF_MMU_MMUAR;
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
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 = MCF_MMU_MMUOR_ITLB | /* instruction */
|
||||||
MCF_MMU_MMUOR_ACC | /* access TLB */
|
MCF_MMU_MMUOR_ACC | /* access TLB */
|
||||||
MCF_MMU_MMUOR_UAA; /* update allocation address field */
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -95,10 +95,10 @@ void init_gpio(void)
|
|||||||
*
|
*
|
||||||
* for DMA operation
|
* for DMA operation
|
||||||
*/
|
*/
|
||||||
MCF_PAD_PAR_DMA = MCF_PAD_PAR_DMA_PAR_DACK0(0b11) |
|
MCF_PAD_PAR_DMA = MCF_PAD_PAR_DMA_PAR_DACK0(0x3) |
|
||||||
MCF_PAD_PAR_DMA_PAR_DACK1(0b11) |
|
MCF_PAD_PAR_DMA_PAR_DACK1(0x3) |
|
||||||
MCF_PAD_PAR_DMA_PAR_DREQ1(0b11) |
|
MCF_PAD_PAR_DMA_PAR_DREQ1(0x3) |
|
||||||
MCF_PAD_PAR_DMA_PAR_DREQ0(0b11);
|
MCF_PAD_PAR_DMA_PAR_DREQ0(0x3);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* configure FEC0 pin assignment on GPIO module as FEC0
|
* configure FEC0 pin assignment on GPIO module as FEC0
|
||||||
|
|||||||
Reference in New Issue
Block a user