📄 fmcdev.c
字号:
// sie core processed request
trace0(0, dev, 1, "--(k_irq_req_clr_stall)");
// set our custom sync bit
if ( !(g_thread[g_ix_ata_thread].bits_got & kbm_sync_cfes ) )
{
thread_set_sync( g_ix_ata_thread, kbm_sync_cfes ) ;
}
return k_ignored;
case k_irq_req_set_cfg: // external3
// sie core processed request
trace1(0, dev, 1, "--(k_irq_req_set_cfg x_usb_conf:%02X)", x_usb_conf);
return k_ignored;
case k_irq_req_set_ifc: // external3
// sie core processed request
trace0(0, dev, 1, "--(k_irq_req_set_ifc)");
return k_ignored;
case k_irq_req_set_rwu: // external3
// sie core processed request
trace0(0, dev, 1, "--(k_irq_req_set_rwu)");
return k_ignored;
case k_irq_req_clr_rwu: // external3
// sie core processed request
trace0(0, dev, 1, "--(k_irq_req_clr_rwu)");
return k_ignored;
case k_irq_gpio6: // external4
case k_irq_gpio7: // external4
case k_irq_gpio5: // external4
case k_irq_gpio4: // external4
case k_irq_gpio3: // external4
case k_irq_gpio2: // external4
case k_irq_gpio1: // external4
case k_irq_gpio0: // external4
trace1(0, dev, 1, "--(gpio interrupt:(%d))", intr);
return k_ignored;
case k_irq_nyet2rx: // external5
trace0(0, dev, 1, "--(k_irq_nyet2rx)");
return k_ignored;
case k_irq_nyet0rx: // external5
trace0(0, dev, 1, "--(k_irq_nyet0rx)");
return k_ignored;
case k_irq_nak2tx: // external5
trace0(0, dev, 1, "--(k_irq_nak2tx)");
// set our usr synchronizer, knl isr auto-masked the nak irq
thread_set_sync( g_ix_ata_thread, kbm_sync_innak ) ;
return k_ignored;
case k_irq_nak2rx: // external5
trace0(0, dev, 1, "--(k_irq_nak2rx)");
// set our usr synchronizer, knl isr auto-masked the nak irq
thread_set_sync( g_ix_ata_thread, kbm_sync_outnak ) ;
return k_ignored;
case k_irq_nak1tx: // external5
trace0(0, dev, 1, "--(k_irq_nak1tx)");
return k_ignored;
case k_irq_nak1rx: // external5
trace0(0, dev, 1, "--(k_irq_nak1rx)");
return k_ignored;
case k_irq_nak0tx: // external5
trace0(0, dev, 1, "--(k_irq_nak0tx)");
return k_ignored;
case k_irq_nak0rx: // external5
trace0(0, dev, 1, "--(k_irq_nak0rx)");
return k_ignored;
#endif
default:
trace0(0, dev, 0, "hey, I dunno how to process that interrupt....?");
return k_ignored;
}
// how'd we get here?
return k_error;
}
////////////////////////////////////////////////////////////////////////////////
//
// DEVICE POLLER
// poll for non-interrupt events related to the device and synchronize
// the associated thread(s).
//
////////////////////////////////////////////////////////////////////////////////
// i think we don't need this...
// implement dev_poll_whatever() here if you end up needing it...
////////////////////////////////////////////////////////////////////////////////
//
// INTERFACE THREAD
// handles the application specific state machine for the device.
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
void fmcdev_dumpram(uint8 addrlo, uint8 addrhi, uint16 length) reentrant
{
uint16 n;
uint8 item;
mcu_begin_critical_section();
x_sram_addr_lo = addrlo;
x_sram_addr_hi = addrhi;
for(n=0; n<length;n++)
{
item = x_sram_data;
TRACE3(421, fmcdev, 0, "x_sram[%02X:%02X]= 0x%02X", x_sram_addr_hi, x_sram_addr_lo, item) ;
}
mcu_end_critical_section();
}
//------------------------------------------------------------------------------
uint16 fmcdev_get_pkt_sz( uint8 pnr ) reentrant
{
uint16 pktsz ;
pktsz = mmu_rd_len(pnr);
TRACE2(422, fmcdev, 0, "pnr %d: %d bytes",pnr,pktsz );
return pktsz;
}
//------------------------------------------------------------------------------
uint8 fmcdev_get_rx_pkt(uint8 whatKind) reentrant
{
uint8 packetToReturn ;
TRACE0(423, fmcdev, 1, "+GetReceivedPacket()" );
if(whatKind == k_last_packet)
{
if(g_last_packet == 0xab)
{
packetToReturn = 4 ; /* return packet a */
}
else if(g_last_packet == 0xba)
{
packetToReturn = 5 ; /* return packet b */
}
else
{
packetToReturn = g_last_packet ; /* return whatever is in this var */
}
TRACE1(424, fmcdev, 2, "returning last packet of %d",packetToReturn);
return(packetToReturn);
}
if(g_last_packet == 0xab)
{
/* last call here had 2 packets... so return the next one */
packetToReturn = 5 ; /* packet b */
g_last_packet = 5 ;
TRACE0(425, fmcdev, 2, "returning last packet of Buffer B") ;
return(5) ;
}
else if(g_last_packet == 0xba)
{
packetToReturn = 4 ;
g_last_packet = 4 ;
TRACE0(426, fmcdev, 2, "returning last packet of Buffer A") ;
return(4) ;
}
switch(endpoint_rd_rx_pnr(2))
{
// commented this out - this is a hack
case 0x00: // neither buffer has filled since the last check
TRACE0(427, fmcdev, 2, "neither buffer has data. Return 0" );
g_last_packet = 0;
return 0 ;
break;
case 0xa0: // A is full B is empty
TRACE0(428, fmcdev, 2, "Packet received on packet buffer A" );
g_last_packet = 4;
return(4);
break;
case 0xb0: // A is empty B is full
TRACE0(429, fmcdev, 2, "Packet received on packet buffer B" );
g_last_packet = 5;
return(5);
break;
case 0xab: // A and B are full - A filled before B
TRACE0(430, fmcdev, 2, "Packet received on packet A or B, but A was first" );
g_last_packet = 0xab;
return(4);
break;
case 0xba: // A and B are full - B filled before A
TRACE0(431, fmcdev, 2, "Packet received on packet A or B, but B was first" );
g_last_packet = 0xba;
return(5);
break;
}
}
/*****************************************************************************/
/* ChangeEndian */
/*****************************************************************************/
void fmcdev_swap_endian( uint32 *pLong ) reentrant
{
uint8 *pByte;
uint8 Temp;
pByte = (uint8 *)pLong;
Temp = *(pByte+0);
*(pByte+0) = *(pByte+3);
*(pByte+3) = Temp;
Temp = *(pByte+1);
*(pByte+1) = *(pByte+2);
*(pByte+2) = Temp;
}
void fmc_init() reentrant
{
TRACE0(432, fmc, 0, "+fmc_init()") ;
fmc_dump_registers() ;
// disable pull-up resistor on 128 pin device.
x_fmc_ctl |= kbm_fmc_ctl_pkg_pullup_dis ;
// manually set to 100-pin for now
x_fmc_mode_ctl |= kbm_fmc_mode_ctl_mux_en ;
if(_mcu_register_rd(x_fmc_mode_ctl)&kbm_fmc_mode_ctl_mux_en)
{
TRACE0(433, fmc, 0, "97C210 100-pin package") ;
}
else
{
TRACE0(434, fmc, 0, "97C210 128-pin package") ;
}
thread_end_dfa() ;
}
void fmc_dump_registers() reentrant
{
TRACE0(435, fmc, 3, "fmc register dump") ;
TRACE2(436, fmc, 3, " x_fmc_ctl: %02x x_fmc_mode_ctl:%02x", x_fmc_ctl, x_fmc_ctl) ;
TRACE1(437, fmc, 3, " x_fmc_mode_ctl: %02x", x_fmc_mode_ctl) ;
TRACE1(438, fmc, 3, " x_media_sts: %02x", x_media_sts) ;
TRACE1(439, fmc, 3, " x_crd_ps: %02x", x_crd_ps) ;
TRACE1(440, fmc, 3, " x_crd_stat: %02x", x_crd_stat) ;
TRACE1(441, fmc, 3, " x_crd_stat_msk: %02x", x_crd_stat_msk) ;
}
void fmc_select_cfc() reentrant
{
mcu_begin_critical_section() ;
x_fmc_mode_ctl=((x_fmc_mode_ctl & kbm_fmc_mode_ctl_mux_en)|k_fmc_mode_ctl_mode_sel_cfc) ;
TRACE1(443, fmc, 0, "fmc mode ctl: selecting cfc. x_fmc_mode_ctl:%02x", x_fmc_mode_ctl) ;
mcu_end_critical_section() ;
}
void fmc_select_smc() reentrant
{
mcu_begin_critical_section() ;
x_fmc_mode_ctl=((x_fmc_mode_ctl & kbm_fmc_mode_ctl_mux_en)|k_fmc_mode_ctl_mode_sel_smc) ;
TRACE1(444, fmc, 0, "fmc mode ctl: selecting smc. x_fmc_mode_ctl:%02x", x_fmc_mode_ctl) ;
mcu_end_critical_section() ;
}
void fmc_select_msc() reentrant
{
mcu_begin_critical_section() ;
x_fmc_mode_ctl=((x_fmc_mode_ctl & kbm_fmc_mode_ctl_mux_en)|k_fmc_mode_ctl_mode_sel_msc) ;
TRACE1(445, fmc, 0, "fmc mode ctl: selecting msc. x_fmc_mode_ctl:%02x", x_fmc_mode_ctl) ;
mcu_end_critical_section() ;
}
void fmc_select_sdc() reentrant
{
mcu_begin_critical_section() ;
x_fmc_mode_ctl=((x_fmc_mode_ctl & kbm_fmc_mode_ctl_mux_en)|k_fmc_mode_ctl_mode_sel_sdc) ;
TRACE1(446, fmc, 0, "fmc mode ctl: selecting sdc. x_fmc_mode_ctl:%02x", x_fmc_mode_ctl) ;
mcu_end_critical_section() ;
}
void fmc_select_none() reentrant
{
mcu_begin_critical_section() ;
x_fmc_mode_ctl=((x_fmc_mode_ctl & kbm_fmc_mode_ctl_mux_en)|k_fmc_mode_ctl_mode_sel_none) ;
TRACE1(447, fmc, 0, "fmc mode ctl: disable all. x_fmc_mode_ctl:%02x", x_fmc_mode_ctl) ;
mcu_end_critical_section() ;
}
//---eof------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -