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 + -
显示快捷键?