📄 ethernet.lst
字号:
141 1 EN1_MAR6 = 0xff;
142 1 EN1_MAR7 = 0xff;
143 1
144 1 EN1_CURR = RX_START_PG + 1; /* RX_CURR_PG; Current memory page = RX_CURR_PG ? */
145 1
146 1 EN_CMD = EN_PAGE0 + EN_NODMA ; /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */
147 1
148 1 EN0_RXCR = ENRXCR_RXCONFIG; /* rx on(broadcasts, no multicast,errors 04*/
149 1 EN0_TXCR = ENTXCR_TXCONFIG; /* xmit on. */
150 1
151 1 EN0_ISR = 0xff; /* Individual bits are cleared by writing a "1" into it. */
152 1 /* It must be cleared after power up. */
153 1
154 1 EN0_IMR = ENISR_ALL; /* INTerrupt mask reg */
155 1
156 1 EN_CMD = EN_PAGE0 + EN_NODMA + EN_START;
157 1 }
158
159 //*******************************************
160 // get a packet form a given address in NIC's RAM
161 // DMA READ
162 //
163 //*******************************************
164 void getnic(WORD addr, BYTE buf[],WORD len)
165 {
166 1 EN0_ISR=ENISR_RDC; //clear remote dma interrupt flag
167 1 EN0_RCNTLO = (BYTE)(len&0xff); // read length low
168 1 EN0_RCNTHI = (BYTE)(len>>8); // read length high
169 1 EN0_RSARLO=(BYTE)(addr &0xff); // read address low
170 1 EN0_RSARHI=(BYTE)(addr>>8); // read address high
171 1 EN_CMD=EN_RREAD+EN_START+EN_PAGE0; // do dma read
172 1 while (len--)
173 1 *buf++=EN_DATA;
174 1 }
175
176 //*******************************************
177 // put a packet into a given address in NIC's RAM
178 // DMA Write
C51 COMPILER V7.07 ETHERNET 06/30/2006 16:21:46 PAGE 4
179 //
180 //*******************************************
181 void putnic(WORD addr, BYTE buf[],WORD len)
182 {
183 1 len+=len&0x01;
184 1 EN0_ISR=ENISR_RDC; //clear remote dma interrupt flag
185 1 EN0_RCNTLO = (BYTE)(len&0xff);
186 1 EN0_RCNTHI = (BYTE)(len>>8);
187 1 EN0_RSARLO=(BYTE)(addr &0xff);
188 1 EN0_RSARHI=(BYTE)(addr>>8);
189 1 EN_CMD=EN_RWRITE+EN_START+EN_PAGE0;
190 1 while (len--)
191 1 EN_DATA=*buf++;
192 1 len=10000;
193 1 while (len && ((EN0_ISR & ENISR_RDC)==0))
194 1 len--;
195 1 }
196
197 //***************************************
198 // wrap an rx page number
199 //***************************************
200 BYTE nicwrap(BYTE page)
201 {
202 1 if (page>=RX_STOP_PG)
203 1 page+=RX_START_PG-RX_STOP_PG;
204 1 else if(page<RX_START_PG)
205 1 page+=RX_STOP_PG-RX_START_PG;
206 1 return (page);
207 1 }
208
209 //*********************************************************************
210 // 延时子程序 1ms
211 //*********************************************************************
212 void delay_ms(int number)
213 { //craystal 22.1184Mhz
214 1 unsigned char i;
215 1 unsigned int j;
216 1 for (j=0;j<number;j++)
217 1 {
218 2 // for (i=0;i<229;i++); //11.0592Mhz (1ms)
219 2 // for (i=0;i<229;i++); //22.1184Mhz (1ms)
220 2 for (i=0;i<255;i++); //24Mhz (1ms)
221 2 }
222 1 }
223
224 //*********************************************************************
225 // 延时子程序 100ms
226 //*********************************************************************
227
228 //void delay_100ms(int number)
229 //{
230 // unsigned int j;
231 // for (j=0;j<number;j++)
232 // delay_ms(100);
233 //}
234
235 /* Make a frame, given data length. Return length of complete frame
236 ** If Ethernet, set dest addr & protocol type; if SLIP, ignore these */
237 int make_frame(ETHERFRAME *efp, BYTE srce[],BYTE dest[], WORD pcol, WORD dlen)
238 {
239 1
240 1 efp->e.ptype = pcol;
C51 COMPILER V7.07 ETHERNET 06/30/2006 16:21:46 PAGE 5
241 1 memcpy(efp->e.dest, dest, MACLEN);
242 1 memcpy(efp->e.srce, srce, MACLEN);
243 1 dlen += sizeof(ETHERHDR);
244 1 return(dlen);
245 1 }
246
247
248 /* Do TCP-style checksum. Improved algorithm is from RFC 1071 */
249 WORD csum(void *dp, WORD count)
250 {
251 1 register LWORD total=0L;
252 1 register WORD n, *p, carries;
253 1
254 1 n = count / 2;
255 1 p = (WORD *)dp;
256 1 while (n--)
257 1 total += *p++;
258 1 if (count & 1)
259 1 total += (*(BYTE *)p)<<8;
260 1 while ((carries=(WORD)(total>>16))!=0)
261 1 total = (total & 0xffffL) + carries;
262 1 return((WORD)total);
263 1 }
264
265 unsigned char check_rtl8019as(void)
266 {
267 1 EN_CMD = EN_PAGE0 + EN_NODMA + EN_STOP; /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */
268 1
269 1 if(EN0_8019ID0 != 0x50)
270 1 return 1;
271 1 if(EN0_8019ID1 != 0x70)
272 1 return 2;
273 1 return 0;
274 1 }
275
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1247 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 10 48
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -