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

📄 ataio.h

📁 ATADRVR是DOS下的磁盘驱动程序,采用PIO传输 ,PCI DMA传输,ATA包,等非常全面代码示例... 内部有C与Asm描述. 编译环境:Borland C/C++ 4.52 与 Bo
💻 H
📖 第 1 页 / 共 3 页
字号:
                                  long bufSize );

extern int dma_pci_chs( int dev, int cmd,
                        unsigned int fr, unsigned int sc,
                        unsigned int cyl, unsigned int head, unsigned int sect,
                        unsigned int seg, unsigned int off,
                        long numSect );

extern int dma_pci_lba28( int dev, int cmd,
                          unsigned int fr, unsigned int sc,
                          unsigned long lba,
                          unsigned int seg, unsigned int off,
                          long numSect );

extern int dma_pci_lba48( int dev, int cmd,
                          unsigned int fr, unsigned int sc,
                          unsigned long lbahi, unsigned long lbalo,
                          unsigned int seg, unsigned int off,
                          long numSect );

extern int dma_pci_packet( int dev,
                           unsigned int cpbc,
                           unsigned int cpseg, unsigned int cpoff,
                           int dir,
                           long dpbc,
                           unsigned int dpseg, unsigned int dpoff,
                           unsigned long lba );

//**************************************************************
//
// Public data in ATAIOPIO.C
//
//**************************************************************

extern unsigned int pio_base_addr1;
extern unsigned int pio_base_addr2;

extern unsigned int pio_memory_seg;
extern int pio_memory_dt_opt;
#define PIO_MEMORY_DT_OPT0 0  // use Data reg at offset 0H
#define PIO_MEMORY_DT_OPT8 1  // use Data reg at offset 8H
#define PIO_MEMORY_DT_OPTB 2  // use Data reg at offsets 400-7ffH
#define PIO_MEMORY_DT_OPTR 3  // randomly select these options

extern unsigned int pio_bmcr_base_addr;

extern unsigned int pio_reg_addrs[10];

extern unsigned char pio_last_write[10];
extern unsigned char pio_last_read[10];

extern int pio_xfer_width;

//**************************************************************
//
// Public functions in ATAIOPIO.C
//
//**************************************************************

// configuration functions

extern void pio_set_iobase_addr( unsigned int base1,
                                 unsigned int base2,
                                 unsigned int base3 );

extern void pio_set_memory_addr( unsigned int seg );

// normal register read/write functions

extern unsigned char pio_inbyte( unsigned int addr );

extern void pio_outbyte( unsigned int addr, unsigned char data );

extern unsigned int pio_inword( unsigned int addr );

extern void pio_outword( unsigned int addr, unsigned int data );

// Normal PIO DRQ block transfer functions. These functions
// handle both PCMCIA memory mode and all I/O mode transfers.

extern void pio_drq_block_in( unsigned int addrDataReg,
                              unsigned int bufSeg, unsigned int bufOff,
                              long wordCnt );

extern void pio_drq_block_out( unsigned int addrDataReg,
                               unsigned int bufSeg, unsigned int bufOff,
                               long wordCnt );

// These functions can be called directly but are normally
// called by the pio_drq_block_in() and pio_drq_block_out()
// functions. These functions handle only I/O mode transfers.

extern void pio_rep_inbyte( unsigned int addrDataReg,
                            unsigned int bufSeg, unsigned int bufOff,
                            long byteCnt );

extern void pio_rep_outbyte( unsigned int addrDataReg,
                             unsigned int bufSeg, unsigned int bufOff,
                             long byteCnt );

extern void pio_rep_inword( unsigned int addrDataReg,
                            unsigned int bufSeg, unsigned int bufOff,
                            long wordCnt );

extern void pio_rep_outword( unsigned int addrDataReg,
                             unsigned int bufSeg, unsigned int bufOff,
                             long wordCnt );

extern void pio_rep_indword( unsigned int addrDataReg,
                             unsigned int bufSeg, unsigned int bufOff,
                             long dwordCnt );

extern void pio_rep_outdword( unsigned int addrDataReg,
                              unsigned int bufSeg, unsigned int bufOff,
                              long dwordCnt );

//**************************************************************
//
// Public data in ATAIOREG.C
//
//**************************************************************

// last ATAPI command packet size and data

extern int reg_atapi_cp_size;
extern unsigned char reg_atapi_cp_data[16];

// flag to control the ~110ms delay for ATAPI devices,
// no delay if the flag is zero.

extern int reg_atapi_delay_flag;

// the values in these variables are placed into the Feature,
// Sector Count, Sector Number and Device/Head register by
// reg_packet() before the A0H command is issued.  reg_packet()
// sets these variables to zero before returning.  These variables
// are initialized to zero.  Only bits 3,2,1,0 of reg_atapi_reg_dh
// are used.

extern unsigned char reg_atapi_reg_fr;
extern unsigned char reg_atapi_reg_sc;
extern unsigned char reg_atapi_reg_sn;
extern unsigned char reg_atapi_reg_dh;

extern long reg_buffer_size;

// Extended error information returned by
// reg_reset(), reg_non_data_*(), reg_pio_data_in_*(),
// reg_pio_data_out_*(), reg_packet(), dma_isa_*()
// and dma_pci_*() functions.

struct REG_CMD_INFO
{
   // entry type, flag and command code
   unsigned char flg;         // see TRC_FLAG_xxx in ataio.h
   unsigned char ct;          // see TRC_TYPE_xxx in ataio.h
   unsigned char cmd;         // command code
   // before regs
   unsigned int  fr1;         // feature (8 or 16 bits)
   unsigned int  sc1;         // sec cnt (8 or 16 bits)
   unsigned char sn1;         // sec num
   unsigned char cl1;         // cyl low
   unsigned char ch1;         // cyl high
   unsigned char dh1;         // device head
   unsigned char dc1;         // device control
   // after regs
   unsigned char st2;         // status reg
   unsigned char as2;         // alt status reg
   unsigned char er2;         // error reg
   unsigned int  sc2;         // sec cnt (8 or 16 bits)
   unsigned char sn2;         // sec num
   unsigned char cl2;         // cyl low
   unsigned char ch2;         // cyl high
   unsigned char dh2;         // device head
   // driver error codes
   unsigned char ec;          // detailed error code
   unsigned char to;          // not zero if time out error
   // additional result info
   long totalBytesXfer;       // total bytes transfered
   long drqPackets;           // number of PIO DRQ packets
   long drqPacketSize;        // number of bytes in current DRQ block
   unsigned int failbits;     // failure bits (protocol errors)
      #define FAILBIT15 0x8000   // extra interrupts detected
      #define FAILBIT14 0x4000
      #define FAILBIT13 0x2000
      #define FAILBIT12 0x1000
      #define FAILBIT11 0x0800
      #define FAILBIT10 0x0400
      #define FAILBIT9  0x0200
      #define FAILBIT8  0x0100   // SC( CD/IO bits) wrong at end of cmd
      #define FAILBIT7  0x0080   // byte count odd at data packet xfer time
      #define FAILBIT6  0x0040   // byte count wrong at data packet xfer time
      #define FAILBIT5  0x0020   // SC (IO bit) wrong at data packet xfer time
      #define FAILBIT4  0x0010   // SC (CD bit) wrong at data packet xfer time
      #define FAILBIT3  0x0008   // byte count wrong at cmd packet xfer time
      #define FAILBIT2  0x0004   // SC wrong at cmd packet xfer time
      #define FAILBIT1  0x0002   // got interrupt before cmd packet xfer
      #define FAILBIT0  0x0001   // slow setting BSY=1 or DRQ=1 after AO cmd
   // sector count, multiple count, and CHS/LBA info
   long ns;                   // number of sectors (sector count)
   int mc;                    // multiple count
   unsigned char lbaSize;     // size of LBA used
      #define LBACHS 0           // last command used CHS
      #define LBA28  28          // last command used 28-bit LBA
      #define LBA32  32          // last command used 32-bit LBA (Packet)
      #define LBA48  48          // last command used 48-bit LBA
      #define LBA64  64          // future use?
   unsigned long lbaLow1;     // lower 32-bits of LBA before
   unsigned long lbaHigh1;    // upper 32-bits of LBA before
   unsigned long lbaLow2;     // lower 32-bits of LBA after
   unsigned long lbaHigh2;    // upper 32-bits of LBA after
} ;

extern struct REG_CMD_INFO reg_cmd_info;

// Configuration data for device 0 and 1
// returned by the reg_config() function.

extern int reg_config_info[2];

#define REG_CONFIG_TYPE_NONE  0
#define REG_CONFIG_TYPE_UNKN  1
#define REG_CONFIG_TYPE_ATA   2
#define REG_CONFIG_TYPE_ATAPI 3

// flag to control the slow data transfer option:
// 0 = no slow data transfer
// !0= slow data transfer before this DRQ packet

extern long reg_slow_xfer_flag;

// flag bits for 'incompatible' controllers and devices

extern int reg_incompat_flags;   // see #defines...

#define REG_INCOMPAT_DMA_DELAY   0x0001   // set to 1 for delay before
                                          // and after stopping the
                                          // DMA engine
#define REG_INCOMPAT_DMA_POLL    0x0002   // set to 1 for no polling
                                          // of Alt Status during
                                          // DMA transfers

//**************************************************************
//
// Public functions in ATAIOREG.C
//
//**************************************************************

// config and reset funcitons

extern int reg_config( void );

extern int reg_reset( int skipFlag, int devRtrn );

// ATA Non-Data command funnctions (for CHS, LBA28 and LBA48)

extern int reg_non_data_chs( int dev, int cmd,
                             unsigned int fr, unsigned int sc,
                             unsigned int cyl, unsigned int head, unsigned int sect );

extern int reg_non_data_lba28( int dev, int cmd,
                               unsigned int fr, unsigned int sc,
                               unsigned long lba );

extern int reg_non_data_lba48( int dev, int cmd,
                               unsigned int fr, unsigned int sc,
                               unsigned long lbahi, unsigned long lbalo );

// PIO Data In/Out data transfer call back function

extern void ( * reg_drq_block_call_back ) ( struct REG_CMD_INFO * );

// ATA PIO Data In command functions (for CHS, LBA28 and LBA48)

⌨️ 快捷键说明

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