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

📄 mscbot.h

📁 <B>SMSC USB2.0 Flash硬盘驱动源码</B>
💻 H
字号:
/*============================================================================
  ____________________________________________________________________________
                                ______________________________________________
   SSSS  M   M          CCCC          Standard Microsystems Corporation
  S      MM MM   SSSS  C                    Austin Design Center
   SSS   M M M  S      C                 11000 N. Mopac Expressway
      S  M   M   SSS   C                Stonelake Bldg. 6, Suite 500
  SSSS   M   M      S   CCCC                Austin, Texas 78759
                SSSS            ______________________________________________
  ____________________________________________________________________________

  Copyright(C) 1999, Standard Microsystems Corporation
  All Rights Reserved.

  This program code listing is proprietary to SMSC and may not be copied,
  distributed, or used without a license to do so.  Such license may have
  Limited or Restricted Rights. Please refer to the license for further
  clarification.
  ____________________________________________________________________________

  Notice: The program contained in this listing is a proprietary trade
  secret of SMSC, Hauppauge, New York, and is copyrighted
  under the United States Copyright Act of 1976 as an unpublished work,
  pursuant to Section 104 and Section 408 of Title XVII of the United
  States code. Unauthorized copying, adaption, distribution, use, or
  display is prohibited by this law.
  ____________________________________________________________________________

  Use, duplication, or disclosure by the Government is subject to
  restrictions as set forth in subparagraph(c)(1)(ii) of the Rights
  in Technical Data and Computer Software clause at DFARS 52.227-7013.
  Contractor/Manufacturer is Standard Microsystems Corporation,
  80 Arkay Drive, Hauppauge, New York, 1178-8847.
  ____________________________________________________________________________
  ____________________________________________________________________________

  mscbot.h - mass storage class bulk only transport
  ____________________________________________________________________________

  comments tbd
  ____________________________________________________________________________

  Revision History
  Date      Who  Comment
  ________  ___  _____________________________________________________________
  05/31/00  tbh  initial version
  07/27/01  tbh  removed prototype for wait_create entry point
  10/04/01  tbh  tweaked during performance optimizations of '201 mass storage
  03/11/02  tbh  added bit g_force_card_establish.  then i removed it.
  03/18/02  tbh  _mscbot_has_residue was returning the opposite truth value
  03/22/02  tbh  added _mscbot_residue_8 _mscbot_residue_32
  06/10/02  tbh  changed prototypes for non bot layer entry points for hpthreads
  07/30/02  ds   Moved _endpoint_unmask_innak(k_rx_pipe) macro to mscbot.h so that sd.c can access it.               
  09/26/02  cds  exported mscbot_tx_data_buffer() as a single function which
                 can be used to transmit a buffer of up to 64 bytes as the 
                 entire data portion of an xfer.
  10/01/02  ds   Added prototype for function mscbot_rx_data_buffer    
  10/02/02  ds   Changed the prototype for function mscbot_rx_data_buffer, so as to return a value.           
  10/02/02  cds  moved g_bot_cbw into xdata to regain data/stack space to prevent  
                 stack overflows on hierarchy-heavy media protocols.             
============================================================================*/

//------------------------------------------------------------------------------
// transfer directions
#define k_dir_read (1==1)
#define k_dir_write !k_dir_read
typedef t_bool t_xfer_dir;

//------------------------------------------------------------------------------
// data direction
#define k_data_in  k_dir_read
#define k_data_out k_dir_write

//------------------------------------------------------------------------------
// command descriptor block
typedef uint8 t_cdb[16];
//typedef struct s_cdb
//{
// tbh says "hmmmmm..."
// some enterprising youth should create all of the unions of all of
// the commands so values can be accessed by field name instead of offset,
// then go retrofit the code to reference the fields.  the proof is left
// to the reader.
//} t_cdb;

//------------------------------------------------------------------------------
// command block wrapper
typedef struct s_cbw
{
  uint8 dwCBWSignatureLo;   // dwCBWSignature: the constant 0x55
  uint8 dwCBWSignatureHl;   // dwCBWSignature: the constant 0x53
  uint8 dwCBWSignatureLh;   // dwCBWSignature: the constant 0x42
  uint8 dwCBWSignatureHi;   // dwCBWSignature: the constant 0x43
  uint8 dwCBWtagLo;         // dwCBWtag: (lsw lsb)
  uint8 dwCBWtagHl;         // dwCBWtag: (lsw msb)
  uint8 dwCBWtagLh;         // dwCBWtag: (msw lsb)
  uint8 dwCBWtagHi;         // dwCBWtag: (msw msb)
  uint8 dwCBWXferLengthLo;  // dwCBWXferLength: (lsw lsb) number of bytes to transfer
  uint8 dwCBWXferLengthHl;  // dwCBWXferLength: (lsw msb)
  uint8 dwCBWXferLengthLh;  // dwCBWXferLength: (msw lsb)
  uint8 dwCBWXferLengthHi;  // dwCBWXferLength: (msw msb)
  uint8 bCBWFlags;          // bmCBWFlags:
                            //  Bit 7: direction - the device shall ignore this bit if the
                            //  dCBWDataTransferLength field is zero, otherwise:
                            //   0 = Data-Out from host to the device,
                            //   1 = Data-In from the device to the host.
                            //  Bit 6: obsolete. The host shall set this bit to zero.
                            //  Bits 5..0: reserved - the host shall set these bits to zero.
  uint8 bCBWlun;            // bmCBWFlags:
  uint8 bCBWCBLength;       // bCBWLength: 0x01..0x10
  t_cdb cdb;                // CBWCB: the command descriptor block
} t_cbw;
// bCBWFlags values
#define kbm_cbw_dir_d2h 0x80

//------------------------------------------------------------------------------
// command status wrapper
typedef struct s_csw
{
  uint8 dwCSWSignatureLo;  // dwCSWSignature: the constant 0x53
  uint8 dwCSWSignatureHl;  // dwCSWSignature: the constant 0x42
  uint8 dwCSWSignatureLh;  // dwCSWSignature: the constant 0x53
  uint8 dwCSWSignatureHi;  // dwCSWSignature: the constant 0x55
  uint8 dwCSWtagLo;        // dwCSWtag: (lsw lsb)
  uint8 dwCSWtagHl;        // dwCSWtag: (lsw msb)
  uint8 dwCSWtagLh;        // dwCSWtag: (msw lsb)
  uint8 dwCSWtagHi;        // dwCSWtag: (msw msb)
  uint8 dwCSWResidueLo;    // dwCBWXferLength: (lsw lsb) number of bytes not transferred
  uint8 dwCSWResidueHl;    // dwCBWXferLength: (lsw msb)
  uint8 dwCSWResidueLh;    // dwCBWXferLength: (msw lsb)
  uint8 dwCSWResidueHi;    // dwCBWXferLength: (msw msb)
  uint8 bCSWStatus;        // bCSWStatus:
                           //  00h command Passed ("good status")
                           //  01h command failed
                           //  02h phase error
                           //  03h to FFh reserved
} t_csw;
// a type for function returns of csw status values
typedef uint8 t_csw_status;
// bCSWStatus values
#define k_command_passed 0x00
#define k_command_failed 0x01
#define k_phase_error    0x02

//------------------------------------------------------------------------------
#define k_tx_pipe 2
#define k_rx_pipe 2

//------------------------------------------------------------------------------
// mscbot class specific requests
#define k_hci_mscbot_reset     0x21FF
#define k_hci_mscbot_getmaxlun 0xA1FE

//------------------------------------------------------------------------------
// macros
#define _mscbot_has_residue() (!_u32_equ_0(g_bot_data_len))
#define _mscbot_set_residue(__n); { g_bot_data_len.u32 = (uint32)(__n); }
#define _mscbot_zero_residue(); { g_bot_data_len.u32 = 0; }
#define _mscbot_decr_residue(__n); { g_bot_data_len.u32 -= (uint32)(__n); }
#define _mscbot_incr_residue(__n); { g_bot_data_len.u32 += (uint32)(__n); }
#define _mscbot_residue_32() g_bot_data_len.u32
#define _mscbot_residue_8(__mswmsb, __mswlsb, __lswmsb, __lswlsb)              \
{                                                                              \
  (__mswmsb) = g_bot_data_len.u8.hi;                                           \
  (__mswlsb) = g_bot_data_len.u8.lh;                                           \
  (__lswmsb) = g_bot_data_len.u8.hl;                                           \
  (__lswlsb) = g_bot_data_len.u8.lo;                                           \
}

//------------------------------------------------------------------------------
// prototypes
uint8 mscbot_mngr(t_message *msgp) reentrant;
uint8 mscbot_cpex(t_message *msgp) reentrant;
void mscbot_thread_wait_create(void) reentrant;

//------------------------------------------------------------------------------
// prototypes from mscbot.c used by the mscbot's helper dfa's
void fgnd_hpbot_wait_create(void) reentrant;
void fgnd_hpbot_wait_status_start(uint8) reentrant;

//------------------------------------------------------------------------------
// externs from device.c (in here cause device.h is part of minimos...)
extern uint8 g_ix_dev_thread;

//------------------------------------------------------------------------------
// externs from mscbot.c used by the mscbot's helper dfa's
extern xdata t_cbw g_bot_cbw;            // command block wrapper
extern t_udw32 g_bot_data_len;     // number of bytes to transfer
extern t_xfer_dir g_bot_xfer_dir;  // k_dir_read or k_dir_write
#if 0
extern bit g_ndp2_tx_stalled;      // set when ndp2 is tx stalled
#endif

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _endpoint_unmask_innak(k_rx_pipe);                                     \
{                                                                              \
  _mcu_register_wr(x_isr_nak, (1 << (2 * k_rx_pipe + 1)));                     \
  _mcu_register_clrbit(x_imr_nak, 2 * k_rx_pipe + 1);                          \
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void mscbot_tx_data_buffer(uint8* buffer, uint8 length) reentrant ;
uint8 mscbot_rx_data_buffer(uint8* buffer, uint8 length) reentrant ;


//---eof------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -