📄 tftp.c
字号:
#include "./include/typedef.h"#include "./include/tftp.h"#include "./include/led.h"#include "./include/web_init.h"#include "./include/myout.h"#include "./include/build_arp.h"#include "./include/build_tftp.h"#include "./include/nand_flash_write.h"U8 HostMac[6], ClientMac[]={0x00,0x11,0x22,0x33,0x44,0x55} ;U8 HostIp[]={192,168,0,1}, ClientIp[]={192,168,0,111};U8 PacketPage[60];U16 HostPort=0, BlockNumber=0;#define rxsave (*(U8 *)0x31000000)extern int eth_send (volatile const void *, int);int eth_rx (U8 *);int Main(){ int totalLen = 0, useLen=0, arpLen=0; GPACON = (GPACON |1<<14 |1<<9); eth_init(ClientMac); InitLed(); LedPlay(0x8); Delay(5000); arpLen=BuildARP(PacketPage, ClientMac, ClientIp, HostIp); if(arpLen>0) eth_send (PacketPage, arpLen); while(1){ useLen=eth_rx(&rxsave+totalLen); if(useLen>0) totalLen += useLen; if(useLen < 512 && BlockNumber>0 )//&& useLen>0) break; } MyOut("\n\rtotalLen = %d, total %d packetpage \n\r",totalLen, BlockNumber); nand_write(0,totalLen,&rxsave); return 0;}/////////////////////////////// Send a data block via Ethernet. extern int eth_send (volatile const void *packet, int length){ volatile U16 *addr; U16 s;retry: // initiate a transmit sequence CS8900_TxCMD = PP_TxCmd_TxStart_Full; CS8900_TxLEN = length; // Test to see if the chip has allocated memory for the packet / if ((get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY) == 0) { MyOut("%s", "cs: unable to send packet; retrying..."); eth_reset (); eth_reginit (); goto retry; } // Write the contents of the packet // assume even number of bytes for (addr = (U16 *)packet; length > 0; length -= 2) { CS8900_RTDATA = *addr++; } // wait for transfer to succeed // while ((s = get_reg (PP_TER) & ~0x3f) == 0); // nothing if ((s & (PP_TER_CRS | PP_TER_TxOK)) != PP_TER_TxOK) { MyOut("transmission error %x", s); } return 0;}// Get a data block via Ethernet int eth_rx (U8 *start){ #define ProtoP 12 #define HoMacP 22 #define SrPortP 34 #define UsLenP 38 #define BlNumberP 44 #define FirstData (*(volatile U8 *)0x19000300) int i=0, useLen=0; U16 txLen=0; U16 *addr, data; addr=(U16 *)start; while ((get_reg(PP_RER) & PP_RER_RxOK) == 0); // judgement rx status put_reg (PP_LineCTL, PP_LineCTL_Tx|0x0); data=CS8900_RTDATA; data=CS8900_RTDATA; MyOut("\n\r fifth byte:[%x]...packetpage number:[%d]", FirstData, BlockNumber); for(i=0;i<45;i+=2) { data=CS8900_RTDATA; PacketPage[i]=data; PacketPage[i+1]=data>>8; } if(PacketPage[ProtoP]==0x08&&PacketPage[ProtoP+1]==0x06) // arp { i=0; do{ HostMac[i++]=PacketPage[HoMacP+i]; }while(i<6); // build request packet txLen = build_tftp_packet(PacketPage, HostMac, 0, 0, 1); goto done; } else // get hostport and user data long and packet blocknumber { // get pakcetpage blocknumber BlockNumber = PacketPage[BlNumberP]<<8 | PacketPage[BlNumberP+1]; // if first block get hostport if(PacketPage[BlNumberP]==0x0&&PacketPage[BlNumberP+1]==0x01) { HostPort=PacketPage[SrPortP]<<8 | PacketPage[SrPortP+1]; } // get user data long useLen=PacketPage[UsLenP]<<8 |PacketPage[UsLenP+1]; useLen -= 12; MyOut(", Len=%d", useLen); } for(i=0;i < useLen;i+=2) { *addr++ = CS8900_RTDATA; } if((useLen & 1) != 0) { *addr++ = CS8900_RTDATA; } txLen = build_tftp_packet(PacketPage, 0, HostPort, BlockNumber, 4); // build configmation packetdone: if(txLen>0) eth_send (PacketPage, txLen); // send confirmation packet put_reg (PP_LineCTL, PP_LineCTL_Tx|PP_LineCTL_Rx); // enabled recei return useLen;}/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -