isa_dma.lst

来自「飞利浦usb D12芯片fireware 源程序」· LST 代码 · 共 397 行 · 第 1/2 页

LST
397
字号
 114      =1                  unsigned char suspend                   : 1;
 115      =1                  unsigned char setup_packet              : 1;
 116      =1                  unsigned char remote_wakeup                     : 1;
 117      =1                  unsigned char in_isr                    : 1;
 118      =1                  unsigned char control_state                     : 2;
 119      =1  
 120      =1                  unsigned char configuration                     : 1;
 121      =1                  unsigned char verbose                           : 1;
 122      =1                  unsigned char ep1_rxdone                        : 1;
 123      =1                  unsigned char setup_dma                         : 1;
 124      =1                  unsigned char dma_state                 : 2;
 125      =1                  unsigned char dma_disable                       : 1; // V2.1
 126      =1          } bits;
 127      =1          unsigned short value;
 128      =1  } EPPFLAGS;
 129      =1  
 130      =1  typedef struct _device_request
 131      =1  {
 132      =1          unsigned char bmRequestType;
 133      =1          unsigned char bRequest;
 134      =1          unsigned short wValue;
 135      =1          unsigned short wIndex;
 136      =1          unsigned short wLength;
 137      =1  } DEVICE_REQUEST;
 138      =1  
 139      =1  typedef struct _IO_REQUEST {
 140      =1          unsigned short  uAddressL;
 141      =1          unsigned char   bAddressH;
 142      =1          unsigned short  uSize;
 143      =1          unsigned char   bCommand;
 144      =1  } IO_REQUEST, *PIO_REQUEST;
 145      =1  
 146      =1  #define MAX_CONTROLDATA_SIZE    8
 147      =1  
 148      =1  typedef struct _control_xfer
 149      =1  {
 150      =1          DEVICE_REQUEST DeviceRequest;
 151      =1          unsigned short wLength;
 152      =1          unsigned short wCount;
 153      =1          unsigned char * pData;
 154      =1          unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
 155      =1  } CONTROL_XFER;
 156      =1  
 157      =1  /*
 158      =1     //*************************************************************************
 159      =1     // USB utility functions
 160      =1     //*************************************************************************
 161      =1  */
 162      =1  #ifndef __C51__
           =1 void interrupt timer_isr(void);
           =1 void interrupt usb_isr(void);
           =1 #endif
 166      =1  
 167      =1  void fn_usb_isr();
 168      =1  
 169      =1  extern void suspend_change(void);
 170      =1  extern void stall_ep0(void);
C51 COMPILER V8.02   ISA_DMA                                                               07/24/2007 14:12:03 PAGE 5   

 171      =1  extern void disconnect_USB(void);
 172      =1  extern void connect_USB(void);
 173      =1  extern void reconnect_USB(void);
 174      =1  extern void init_unconfig(void);
 175      =1  extern void init_config(void);
 176      =1  extern void single_transmit(unsigned char * pData, unsigned char len);
 177      =1  extern void code_transmit(unsigned char code * pRomData, unsigned short len);
 178      =1  
 179      =1  extern void control_handler();
 180      =1  extern void check_key_LED(void);
 181      =1  extern void setup_dma();
 182      =1  #ifndef __C51__
           =1 extern void setup_io(); // V2.1, x86 only
           =1 #endif
 185      =1  
 186      =1  void dma_start(PIO_REQUEST);
 187      =1  
 188      =1  #define IN_TOKEN_DMA    1
 189      =1  #define OUT_TOKEN_DMA   0
 190      =1  
 191      =1  #ifndef __C51__
           =1         #define DMA_BUFFER_SIZE         64000
           =1 #else
 194      =1          #define DMA_BUFFER_SIZE         16384
 195      =1  #endif
 196      =1  
 197      =1  #define DMA_IDLE        0
 198      =1  #define DMA_RUNNING     1
 199      =1  #define DMA_PENDING     2
 200      =1  
 201      =1  #define SETUP_DMA_REQUEST               0x0471
 202      =1  #define GET_FIRMWARE_VERSION    0x0472
 203      =1  #define GET_SET_TWAIN_REQUEST   0x0473
 204      =1  
 205      =1  typedef struct _TWAIN_FILEINFO {
 206      =1          unsigned char   bPage;    // bPage bit 7 - 5 map to uSize bit 18 - 16
 207      =1          unsigned char   uSizeH;    // uSize bit 15 - 8
 208      =1          unsigned char   uSizeL;    // uSize bit 7 - 0
 209      =1  } TWAIN_FILEINFO, *PTWAIN_FILEINFO;
 210      =1  
 211      =1  #endif
 212      =1  
  26          
  27          #define DMA37MD_SINGLE  0x40    /* single pass mode */
  28          #define DMA37MD_BLOCK   0x80    /* single pass mode */
  29          #define DMA37MD_AUTO    0x10    /* autoinitialise single pass mode */
  30          #define DMA37MD_DEMAND  0x00    /* demand mode */
  31          #define DMA37MD_WRITE   0x04    /* read the device, write memory operation */
  32          #define DMA37MD_READ    0x08    /* write the device, read memory operation */
  33          
  34          /*
  35          **  Register definitions for DMA controller 1 (channels 0..3):
  36          */
  37          #define DMA1_CHN(c)     (2*(c)) /* addr reg for channel c */
  38          #define DMA1_CMD    (8)     /* command register */
  39          #define DMA1_SMSK       (10)    /* single mask register */
  40          #define DMA1_MODE       (11)    /* mode register */
  41          #define DMA1_FFC        (12)    /* clear first/last FF */
  42          
  43          #define VALID_DMA_MASK (7)
  44          
  45          extern EPPFLAGS bEPPflags;
C51 COMPILER V8.02   ISA_DMA                                                               07/24/2007 14:12:03 PAGE 6   

  46          extern unsigned long dmaBuffer;
  47          
  48          void dma_start(PIO_REQUEST pio)
  49          {
  50   1              static short pageport[8] = { 0x87, 0x83, 0x81, 0x82, 0x8f, 0x8b, 0x89, 0x8a };
  51   1              unsigned short dmaport, nbytes, ch;
  52   1              unsigned long offset, buf_phy_addr;
  53   1              BOOL b_read;
  54   1      
  55   1              offset = (((unsigned long)pio->bAddressH)<<16)
  56   1                      + pio->uAddressL;
  57   1      
  58   1              b_read = pio->bCommand & 0x1;
  59   1              buf_phy_addr = dmaBuffer + offset;
  60   1              nbytes = pio->uSize;
  61   1              ch = 3;
  62   1      
  63   1              if(bEPPflags.bits.in_isr == 0) {
  64   2                      if(b_read)
  65   2                              printf("DMA channel %d IN token DMA start at %lx of %u bytes.\n", ch, buf_phy_addr, nbytes);
  66   2                      else
  67   2                              printf("DMA channel %d OUT token DMA start at %lx of %u bytes.\n", ch, buf_phy_addr, nbytes);
  68   2              }
  69   1      
  70   1              if ((ch & 4) == 0) {
  71   2      
  72   2                      if (b_read)
  73   2                              outportb(DMA1_MODE, DMA37MD_DEMAND|DMA37MD_READ|ch);
*** WARNING C206 IN LINE 73 OF ISA_DMA.C: 'outportb': missing function-prototype
*** ERROR C267 IN LINE 73 OF ISA_DMA.C: 'outportb': requires ANSI-style prototype
  74   2      //                      outportb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_READ|ch);
  75   2                      else
  76   2                              outportb(DMA1_MODE, DMA37MD_DEMAND|DMA37MD_WRITE|ch);
  77   2      //                      outportb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|ch);
  78   2      
  79   2                      outportb(DMA1_FFC, 0);
  80   2      
  81   2                      /* send start address */
  82   2                      dmaport =  DMA1_CHN(ch);
  83   2                      outportb(dmaport, buf_phy_addr);
  84   2                      outportb(dmaport, buf_phy_addr>>8);
  85   2                      outportb(pageport[ch], buf_phy_addr>>16);
  86   2      
  87   2                      /* send count */
  88   2                      outportb(DMA1_FFC, 0);
  89   2                      outportb(dmaport + 1, --nbytes);
  90   2                      outportb(dmaport + 1, nbytes>>8);
  91   2      
  92   2                      outportb(DMA1_CMD, 0x0);
  93   2      
  94   2                      /* unmask channel */
  95   2                      outportb(DMA1_SMSK, ch);
  96   2              }
  97   1      }
  98          
  99          int dma_getcount(int ch)
 100          {
 101   1              unsigned short dmaport;
 102   1              unsigned short highbyte, lowbyte;
 103   1      
 104   1              dmaport =  DMA1_CHN(ch);
 105   1              outportb(DMA1_FFC, 0);
C51 COMPILER V8.02   ISA_DMA                                                               07/24/2007 14:12:03 PAGE 7   

 106   1      
 107   1              lowbyte = inportb(dmaport + 1);
 108   1              highbyte = inportb(dmaport + 1);
 109   1              highbyte <<= 8;
 110   1              highbyte += lowbyte;
 111   1      
 112   1              return highbyte;
 113   1      }

C51 COMPILATION COMPLETE.  4 WARNING(S),  1 ERROR(S)

⌨️ 快捷键说明

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