⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmcdev.c

📁 <B>SMSC USB2.0 Flash硬盘驱动源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
        // 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 + -