rm bloat
This commit is contained in:
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -5,6 +5,8 @@
|
||||
"ch32v003fun.h": "c",
|
||||
"w5500.h": "c",
|
||||
"wizchip_conf.h": "c",
|
||||
"socket.h": "c"
|
||||
"socket.h": "c",
|
||||
"type_traits": "c",
|
||||
"compare": "c"
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,7 @@ struct dhdr
|
||||
|
||||
uint8_t* pDNSMSG; // DNS message buffer
|
||||
uint8_t DNS_SOCKET; // SOCKET number for DNS
|
||||
uint16_t DNS_MSGID; // DNS message ID
|
||||
volatile uint16_t DNS_MSGID; // DNS message ID
|
||||
|
||||
uint32_t dns_1s_tick; // for timout of DNS processing
|
||||
static uint8_t retry_count;
|
||||
@@ -368,7 +368,7 @@ int8_t parseDNSMSG(struct dhdr * pdhdr, uint8_t * pbuf, uint8_t * ip_from_dns)
|
||||
{
|
||||
cp = dns_question(msg, cp);
|
||||
#ifdef _DNS_DEUBG_
|
||||
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||
#endif
|
||||
if(!cp) return -1;
|
||||
}
|
||||
@@ -378,7 +378,7 @@ int8_t parseDNSMSG(struct dhdr * pdhdr, uint8_t * pbuf, uint8_t * ip_from_dns)
|
||||
{
|
||||
cp = dns_answer(msg, cp, ip_from_dns);
|
||||
#ifdef _DNS_DEUBG_
|
||||
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||
printf("MAX_DOMAIN_NAME is too small, it should be redfine in dns.h");
|
||||
#endif
|
||||
if(!cp) return -1;
|
||||
}
|
||||
@@ -399,7 +399,6 @@ int8_t parseDNSMSG(struct dhdr * pdhdr, uint8_t * pbuf, uint8_t * ip_from_dns)
|
||||
else return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* MAKE DNS QUERY MESSAGE
|
||||
*
|
||||
@@ -410,20 +409,26 @@ int8_t parseDNSMSG(struct dhdr * pdhdr, uint8_t * pbuf, uint8_t * ip_from_dns)
|
||||
* len - is the MAX. size of buffer.
|
||||
* Returns : the pointer to the DNS message.
|
||||
*/
|
||||
int16_t dns_makequery(uint16_t op, char * name, uint8_t * buf, uint16_t len)
|
||||
{
|
||||
uint8_t *cp;
|
||||
// #pragma GCC push_options
|
||||
// #pragma GCC optimize("O0")
|
||||
int16_t dns_makequery(uint16_t op, char *name, uint8_t *buf, uint16_t len) {
|
||||
uint8_t *cp = buf;
|
||||
char *cp1;
|
||||
char sname[MAXCNAME];
|
||||
char *dname;
|
||||
uint16_t p;
|
||||
uint16_t dlen;
|
||||
|
||||
cp = buf;
|
||||
|
||||
// Ensuring name fits into sname
|
||||
if (strlen(name) >= MAXCNAME) {
|
||||
// Handle error - name too long
|
||||
printf("Error: Name too long.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
DNS_MSGID++;
|
||||
cp = put16(cp, DNS_MSGID);
|
||||
p = (op << 11) | 0x0100; /* Recursion desired */
|
||||
p = (op << 11) | 0x0100; // Recursion desired
|
||||
cp = put16(cp, p);
|
||||
cp = put16(cp, 1);
|
||||
cp = put16(cp, 0);
|
||||
@@ -433,34 +438,38 @@ int16_t dns_makequery(uint16_t op, char * name, uint8_t * buf, uint16_t len)
|
||||
strcpy(sname, name);
|
||||
dname = sname;
|
||||
dlen = strlen(dname);
|
||||
for (;;)
|
||||
{
|
||||
/* Look for next dot */
|
||||
cp1 = strchr(dname, '.');
|
||||
|
||||
if (cp1 != NULL) len = cp1 - dname; /* More to come */
|
||||
else len = dlen; /* Last component */
|
||||
for (;;) {
|
||||
cp1 = strchr(dname, '.'); // Look for next dot
|
||||
uint16_t component_len = cp1 != NULL ? cp1 - dname : dlen;
|
||||
|
||||
*cp++ = len; /* Write length of component */
|
||||
if (len == 0) break;
|
||||
*cp++ = component_len; // Write length of component
|
||||
if (component_len == 0) break; // Handle empty component
|
||||
|
||||
/* Copy component up to (but not including) dot */
|
||||
strncpy((char *)cp, dname, len);
|
||||
cp += len;
|
||||
if (cp1 == NULL)
|
||||
{
|
||||
*cp++ = 0; /* Last one; write null and finish */
|
||||
memcpy(cp, dname, component_len); // Copy component up to (but not including) dot
|
||||
cp += component_len;
|
||||
|
||||
if (cp1 == NULL) {
|
||||
*cp++ = 0; // Last one; write null terminator
|
||||
break;
|
||||
}
|
||||
dname += len+1;
|
||||
dlen -= len+1;
|
||||
|
||||
dname += component_len + 1; // Move past current component and dot
|
||||
dlen -= component_len + 1;
|
||||
|
||||
// Ensures dlen is still valid
|
||||
if (dlen <= 0) {
|
||||
printf("Error: dlen is non-positive.\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
cp = put16(cp, 0x0001); /* type */
|
||||
cp = put16(cp, 0x0001); /* class */
|
||||
cp = put16(cp, 0x0001); // type
|
||||
cp = put16(cp, 0x0001); // class
|
||||
|
||||
return ((int16_t)((uint32_t)(cp) - (uint32_t)(buf)));
|
||||
return (int16_t)((uint32_t)(cp) - (uint32_t)(buf));
|
||||
}
|
||||
// #pragma GCC pop_options
|
||||
|
||||
/*
|
||||
* CHECK DNS TIMEOUT
|
||||
@@ -526,17 +535,17 @@ int8_t DNS_run(uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns)
|
||||
{
|
||||
if (len > MAX_DNS_BUF_SIZE) len = MAX_DNS_BUF_SIZE;
|
||||
len = recvfrom(DNS_SOCKET, pDNSMSG, len, ip, &port);
|
||||
#ifdef _DNS_DEBUG_
|
||||
printf("> Receive DNS message from %d.%d.%d.%d(%d). len = %d\r\n", ip[0], ip[1], ip[2], ip[3],port,len);
|
||||
#ifdef _DNS_DEBUG_
|
||||
printf("> Receive DNS message from %d.%d.%d.%d(%d). len = %d\r\n", ip[0], ip[1], ip[2], ip[3],port,len);
|
||||
|
||||
// Print the partial DNS message
|
||||
printf("> Partial DNS message: ");
|
||||
for (int i = 0; i < len; i++) {
|
||||
printf("%02X ", pDNSMSG[i]); // Print each byte in hexadecimal format
|
||||
}
|
||||
printf("\r\n");
|
||||
#endif
|
||||
ret = parseDNSMSG(&dhp, pDNSMSG, ip_from_dns);
|
||||
printf("> Partial DNS message: ");
|
||||
for (int i = 0; i < len; i++) {
|
||||
printf("%02X ", pDNSMSG[i]); // Print each byte in hexadecimal format
|
||||
}
|
||||
printf("\r\n");
|
||||
#endif
|
||||
ret = parseDNSMSG(&dhp, pDNSMSG, ip_from_dns);
|
||||
break;
|
||||
}
|
||||
// Check Timeout
|
||||
|
||||
@@ -1,584 +0,0 @@
|
||||
#include "ftpc.h"
|
||||
|
||||
un_l2cval remote_ip;
|
||||
uint16_t remote_port;
|
||||
un_l2cval local_ip;
|
||||
uint16_t local_port;
|
||||
uint8_t connect_state_control_ftpc = 0;
|
||||
uint8_t connect_state_data_ftpc = 0;
|
||||
uint8_t gModeActivePassiveflag = 0;
|
||||
uint8_t FTP_destip[4] = {192, 168, 10, 230}; // For FTP client examples; destination network info
|
||||
uint16_t FTP_destport = 21; // For FTP client examples; destination network info
|
||||
uint8_t gMenuStart = 0;
|
||||
uint8_t gDataSockReady = 0;
|
||||
uint8_t gDataPutGetStart = 0;
|
||||
static uint8_t gMsgBuf[20]={0,};
|
||||
|
||||
struct ftpc ftpc;
|
||||
struct Command Command;
|
||||
|
||||
void ftpc_init(uint8_t * src_ip)
|
||||
{
|
||||
ftpc.dsock_mode = ACTIVE_MODE;
|
||||
|
||||
local_ip.cVal[0] = src_ip[0];
|
||||
local_ip.cVal[1] = src_ip[1];
|
||||
local_ip.cVal[2] = src_ip[2];
|
||||
local_ip.cVal[3] = src_ip[3];
|
||||
local_port = 35000;
|
||||
strcpy(ftpc.workingdir, "/");
|
||||
socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0);
|
||||
}
|
||||
uint8_t ftpc_run(uint8_t * dbuf)
|
||||
{
|
||||
#ifndef Need_UARTGetCharBlocking_func
|
||||
uint16_t size = 0;
|
||||
long ret = 0;
|
||||
uint32_t send_byte, recv_byte;
|
||||
uint32_t blocklen;
|
||||
uint32_t remain_filesize;
|
||||
uint32_t remain_datasize;
|
||||
uint8_t msg_c;
|
||||
uint8_t dat[50]={0,};
|
||||
uint32_t totalSize = 0, availableSize = 0;
|
||||
|
||||
switch(getSn_SR(CTRL_SOCK))
|
||||
{
|
||||
case SOCK_ESTABLISHED :
|
||||
if(!connect_state_control_ftpc){
|
||||
printf("%d:FTP Connected\r\n", CTRL_SOCK);
|
||||
strcpy(ftpc.workingdir, "/");
|
||||
connect_state_control_ftpc = 1;
|
||||
}
|
||||
if(gMenuStart){
|
||||
gMenuStart = 0;
|
||||
printf("\r\n----------------------------------------\r\n");
|
||||
printf("Press menu key\r\n");
|
||||
printf("----------------------------------------\r\n");
|
||||
printf("1> View FTP Server Directory\r\n");
|
||||
printf("2> View My Directory\r\n");
|
||||
printf("3> Sets the type of file to be transferred. Current state : %s\r\n", (ftpc.type==ASCII_TYPE)?"Ascii":"Binary");
|
||||
printf("4> Sets Data Connection. Current state : %s\r\n", (ftpc.dsock_mode==ACTIVE_MODE)?"Active":"Passive");
|
||||
printf("5> Put File to Server\r\n");
|
||||
printf("6> Get File from Server\r\n");
|
||||
#if defined(F_FILESYSTEM)
|
||||
printf("7> Delete My File\r\n");
|
||||
#endif
|
||||
printf("----------------------------------------\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_dir;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_dir;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='5'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_put;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_put;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(msg_c=='6'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_get;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_get;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
#if defined(F_FILESYSTEM)
|
||||
scan_files(ftpc.workingdir, dbuf, (int *)&size);
|
||||
printf("\r\n%s\r\n", dbuf);
|
||||
#else
|
||||
if (strncmp(ftpc.workingdir, "/$Recycle.Bin", sizeof("/$Recycle.Bin")) != 0)
|
||||
size = sprintf(dbuf, "drwxr-xr-x 1 ftp ftp 0 Dec 31 2014 $Recycle.Bin\r\n-rwxr-xr-x 1 ftp ftp 512 Dec 31 2014 test.txt\r\n");
|
||||
printf("\r\n%s\r\n", dbuf);
|
||||
#endif
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='3'){
|
||||
printf("1> ASCII\r\n");
|
||||
printf("2> BINARY\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
sprintf(dat,"TYPE %c\r\n", TransferAscii);
|
||||
ftpc.type = ASCII_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
sprintf(dat,"TYPE %c\r\n", TransferBinary);
|
||||
ftpc.type = IMAGE_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
}
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='4'){
|
||||
printf("1> ACTIVE\r\n");
|
||||
printf("2> PASSIVE\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
ftpc.dsock_mode=ACTIVE_MODE;
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
ftpc.dsock_mode=PASSIVE_MODE;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
}
|
||||
#if defined(F_FILESYSTEM)
|
||||
else if(msg_c=='7'){
|
||||
printf(">del filename?");
|
||||
sprintf(ftpc.filename, "/%s\r\n", User_Keyboard_MSG());
|
||||
if (f_unlink((const char *)ftpc.filename) != 0){
|
||||
printf("\r\nCould not delete.\r\n");
|
||||
}
|
||||
else{
|
||||
printf("\r\nDeleted.\r\n");
|
||||
}
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(gDataSockReady){
|
||||
gDataSockReady = 0;
|
||||
switch(Command.First){
|
||||
case f_dir:
|
||||
sprintf(dat,"LIST\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case f_put:
|
||||
printf(">put file name?");
|
||||
sprintf(dat,"STOR %s\r\n", User_Keyboard_MSG());
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case f_get:
|
||||
printf(">get file name?");
|
||||
sprintf(dat,"RETR %s\r\n", User_Keyboard_MSG());
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
default:
|
||||
printf("Command.First = default\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if((size = getSn_RX_RSR(CTRL_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(size > _MAX_SS) size = _MAX_SS - 1;
|
||||
ret = recv(CTRL_SOCK,dbuf,size);
|
||||
dbuf[ret] = '\0';
|
||||
if(ret != size)
|
||||
{
|
||||
if(ret==SOCK_BUSY) return 0;
|
||||
if(ret < 0){
|
||||
printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
|
||||
close(CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
printf("Rcvd Command: %s\r\n", dbuf);
|
||||
proc_ftpc((char *)dbuf);
|
||||
}
|
||||
break;
|
||||
case SOCK_CLOSE_WAIT :
|
||||
printf("%d:CloseWait\r\n",CTRL_SOCK);
|
||||
if((ret=disconnect(CTRL_SOCK)) != SOCK_OK) return ret;
|
||||
printf("%d:Closed\r\n",CTRL_SOCK);
|
||||
break;
|
||||
case SOCK_CLOSED :
|
||||
printf("%d:FTPStart\r\n",CTRL_SOCK);
|
||||
if((ret=socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0)) != CTRL_SOCK){
|
||||
printf("%d:socket() error:%ld\r\n", CTRL_SOCK, ret);
|
||||
close(CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case SOCK_INIT :
|
||||
printf("%d:Opened\r\n",CTRL_SOCK);
|
||||
if((ret = connect(CTRL_SOCK, FTP_destip, FTP_destport)) != SOCK_OK){
|
||||
printf("%d:Connect error\r\n",CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
connect_state_control_ftpc = 0;
|
||||
printf("%d:Connectting...\r\n",CTRL_SOCK);
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
|
||||
switch(getSn_SR(DATA_SOCK)){
|
||||
case SOCK_ESTABLISHED :
|
||||
if(!connect_state_data_ftpc){
|
||||
printf("%d:FTP Data socket Connected\r\n", DATA_SOCK);
|
||||
connect_state_data_ftpc = 1;
|
||||
}
|
||||
if(gDataPutGetStart){
|
||||
switch(Command.Second){
|
||||
case s_dir:
|
||||
printf("dir waiting...\r\n");
|
||||
if((size = getSn_RX_RSR(DATA_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
|
||||
printf("ok\r\n");
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(size > _MAX_SS) size = _MAX_SS - 1;
|
||||
ret = recv(DATA_SOCK,dbuf,size);
|
||||
dbuf[ret] = '\0';
|
||||
if(ret != size){
|
||||
if(ret==SOCK_BUSY) return 0;
|
||||
if(ret < 0){
|
||||
printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
printf("Rcvd Data:\n\r%s\n\r", dbuf);
|
||||
gDataPutGetStart = 0;
|
||||
Command.Second = s_nocmd;
|
||||
}
|
||||
break;
|
||||
case s_put:
|
||||
printf("put waiting...\r\n");
|
||||
if(strlen(ftpc.workingdir) == 1)
|
||||
sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
|
||||
else
|
||||
sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
|
||||
#if defined(F_FILESYSTEM)
|
||||
ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_READ);
|
||||
if(ftpc.fr == FR_OK){
|
||||
remain_filesize = ftpc.fil.fsize;
|
||||
printf("f_open return FR_OK\r\n");
|
||||
do{
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(remain_filesize > _MAX_SS)
|
||||
send_byte = _MAX_SS;
|
||||
else
|
||||
send_byte = remain_filesize;
|
||||
ftpc.fr = f_read(&(ftpc.fil), (void *)dbuf, send_byte , (UINT *)&blocklen);
|
||||
if(ftpc.fr != FR_OK){
|
||||
break;
|
||||
}
|
||||
printf("#");
|
||||
send(DATA_SOCK, dbuf, blocklen);
|
||||
remain_filesize -= blocklen;
|
||||
}while(remain_filesize != 0);
|
||||
printf("\r\nFile read finished\r\n");
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
}
|
||||
else{
|
||||
printf("File Open Error: %d\r\n", ftpc.fr);
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
}
|
||||
#else
|
||||
remain_filesize = strlen(ftpc.filename);
|
||||
do{
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
blocklen = sprintf(dbuf, "%s", ftpc.filename);
|
||||
printf("########## dbuf:%s\r\n", dbuf);
|
||||
send(DATA_SOCK, dbuf, blocklen);
|
||||
remain_filesize -= blocklen;
|
||||
}while(remain_filesize != 0);
|
||||
#endif
|
||||
gDataPutGetStart = 0;
|
||||
Command.Second = s_nocmd;
|
||||
disconnect(DATA_SOCK);
|
||||
break;
|
||||
case s_get:
|
||||
printf("get waiting...\r\n");
|
||||
if(strlen(ftpc.workingdir) == 1)
|
||||
sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
|
||||
else
|
||||
sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
|
||||
#if defined(F_FILESYSTEM)
|
||||
ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||
if(ftpc.fr == FR_OK){
|
||||
printf("f_open return FR_OK\r\n");
|
||||
while(1){
|
||||
if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
|
||||
while(1){
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(remain_datasize > _MAX_SS) recv_byte = _MAX_SS;
|
||||
else recv_byte = remain_datasize;
|
||||
ret = recv(DATA_SOCK, dbuf, recv_byte);
|
||||
ftpc.fr = f_write(&(ftpc.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen);
|
||||
remain_datasize -= blocklen;
|
||||
if(ftpc.fr != FR_OK){
|
||||
printf("f_write failed\r\n");
|
||||
break;
|
||||
}
|
||||
if(remain_datasize <= 0) break;
|
||||
}
|
||||
if(ftpc.fr != FR_OK){
|
||||
printf("f_write failed\r\n");
|
||||
break;
|
||||
}
|
||||
printf("#");
|
||||
}
|
||||
else{
|
||||
if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED) break;
|
||||
}
|
||||
}
|
||||
printf("\r\nFile write finished\r\n");
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
gDataPutGetStart = 0;
|
||||
}else{
|
||||
printf("File Open Error: %d\r\n", ftpc.fr);
|
||||
}
|
||||
#else
|
||||
while(1){
|
||||
if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
|
||||
while(1){
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(remain_datasize > _MAX_SS)
|
||||
recv_byte = _MAX_SS;
|
||||
else
|
||||
recv_byte = remain_datasize;
|
||||
ret = recv(DATA_SOCK, dbuf, recv_byte);
|
||||
printf("########## dbuf:%s\r\n", dbuf);
|
||||
remain_datasize -= ret;
|
||||
if(remain_datasize <= 0)
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED)
|
||||
break;
|
||||
}
|
||||
}
|
||||
gDataPutGetStart = 0;
|
||||
Command.Second = s_nocmd;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
printf("Command.Second = default\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SOCK_CLOSE_WAIT :
|
||||
printf("%d:CloseWait\r\n",DATA_SOCK);
|
||||
if((ret=disconnect(DATA_SOCK)) != SOCK_OK) return ret;
|
||||
printf("%d:Closed\r\n",DATA_SOCK);
|
||||
break;
|
||||
case SOCK_CLOSED :
|
||||
if(ftpc.dsock_state == DATASOCK_READY){
|
||||
if(ftpc.dsock_mode == PASSIVE_MODE){
|
||||
printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
|
||||
if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
|
||||
printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
local_port++;
|
||||
if(local_port > 50000)
|
||||
local_port = 35000;
|
||||
}else{
|
||||
printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
|
||||
if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
|
||||
printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
local_port++;
|
||||
if(local_port > 50000)
|
||||
local_port = 35000;
|
||||
}
|
||||
ftpc.dsock_state = DATASOCK_START;
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCK_INIT :
|
||||
printf("%d:Opened\r\n",DATA_SOCK);
|
||||
if(ftpc.dsock_mode == ACTIVE_MODE){
|
||||
if( (ret = listen(DATA_SOCK)) != SOCK_OK){
|
||||
printf("%d:Listen error\r\n",DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
gDataSockReady = 1;
|
||||
printf("%d:Listen ok\r\n",DATA_SOCK);
|
||||
}else{
|
||||
if((ret = connect(DATA_SOCK, remote_ip.cVal, remote_port)) != SOCK_OK){
|
||||
printf("%d:Connect error\r\n", DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
gDataSockReady = 1;
|
||||
}
|
||||
connect_state_data_ftpc = 0;
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
char proc_ftpc(char * buf)
|
||||
{
|
||||
uint16_t Responses;
|
||||
uint8_t dat[30]={0,};
|
||||
|
||||
Responses =(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
|
||||
|
||||
switch(Responses){
|
||||
case R_220: /* Service ready for new user. */
|
||||
printf("\r\nInput your User ID > ");
|
||||
sprintf(dat,"USER %s\r\n", User_Keyboard_MSG());
|
||||
printf("\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
|
||||
case R_331: /* User name okay, need password. */
|
||||
printf("\r\nInput your Password > ");
|
||||
sprintf(dat,"PASS %s\r\n", User_Keyboard_MSG());
|
||||
printf("\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case R_230: /* User logged in, proceed */
|
||||
printf("\r\nUser logged in, proceed\r\n");
|
||||
|
||||
sprintf(dat,"TYPE %c\r\n", TransferAscii);
|
||||
ftpc.type = ASCII_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case R_200:
|
||||
if((ftpc.dsock_mode==ACTIVE_MODE)&&gModeActivePassiveflag){
|
||||
ftpc.dsock_state = DATASOCK_READY;
|
||||
gModeActivePassiveflag = 0;
|
||||
}
|
||||
else{
|
||||
gMenuStart = 1;
|
||||
}
|
||||
break;
|
||||
case R_150:
|
||||
switch(Command.First){
|
||||
case f_dir:
|
||||
Command.First = f_nocmd;
|
||||
Command.Second = s_dir;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
case f_get:
|
||||
Command.First = f_nocmd;
|
||||
Command.Second = s_get;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
case f_put:
|
||||
Command.First = f_nocmd;
|
||||
Command.Second = s_put;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
default :
|
||||
printf("Command.First = default\r\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case R_226:
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
case R_227:
|
||||
if (pportc(buf) == -1){
|
||||
printf("Bad port syntax\r\n");
|
||||
}
|
||||
else{
|
||||
printf("Go Open Data Sock...\r\n ");
|
||||
ftpc.dsock_mode = PASSIVE_MODE;
|
||||
ftpc.dsock_state = DATASOCK_READY;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("\r\nDefault Status = %d\r\n",(uint16_t)Responses);
|
||||
gDataSockReady = 1;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int pportc(char * arg)
|
||||
{
|
||||
int i;
|
||||
char* tok=0;
|
||||
strtok(arg,"(");
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if(i==0) tok = strtok(NULL,",\r\n");
|
||||
else tok = strtok(NULL,",");
|
||||
remote_ip.cVal[i] = (uint8_t)atoi(tok);
|
||||
if (!tok){
|
||||
printf("bad pport : %s\r\n", arg);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
remote_port = 0;
|
||||
for (i = 0; i < 2; i++){
|
||||
tok = strtok(NULL,",\r\n");
|
||||
remote_port <<= 8;
|
||||
remote_port += atoi(tok);
|
||||
if (!tok){
|
||||
printf("bad pport : %s\r\n", arg);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
printf("ip : %d.%d.%d.%d, port : %d\r\n", remote_ip.cVal[0], remote_ip.cVal[1], remote_ip.cVal[2], remote_ip.cVal[3], remote_port);
|
||||
return 0;
|
||||
}
|
||||
uint8_t* User_Keyboard_MSG()
|
||||
{
|
||||
uint8_t i=0;
|
||||
do{
|
||||
gMsgBuf[i] = ftp_getc();
|
||||
i++;
|
||||
}while(gMsgBuf[i-1]!=0x0d);
|
||||
gMsgBuf[i-1]=0;
|
||||
return gMsgBuf;
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
#ifndef _FTPC_H_
|
||||
#define _FTPC_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include "socket.h"
|
||||
|
||||
/* If you need this header, use it. */
|
||||
//#include "stdio_private.h"
|
||||
|
||||
#define F_APP_FTPC
|
||||
|
||||
/* If your target support a file system, you have to activate this feature and implement. */
|
||||
//#define F_FILESYSTEM
|
||||
|
||||
/* Change to your Chipset Uart function, you have to activate this feature and implement.
|
||||
* Change!! -> Board_UARTGetCharBlocking()
|
||||
* Below is an example of a function of lpc_chip library. */
|
||||
//#define ftp_getc() Board_UARTGetCharBlocking()
|
||||
|
||||
#ifdef F_FILESYSTEM
|
||||
#include "ff.h"
|
||||
#endif
|
||||
|
||||
#ifndef ftp_getc()
|
||||
#define Need_UARTGetCharBlocking_func
|
||||
#else
|
||||
/* Change library
|
||||
* Change!! -> board_api.h,
|
||||
* Below is an example of a function of lpc_chip library. */
|
||||
#include "board_api.h"
|
||||
#endif
|
||||
|
||||
|
||||
#define LINELEN 100
|
||||
#ifndef F_FILESYSTEM
|
||||
#define _MAX_SS 512
|
||||
#endif
|
||||
|
||||
#define CTRL_SOCK 2
|
||||
#define DATA_SOCK 3
|
||||
|
||||
/* FTP Responses */
|
||||
#define R_150 150 /* File status ok; opening data conn */
|
||||
#define R_200 200 /* 'Generic' command ok */
|
||||
#define R_220 220 /* Service ready for new user. */
|
||||
#define R_226 226 /* Closing data connection. File transfer/abort successful */
|
||||
#define R_227 227 /* Entering passive mode (h1,h2,h3,h4,p1,p2) */
|
||||
#define R_230 230 /* User logged in, proceed */
|
||||
#define R_331 331 /* User name okay, need password. */
|
||||
|
||||
#define TransferAscii 'A'
|
||||
#define TransferBinary 'I'
|
||||
|
||||
enum ftpc_type {
|
||||
ASCII_TYPE,
|
||||
IMAGE_TYPE,
|
||||
};
|
||||
|
||||
enum ftpc_datasock_state{
|
||||
DATASOCK_IDLE,
|
||||
DATASOCK_READY,
|
||||
DATASOCK_START
|
||||
};
|
||||
|
||||
enum ftpc_datasock_mode{
|
||||
PASSIVE_MODE,
|
||||
ACTIVE_MODE
|
||||
};
|
||||
enum CommandFirst {
|
||||
f_nocmd,
|
||||
f_dir,
|
||||
f_put,
|
||||
f_get,
|
||||
};
|
||||
enum CommandSecond {
|
||||
s_nocmd,
|
||||
s_dir,
|
||||
s_put,
|
||||
s_get,
|
||||
};
|
||||
struct Command {
|
||||
enum CommandFirst First;
|
||||
enum CommandSecond Second;
|
||||
};
|
||||
struct ftpc {
|
||||
uint8_t control; /* Control stream */
|
||||
uint8_t data; /* Data stream */
|
||||
|
||||
enum ftpc_type type; /* Transfer type */
|
||||
|
||||
enum ftpc_datasock_state dsock_state;
|
||||
enum ftpc_datasock_mode dsock_mode;
|
||||
|
||||
char workingdir[LINELEN];
|
||||
char filename[LINELEN];
|
||||
|
||||
#ifdef F_FILESYSTEM
|
||||
FIL fil; // FatFs File objects
|
||||
FRESULT fr; // FatFs function common result code
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifndef un_I2cval
|
||||
typedef union _un_l2cval {
|
||||
uint32_t lVal;
|
||||
uint8_t cVal[4];
|
||||
}un_l2cval;
|
||||
#endif
|
||||
|
||||
void ftpc_init(uint8_t * src_ip);
|
||||
uint8_t ftpc_run(uint8_t * dbuf);
|
||||
char proc_ftpc(char * buf);
|
||||
int pportc(char * arg);
|
||||
uint8_t* User_Keyboard_MSG();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _FTPC_H_
|
||||
@@ -1,75 +0,0 @@
|
||||
/* Copyright (c) 2002, Joerg Wunsch
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* $Id: stdio_private.h,v 1.6 2003/01/07 22:17:24 joerg_wunsch Exp $ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct __file {
|
||||
char *buf; /* buffer pointer */
|
||||
unsigned char unget; /* ungetc() buffer */
|
||||
uint8_t flags; /* flags, see below */
|
||||
#define __SRD 0x0001 /* OK to read */
|
||||
#define __SWR 0x0002 /* OK to write */
|
||||
#define __SSTR 0x0004 /* this is an sprintf/snprintf string */
|
||||
#define __SPGM 0x0008 /* fmt string is in progmem */
|
||||
#define __SERR 0x0010 /* found error */
|
||||
#define __SEOF 0x0020 /* found EOF */
|
||||
#define __SUNGET 0x040 /* ungetc() happened */
|
||||
#if 0
|
||||
/* possible future extensions, will require uint16_t flags */
|
||||
#define __SRW 0x0080 /* open for reading & writing */
|
||||
#define __SLBF 0x0100 /* line buffered */
|
||||
#define __SNBF 0x0200 /* unbuffered */
|
||||
#define __SMBF 0x0400 /* buf is from malloc */
|
||||
#endif
|
||||
int size; /* size of buffer */
|
||||
int len; /* characters read or written so far */
|
||||
int (*put)(char); /* function to write one char to device */
|
||||
int (*get)(void); /* function to read one char from device */
|
||||
};
|
||||
|
||||
/* values for PRINTF_LEVEL */
|
||||
#define PRINTF_MIN 1
|
||||
#define PRINTF_STD 2
|
||||
#define PRINTF_FLT 3
|
||||
|
||||
/* values for SCANF_LEVEL */
|
||||
#define SCANF_MIN 1
|
||||
#define SCANF_STD 2
|
||||
#define SCANF_FLT 3
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -1,64 +0,0 @@
|
||||
# FTP Server
|
||||
|
||||
## init wizchip
|
||||
### variable and function
|
||||
|
||||
uint8_t gFTPBUF[_MAX_SS];
|
||||
uint8_t wiznet_memsize[2][8] = {{8,8,8,8,8,8,8,8}, {8,8,8,8,8,8,8,8}};
|
||||
#define ETH_MAX_BUF_SIZE 2048
|
||||
uint8_t ethBuf0[ETH_MAX_BUF_SIZE];
|
||||
wiz_NetInfo gWIZNETINFO = {
|
||||
.mac = {0x00, 0x08, 0xdc, 0x11, 0x22, 0x33},
|
||||
.ip = {192, 168, 15, 111},
|
||||
.sn = {255, 255, 255, 0},
|
||||
.gw = {192, 168, 15, 1},
|
||||
.dns = {8, 8, 8, 8},
|
||||
.dhcp = NETINFO_STATIC
|
||||
|
||||
|
||||
|
||||
### run init funciton in main funcion
|
||||
|
||||
Reset_WIZCHIP();
|
||||
reg_wizchip_bus_cbfunc(Chip_read, Chip_write);
|
||||
reg_wizchip_cs_cbfunc(ChipCsEnable, ChipCsDisable);
|
||||
|
||||
if (ctlwizchip(CW_INIT_WIZCHIP, (void*)wiznet_memsize) == -1)
|
||||
{
|
||||
printf("WIZchip memory initialization failed\r\n");
|
||||
}
|
||||
|
||||
ctlnetwork(CN_SET_NETINFO, (void *)&gWIZNETINFO);
|
||||
print_network_information();
|
||||
|
||||
|
||||
## Run function
|
||||
|
||||
if((ret = ftpd_run(gFTPBUF)) < 0)
|
||||
{
|
||||
porintf(" FTP server Error %d \r\n", ret);
|
||||
}
|
||||
|
||||
## FTP ID & PASSWORD
|
||||
|
||||
### USED ID
|
||||
#### ID Enable in ftpd_init function
|
||||
|
||||
ftp.ID_Enable = STATUS_USED;
|
||||
|
||||
#### ID Setting
|
||||
|
||||
#define ftp_ID "wiznet"
|
||||
|
||||
### USED PASSWORD
|
||||
#### PW Enable in ftpd_init function
|
||||
|
||||
ftp.PW_Enable = STATUS_USED;
|
||||
|
||||
#### PW Setting
|
||||
|
||||
#define ftp_PW "wiznet54321"
|
||||
|
||||
### Connedtion remain count
|
||||
|
||||
#define remain_time 400000
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,167 +0,0 @@
|
||||
#ifndef _FTPD_H_
|
||||
#define _FTPD_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Wiznet.
|
||||
* (c) Copyright 2002, Wiznet.
|
||||
*
|
||||
* Filename : ftpd.h
|
||||
* Version : 1.0
|
||||
* Programmer(s) :
|
||||
* Created : 2003/01/28
|
||||
* Description : Header file of FTP daemon. (AVR-GCC Compiler)
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
//#define F_FILESYSTEM // If your target support a file system, you have to activate this feature and implement.
|
||||
|
||||
#if defined(F_FILESYSTEM)
|
||||
#include "ff.h"
|
||||
#endif
|
||||
|
||||
#define F_APP_FTP
|
||||
#define _FTP_DEBUG_
|
||||
|
||||
|
||||
#define LINELEN 100
|
||||
//#define DATA_BUF_SIZE 100
|
||||
#if !defined(F_FILESYSTEM)
|
||||
#define _MAX_SS 512
|
||||
#endif
|
||||
|
||||
#define CTRL_SOCK 2
|
||||
#define DATA_SOCK 3
|
||||
#define CTRL_SOCK1 4
|
||||
|
||||
|
||||
#define IPPORT_FTPD 20 /* FTP Data port */
|
||||
#define IPPORT_FTP 21 /* FTP Control port */
|
||||
|
||||
#define HOSTNAME "iinChip"
|
||||
#define VERSION "1.0"
|
||||
|
||||
#define FILENAME "a.txt"
|
||||
|
||||
/* FTP commands */
|
||||
enum ftp_cmd {
|
||||
USER_CMD,
|
||||
ACCT_CMD,
|
||||
PASS_CMD,
|
||||
TYPE_CMD,
|
||||
LIST_CMD,
|
||||
CWD_CMD,
|
||||
DELE_CMD,
|
||||
NAME_CMD,
|
||||
QUIT_CMD,
|
||||
RETR_CMD,
|
||||
STOR_CMD,
|
||||
PORT_CMD,
|
||||
NLST_CMD,
|
||||
PWD_CMD,
|
||||
XPWD_CMD,
|
||||
MKD_CMD,
|
||||
XMKD_CMD,
|
||||
XRMD_CMD,
|
||||
RMD_CMD,
|
||||
STRU_CMD,
|
||||
MODE_CMD,
|
||||
SYST_CMD,
|
||||
XMD5_CMD,
|
||||
XCWD_CMD,
|
||||
FEAT_CMD,
|
||||
PASV_CMD,
|
||||
SIZE_CMD,
|
||||
MLSD_CMD,
|
||||
APPE_CMD,
|
||||
NO_CMD,
|
||||
};
|
||||
|
||||
enum ftp_type {
|
||||
ASCII_TYPE,
|
||||
IMAGE_TYPE,
|
||||
LOGICAL_TYPE
|
||||
};
|
||||
|
||||
enum ftp_state {
|
||||
FTPS_NOT_LOGIN,
|
||||
FTPS_LOGIN
|
||||
};
|
||||
|
||||
enum datasock_state{
|
||||
DATASOCK_IDLE,
|
||||
DATASOCK_READY,
|
||||
DATASOCK_START
|
||||
};
|
||||
|
||||
enum datasock_mode{
|
||||
PASSIVE_MODE,
|
||||
ACTIVE_MODE
|
||||
};
|
||||
|
||||
enum ftp_use_status{
|
||||
STATUS_USED,
|
||||
STATUS_NOT_USED
|
||||
};
|
||||
|
||||
struct ftpd {
|
||||
uint8_t control; /* Control stream */
|
||||
uint8_t data; /* Data stream */
|
||||
|
||||
enum ftp_type type; /* Transfer type */
|
||||
enum ftp_state state;
|
||||
|
||||
enum ftp_cmd current_cmd;
|
||||
|
||||
enum datasock_state dsock_state;
|
||||
enum datasock_mode dsock_mode;
|
||||
|
||||
enum ftp_use_status ID_Enable;
|
||||
enum ftp_use_status PW_Enable;
|
||||
|
||||
char username[LINELEN]; /* Arg to USER command */
|
||||
char userpassword[LINELEN];
|
||||
char workingdir[LINELEN];
|
||||
char filename[LINELEN];
|
||||
|
||||
#if defined(F_FILESYSTEM)
|
||||
FIL fil; // FatFs File objects
|
||||
FRESULT fr; // FatFs function common result code
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#ifndef un_I2cval
|
||||
typedef union _un_l2cval {
|
||||
uint32_t lVal;
|
||||
uint8_t cVal[4];
|
||||
}un_l2cval;
|
||||
#endif
|
||||
|
||||
void ftpd_init(uint8_t * src_ip);
|
||||
uint8_t ftpd_run(uint8_t * dbuf);
|
||||
char proc_ftpd(uint8_t sn, char * buf);
|
||||
|
||||
char ftplogin(uint8_t sn,char * pass);
|
||||
|
||||
int pport(char * arg);
|
||||
|
||||
int sendit(char * command);
|
||||
int recvit(char * command);
|
||||
|
||||
long sendfile(uint8_t s, char * command);
|
||||
long recvfile(uint8_t s);
|
||||
|
||||
#if defined(F_FILESYSTEM)
|
||||
void print_filedsc(FIL *fil);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _FTPD_H_
|
||||
@@ -1,74 +0,0 @@
|
||||
/* Copyright (c) 2002, Joerg Wunsch
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* $Id: stdio_private.h,v 1.6 2003/01/07 22:17:24 joerg_wunsch Exp $ */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct __file {
|
||||
char *buf; /* buffer pointer */
|
||||
unsigned char unget; /* ungetc() buffer */
|
||||
uint8_t flags; /* flags, see below */
|
||||
#define __SRD 0x0001 /* OK to read */
|
||||
#define __SWR 0x0002 /* OK to write */
|
||||
#define __SSTR 0x0004 /* this is an sprintf/snprintf string */
|
||||
#define __SPGM 0x0008 /* fmt string is in progmem */
|
||||
#define __SERR 0x0010 /* found error */
|
||||
#define __SEOF 0x0020 /* found EOF */
|
||||
#define __SUNGET 0x040 /* ungetc() happened */
|
||||
#if 0
|
||||
/* possible future extensions, will require uint16_t flags */
|
||||
#define __SRW 0x0080 /* open for reading & writing */
|
||||
#define __SLBF 0x0100 /* line buffered */
|
||||
#define __SNBF 0x0200 /* unbuffered */
|
||||
#define __SMBF 0x0400 /* buf is from malloc */
|
||||
#endif
|
||||
int size; /* size of buffer */
|
||||
int len; /* characters read or written so far */
|
||||
int (*put)(char); /* function to write one char to device */
|
||||
int (*get)(void); /* function to read one char from device */
|
||||
};
|
||||
|
||||
/* values for PRINTF_LEVEL */
|
||||
#define PRINTF_MIN 1
|
||||
#define PRINTF_STD 2
|
||||
#define PRINTF_FLT 3
|
||||
|
||||
/* values for SCANF_LEVEL */
|
||||
#define SCANF_MIN 1
|
||||
#define SCANF_STD 2
|
||||
#define SCANF_FLT 3
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -1,927 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "socket.h"
|
||||
#include "snmp.h"
|
||||
#include "snmp_custom.h"
|
||||
|
||||
/********************************************************************************************/
|
||||
/* SNMP : Functions declaration */
|
||||
/********************************************************************************************/
|
||||
// SNMP Parsing functions
|
||||
int32_t findEntry(uint8_t *oid, int32_t len);
|
||||
int32_t getOID(int32_t id, uint8_t *oid, uint8_t *len);
|
||||
int32_t getValue( uint8_t *vptr, int32_t vlen);
|
||||
int32_t getEntry(int32_t id, uint8_t *dataType, void *ptr, int32_t *len);
|
||||
int32_t setEntry(int32_t id, void *val, int32_t vlen, uint8_t dataType, int32_t index);
|
||||
int32_t makeTrapVariableBindings(dataEntryType *oid_data, void *ptr, uint32_t *len);
|
||||
|
||||
int32_t parseLength(const uint8_t *msg, int32_t *len);
|
||||
int32_t parseTLV(const uint8_t *msg, int32_t index, tlvStructType *tlv);
|
||||
void insertRespLen(int32_t reqStart, int32_t respStart, int32_t size);
|
||||
int32_t parseVarBind(int32_t reqType, int32_t index);
|
||||
int32_t parseSequence(int32_t reqType, int32_t index);
|
||||
int32_t parseSequenceOf(int32_t reqType);
|
||||
int32_t parseRequest();
|
||||
int32_t parseCommunity();
|
||||
int32_t parseVersion();
|
||||
int32_t parseSNMPMessage();
|
||||
|
||||
// Debugging function
|
||||
#ifdef _SNMP_DEBUG_
|
||||
void dumpCode(uint8_t* header, uint8_t* tail, uint8_t *buff, int32_t len);
|
||||
#endif
|
||||
|
||||
// Utils
|
||||
void ipToByteArray(int8_t *ip, uint8_t *pDes);
|
||||
|
||||
/********************************************************************************************/
|
||||
/* SNMP : Variable declaration */
|
||||
/********************************************************************************************/
|
||||
// SNMP message structures
|
||||
struct messageStruct request_msg;
|
||||
struct messageStruct response_msg;
|
||||
|
||||
// SNMP Time counter
|
||||
static time_t startTime = 0;
|
||||
volatile uint32_t snmp_tick_10ms = 0; //volatile uint32_t snmp_tick_1ms = 0;
|
||||
|
||||
// SNMP Sockets
|
||||
static uint8_t SOCK_SNMP_AGENT;
|
||||
static uint8_t SOCK_SNMP_TRAP;
|
||||
|
||||
uint8_t packet_trap[MAX_TRAPMSG_LEN] = {0,};
|
||||
uint8_t errorStatus, errorIndex;
|
||||
|
||||
|
||||
/********************************************************************************************/
|
||||
/* SNMP : Time handler */
|
||||
/********************************************************************************************/
|
||||
void currentUptime(void *ptr, uint8_t *len)
|
||||
{
|
||||
time_t curTime = getSNMPTimeTick();
|
||||
|
||||
//*(uint32_t *)ptr = (uint32_t)(curTime - startTime) / 10; // calculation for 1ms tick
|
||||
*(uint32_t *)ptr = (uint32_t)(curTime - startTime); // calculation for 10ms tick
|
||||
*len = 4;
|
||||
}
|
||||
|
||||
void SNMP_time_handler(void)
|
||||
{
|
||||
//snmp_tick_1ms++;
|
||||
snmp_tick_10ms++;
|
||||
}
|
||||
|
||||
uint32_t getSNMPTimeTick(void)
|
||||
{
|
||||
//return snmp_tick_1ms;
|
||||
return snmp_tick_10ms;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************************/
|
||||
/* SNMP : Library Part */
|
||||
/********************************************************************************************/
|
||||
/**
|
||||
* @addtogroup snmp_module
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialize SNMP Daemon.
|
||||
* This should be called just one time at first time
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*/
|
||||
void snmpd_init(uint8_t * managerIP, uint8_t * agentIP, uint8_t sn_agent, uint8_t sn_trap)
|
||||
{
|
||||
#ifdef _SNMP_DEBUG_
|
||||
printf("\r\n - SNMP : Start SNMP Agent Daemon\r\n");
|
||||
#endif
|
||||
SOCK_SNMP_AGENT = sn_agent;
|
||||
SOCK_SNMP_TRAP = sn_trap;
|
||||
|
||||
if((SOCK_SNMP_AGENT > _WIZCHIP_SOCK_NUM_) || (SOCK_SNMP_TRAP > _WIZCHIP_SOCK_NUM_)) return;
|
||||
|
||||
startTime = getSNMPTimeTick(); // Start time (unit: 10ms)
|
||||
initTable(); // Settings for OID entry values
|
||||
|
||||
initial_Trap(managerIP, agentIP);
|
||||
|
||||
/*
|
||||
// Example Codes for SNMP Trap
|
||||
{
|
||||
dataEntryType enterprise_oid = {0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00},
|
||||
SNMPDTYPE_OBJ_ID, 0x0a, {"\x2b\x06\x01\x04\x01\x81\x9b\x19\x10\x00"}, NULL, NULL};
|
||||
|
||||
dataEntryType trap_oid1 = {8, {0x2b, 6, 1, 4, 1, 0, 11, 0}, SNMPDTYPE_OCTET_STRING, 30, {""}, NULL, NULL};
|
||||
dataEntryType trap_oid2 = {8, {0x2b, 6, 1, 4, 1, 0, 12, 0}, SNMPDTYPE_INTEGER, 4, {""}, NULL, NULL};
|
||||
|
||||
strcpy((char *)trap_oid1.u.octetstring, "Alert!!!"); // String added
|
||||
trap_oid2.u.intval = 123456; // Integer value added
|
||||
|
||||
// Generic Trap: warmStart
|
||||
snmp_sendTrap((void *)"192.168.0.214", (void *)"192.168.0.112", (void *)"public", enterprise_oid, SNMPTRAP_WARMSTART, 0, 0);
|
||||
|
||||
// Enterprise-Specific Trap
|
||||
snmp_sendTrap((void *)"192.168.0.214", (void *)"192.168.0.112", (void *)"public", enterprise_oid, 6, 0, 2, &trap_oid1, &trap_oid2);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* SNMP Process Handler.
|
||||
* UDP Socket and SNMP Agent transaction handling.
|
||||
*
|
||||
* @param none
|
||||
* @return none
|
||||
*/
|
||||
|
||||
int32_t snmpd_run(void)
|
||||
{
|
||||
int32_t ret;
|
||||
int32_t len = 0;
|
||||
|
||||
uint8_t svr_addr[6];
|
||||
uint16_t svr_port;
|
||||
|
||||
if(SOCK_SNMP_AGENT > _WIZCHIP_SOCK_NUM_) return -99;
|
||||
|
||||
switch(getSn_SR(SOCK_SNMP_AGENT))
|
||||
{
|
||||
case SOCK_UDP :
|
||||
if ( (len = getSn_RX_RSR(SOCK_SNMP_AGENT)) > 0)
|
||||
{
|
||||
request_msg.len= recvfrom(SOCK_SNMP_AGENT, request_msg.buffer, len, svr_addr, &svr_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
request_msg.len = 0;
|
||||
}
|
||||
|
||||
if (request_msg.len > 0)
|
||||
{
|
||||
#ifdef _SNMP_DEBUG_
|
||||
dumpCode((void *)"\r\n[Request]\r\n", (void *)"\r\n", request_msg.buffer, request_msg.len);
|
||||
#endif
|
||||
// Initialize
|
||||
request_msg.index = 0;
|
||||
response_msg.index = 0;
|
||||
errorStatus = errorIndex = 0;
|
||||
memset(response_msg.buffer, 0x00, MAX_SNMPMSG_LEN);
|
||||
|
||||
// Received message parsing and send response process
|
||||
if (parseSNMPMessage() != -1)
|
||||
{
|
||||
sendto(SOCK_SNMP_AGENT, response_msg.buffer, response_msg.index, svr_addr, svr_port);
|
||||
}
|
||||
|
||||
#ifdef _SNMP_DEBUG_
|
||||
dumpCode((void *)"\r\n[Response]\r\n", (void *)"\r\n", response_msg.buffer, response_msg.index);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCK_CLOSED :
|
||||
if((ret = socket(SOCK_SNMP_AGENT, Sn_MR_UDP, PORT_SNMP_AGENT, 0x00)) != SOCK_SNMP_AGENT)
|
||||
return ret;
|
||||
#ifdef _SNMP_DEBUG_
|
||||
printf(" - [%d] UDP Socket for SNMP Agent, port [%d]\r\n", SOCK_SNMP_AGENT, PORT_SNMP_AGENT);
|
||||
#endif
|
||||
break;
|
||||
|
||||
default :
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int32_t findEntry(uint8_t *oid, int32_t len)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i = 0 ; i < maxData ; i++)
|
||||
{
|
||||
if (len == snmpData[i].oidlen)
|
||||
{
|
||||
if (!memcmp(snmpData[i].oid, oid, len)) return(i);
|
||||
}
|
||||
}
|
||||
|
||||
return OID_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
int32_t getOID(int32_t id, uint8_t *oid, uint8_t *len)
|
||||
{
|
||||
int32_t j;
|
||||
|
||||
if (!((id >= 0) && (id < maxData))) return INVALID_ENTRY_ID;
|
||||
|
||||
*len = snmpData[id].oidlen;
|
||||
|
||||
for (j = 0 ; j < *len ; j++)
|
||||
{
|
||||
oid[j] = snmpData[id].oid[j];
|
||||
}
|
||||
|
||||
return SNMP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int32_t getValue( uint8_t *vptr, int32_t vlen)
|
||||
{
|
||||
int32_t index = 0;
|
||||
int32_t value = 0;
|
||||
|
||||
while (index < vlen)
|
||||
{
|
||||
if (index != 0) value <<= 8;
|
||||
value |= vptr[index++];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
int32_t getEntry(int32_t id, uint8_t *dataType, void *ptr, int32_t *len)
|
||||
{
|
||||
uint8_t * ptr_8;
|
||||
int32_t value;
|
||||
|
||||
uint8_t * string;
|
||||
int32_t j;
|
||||
|
||||
if (!((id >= 0) && (id < maxData))) return INVALID_ENTRY_ID;
|
||||
|
||||
*dataType = snmpData[id].dataType;
|
||||
|
||||
switch(*dataType)
|
||||
{
|
||||
case SNMPDTYPE_OCTET_STRING :
|
||||
case SNMPDTYPE_OBJ_ID :
|
||||
{
|
||||
string = ptr;
|
||||
|
||||
if (snmpData[id].getfunction != NULL)
|
||||
{
|
||||
snmpData[id].getfunction( (void *)&snmpData[id].u.octetstring, &snmpData[id].dataLen );
|
||||
}
|
||||
|
||||
if ( (*dataType)==SNMPDTYPE_OCTET_STRING )
|
||||
{
|
||||
snmpData[id].dataLen = (uint8_t)strlen((char const*)&snmpData[id].u.octetstring);
|
||||
}
|
||||
|
||||
*len = snmpData[id].dataLen;
|
||||
for (j = 0 ; j < *len ; j++)
|
||||
{
|
||||
string[j] = snmpData[id].u.octetstring[j];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SNMPDTYPE_INTEGER :
|
||||
case SNMPDTYPE_TIME_TICKS :
|
||||
case SNMPDTYPE_COUNTER :
|
||||
case SNMPDTYPE_GAUGE :
|
||||
{
|
||||
if (snmpData[id].getfunction != NULL)
|
||||
{
|
||||
snmpData[id].getfunction( (void *)&snmpData[id].u.intval, &snmpData[id].dataLen );
|
||||
}
|
||||
|
||||
if(snmpData[id].dataLen) *len = snmpData[id].dataLen;
|
||||
else *len = sizeof(uint32_t);
|
||||
|
||||
/*
|
||||
// Original code (IAR, STM32)
|
||||
// This code is not working in NXP+LPCXpresso (32-bit pointer operation error)
|
||||
value = (int32_t *)ptr;
|
||||
*value = HTONL(snmpData[id].u.intval);
|
||||
*/
|
||||
|
||||
ptr_8 = ptr;
|
||||
//value = HTONL(snmpData[id].u.intval); // Endian convert when processing 32bit pointer operation
|
||||
value = snmpData[id].u.intval;
|
||||
|
||||
for (j = 0 ; j < *len ; j++)
|
||||
{
|
||||
ptr_8[j] = (uint8_t)((value >> ((*len-j-1)*8)));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
return INVALID_DATA_TYPE;
|
||||
}
|
||||
|
||||
return SNMP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int32_t setEntry(int32_t id, void *val, int32_t vlen, uint8_t dataType, int32_t index)
|
||||
{
|
||||
|
||||
int32_t retStatus=OID_NOT_FOUND;
|
||||
int32_t j;
|
||||
|
||||
if (snmpData[id].dataType != dataType)
|
||||
{
|
||||
errorStatus = BAD_VALUE;
|
||||
errorIndex = index;
|
||||
return INVALID_DATA_TYPE;
|
||||
}
|
||||
|
||||
switch(snmpData[id].dataType)
|
||||
{
|
||||
case SNMPDTYPE_OCTET_STRING :
|
||||
case SNMPDTYPE_OBJ_ID :
|
||||
{
|
||||
uint8_t *string = val;
|
||||
for (j = 0 ; j < vlen ; j++)
|
||||
{
|
||||
snmpData[id].u.octetstring[j] = string[j];
|
||||
}
|
||||
snmpData[id].dataLen = vlen;
|
||||
}
|
||||
retStatus = SNMP_SUCCESS;
|
||||
break;
|
||||
|
||||
case SNMPDTYPE_INTEGER :
|
||||
case SNMPDTYPE_TIME_TICKS :
|
||||
case SNMPDTYPE_COUNTER :
|
||||
case SNMPDTYPE_GAUGE :
|
||||
{
|
||||
snmpData[id].u.intval = getValue( (uint8_t *)val, vlen);
|
||||
snmpData[id].dataLen = vlen;
|
||||
|
||||
if (snmpData[id].setfunction != NULL)
|
||||
{
|
||||
snmpData[id].setfunction(snmpData[id].u.intval);
|
||||
}
|
||||
|
||||
}
|
||||
retStatus = SNMP_SUCCESS;
|
||||
break;
|
||||
|
||||
default :
|
||||
retStatus = INVALID_DATA_TYPE;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return retStatus;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseLength(const uint8_t *msg, int32_t *len)
|
||||
{
|
||||
int32_t i=1;
|
||||
|
||||
if (msg[0] & 0x80)
|
||||
{
|
||||
int32_t tlen = (msg[0] & 0x7f) - 1;
|
||||
*len = msg[i++];
|
||||
|
||||
while (tlen--)
|
||||
{
|
||||
*len <<= 8;
|
||||
*len |= msg[i++];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*len = msg[0];
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseTLV(const uint8_t *msg, int32_t index, tlvStructType *tlv)
|
||||
{
|
||||
int32_t Llen = 0;
|
||||
|
||||
tlv->start = index;
|
||||
|
||||
Llen = parseLength((const uint8_t *)&msg[index+1], &tlv->len );
|
||||
|
||||
tlv->vstart = index + Llen + 1;
|
||||
|
||||
switch (msg[index])
|
||||
{
|
||||
case SNMPDTYPE_SEQUENCE:
|
||||
case GET_REQUEST:
|
||||
case GET_NEXT_REQUEST:
|
||||
case SET_REQUEST:
|
||||
tlv->nstart = tlv->vstart;
|
||||
break;
|
||||
default:
|
||||
tlv->nstart = tlv->vstart + tlv->len;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void insertRespLen(int32_t reqStart, int32_t respStart, int32_t size)
|
||||
{
|
||||
int32_t indexStart, lenLength;
|
||||
uint32_t mask = 0xff;
|
||||
int32_t shift = 0;
|
||||
|
||||
if (request_msg.buffer[reqStart+1] & 0x80)
|
||||
{
|
||||
lenLength = request_msg.buffer[reqStart+1] & 0x7f;
|
||||
indexStart = respStart+2;
|
||||
|
||||
while (lenLength--)
|
||||
{
|
||||
response_msg.buffer[indexStart+lenLength] =
|
||||
(uint8_t)((size & mask) >> shift);
|
||||
shift+=8;
|
||||
mask <<= shift;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
response_msg.buffer[respStart+1] = (uint8_t)(size & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t parseVarBind(int32_t reqType, int32_t index)
|
||||
{
|
||||
int32_t seglen = 0, id;
|
||||
tlvStructType name, value;
|
||||
int32_t size = 0;
|
||||
|
||||
//extern const int32_t maxData;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &name);
|
||||
|
||||
if ( request_msg.buffer[name.start] != SNMPDTYPE_OBJ_ID ) return -1;
|
||||
|
||||
id = findEntry(&request_msg.buffer[name.vstart], name.len);
|
||||
|
||||
if ((reqType == GET_REQUEST) || (reqType == SET_REQUEST))
|
||||
{
|
||||
seglen = name.nstart - name.start;
|
||||
COPY_SEGMENT(name);
|
||||
size = seglen;
|
||||
}
|
||||
else if (reqType == GET_NEXT_REQUEST)
|
||||
{
|
||||
response_msg.buffer[response_msg.index] = request_msg.buffer[name.start];
|
||||
|
||||
if (++id >= maxData)
|
||||
{
|
||||
id = OID_NOT_FOUND;
|
||||
seglen = name.nstart - name.start;
|
||||
COPY_SEGMENT(name);
|
||||
size = seglen;
|
||||
}
|
||||
else
|
||||
{
|
||||
request_msg.index += name.nstart - name.start;
|
||||
|
||||
getOID(id, &response_msg.buffer[response_msg.index+2], &response_msg.buffer[response_msg.index+1]);
|
||||
|
||||
seglen = response_msg.buffer[response_msg.index+1]+2;
|
||||
response_msg.index += seglen ;
|
||||
size = seglen;
|
||||
}
|
||||
}
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &value);
|
||||
|
||||
if (id != OID_NOT_FOUND)
|
||||
{
|
||||
uint8_t dataType;
|
||||
int32_t len;
|
||||
|
||||
if ((reqType == GET_REQUEST) || (reqType == GET_NEXT_REQUEST))
|
||||
{
|
||||
getEntry(id, &dataType, &response_msg.buffer[response_msg.index+2], &len);
|
||||
|
||||
response_msg.buffer[response_msg.index] = dataType;
|
||||
response_msg.buffer[response_msg.index+1] = len;
|
||||
seglen = (2 + len);
|
||||
response_msg.index += seglen;
|
||||
|
||||
request_msg.index += (value.nstart - value.start);
|
||||
|
||||
}
|
||||
else if (reqType == SET_REQUEST)
|
||||
{
|
||||
setEntry(id, &request_msg.buffer[value.vstart], value.len, request_msg.buffer[value.start], index);
|
||||
seglen = value.nstart - value.start;
|
||||
COPY_SEGMENT(value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
seglen = value.nstart - value.start;
|
||||
COPY_SEGMENT(value);
|
||||
|
||||
errorIndex = index;
|
||||
errorStatus = NO_SUCH_NAME;
|
||||
}
|
||||
|
||||
size += seglen;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseSequence(int32_t reqType, int32_t index)
|
||||
{
|
||||
int32_t seglen;
|
||||
tlvStructType seq;
|
||||
int32_t size = 0, respLoc;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &seq);
|
||||
|
||||
if ( request_msg.buffer[seq.start] != SNMPDTYPE_SEQUENCE ) return -1;
|
||||
|
||||
seglen = seq.vstart - seq.start;
|
||||
respLoc = response_msg.index;
|
||||
COPY_SEGMENT(seq);
|
||||
|
||||
size = parseVarBind( reqType, index );
|
||||
insertRespLen(seq.start, respLoc, size);
|
||||
size += seglen;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseSequenceOf(int32_t reqType)
|
||||
{
|
||||
int32_t seglen;
|
||||
tlvStructType seqof;
|
||||
int32_t size = 0, respLoc;
|
||||
int32_t index = 0;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &seqof);
|
||||
|
||||
if ( request_msg.buffer[seqof.start] != SNMPDTYPE_SEQUENCE_OF ) return -1;
|
||||
|
||||
seglen = seqof.vstart - seqof.start;
|
||||
respLoc = response_msg.index;
|
||||
COPY_SEGMENT(seqof);
|
||||
|
||||
while (request_msg.index < request_msg.len)
|
||||
{
|
||||
size += parseSequence( reqType, index++ );
|
||||
}
|
||||
|
||||
insertRespLen(seqof.start, respLoc, size);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseRequest()
|
||||
{
|
||||
int32_t ret, seglen;
|
||||
tlvStructType snmpreq, requestid, errStatus, errIndex;
|
||||
int32_t size = 0, respLoc, reqType;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &snmpreq);
|
||||
|
||||
reqType = request_msg.buffer[snmpreq.start];
|
||||
|
||||
if ( !VALID_REQUEST(reqType) ) return -1;
|
||||
|
||||
seglen = snmpreq.vstart - snmpreq.start;
|
||||
respLoc = snmpreq.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(snmpreq);
|
||||
|
||||
response_msg.buffer[snmpreq.start] = GET_RESPONSE;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &requestid);
|
||||
seglen = requestid.nstart - requestid.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(requestid);
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &errStatus);
|
||||
seglen = errStatus.nstart - errStatus.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(errStatus);
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &errIndex);
|
||||
seglen = errIndex.nstart - errIndex.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(errIndex);
|
||||
|
||||
ret = parseSequenceOf(reqType);
|
||||
if (ret == -1) return -1;
|
||||
else size += ret;
|
||||
|
||||
insertRespLen(snmpreq.start, respLoc, size);
|
||||
|
||||
if (errorStatus)
|
||||
{
|
||||
response_msg.buffer[errStatus.vstart] = errorStatus;
|
||||
response_msg.buffer[errIndex.vstart] = errorIndex + 1;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseCommunity()
|
||||
{
|
||||
int32_t seglen;
|
||||
tlvStructType community;
|
||||
int32_t size=0;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &community);
|
||||
|
||||
if (!((request_msg.buffer[community.start] == SNMPDTYPE_OCTET_STRING) && (community.len == COMMUNITY_SIZE)))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!memcmp(&request_msg.buffer[community.vstart], (int8_t *)COMMUNITY, COMMUNITY_SIZE))
|
||||
{
|
||||
seglen = community.nstart - community.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(community);
|
||||
|
||||
size += parseRequest();
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
int32_t parseVersion()
|
||||
{
|
||||
int32_t size = 0, seglen;
|
||||
tlvStructType tlv;
|
||||
|
||||
size = parseTLV(request_msg.buffer, request_msg.index, &tlv);
|
||||
|
||||
if (!((request_msg.buffer[tlv.start] == SNMPDTYPE_INTEGER) && (request_msg.buffer[tlv.vstart] == SNMP_V1)))
|
||||
return -1;
|
||||
|
||||
seglen = tlv.nstart - tlv.start;
|
||||
size += seglen;
|
||||
COPY_SEGMENT(tlv);
|
||||
size = parseCommunity();
|
||||
|
||||
if (size == -1) return size;
|
||||
else return (size + seglen);
|
||||
}
|
||||
|
||||
|
||||
int32_t parseSNMPMessage()
|
||||
{
|
||||
int32_t size = 0, seglen, respLoc;
|
||||
tlvStructType tlv;
|
||||
|
||||
parseTLV(request_msg.buffer, request_msg.index, &tlv);
|
||||
|
||||
if (request_msg.buffer[tlv.start] != SNMPDTYPE_SEQUENCE_OF) return -1;
|
||||
|
||||
seglen = tlv.vstart - tlv.start;
|
||||
respLoc = tlv.start;
|
||||
COPY_SEGMENT(tlv);
|
||||
|
||||
size = parseVersion();
|
||||
|
||||
if (size == -1) return -1;
|
||||
else size += seglen;
|
||||
|
||||
insertRespLen(tlv.start, respLoc, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ipToByteArray(int8_t *ip, uint8_t *pDes)
|
||||
{
|
||||
uint32_t i, ip1=0, ip2=0, ip3=0, ip4=0;
|
||||
int8_t buff[32];
|
||||
uint32_t len = (uint32_t)strlen((char const*)ip);
|
||||
strcpy((char *)buff, (char const*)ip);
|
||||
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
if ( buff[i]=='.' ) buff[i] = ' ';
|
||||
}
|
||||
|
||||
sscanf((char const*)buff, "%u %u %u %u", &ip1, &ip2, &ip3, &ip4);
|
||||
pDes[0] = ip1; pDes[1] = ip2; pDes[2] = ip3; pDes[3] = ip4;
|
||||
}
|
||||
|
||||
|
||||
int32_t makeTrapVariableBindings(dataEntryType *oid_data, void *ptr, uint32_t *len)
|
||||
{
|
||||
uint32_t j;
|
||||
|
||||
((uint8_t*)ptr)[0] = 0x30;
|
||||
((uint8_t*)ptr)[1] = 0xff;
|
||||
((uint8_t*)ptr)[2] = 0x06;
|
||||
((uint8_t*)ptr)[3] = oid_data->oidlen;
|
||||
|
||||
for (j = 0 ; j < oid_data->oidlen ; j++)
|
||||
{
|
||||
((uint8_t*)ptr)[j+4] = oid_data->oid[j];
|
||||
}
|
||||
|
||||
switch(oid_data->dataType)
|
||||
{
|
||||
case SNMPDTYPE_OCTET_STRING :
|
||||
case SNMPDTYPE_OBJ_ID :
|
||||
{
|
||||
uint8_t *string = &((uint8_t*)ptr)[4+oid_data->oidlen+2];
|
||||
|
||||
if ( oid_data->dataType==SNMPDTYPE_OCTET_STRING )
|
||||
{
|
||||
oid_data->dataLen = (uint8_t)strlen((char const*)&oid_data->u.octetstring);
|
||||
}
|
||||
for (j = 0 ; j < oid_data->dataLen ; j++)
|
||||
{
|
||||
string[j] = oid_data->u.octetstring[j];
|
||||
}
|
||||
|
||||
((uint8_t*)ptr)[4+oid_data->oidlen] = oid_data->dataType;
|
||||
((uint8_t*)ptr)[4+oid_data->oidlen+1] = oid_data->dataLen;
|
||||
((uint8_t*)ptr)[1] = 2 + oid_data->oidlen + 2 + oid_data->dataLen;
|
||||
*len = 4 + oid_data->oidlen + 2 + oid_data->dataLen;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNMPDTYPE_INTEGER :
|
||||
case SNMPDTYPE_TIME_TICKS :
|
||||
case SNMPDTYPE_COUNTER :
|
||||
case SNMPDTYPE_GAUGE :
|
||||
{
|
||||
oid_data->dataLen = 4;
|
||||
|
||||
*(int32_t*)(&((uint8_t*)ptr)[4+oid_data->oidlen+2]) = HTONL(oid_data->u.intval);
|
||||
|
||||
((uint8_t*)ptr)[4+oid_data->oidlen] = oid_data->dataType;
|
||||
((uint8_t*)ptr)[4+oid_data->oidlen+1] = oid_data->dataLen;
|
||||
((uint8_t*)ptr)[1] = 2 + oid_data->oidlen + 2 + oid_data->dataLen;
|
||||
*len = 4 + oid_data->oidlen + 2 + oid_data->dataLen;
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
return INVALID_DATA_TYPE;
|
||||
}
|
||||
|
||||
return SNMP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int32_t snmp_sendTrap(uint8_t * managerIP, uint8_t * agentIP, int8_t* community, dataEntryType enterprise_oid, uint32_t genericTrap, uint32_t specificTrap, uint32_t va_count, ...)
|
||||
{
|
||||
uint32_t i;
|
||||
int32_t packet_index = 0;
|
||||
int32_t packet_buff1 = 0;
|
||||
int32_t packet_buff2 = 0;
|
||||
int32_t packet_buff3 = 0;
|
||||
|
||||
va_list ap;
|
||||
uint32_t length_var_bindings = 0;
|
||||
uint32_t length_buff = 0;
|
||||
|
||||
//SNMP Trap packet generation
|
||||
packet_trap[packet_index++] = 0x30; // ASN.1 Header
|
||||
|
||||
packet_trap[packet_index] = 0xff; // pdu_length, temp
|
||||
packet_buff1 = packet_index++;
|
||||
|
||||
packet_trap[packet_index++] = 0x02; // Version
|
||||
packet_trap[packet_index++] = 0x01;
|
||||
packet_trap[packet_index++] = 0x00;
|
||||
|
||||
packet_trap[packet_index++] = 0x04; // Community
|
||||
packet_trap[packet_index++] = (uint8_t)strlen((char const*)community);
|
||||
memcpy(&(packet_trap[packet_index]), community, strlen((char const*)community));
|
||||
|
||||
packet_index = packet_index + (uint8_t)strlen((char const*)community);
|
||||
|
||||
packet_trap[packet_index++] = 0xa4; // trap
|
||||
packet_trap[packet_index] = 0xff; // length, temp
|
||||
packet_buff2 = packet_index++;
|
||||
|
||||
packet_trap[packet_index++] = 0x06; // enterprise_oid
|
||||
packet_trap[packet_index++] = enterprise_oid.oidlen;
|
||||
for (i=0; i<enterprise_oid.oidlen; i++)
|
||||
{
|
||||
packet_trap[packet_index++] = enterprise_oid.oid[i];
|
||||
}
|
||||
|
||||
packet_trap[packet_index++] = 0x40; // agent ip
|
||||
packet_trap[packet_index++] = 0x04;
|
||||
packet_trap[packet_index++] = agentIP[0];
|
||||
packet_trap[packet_index++] = agentIP[1];
|
||||
packet_trap[packet_index++] = agentIP[2];
|
||||
packet_trap[packet_index++] = agentIP[3];
|
||||
|
||||
packet_trap[packet_index++] = 0x02; // Generic Trap
|
||||
packet_trap[packet_index++] = 0x01;
|
||||
packet_trap[packet_index++] = (uint8_t)genericTrap;
|
||||
|
||||
packet_trap[packet_index++] = 0x02; // Specific Trap
|
||||
packet_trap[packet_index++] = 0x01;
|
||||
packet_trap[packet_index++] = (uint8_t)specificTrap;
|
||||
|
||||
packet_trap[packet_index++] = 0x43; // Timestamp
|
||||
packet_trap[packet_index++] = 0x01;
|
||||
packet_trap[packet_index++] = 0x00;
|
||||
|
||||
packet_trap[packet_index++] = 0x30; // Sequence of variable-bindings
|
||||
packet_trap[packet_index] = 0xff;
|
||||
packet_buff3 = packet_index++;
|
||||
|
||||
// variable-bindings
|
||||
{
|
||||
va_start (ap, va_count);
|
||||
|
||||
for (i=0; i<va_count; i++)
|
||||
{
|
||||
dataEntryType* fff = va_arg(ap, dataEntryType*);
|
||||
makeTrapVariableBindings(fff, &(packet_trap[packet_index]), &length_buff);
|
||||
packet_index = packet_index + length_buff;
|
||||
length_var_bindings = length_var_bindings + length_buff;
|
||||
}
|
||||
|
||||
packet_trap[packet_buff3] = length_var_bindings;
|
||||
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
|
||||
packet_trap[packet_buff1] = packet_index - 2;
|
||||
packet_trap[packet_buff2] = packet_index - (9 + (uint8_t)strlen((char const*)community));
|
||||
|
||||
// Send SNMP Trap Packet to NMS
|
||||
{
|
||||
socket(SOCK_SNMP_TRAP, Sn_MR_UDP, PORT_SNMP_TRAP, 0);
|
||||
sendto(SOCK_SNMP_TRAP, packet_trap, packet_index, managerIP, PORT_SNMP_TRAP);
|
||||
|
||||
close(SOCK_SNMP_TRAP);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _SNMP_DEBUG_
|
||||
void dumpCode(uint8_t* header, uint8_t* tail, uint8_t *buff, int32_t len)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf((char const*)header);
|
||||
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
if ( i%16==0 ) printf("0x%04x : ", i);
|
||||
printf("%02x ",buff[i]);
|
||||
|
||||
if ( i%16-15==0 )
|
||||
{
|
||||
int j;
|
||||
printf(" ");
|
||||
for (j=i-15; j<=i; j++)
|
||||
{
|
||||
if ( isprint(buff[j]) ) printf("%c", buff[j]);
|
||||
else printf(".");
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
if ( i%16!=0 )
|
||||
{
|
||||
int j;
|
||||
int spaces=(len-i+16-i%16)*3+2;
|
||||
for (j=0; j<spaces; j++) printf(" ");
|
||||
for (j=i-i%16; j<len; j++)
|
||||
{
|
||||
if ( isprint(buff[j]) ) printf("%c", buff[j]);
|
||||
else printf(".");
|
||||
}
|
||||
}
|
||||
printf((char const*)tail);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
#ifndef _SNMP_H_
|
||||
#define _SNMP_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// SNMP Debug Message (dump) Enable
|
||||
#define _SNMP_DEBUG_
|
||||
|
||||
#define PORT_SNMP_AGENT 161
|
||||
#define PORT_SNMP_TRAP 162
|
||||
|
||||
#define SNMP_V1 0
|
||||
|
||||
#define MAX_OID 12
|
||||
#define MAX_STRING 64
|
||||
#define MAX_SNMPMSG_LEN 512
|
||||
#define MAX_TRAPMSG_LEN 512
|
||||
|
||||
// SNMP Error code
|
||||
#define SNMP_SUCCESS 0
|
||||
#define OID_NOT_FOUND -1
|
||||
#define TABLE_FULL -2
|
||||
#define ILLEGAL_LENGTH -3
|
||||
#define INVALID_ENTRY_ID -4
|
||||
#define INVALID_DATA_TYPE -5
|
||||
|
||||
#define NO_SUCH_NAME 2
|
||||
#define BAD_VALUE 3
|
||||
|
||||
// SNMPv1 Commands
|
||||
#define GET_REQUEST 0xa0
|
||||
#define GET_NEXT_REQUEST 0xa1
|
||||
#define GET_RESPONSE 0xa2
|
||||
#define SET_REQUEST 0xa3
|
||||
|
||||
// Macros: SNMPv1 request validation checker
|
||||
#define VALID_REQUEST(x) ((x == GET_REQUEST) || (x == GET_NEXT_REQUEST) || (x == SET_REQUEST))
|
||||
|
||||
// SNMPv1 Return Types
|
||||
#define SNMPDTYPE_INTEGER 0x02
|
||||
#define SNMPDTYPE_OCTET_STRING 0x04
|
||||
#define SNMPDTYPE_NULL_ITEM 0x05
|
||||
#define SNMPDTYPE_OBJ_ID 0x06
|
||||
#define SNMPDTYPE_SEQUENCE 0x30
|
||||
#define SNMPDTYPE_SEQUENCE_OF SNMPDTYPE_SEQUENCE
|
||||
|
||||
#define SNMPDTYPE_COUNTER 0x41
|
||||
#define SNMPDTYPE_GAUGE 0x42
|
||||
#define SNMPDTYPE_TIME_TICKS 0x43
|
||||
#define SNMPDTYPE_OPAQUE 0x44
|
||||
|
||||
// SNMP Trap: Standard Trap Types (Generic)
|
||||
#define SNMPTRAP_COLDSTART 0x00 // Generic trap-type 0: Cold Start
|
||||
#define SNMPTRAP_WARMSTART 0x01 // Generic trap-type 1: Warm Start
|
||||
#define SNMPTRAP_LINKDOWN 0x02 // Generic trap-type 2: Link Down
|
||||
#define SNMPTRAP_LINKUP 0x03 // Generic trap-type 3: Link Up
|
||||
#define SNMPTRAP_AUTHENTICATION 0x04 // Generic trap-type 4: Authentication Failure
|
||||
#define SNMPTRAP_EGPNEIGHBORLOSS 0x05 // Generic trap-type 5: EGP Neighbor Loss
|
||||
|
||||
// Macros
|
||||
#define COPY_SEGMENT(x) \
|
||||
{ \
|
||||
request_msg.index += seglen; \
|
||||
memcpy(&response_msg.buffer[response_msg.index], &request_msg.buffer[x.start], seglen ); \
|
||||
response_msg.index += seglen; \
|
||||
}
|
||||
|
||||
#ifndef HTONL
|
||||
#define HTONL(x) \
|
||||
((((x) >> 24) & 0x000000ff) | \
|
||||
(((x) >> 8) & 0x0000ff00) | \
|
||||
(((x) << 8) & 0x00ff0000) | \
|
||||
(((x) << 24) & 0xff000000))
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint8_t oidlen;
|
||||
uint8_t oid[MAX_OID];
|
||||
uint8_t dataType;
|
||||
uint8_t dataLen;
|
||||
union {
|
||||
uint8_t octetstring[MAX_STRING];
|
||||
uint32_t intval;
|
||||
} u;
|
||||
void (*getfunction)(void *, uint8_t *);
|
||||
void (*setfunction)(int32_t);
|
||||
} dataEntryType;
|
||||
|
||||
struct messageStruct {
|
||||
uint8_t buffer[MAX_SNMPMSG_LEN];
|
||||
int32_t len;
|
||||
int32_t index;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int32_t start; /* Absolute Index of the TLV */
|
||||
int32_t len; /* The L value of the TLV */
|
||||
int32_t vstart; /* Absolute Index of this TLV's Value */
|
||||
int32_t nstart; /* Absolute Index of the next TLV */
|
||||
} tlvStructType;
|
||||
|
||||
|
||||
/********************************************************************************************/
|
||||
/* SNMP : Functions */
|
||||
/********************************************************************************************/
|
||||
// SNMP Main functions
|
||||
void snmpd_init(uint8_t * managerIP, uint8_t * agentIP, uint8_t sn_agent, uint8_t sn_trap);
|
||||
int32_t snmpd_run(void);
|
||||
int32_t snmp_sendTrap(uint8_t * managerIP, uint8_t * agentIP, int8_t* community, dataEntryType enterprise_oid, uint32_t genericTrap, uint32_t specificTrap, uint32_t va_count, ...);
|
||||
|
||||
// SNMP Time handler functions
|
||||
void SNMP_time_handler(void);
|
||||
uint32_t getSNMPTimeTick(void);
|
||||
void currentUptime(void *ptr, uint8_t *len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,147 +0,0 @@
|
||||
|
||||
/********************************************************************************************
|
||||
* SNMP : User Customization Part
|
||||
* - OID Registration
|
||||
* - User defined functions for OID related
|
||||
* + Integer value, String
|
||||
* + I/O control / Chip registers
|
||||
* + Network Informations
|
||||
* + Etc.
|
||||
*
|
||||
*********************************************************************************************/
|
||||
#include "snmp_custom.h"
|
||||
|
||||
#ifdef _USE_WIZNET_W5500_EVB_
|
||||
#include "board.h"
|
||||
#endif
|
||||
|
||||
dataEntryType snmpData[] =
|
||||
{
|
||||
// System MIB
|
||||
// SysDescr Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 1, 0},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"WIZnet Embedded SNMP Agent"},
|
||||
NULL, NULL},
|
||||
|
||||
// SysObjectID Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 2, 0},
|
||||
SNMPDTYPE_OBJ_ID, 8, {"\x2b\x06\x01\x02\x01\x01\x02\x00"},
|
||||
NULL, NULL},
|
||||
|
||||
// SysUptime Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 3, 0},
|
||||
SNMPDTYPE_TIME_TICKS, 0, {""},
|
||||
currentUptime, NULL},
|
||||
|
||||
// sysContact Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 4, 0},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"http://www.wizwiki.net/forum"},
|
||||
NULL, NULL},
|
||||
|
||||
// sysName Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 5, 0},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"http://www.wiznet.co.kr"},
|
||||
NULL, NULL},
|
||||
|
||||
// Location Entry
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 6, 0},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"4F Humax Village"},
|
||||
NULL, NULL},
|
||||
|
||||
// SysServices
|
||||
{8, {0x2b, 6, 1, 2, 1, 1, 7, 0},
|
||||
SNMPDTYPE_INTEGER, 4, {""},
|
||||
NULL, NULL},
|
||||
|
||||
#ifdef _USE_WIZNET_W5500_EVB_
|
||||
// Get the WIZnet W5500-EVB LED Status
|
||||
{8, {0x2b, 6, 1, 4, 1, 6, 1, 0},
|
||||
SNMPDTYPE_OCTET_STRING, 40, {""},
|
||||
get_LEDStatus_all, NULL},
|
||||
|
||||
// Set the LED_R (RGB LED)
|
||||
{8, {0x2b, 6, 1, 4, 1, 6, 1, 1},
|
||||
SNMPDTYPE_INTEGER, 4, {""},
|
||||
NULL, set_LEDStatus_R},
|
||||
|
||||
// Set the LED_G (RGB LED)
|
||||
{8, {0x2b, 6, 1, 4, 1, 6, 1, 2},
|
||||
SNMPDTYPE_INTEGER, 4, {""},
|
||||
NULL, set_LEDStatus_G},
|
||||
|
||||
// Set the LED_B (RGB LED)
|
||||
{8, {0x2b, 6, 1, 4, 1, 6, 1, 3},
|
||||
SNMPDTYPE_INTEGER, 4, {""},
|
||||
NULL, set_LEDStatus_B},
|
||||
#endif
|
||||
|
||||
// OID Test #1 (long-length OID example, 19865)
|
||||
{0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"long-length OID Test #1"},
|
||||
NULL, NULL},
|
||||
|
||||
// OID Test #2 (long-length OID example, 22210)
|
||||
{0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0xad, 0x42, 0x01, 0x00},
|
||||
SNMPDTYPE_OCTET_STRING, 35, {"long-length OID Test #2"},
|
||||
NULL, NULL},
|
||||
|
||||
// OID Test #2: SysObjectID Entry
|
||||
{0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0xad, 0x42, 0x02, 0x00},
|
||||
SNMPDTYPE_OBJ_ID, 0x0a, {"\x2b\x06\x01\x04\x01\x81\xad\x42\x02\x00"},
|
||||
NULL, NULL},
|
||||
};
|
||||
|
||||
const int32_t maxData = (sizeof(snmpData) / sizeof(dataEntryType));
|
||||
|
||||
void initTable()
|
||||
{
|
||||
// Example integer value for [OID 1.3.6.1.2.1.1.7.0]
|
||||
snmpData[6].u.intval = -5;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// W5500-EVB: LED Control ///////////////////////////////////////////////////////////////////////////
|
||||
#ifdef _USE_WIZNET_W5500_EVB_
|
||||
void get_LEDStatus_all(void *ptr, uint8_t *len)
|
||||
{
|
||||
uint8_t led_status[3] = {0, };
|
||||
|
||||
led_status[LED_R] = (uint8_t)Board_LED_Test(LED_R);
|
||||
led_status[LED_G] = (uint8_t)Board_LED_Test(LED_G);
|
||||
led_status[LED_B] = (uint8_t)Board_LED_Test(LED_B);
|
||||
|
||||
*len = sprintf((char *)ptr, "LED R [%s] / G [%s] / B [%s]", led_status[LED_R]?"On":"Off", led_status[LED_G]?"On":"Off", led_status[LED_B]?"On":"Off");
|
||||
}
|
||||
|
||||
void set_LEDStatus_R(int32_t val)
|
||||
{
|
||||
if(val == 0) Board_LED_Set(LED_R, false);
|
||||
else Board_LED_Set(LED_R, true);
|
||||
}
|
||||
|
||||
void set_LEDStatus_G(int32_t val)
|
||||
{
|
||||
if(val == 0) Board_LED_Set(LED_G, false);
|
||||
else Board_LED_Set(LED_G, true);
|
||||
}
|
||||
|
||||
void set_LEDStatus_B(int32_t val)
|
||||
{
|
||||
if(val == 0) Board_LED_Set(LED_B, false);
|
||||
else Board_LED_Set(LED_B, true);
|
||||
}
|
||||
#endif
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void initial_Trap(uint8_t * managerIP, uint8_t * agentIP)
|
||||
{
|
||||
// SNMP Trap: WarmStart(1) Trap
|
||||
{
|
||||
dataEntryType enterprise_oid = {0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00},
|
||||
SNMPDTYPE_OBJ_ID, 0x0a, {"\x2b\x06\x01\x04\x01\x81\x9b\x19\x10\x00"}, NULL, NULL};
|
||||
// Generic Trap: warmStart COMMUNITY
|
||||
snmp_sendTrap(managerIP, agentIP, (void *)COMMUNITY, enterprise_oid, SNMPTRAP_WARMSTART, 0, 0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
#ifndef _SNMP_CUSTOM_H_
|
||||
#define _SNMP_CUSTOM_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "snmp.h"
|
||||
|
||||
extern dataEntryType snmpData[];
|
||||
extern const int32_t maxData;
|
||||
|
||||
// Define for using W5500-EVB: H/W Dependency (e.g., LEDs...)
|
||||
//#define _USE_WIZNET_W5500_EVB_
|
||||
|
||||
#define COMMUNITY "public\0"
|
||||
#define COMMUNITY_SIZE (strlen(COMMUNITY))
|
||||
|
||||
/* Predefined function: Response value control */
|
||||
void initTable();
|
||||
|
||||
/* User defined functions: LED control examples */
|
||||
#ifdef _USE_WIZNET_W5500_EVB_
|
||||
void get_LEDStatus_all(void *ptr, uint8_t *len);
|
||||
void set_LEDStatus_R(int32_t val);
|
||||
void set_LEDStatus_G(int32_t val);
|
||||
void set_LEDStatus_B(int32_t val);
|
||||
#endif
|
||||
/* SNMP Trap: warmStart(1) */
|
||||
void initial_Trap(uint8_t * managerIP, uint8_t * agentIP);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,45 +0,0 @@
|
||||
============================================================
|
||||
<OID encoding steps for WIZnet SNMP Agent>
|
||||
============================================================
|
||||
|
||||
+ Example OID for convert
|
||||
1.3.6.1.4.1.19865.1.0
|
||||
|
||||
(1) Convert Usage
|
||||
CMD>>oid 1.3.6.1.4.1.19865.1.0
|
||||
=> 06 0A 2B 06 01 04 01 81 9B 19 01 00
|
||||
|
||||
>> TLV(tag-length-value) Example OID
|
||||
(06) Tag
|
||||
(0A) Length
|
||||
[2B] 1(iso).3(identified-organization) (in ASN.1 BER encoding, i.e. 1*40+3 = 0x2b)
|
||||
[06] 6(dod)
|
||||
[01] 1(internet)
|
||||
[04] 4(private)
|
||||
[01] 1(enterprise)
|
||||
[81 9B 19] 19865(Vendor-Specific)
|
||||
...
|
||||
|
||||
(2) Add the entry to OID table in source code (DataEntryType, put the converted value to array)
|
||||
{0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00},
|
||||
SNMPDTYPE_OCTET_STRING, 30, {"long-length OID Test"},
|
||||
NULL, NULL},
|
||||
|
||||
============================================================
|
||||
OID Converter: OID encoder/decoder
|
||||
v1.3 - Matthias Gaertner 1999/2001 - Freeware
|
||||
============================================================
|
||||
|
||||
The OID converter is a handy little tool to convert ASN.1 OIDs from readable dotted decimal notation to binary hexadecimal Distinguished Encoding Rules (DER) representation and vice versa.
|
||||
If you're into x.509 certificates, this may be useful to you, too.
|
||||
|
||||
Usage:
|
||||
OID [-c|-C] [-o] {-i|1.2.3.4}
|
||||
converts dotted form to ASCII HEX DER output.
|
||||
OID -x [-o] {-i|hex-digits}
|
||||
decodes ASCII HEX DER and gives dotted form.
|
||||
|
||||
If you need more information, please refer to Matthias Gaertner's page,
|
||||
http://www.rtner.de/software/oid.html
|
||||
|
||||
===============================================================================================
|
||||
@@ -1,33 +0,0 @@
|
||||
#
|
||||
# net-snmp (or ucd-snmp) persistent data file.
|
||||
#
|
||||
############################################################################
|
||||
# STOP STOP STOP STOP STOP STOP STOP STOP STOP
|
||||
#
|
||||
# **** DO NOT EDIT THIS FILE ****
|
||||
#
|
||||
# STOP STOP STOP STOP STOP STOP STOP STOP STOP
|
||||
############################################################################
|
||||
#
|
||||
# DO NOT STORE CONFIGURATION ENTRIES HERE.
|
||||
# Please save normal configuration tokens for snmptrapd in SNMPCONFPATH/snmptrapd.conf.
|
||||
# Only "createUser" tokens should be placed here by snmptrapd administrators.
|
||||
# (Did I mention: do not edit this file?)
|
||||
#
|
||||
|
||||
|
||||
authCommunity log,execute,net public
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
engineBoots 1
|
||||
oldEngineID 0x80001f88803d6f00001ba7934e00000000
|
||||
@@ -1,450 +0,0 @@
|
||||
/*
|
||||
* sntp.c
|
||||
*
|
||||
* Created on: 2014. 12. 15.
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "sntp.h"
|
||||
#include "socket.h"
|
||||
|
||||
ntpformat NTPformat;
|
||||
datetime Nowdatetime;
|
||||
uint8_t ntpmessage[48];
|
||||
uint8_t *data_buf;
|
||||
uint8_t NTP_SOCKET;
|
||||
uint8_t time_zone;
|
||||
uint16_t ntp_retry_cnt=0; //counting the ntp retry number
|
||||
|
||||
/*
|
||||
00)UTC-12:00 Baker Island, Howland Island (both uninhabited)
|
||||
01) UTC-11:00 American Samoa, Samoa
|
||||
02) UTC-10:00 (Summer)French Polynesia (most), United States (Aleutian Islands, Hawaii)
|
||||
03) UTC-09:30 Marquesas Islands
|
||||
04) UTC-09:00 Gambier Islands;(Summer)United States (most of Alaska)
|
||||
05) UTC-08:00 (Summer)Canada (most of British Columbia), Mexico (Baja California)
|
||||
06) UTC-08:00 United States (California, most of Nevada, most of Oregon, Washington (state))
|
||||
07) UTC-07:00 Mexico (Sonora), United States (Arizona); (Summer)Canada (Alberta)
|
||||
08) UTC-07:00 Mexico (Chihuahua), United States (Colorado)
|
||||
09) UTC-06:00 Costa Rica, El Salvador, Ecuador (Galapagos Islands), Guatemala, Honduras
|
||||
10) UTC-06:00 Mexico (most), Nicaragua;(Summer)Canada (Manitoba, Saskatchewan), United States (Illinois, most of Texas)
|
||||
11) UTC-05:00 Colombia, Cuba, Ecuador (continental), Haiti, Jamaica, Panama, Peru
|
||||
12) UTC-05:00 (Summer)Canada (most of Ontario, most of Quebec)
|
||||
13) UTC-05:00 United States (most of Florida, Georgia, Massachusetts, most of Michigan, New York, North Carolina, Ohio, Washington D.C.)
|
||||
14) UTC-04:30 Venezuela
|
||||
15) UTC-04:00 Bolivia, Brazil (Amazonas), Chile (continental), Dominican Republic, Canada (Nova Scotia), Paraguay,
|
||||
16) UTC-04:00 Puerto Rico, Trinidad and Tobago
|
||||
17) UTC-03:30 Canada (Newfoundland)
|
||||
18) UTC-03:00 Argentina; (Summer) Brazil (Brasilia, Rio de Janeiro, Sao Paulo), most of Greenland, Uruguay
|
||||
19) UTC-02:00 Brazil (Fernando de Noronha), South Georgia and the South Sandwich Islands
|
||||
20) UTC-01:00 Portugal (Azores), Cape Verde
|
||||
21) UTC±00:00 Cote d'Ivoire, Faroe Islands, Ghana, Iceland, Senegal; (Summer) Ireland, Portugal (continental and Madeira)
|
||||
22) UTC±00:00 Spain (Canary Islands), Morocco, United Kingdom
|
||||
23) UTC+01:00 Angola, Cameroon, Nigeria, Tunisia; (Summer)Albania, Algeria, Austria, Belgium, Bosnia and Herzegovina,
|
||||
24) UTC+01:00 Spain (continental), Croatia, Czech Republic, Denmark, Germany, Hungary, Italy, Kinshasa, Kosovo,
|
||||
25) UTC+01:00 Macedonia, France (metropolitan), the Netherlands, Norway, Poland, Serbia, Slovakia, Slovenia, Sweden, Switzerland
|
||||
26) UTC+02:00 Libya, Egypt, Malawi, Mozambique, South Africa, Zambia, Zimbabwe, (Summer)Bulgaria, Cyprus, Estonia,
|
||||
27) UTC+02:00 Finland, Greece, Israel, Jordan, Latvia, Lebanon, Lithuania, Moldova, Palestine, Romania, Syria, Turkey, Ukraine
|
||||
28) UTC+03:00 Belarus, Djibouti, Eritrea, Ethiopia, Iraq, Kenya, Madagascar, Russia (Kaliningrad Oblast), Saudi Arabia,
|
||||
29) UTC+03:00 South Sudan, Sudan, Somalia, South Sudan, Tanzania, Uganda, Yemen
|
||||
30) UTC+03:30 (Summer)Iran
|
||||
31) UTC+04:00 Armenia, Azerbaijan, Georgia, Mauritius, Oman, Russia (European), Seychelles, United Arab Emirates
|
||||
32) UTC+04:30 Afghanistan
|
||||
33) UTC+05:00 Kazakhstan (West), Maldives, Pakistan, Uzbekistan
|
||||
34) UTC+05:30 India, Sri Lanka
|
||||
35) UTC+05:45 Nepal
|
||||
36) UTC+06:00 Kazakhstan (most), Bangladesh, Russia (Ural: Sverdlovsk Oblast, Chelyabinsk Oblast)
|
||||
37) UTC+06:30 Cocos Islands, Myanmar
|
||||
38) UTC+07:00 Jakarta, Russia (Novosibirsk Oblast), Thailand, Vietnam
|
||||
39) UTC+08:00 China, Hong Kong, Russia (Krasnoyarsk Krai), Malaysia, Philippines, Singapore, Taiwan, most of Mongolia, Western Australia
|
||||
40) UTC+09:00 Korea, East Timor, Russia (Irkutsk Oblast), Japan
|
||||
41) UTC+09:30 Australia (Northern Territory);(Summer)Australia (South Australia))
|
||||
42) UTC+10:00 Russia (Zabaykalsky Krai); (Summer)Australia (New South Wales, Queensland, Tasmania, Victoria)
|
||||
43) UTC+10:30 Lord Howe Island
|
||||
44) UTC+11:00 New Caledonia, Russia (Primorsky Krai), Solomon Islands
|
||||
45) UTC+11:30 Norfolk Island
|
||||
46) UTC+12:00 Fiji, Russia (Kamchatka Krai);(Summer)New Zealand
|
||||
47) UTC+12:45 (Summer)New Zealand
|
||||
48) UTC+13:00 Tonga
|
||||
49) UTC+14:00 Kiribati (Line Islands)
|
||||
*/
|
||||
void get_seconds_from_ntp_server(uint8_t *buf, uint16_t idx)
|
||||
{
|
||||
tstamp seconds = 0;
|
||||
uint8_t i=0;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
seconds = (seconds << 8) | buf[idx + i];
|
||||
}
|
||||
switch (time_zone)
|
||||
{
|
||||
case 0:
|
||||
seconds -= 12*3600;
|
||||
break;
|
||||
case 1:
|
||||
seconds -= 11*3600;
|
||||
break;
|
||||
case 2:
|
||||
seconds -= 10*3600;
|
||||
break;
|
||||
case 3:
|
||||
seconds -= (9*3600+30*60);
|
||||
break;
|
||||
case 4:
|
||||
seconds -= 9*3600;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
seconds -= 8*3600;
|
||||
break;
|
||||
case 7:
|
||||
case 8:
|
||||
seconds -= 7*3600;
|
||||
break;
|
||||
case 9:
|
||||
case 10:
|
||||
seconds -= 6*3600;
|
||||
break;
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
seconds -= 5*3600;
|
||||
break;
|
||||
case 14:
|
||||
seconds -= (4*3600+30*60);
|
||||
break;
|
||||
case 15:
|
||||
case 16:
|
||||
seconds -= 4*3600;
|
||||
break;
|
||||
case 17:
|
||||
seconds -= (3*3600+30*60);
|
||||
break;
|
||||
case 18:
|
||||
seconds -= 3*3600;
|
||||
break;
|
||||
case 19:
|
||||
seconds -= 2*3600;
|
||||
break;
|
||||
case 20:
|
||||
seconds -= 1*3600;
|
||||
break;
|
||||
case 21: //<2F><>?
|
||||
case 22:
|
||||
break;
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
seconds += 1*3600;
|
||||
break;
|
||||
case 26:
|
||||
case 27:
|
||||
seconds += 2*3600;
|
||||
break;
|
||||
case 28:
|
||||
case 29:
|
||||
seconds += 3*3600;
|
||||
break;
|
||||
case 30:
|
||||
seconds += (3*3600+30*60);
|
||||
break;
|
||||
case 31:
|
||||
seconds += 4*3600;
|
||||
break;
|
||||
case 32:
|
||||
seconds += (4*3600+30*60);
|
||||
break;
|
||||
case 33:
|
||||
seconds += 5*3600;
|
||||
break;
|
||||
case 34:
|
||||
seconds += (5*3600+30*60);
|
||||
break;
|
||||
case 35:
|
||||
seconds += (5*3600+45*60);
|
||||
break;
|
||||
case 36:
|
||||
seconds += 6*3600;
|
||||
break;
|
||||
case 37:
|
||||
seconds += (6*3600+30*60);
|
||||
break;
|
||||
case 38:
|
||||
seconds += 7*3600;
|
||||
break;
|
||||
case 39:
|
||||
seconds += 8*3600;
|
||||
break;
|
||||
case 40:
|
||||
seconds += 9*3600;
|
||||
break;
|
||||
case 41:
|
||||
seconds += (9*3600+30*60);
|
||||
break;
|
||||
case 42:
|
||||
seconds += 10*3600;
|
||||
break;
|
||||
case 43:
|
||||
seconds += (10*3600+30*60);
|
||||
break;
|
||||
case 44:
|
||||
seconds += 11*3600;
|
||||
break;
|
||||
case 45:
|
||||
seconds += (11*3600+30*60);
|
||||
break;
|
||||
case 46:
|
||||
seconds += 12*3600;
|
||||
break;
|
||||
case 47:
|
||||
seconds += (12*3600+45*60);
|
||||
break;
|
||||
case 48:
|
||||
seconds += 13*3600;
|
||||
break;
|
||||
case 49:
|
||||
seconds += 14*3600;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
//calculation for date
|
||||
calcdatetime(seconds);
|
||||
}
|
||||
|
||||
void SNTP_init(uint8_t s, uint8_t *ntp_server, uint8_t tz, uint8_t *buf)
|
||||
{
|
||||
NTP_SOCKET = s;
|
||||
|
||||
NTPformat.dstaddr[0] = ntp_server[0];
|
||||
NTPformat.dstaddr[1] = ntp_server[1];
|
||||
NTPformat.dstaddr[2] = ntp_server[2];
|
||||
NTPformat.dstaddr[3] = ntp_server[3];
|
||||
|
||||
time_zone = tz;
|
||||
|
||||
data_buf = buf;
|
||||
|
||||
uint8_t Flag;
|
||||
NTPformat.leap = 0; /* leap indicator */
|
||||
NTPformat.version = 4; /* version number */
|
||||
NTPformat.mode = 3; /* mode */
|
||||
NTPformat.stratum = 0; /* stratum */
|
||||
NTPformat.poll = 0; /* poll interval */
|
||||
NTPformat.precision = 0; /* precision */
|
||||
NTPformat.rootdelay = 0; /* root delay */
|
||||
NTPformat.rootdisp = 0; /* root dispersion */
|
||||
NTPformat.refid = 0; /* reference ID */
|
||||
NTPformat.reftime = 0; /* reference time */
|
||||
NTPformat.org = 0; /* origin timestamp */
|
||||
NTPformat.rec = 0; /* receive timestamp */
|
||||
NTPformat.xmt = 1; /* transmit timestamp */
|
||||
|
||||
Flag = (NTPformat.leap<<6)+(NTPformat.version<<3)+NTPformat.mode; //one byte Flag
|
||||
memcpy(ntpmessage,(void const*)(&Flag),1);
|
||||
}
|
||||
|
||||
int8_t SNTP_run(datetime *time)
|
||||
{
|
||||
uint16_t RSR_len;
|
||||
uint32_t destip = 0;
|
||||
uint16_t destport;
|
||||
uint16_t startindex = 40; //last 8-byte of data_buf[size is 48 byte] is xmt, so the startindex should be 40
|
||||
|
||||
switch(getSn_SR(NTP_SOCKET))
|
||||
{
|
||||
case SOCK_UDP:
|
||||
if ((RSR_len = getSn_RX_RSR(NTP_SOCKET)) > 0)
|
||||
{
|
||||
if (RSR_len > MAX_SNTP_BUF_SIZE) RSR_len = MAX_SNTP_BUF_SIZE; // if Rx data size is lager than TX_RX_MAX_BUF_SIZE
|
||||
recvfrom(NTP_SOCKET, data_buf, RSR_len, (uint8_t *)&destip, &destport);
|
||||
|
||||
get_seconds_from_ntp_server(data_buf,startindex);
|
||||
time->yy = Nowdatetime.yy;
|
||||
time->mo = Nowdatetime.mo;
|
||||
time->dd = Nowdatetime.dd;
|
||||
time->hh = Nowdatetime.hh;
|
||||
time->mm = Nowdatetime.mm;
|
||||
time->ss = Nowdatetime.ss;
|
||||
|
||||
ntp_retry_cnt=0;
|
||||
close(NTP_SOCKET);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(ntp_retry_cnt<0xFFFF)
|
||||
{
|
||||
if(ntp_retry_cnt==0)//first send request, no need to wait
|
||||
{
|
||||
sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
|
||||
ntp_retry_cnt++;
|
||||
}
|
||||
else // send request again? it should wait for a while
|
||||
{
|
||||
if((ntp_retry_cnt % 0xFFF) == 0) //wait time
|
||||
{
|
||||
sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
|
||||
#ifdef _SNTP_DEBUG_
|
||||
printf("ntp retry: %d\r\n", ntp_retry_cnt);
|
||||
#endif
|
||||
ntp_retry_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else //ntp retry fail
|
||||
{
|
||||
ntp_retry_cnt=0;
|
||||
#ifdef _SNTP_DEBUG_
|
||||
printf("ntp retry failed!\r\n");
|
||||
#endif
|
||||
close(NTP_SOCKET);
|
||||
}
|
||||
break;
|
||||
case SOCK_CLOSED:
|
||||
socket(NTP_SOCKET,Sn_MR_UDP,ntp_port,0);
|
||||
break;
|
||||
}
|
||||
// Return value
|
||||
// 0 - failed / 1 - success
|
||||
return 0;
|
||||
}
|
||||
|
||||
void calcdatetime(tstamp seconds)
|
||||
{
|
||||
uint8_t yf=0;
|
||||
tstamp n=0,d=0,total_d=0,rz=0;
|
||||
uint16_t y=0,r=0,yr=0;
|
||||
signed long long yd=0;
|
||||
|
||||
n = seconds;
|
||||
total_d = seconds/(SECS_PERDAY);
|
||||
d=0;
|
||||
uint32_t p_year_total_sec=SECS_PERDAY*365;
|
||||
uint32_t r_year_total_sec=SECS_PERDAY*366;
|
||||
while(n>=p_year_total_sec)
|
||||
{
|
||||
if((EPOCH+r)%400==0 || ((EPOCH+r)%100!=0 && (EPOCH+r)%4==0))
|
||||
{
|
||||
n = n -(r_year_total_sec);
|
||||
d = d + 366;
|
||||
}
|
||||
else
|
||||
{
|
||||
n = n - (p_year_total_sec);
|
||||
d = d + 365;
|
||||
}
|
||||
r+=1;
|
||||
y+=1;
|
||||
|
||||
}
|
||||
|
||||
y += EPOCH;
|
||||
|
||||
Nowdatetime.yy = y;
|
||||
|
||||
yd=0;
|
||||
yd = total_d - d;
|
||||
|
||||
yf=1;
|
||||
while(yd>=28)
|
||||
{
|
||||
|
||||
if(yf==1 || yf==3 || yf==5 || yf==7 || yf==8 || yf==10 || yf==12)
|
||||
{
|
||||
yd -= 31;
|
||||
if(yd<0)break;
|
||||
rz += 31;
|
||||
}
|
||||
|
||||
if (yf==2)
|
||||
{
|
||||
if (y%400==0 || (y%100!=0 && y%4==0))
|
||||
{
|
||||
yd -= 29;
|
||||
if(yd<0)break;
|
||||
rz += 29;
|
||||
}
|
||||
else
|
||||
{
|
||||
yd -= 28;
|
||||
if(yd<0)break;
|
||||
rz += 28;
|
||||
}
|
||||
}
|
||||
if(yf==4 || yf==6 || yf==9 || yf==11 )
|
||||
{
|
||||
yd -= 30;
|
||||
if(yd<0)break;
|
||||
rz += 30;
|
||||
}
|
||||
yf += 1;
|
||||
|
||||
}
|
||||
Nowdatetime.mo=yf;
|
||||
yr = total_d-d-rz;
|
||||
|
||||
yr += 1;
|
||||
|
||||
Nowdatetime.dd=yr;
|
||||
|
||||
//calculation for time
|
||||
seconds = seconds%SECS_PERDAY;
|
||||
Nowdatetime.hh = seconds/3600;
|
||||
Nowdatetime.mm = (seconds%3600)/60;
|
||||
Nowdatetime.ss = (seconds%3600)%60;
|
||||
|
||||
}
|
||||
|
||||
tstamp changedatetime_to_seconds(void)
|
||||
{
|
||||
tstamp seconds=0;
|
||||
uint32_t total_day=0;
|
||||
uint16_t i=0,run_year_cnt=0,l=0;
|
||||
|
||||
l = Nowdatetime.yy;//low
|
||||
|
||||
|
||||
for(i=EPOCH;i<l;i++)
|
||||
{
|
||||
if((i%400==0) || ((i%100!=0) && (i%4==0)))
|
||||
{
|
||||
run_year_cnt += 1;
|
||||
}
|
||||
}
|
||||
|
||||
total_day=(l-EPOCH-run_year_cnt)*365+run_year_cnt*366;
|
||||
|
||||
for(i=1;i<=Nowdatetime.mo;i++)
|
||||
{
|
||||
if(i==5 || i==7 || i==10 || i==12)
|
||||
{
|
||||
total_day += 30;
|
||||
}
|
||||
if (i==3)
|
||||
{
|
||||
if (l%400==0 && l%100!=0 && l%4==0)
|
||||
{
|
||||
total_day += 29;
|
||||
}
|
||||
else
|
||||
{
|
||||
total_day += 28;
|
||||
}
|
||||
}
|
||||
if(i==2 || i==4 || i==6 || i==8 || i==9 || i==11)
|
||||
{
|
||||
total_day += 31;
|
||||
}
|
||||
}
|
||||
|
||||
seconds = (total_day+Nowdatetime.dd-1)*24*3600;
|
||||
seconds += Nowdatetime.ss;//seconds
|
||||
seconds += Nowdatetime.mm*60;//minute
|
||||
seconds += Nowdatetime.hh*3600;//hour
|
||||
|
||||
return seconds;
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* sntp.h
|
||||
*
|
||||
* Created on: 2014. 12. 15.
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
#ifndef SNTP_H_
|
||||
#define SNTP_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* @brief Define it for Debug & Monitor DNS processing.
|
||||
* @note If defined, it dependens on <stdio.h>
|
||||
*/
|
||||
//#define _SNTP_DEBUG_
|
||||
|
||||
#define MAX_SNTP_BUF_SIZE sizeof(ntpformat) ///< maximum size of DNS buffer. */
|
||||
|
||||
/* for ntpclient */
|
||||
typedef signed char s_char;
|
||||
typedef unsigned long long tstamp;
|
||||
typedef unsigned int tdist;
|
||||
|
||||
typedef struct _ntpformat
|
||||
{
|
||||
|
||||
uint8_t dstaddr[4]; /* destination (local) address */
|
||||
char version; /* version number */
|
||||
char leap; /* leap indicator */
|
||||
char mode; /* mode */
|
||||
char stratum; /* stratum */
|
||||
char poll; /* poll interval */
|
||||
s_char precision; /* precision */
|
||||
tdist rootdelay; /* root delay */
|
||||
tdist rootdisp; /* root dispersion */
|
||||
char refid; /* reference ID */
|
||||
tstamp reftime; /* reference time */
|
||||
tstamp org; /* origin timestamp */
|
||||
tstamp rec; /* receive timestamp */
|
||||
tstamp xmt; /* transmit timestamp */
|
||||
|
||||
|
||||
} ntpformat;
|
||||
|
||||
typedef struct _datetime
|
||||
{
|
||||
uint16_t yy;
|
||||
uint8_t mo;
|
||||
uint8_t dd;
|
||||
uint8_t hh;
|
||||
uint8_t mm;
|
||||
uint8_t ss;
|
||||
} datetime;
|
||||
|
||||
#define ntp_port 123 //ntp server port number
|
||||
#define SECS_PERDAY 86400UL // seconds in a day = 60*60*24
|
||||
#define UTC_ADJ_HRS 9 // SEOUL : GMT+9
|
||||
#define EPOCH 1900 // NTP start year
|
||||
|
||||
void get_seconds_from_ntp_server(uint8_t *buf, uint16_t idx);
|
||||
void SNTP_init(uint8_t s, uint8_t *ntp_server, uint8_t tz, uint8_t *buf);
|
||||
int8_t SNTP_run(datetime *time);
|
||||
tstamp changedatetime_to_seconds(void);
|
||||
void calcdatetime(tstamp seconds);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SNTP_H_ */
|
||||
@@ -1,158 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "netutil.h"
|
||||
|
||||
/**
|
||||
* Convert a 32bit Address into a Dotted Decimal Format string.
|
||||
*
|
||||
* @param addr 32bit address.
|
||||
* @return Dotted Decimal Format string.
|
||||
*/
|
||||
int8_t* inet_ntoa(uint32_t addr)
|
||||
{
|
||||
static int8_t addr_str[16];
|
||||
memset(addr_str,0,16);
|
||||
sprintf((char*)addr_str,"%d.%d.%d.%d",(int32_t)(addr>>24 & 0xFF),(int32_t)(addr>>16 & 0xFF),(int32_t)(addr>>8 & 0xFF),(int32_t)(addr & 0xFF));
|
||||
return addr_str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a 32bit Address into a Dotted Decimal Format string.
|
||||
* This is differ from inet_ntoa in fixed length.
|
||||
*
|
||||
* @param addr 32bit address.
|
||||
* @return Dotted Decimal Format string.
|
||||
*/
|
||||
int8_t* inet_ntoa_pad(uint32_t addr)
|
||||
{
|
||||
static int8_t addr_str[16];
|
||||
memset(addr_str,0,16);
|
||||
sprintf((char*)addr_str,"%03d.%03d.%03d.%03d",(int32_t)(addr>>24 & 0xFF),(int32_t)(addr>>16 & 0xFF),(int32_t)(addr>>8 & 0xFF),(int32_t)(addr & 0xFF));
|
||||
return addr_str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string containing an (Ipv4) Internet Protocol decimal dotted address into a 32bit address.
|
||||
*
|
||||
* @param addr Dotted Decimal Format string.
|
||||
* @return 32bit address.
|
||||
*/
|
||||
uint32_t inet_addr(uint8_t* addr)
|
||||
{
|
||||
int8_t i;
|
||||
uint32_t inetaddr = 0;
|
||||
int8_t taddr[30];
|
||||
int8_t * nexttok;
|
||||
int32_t num;
|
||||
strcpy((char*)taddr,(char*)addr);
|
||||
|
||||
nexttok = taddr;
|
||||
for(i = 0; i < 4 ; i++)
|
||||
{
|
||||
nexttok = (int8_t*)strtok((char*)nexttok,".");
|
||||
if(nexttok[0] == '0' && nexttok[1] == 'x') num = strtol((char*)nexttok+2, NULL, 16);
|
||||
else num = strtol((char*)nexttok, NULL, 10);
|
||||
inetaddr = inetaddr << 8;
|
||||
inetaddr |= (num & 0xFF);
|
||||
nexttok = NULL;
|
||||
}
|
||||
return inetaddr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Swap the byte order of 16bit(short) wide variable.
|
||||
*
|
||||
* @param i 16bit value to swap
|
||||
* @return Swapped value
|
||||
*/
|
||||
uint16_t swaps(uint16_t i)
|
||||
{
|
||||
uint16_t ret=0;
|
||||
ret = (i & 0xFF) << 8;
|
||||
ret |= ((i >> 8)& 0xFF);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Swap the byte order of 32bit(long) wide variable.
|
||||
*
|
||||
* @param l 32bit value to convert
|
||||
* @return Swapped value
|
||||
*/
|
||||
uint32_t swapl(uint32_t l)
|
||||
{
|
||||
uint32_t ret=0;
|
||||
ret = (l & 0xFF) << 24;
|
||||
ret |= ((l >> 8) & 0xFF) << 16;
|
||||
ret |= ((l >> 16) & 0xFF) << 8;
|
||||
ret |= ((l >> 24) & 0xFF);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* htons function converts a unsigned short from host to TCP/IP network byte order (which is big-endian).
|
||||
*
|
||||
* @param hostshort The value to convert.
|
||||
* @return The value in TCP/IP network byte order.
|
||||
*/
|
||||
uint16_t htons(uint16_t hostshort)
|
||||
{
|
||||
#ifdef SYSTEM_LITTLE_ENDIAN
|
||||
return swaps(hostshort);
|
||||
#else
|
||||
return hostshort;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* htonl function converts a unsigned long from host to TCP/IP network byte order (which is big-endian).
|
||||
*
|
||||
* @param hostlong The value to convert.
|
||||
* @return The value in TCP/IP network byte order.
|
||||
*/
|
||||
uint32_t htonl(uint32_t hostlong)
|
||||
{
|
||||
#ifdef SYSTEM_LITTLE_ENDIAN
|
||||
return swapl(hostlong);
|
||||
#else
|
||||
return hostlong;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ntohs function converts a unsigned short from TCP/IP network byte order
|
||||
* to host byte order (which is little-endian on Intel processors).
|
||||
*
|
||||
* @param netshort The value to convert.
|
||||
* @return A 16-bit number in host byte order
|
||||
*/
|
||||
uint32_t ntohs(uint16_t netshort)
|
||||
{
|
||||
#ifdef SYSTEM_LITTLE_ENDIAN
|
||||
return htons(netshort);
|
||||
#else
|
||||
return netshort;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* converts a unsigned long from TCP/IP network byte order to host byte order
|
||||
* (which is little-endian on Intel processors).
|
||||
*
|
||||
* @param netlong The value to convert.
|
||||
* @return A 16-bit number in host byte order
|
||||
*/
|
||||
uint32_t ntohl(uint32_t netlong)
|
||||
{
|
||||
#ifdef SYSTEM_LITTLE_ENDIAN
|
||||
return swapl(netlong);
|
||||
#else
|
||||
return netlong;
|
||||
#endif
|
||||
}
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
#ifndef __NETUTIL_H__
|
||||
#define __NETUTIL_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
|
||||
int8_t* inet_ntoa(uint32_t addr);
|
||||
int8_t* inet_ntoa_pad(uint32_t addr);
|
||||
uint32_t inet_addr(uint8_t* addr);
|
||||
uint16_t swaps(uint16_t i);
|
||||
uint32_t swapl(uint32_t l);
|
||||
uint16_t htons(uint16_t hostshort);
|
||||
uint32_t htonl(uint32_t hostlong);
|
||||
uint32_t ntohs(uint16_t netshort);
|
||||
uint32_t ntohl(uint32_t netlong);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,660 +0,0 @@
|
||||
/**
|
||||
* @file tftp.c
|
||||
* @brief TFTP Source File.
|
||||
* @version 0.1.0
|
||||
* @author Sang-sik Kim
|
||||
*/
|
||||
|
||||
/* Includes -----------------------------------------------------*/
|
||||
#include <string.h>
|
||||
#include "tftp.h"
|
||||
#include "socket.h"
|
||||
#include "netutil.h"
|
||||
|
||||
/* define -------------------------------------------------------*/
|
||||
|
||||
/* typedef ------------------------------------------------------*/
|
||||
|
||||
/* Extern Variable ----------------------------------------------*/
|
||||
|
||||
/* Extern Functions ---------------------------------------------*/
|
||||
#ifdef F_STORAGE
|
||||
extern void save_data(uint8_t *data, uint32_t data_len, uint16_t block_number);
|
||||
#endif
|
||||
|
||||
/* Global Variable ----------------------------------------------*/
|
||||
static int g_tftp_socket = -1;
|
||||
|
||||
static uint8_t g_filename[FILE_NAME_SIZE];
|
||||
|
||||
static uint32_t g_server_ip = 0;
|
||||
static uint16_t g_server_port = 0;
|
||||
static uint16_t g_local_port = 0;
|
||||
|
||||
static uint32_t g_tftp_state = STATE_NONE;
|
||||
static uint16_t g_block_num = 0;
|
||||
|
||||
static uint32_t g_timeout = 5;
|
||||
static uint32_t g_resend_flag = 0;
|
||||
static uint32_t tftp_time_cnt = 0;
|
||||
static uint32_t tftp_retry_cnt = 0;
|
||||
|
||||
static uint8_t *g_tftp_rcv_buf = NULL;
|
||||
|
||||
static TFTP_OPTION default_tftp_opt = {
|
||||
.code = (uint8_t *)"timeout",
|
||||
.value = (uint8_t *)"5"
|
||||
};
|
||||
|
||||
uint8_t g_progress_state = TFTP_PROGRESS;
|
||||
|
||||
#ifdef __TFTP_DEBUG__
|
||||
int dbg_level = (INFO_DBG | ERROR_DBG | IPC_DBG);
|
||||
#endif
|
||||
|
||||
/* static function define ---------------------------------------*/
|
||||
static void set_filename(uint8_t *file, uint32_t file_size)
|
||||
{
|
||||
memcpy(g_filename, file, file_size);
|
||||
}
|
||||
|
||||
static inline void set_server_ip(uint32_t ipaddr)
|
||||
{
|
||||
g_server_ip = ipaddr;
|
||||
}
|
||||
|
||||
static inline uint32_t get_server_ip()
|
||||
{
|
||||
return g_server_ip;
|
||||
}
|
||||
|
||||
static inline void set_server_port(uint16_t port)
|
||||
{
|
||||
g_server_port = port;
|
||||
}
|
||||
|
||||
static inline uint16_t get_server_port()
|
||||
{
|
||||
return g_server_port;
|
||||
}
|
||||
|
||||
static inline void set_local_port(uint16_t port)
|
||||
{
|
||||
g_local_port = port;
|
||||
}
|
||||
|
||||
static inline uint16_t get_local_port()
|
||||
{
|
||||
return g_local_port;
|
||||
}
|
||||
|
||||
static inline uint16_t genernate_port()
|
||||
{
|
||||
/* TODO */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void set_tftp_state(uint32_t state)
|
||||
{
|
||||
g_tftp_state = state;
|
||||
}
|
||||
|
||||
static inline uint32_t get_tftp_state()
|
||||
{
|
||||
return g_tftp_state;
|
||||
}
|
||||
|
||||
static inline void set_tftp_timeout(uint32_t timeout)
|
||||
{
|
||||
g_timeout = timeout;
|
||||
}
|
||||
|
||||
static inline uint32_t get_tftp_timeout()
|
||||
{
|
||||
return g_timeout;
|
||||
}
|
||||
|
||||
static inline void set_block_number(uint16_t block_number)
|
||||
{
|
||||
g_block_num = block_number;
|
||||
}
|
||||
|
||||
static inline uint16_t get_block_number()
|
||||
{
|
||||
return g_block_num;
|
||||
}
|
||||
|
||||
static int open_tftp_socket(uint8_t sock)
|
||||
{
|
||||
uint8_t sd, sck_state;
|
||||
|
||||
sd = socket(sock, Sn_MR_UDP, 51000, SF_IO_NONBLOCK);
|
||||
if(sd != sock) {
|
||||
//DBG_PRINT(ERROR_DBG, "[%s] socket error\r\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
do {
|
||||
getsockopt(sd , SO_STATUS, &sck_state);
|
||||
} while(sck_state != SOCK_UDP);
|
||||
|
||||
return sd;
|
||||
}
|
||||
|
||||
static int send_udp_packet(int socket, uint8_t *packet, uint32_t len, uint32_t ip, uint16_t port)
|
||||
{
|
||||
int snd_len;
|
||||
|
||||
ip = htonl(ip);
|
||||
|
||||
snd_len = sendto(socket, packet, len, (uint8_t *)&ip, port);
|
||||
if(snd_len != len) {
|
||||
//DBG_PRINT(ERROR_DBG, "[%s] sendto error\r\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return snd_len;
|
||||
}
|
||||
|
||||
static int recv_udp_packet(int socket, uint8_t *packet, uint32_t len, uint32_t *ip, uint16_t *port)
|
||||
{
|
||||
int ret;
|
||||
uint8_t sck_state;
|
||||
uint16_t recv_len;
|
||||
|
||||
/* Receive Packet Process */
|
||||
ret = getsockopt(socket, SO_STATUS, &sck_state);
|
||||
if(ret != SOCK_OK) {
|
||||
//DBG_PRINT(ERROR_DBG, "[%s] getsockopt SO_STATUS error\r\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(sck_state == SOCK_UDP) {
|
||||
ret = getsockopt(socket, SO_RECVBUF, &recv_len);
|
||||
if(ret != SOCK_OK) {
|
||||
//DBG_PRINT(ERROR_DBG, "[%s] getsockopt SO_RECVBUF error\r\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(recv_len) {
|
||||
recv_len = recvfrom(socket, packet, len, (uint8_t *)ip, port);
|
||||
if(recv_len < 0) {
|
||||
//DBG_PRINT(ERROR_DBG, "[%s] recvfrom error\r\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*ip = ntohl(*ip);
|
||||
|
||||
return recv_len;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void close_tftp_socket(int socket)
|
||||
{
|
||||
close(socket);
|
||||
}
|
||||
|
||||
|
||||
static void init_tftp(void)
|
||||
{
|
||||
g_filename[0] = 0;
|
||||
|
||||
set_server_ip(0);
|
||||
set_server_port(0);
|
||||
set_local_port(0);
|
||||
|
||||
set_tftp_state(STATE_NONE);
|
||||
set_block_number(0);
|
||||
|
||||
/* timeout flag */
|
||||
g_resend_flag = 0;
|
||||
tftp_retry_cnt = tftp_time_cnt = 0;
|
||||
|
||||
g_progress_state = TFTP_PROGRESS;
|
||||
}
|
||||
|
||||
static void tftp_cancel_timeout(void)
|
||||
{
|
||||
if(g_resend_flag) {
|
||||
g_resend_flag = 0;
|
||||
tftp_retry_cnt = tftp_time_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void tftp_reg_timeout()
|
||||
{
|
||||
if(g_resend_flag == 0) {
|
||||
g_resend_flag = 1;
|
||||
tftp_retry_cnt = tftp_time_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void process_tftp_option(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
/* TODO Option Process */
|
||||
}
|
||||
|
||||
static void send_tftp_rrq(uint8_t *filename, uint8_t *mode, TFTP_OPTION *opt, uint8_t opt_len)
|
||||
{
|
||||
uint8_t snd_buf[MAX_MTU_SIZE];
|
||||
uint8_t *pkt = snd_buf;
|
||||
uint32_t i, len;
|
||||
|
||||
*((uint16_t *)pkt) = htons(TFTP_RRQ);
|
||||
pkt += 2;
|
||||
strcpy((char *)pkt, (const char *)filename);
|
||||
pkt += strlen((char *)filename) + 1;
|
||||
strcpy((char *)pkt, (const char *)mode);
|
||||
pkt += strlen((char *)mode) + 1;
|
||||
|
||||
for(i = 0 ; i < opt_len ; i++) {
|
||||
strcpy((char *)pkt, (const char *)opt[i].code);
|
||||
pkt += strlen((char *)opt[i].code) + 1;
|
||||
strcpy((char *)pkt, (const char *)opt[i].value);
|
||||
pkt += strlen((char *)opt[i].value) + 1;
|
||||
}
|
||||
|
||||
len = pkt - snd_buf;
|
||||
|
||||
send_udp_packet(g_tftp_socket, snd_buf, len, get_server_ip(), TFTP_SERVER_PORT);
|
||||
set_tftp_state(STATE_RRQ);
|
||||
set_filename(filename, strlen((char *)filename) + 1);
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP RRQ : FileName(%s), Mode(%s)\r\n", filename, mode);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0 // 2014.07.01 sskim
|
||||
static void send_tftp_wrq(uint8_t *filename, uint8_t *mode, TFTP_OPTION *opt, uint8_t opt_len)
|
||||
{
|
||||
uint8_t snd_buf[MAX_MTU_SIZE];
|
||||
uint8_t *pkt = snd_buf;
|
||||
uint32_t i, len;
|
||||
|
||||
*((uint16_t *)pkt) = htons((uint16_t)TFTP_WRQ);
|
||||
pkt += 2;
|
||||
strcpy((char *)pkt, (const char *)filename);
|
||||
pkt += strlen((char *)filename) + 1;
|
||||
strcpy((char *)pkt, (const char *)mode);
|
||||
pkt += strlen((char *)mode) + 1;
|
||||
|
||||
for(i = 0 ; i < opt_len ; i++) {
|
||||
strcpy((char *)pkt, (const char *)opt[i].code);
|
||||
pkt += strlen((char *)opt[i].code) + 1;
|
||||
strcpy((char *)pkt, (const char *)opt[i].value);
|
||||
pkt += strlen((char *)opt[i].value) + 1;
|
||||
}
|
||||
|
||||
len = pkt - snd_buf;
|
||||
|
||||
send_udp_packet(g_tftp_socket , snd_buf, len, get_server_ip(), TFTP_SERVER_PORT);
|
||||
set_tftp_state(STATE_WRQ);
|
||||
set_filename(filename, strlen((char *)filename) + 1);
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP WRQ : FileName(%s), Mode(%s)\r\n", filename, mode);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0 // 2014.07.01 sskim
|
||||
static void send_tftp_data(uint16_t block_number, uint8_t *data, uint16_t data_len)
|
||||
{
|
||||
uint8_t snd_buf[MAX_MTU_SIZE];
|
||||
uint8_t *pkt = snd_buf;
|
||||
uint32_t len;
|
||||
|
||||
*((uint16_t *)pkt) = htons((uint16_t)TFTP_DATA);
|
||||
pkt += 2;
|
||||
*((uint16_t *)pkt) = htons(block_number);
|
||||
pkt += 2;
|
||||
memcpy(pkt, data, data_len);
|
||||
pkt += data_len;
|
||||
|
||||
len = pkt - snd_buf;
|
||||
|
||||
send_udp_packet(g_tftp_socket , snd_buf, len, get_server_ip(), get_server_port());
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP DATA : Block Number(%d), Data Length(%d)\r\n", block_number, data_len);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void send_tftp_ack(uint16_t block_number)
|
||||
{
|
||||
uint8_t snd_buf[4];
|
||||
uint8_t *pkt = snd_buf;
|
||||
|
||||
*((uint16_t *)pkt) = htons((uint16_t)TFTP_ACK);
|
||||
pkt += 2;
|
||||
*((uint16_t *)pkt) = htons(block_number);
|
||||
pkt += 2;
|
||||
|
||||
send_udp_packet(g_tftp_socket , snd_buf, 4, get_server_ip(), get_server_port());
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP ACK : Block Number(%d)\r\n", block_number);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0 // 2014.07.01 sskim
|
||||
static void send_tftp_oack(TFTP_OPTION *opt, uint8_t opt_len)
|
||||
{
|
||||
uint8_t snd_buf[MAX_MTU_SIZE];
|
||||
uint8_t *pkt = snd_buf;
|
||||
uint32_t i, len;
|
||||
|
||||
*((uint16_t *)pkt) = htons((uint16_t)TFTP_OACK);
|
||||
pkt += 2;
|
||||
|
||||
for(i = 0 ; i < opt_len ; i++) {
|
||||
strcpy((char *)pkt, (const char *)opt[i].code);
|
||||
pkt += strlen((char *)opt[i].code) + 1;
|
||||
strcpy((char *)pkt, (const char *)opt[i].value);
|
||||
pkt += strlen((char *)opt[i].value) + 1;
|
||||
}
|
||||
|
||||
len = pkt - snd_buf;
|
||||
|
||||
send_udp_packet(g_tftp_socket , snd_buf, len, get_server_ip(), get_server_port());
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP OACK \r\n");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0 // 2014.07.01 sskim
|
||||
static void send_tftp_error(uint16_t error_number, uint8_t *error_message)
|
||||
{
|
||||
uint8_t snd_buf[MAX_MTU_SIZE];
|
||||
uint8_t *pkt = snd_buf;
|
||||
uint32_t len;
|
||||
|
||||
*((uint16_t *)pkt) = htons((uint16_t)TFTP_ERROR);
|
||||
pkt += 2;
|
||||
*((uint16_t *)pkt) = htons(error_number);
|
||||
pkt += 2;
|
||||
strcpy((char *)pkt, (const char *)error_message);
|
||||
pkt += strlen((char *)error_message) + 1;
|
||||
|
||||
len = pkt - snd_buf;
|
||||
|
||||
send_udp_packet(g_tftp_socket , snd_buf, len, get_server_ip(), get_server_port());
|
||||
tftp_reg_timeout();
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, ">> TFTP ERROR : Error Number(%d)\r\n", error_number);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void recv_tftp_rrq(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
/* When TFTP Server Mode */
|
||||
}
|
||||
|
||||
static void recv_tftp_wrq(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
/* When TFTP Server Mode */
|
||||
}
|
||||
|
||||
static void recv_tftp_data(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
TFTP_DATA_T *data = (TFTP_DATA_T *)msg;
|
||||
|
||||
data->opcode = ntohs(data->opcode);
|
||||
data->block_num = ntohs(data->block_num);
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, "<< TFTP_DATA : opcode(%d), block_num(%d)\r\n", data->opcode, data->block_num);
|
||||
#endif
|
||||
|
||||
switch(get_tftp_state())
|
||||
{
|
||||
case STATE_RRQ :
|
||||
case STATE_OACK :
|
||||
if(data->block_num == 1) {
|
||||
set_tftp_state(STATE_DATA);
|
||||
set_block_number(data->block_num);
|
||||
#ifdef F_STORAGE
|
||||
save_data(data->data, msg_len - 4, data->block_num);
|
||||
#endif
|
||||
tftp_cancel_timeout();
|
||||
}
|
||||
send_tftp_ack(data->block_num);
|
||||
|
||||
if((msg_len - 4) < TFTP_BLK_SIZE) {
|
||||
init_tftp();
|
||||
g_progress_state = TFTP_SUCCESS;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case STATE_DATA :
|
||||
if(data->block_num == (get_block_number() + 1)) {
|
||||
set_block_number(data->block_num);
|
||||
#ifdef F_STORAGE
|
||||
save_data(data->data, msg_len - 4, data->block_num);
|
||||
#endif
|
||||
tftp_cancel_timeout();
|
||||
}
|
||||
send_tftp_ack(data->block_num);
|
||||
|
||||
if((msg_len - 4) < TFTP_BLK_SIZE) {
|
||||
init_tftp();
|
||||
g_progress_state = TFTP_SUCCESS;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default :
|
||||
/* invalid message */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void recv_tftp_ack(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, "<< TFTP_ACK : \r\n");
|
||||
#endif
|
||||
|
||||
switch(get_tftp_state())
|
||||
{
|
||||
case STATE_WRQ :
|
||||
break;
|
||||
|
||||
case STATE_ACK :
|
||||
break;
|
||||
|
||||
default :
|
||||
/* invalid message */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void recv_tftp_oack(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, "<< TFTP_OACK : \r\n");
|
||||
#endif
|
||||
|
||||
switch(get_tftp_state())
|
||||
{
|
||||
case STATE_RRQ :
|
||||
process_tftp_option(msg, msg_len);
|
||||
set_tftp_state(STATE_OACK);
|
||||
tftp_cancel_timeout();
|
||||
send_tftp_ack(0);
|
||||
break;
|
||||
|
||||
case STATE_WRQ :
|
||||
process_tftp_option(msg, msg_len);
|
||||
set_tftp_state(STATE_ACK);
|
||||
tftp_cancel_timeout();
|
||||
|
||||
/* TODO DATA Transfer */
|
||||
//send_tftp_data(...);
|
||||
break;
|
||||
|
||||
default :
|
||||
/* invalid message */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void recv_tftp_error(uint8_t *msg, uint32_t msg_len)
|
||||
{
|
||||
TFTP_ERROR_T *data= (TFTP_ERROR_T *)msg;
|
||||
|
||||
data->opcode = ntohs(data->opcode);
|
||||
data->error_code = ntohs(data->error_code);
|
||||
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(IPC_DBG, "<< TFTP_ERROR : %d (%s)\r\n", data->error_code, data->error_msg);
|
||||
DBG_PRINT(ERROR_DBG, "[%s] Error Code : %d (%s)\r\n", __func__, data->error_code, data->error_msg);
|
||||
#endif
|
||||
init_tftp();
|
||||
g_progress_state = TFTP_FAIL;
|
||||
}
|
||||
|
||||
static void recv_tftp_packet(uint8_t *packet, uint32_t packet_len, uint32_t from_ip, uint16_t from_port)
|
||||
{
|
||||
uint16_t opcode;
|
||||
|
||||
/* Verify Server IP */
|
||||
if(from_ip != get_server_ip()) {
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(ERROR_DBG, "[%s] Server IP faults\r\n", __func__);
|
||||
DBG_PRINT(ERROR_DBG, "from IP : %08x, Server IP : %08x\r\n", from_ip, get_server_ip());
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
opcode = ntohs(*((uint16_t *)packet));
|
||||
|
||||
/* Set Server Port */
|
||||
if((get_tftp_state() == STATE_WRQ) || (get_tftp_state() == STATE_RRQ)) {
|
||||
set_server_port(from_port);
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(INFO_DBG, "[%s] Set Server Port : %d\r\n", __func__, from_port);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch(opcode)
|
||||
{
|
||||
case TFTP_RRQ : /* When Server */
|
||||
recv_tftp_rrq(packet, packet_len);
|
||||
break;
|
||||
case TFTP_WRQ : /* When Server */
|
||||
recv_tftp_wrq(packet, packet_len);
|
||||
break;
|
||||
case TFTP_DATA :
|
||||
recv_tftp_data(packet, packet_len);
|
||||
break;
|
||||
case TFTP_ACK :
|
||||
recv_tftp_ack(packet, packet_len);
|
||||
break;
|
||||
case TFTP_OACK :
|
||||
recv_tftp_oack(packet, packet_len);
|
||||
break;
|
||||
case TFTP_ERROR :
|
||||
recv_tftp_error(packet, packet_len);
|
||||
break;
|
||||
|
||||
default :
|
||||
// Unknown Mesage
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Functions ----------------------------------------------------*/
|
||||
void TFTP_init(uint8_t socket, uint8_t *buf)
|
||||
{
|
||||
init_tftp();
|
||||
|
||||
g_tftp_socket = open_tftp_socket(socket);
|
||||
g_tftp_rcv_buf = buf;
|
||||
}
|
||||
|
||||
void TFTP_exit(void)
|
||||
{
|
||||
init_tftp();
|
||||
|
||||
close_tftp_socket(g_tftp_socket);
|
||||
g_tftp_socket = -1;
|
||||
|
||||
g_tftp_rcv_buf = NULL;
|
||||
}
|
||||
|
||||
int TFTP_run(void)
|
||||
{
|
||||
uint16_t len, from_port;
|
||||
uint32_t from_ip;
|
||||
|
||||
/* Timeout Process */
|
||||
if(g_resend_flag) {
|
||||
if(tftp_time_cnt >= g_timeout) {
|
||||
switch(get_tftp_state()) {
|
||||
case STATE_WRQ: // 미구현
|
||||
break;
|
||||
|
||||
case STATE_RRQ:
|
||||
send_tftp_rrq(g_filename, (uint8_t *)TRANS_BINARY, &default_tftp_opt, 1);
|
||||
break;
|
||||
|
||||
case STATE_OACK:
|
||||
case STATE_DATA:
|
||||
send_tftp_ack(get_block_number());
|
||||
break;
|
||||
|
||||
case STATE_ACK: // 미구현
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
tftp_time_cnt = 0;
|
||||
tftp_retry_cnt++;
|
||||
|
||||
if(tftp_retry_cnt >= 5) {
|
||||
init_tftp();
|
||||
g_progress_state = TFTP_FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Receive Packet Process */
|
||||
len = recv_udp_packet(g_tftp_socket, g_tftp_rcv_buf, MAX_MTU_SIZE, &from_ip, &from_port);
|
||||
if(len < 0) {
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(ERROR_DBG, "[%s] recv_udp_packet error\r\n", __func__);
|
||||
#endif
|
||||
return g_progress_state;
|
||||
}
|
||||
|
||||
recv_tftp_packet(g_tftp_rcv_buf, len, from_ip, from_port);
|
||||
|
||||
return g_progress_state;
|
||||
}
|
||||
|
||||
void TFTP_read_request(uint32_t server_ip, uint8_t *filename)
|
||||
{
|
||||
set_server_ip(server_ip);
|
||||
#ifdef __TFTP_DEBUG__
|
||||
DBG_PRINT(INFO_DBG, "[%s] Set Tftp Server : %x\r\n", __func__, server_ip);
|
||||
#endif
|
||||
|
||||
g_progress_state = TFTP_PROGRESS;
|
||||
send_tftp_rrq(filename, (uint8_t *)TRANS_BINARY, &default_tftp_opt, 1);
|
||||
}
|
||||
|
||||
void tftp_timeout_handler(void)
|
||||
{
|
||||
if(g_resend_flag)
|
||||
tftp_time_cnt++;
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
/**
|
||||
* @file tftp.h
|
||||
* @brief TFTP Header File.
|
||||
* @version 0.1.0
|
||||
* @author Sang-sik Kim
|
||||
*/
|
||||
#ifndef __TFTP_H__
|
||||
#define __TFTP_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define F_APP_TFTP
|
||||
#define __TFTP_DEBUG__
|
||||
|
||||
#define F_STORAGE // If your target support a storage, you have to activate this feature and implement.
|
||||
|
||||
#define SOCK_TFTP 1
|
||||
|
||||
#define INFO_DBG 0x01
|
||||
#define ERROR_DBG 0x02
|
||||
#define DEBUG_DBG 0x04
|
||||
#define IPC_DBG 0x08
|
||||
|
||||
#define DBG_PRINT(level, format, args...) { \
|
||||
if(dbg_level & level) \
|
||||
printf(format, ##args); \
|
||||
}
|
||||
|
||||
#define NORMAL_MODE 0
|
||||
#define TFTP_MODE 1
|
||||
|
||||
extern int dbg_level;
|
||||
|
||||
/* tftp message */
|
||||
#define TFTP_RRQ 1
|
||||
#define TFTP_WRQ 2
|
||||
#define TFTP_DATA 3
|
||||
#define TFTP_ACK 4
|
||||
#define TFTP_ERROR 5
|
||||
#define TFTP_OACK 6
|
||||
|
||||
/* tftp state */
|
||||
#define STATE_NONE 0
|
||||
#define STATE_RRQ 1
|
||||
#define STATE_WRQ 2
|
||||
#define STATE_DATA 3
|
||||
#define STATE_ACK 4
|
||||
#define STATE_OACK 5
|
||||
|
||||
/* tftp transfer mode */
|
||||
#define TRANS_ASCII "netascii"
|
||||
#define TRANS_BINARY "octet"
|
||||
|
||||
/* tftp progress state */
|
||||
#define TFTP_PROGRESS 0
|
||||
#define TFTP_FAIL 1
|
||||
#define TFTP_SUCCESS 2
|
||||
|
||||
/* define */
|
||||
#define TFTP_SERVER_PORT 69
|
||||
#define TFTP_TEMP_PORT 51000
|
||||
#define TFTP_BLK_SIZE 512
|
||||
#define MAX_MTU_SIZE 1514
|
||||
#define FILE_NAME_SIZE 20
|
||||
|
||||
//#define __TFTP_DEBUG__
|
||||
|
||||
/* typedef */
|
||||
typedef struct tftp_data {
|
||||
uint16_t opcode;
|
||||
uint16_t block_num;
|
||||
uint8_t data[0];
|
||||
} TFTP_DATA_T;
|
||||
|
||||
typedef struct tftp_error {
|
||||
uint16_t opcode;
|
||||
uint16_t error_code;
|
||||
uint8_t error_msg[0];
|
||||
} TFTP_ERROR_T;
|
||||
|
||||
typedef struct tftp_option {
|
||||
uint8_t *code;
|
||||
uint8_t *value;
|
||||
} TFTP_OPTION;
|
||||
|
||||
/* Functions */
|
||||
void TFTP_init(uint8_t socket, uint8_t *buf);
|
||||
void TFTP_exit(void);
|
||||
int TFTP_run(void);
|
||||
void TFTP_read_request(uint32_t server_ip, uint8_t *filename);
|
||||
void tftp_timeout_handler(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*__TFTP_H__ */
|
||||
@@ -1,386 +0,0 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5100.c
|
||||
//! \brief W5100 HAL Interface.
|
||||
//! \version 1.0.0
|
||||
//! \date 2013/10/21
|
||||
//! \par Revision history
|
||||
//! <2013/10/21> 1st Release
|
||||
//! \author MidnightCow
|
||||
//!
|
||||
//! Copyright (c) 2013, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "w5100.h"
|
||||
|
||||
#if (_WIZCHIP_ == 5100)
|
||||
/**
|
||||
@brief This function writes the data into W5100 registers.
|
||||
*/
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
|
||||
{
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//WIZCHIP.IF.BUS._write_byte(AddrSel,wb);
|
||||
WIZCHIP.IF.BUS._write_data(AddrSel,wb);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
/**
|
||||
@brief This function reads the value from W5100 registers.
|
||||
*/
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint8_t ret;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//ret = WIZCHIP.IF.BUS._read_byte(AddrSel);
|
||||
ret = WIZCHIP.IF.BUS._read_data(AddrSel);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
//ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function writes into W5100 memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select(); //M20150601 : Moved here.
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
//M20160715 : Depricated "M20150601 : Remove _select() to top-side"
|
||||
// CS should be controlled every SPI frames
|
||||
WIZCHIP.CS._select();
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]); // Data write (write 1byte data)
|
||||
//M20160715 : Depricated "M20150601 : Remove _select() to top-side"
|
||||
WIZCHIP.CS._deselect();
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
for(i = 0; i < len; i++)
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
// WIZCHIP.IF.BUS._write_byte(AddrSel+i,pBuf[i]);
|
||||
WIZCHIP.IF.BUS._write_data(AddrSel+i,pBuf[i]);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
/*
|
||||
WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR()|MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
|
||||
setMR(getMR() & ~MR_AI);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect(); //M20150601 : Moved here.
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function reads into W5100 memory(Buffer)
|
||||
*/
|
||||
|
||||
void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select(); //M20150601 : Moved here.
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
//M20160715 : Depricated "M20150601 : Remove _select() to top-side"
|
||||
// CS should be controlled every SPI frames
|
||||
WIZCHIP.CS._select();
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >> 0);
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
//M20160715 : Depricated "M20150601 : Remove _select() to top-side"
|
||||
WIZCHIP.CS._deselect();
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
for(i = 0 ; i < len; i++)
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
// pBuf[i] = WIZCHIP.IF.BUS._read_byte(AddrSel+i);
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_data(AddrSel+i);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
/*
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR() | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
setMR(getMR() & ~MR_AI);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect(); //M20150601 : Moved Here.
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// Socket N regsiter IO function //
|
||||
///////////////////////////////////
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// Sn_TXBUF & Sn_RXBUF IO function //
|
||||
/////////////////////////////////////
|
||||
uint32_t getSn_RxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t rxbase = _W5100_IO_BASE_ + _WIZCHIP_IO_RXBUF_;
|
||||
#else
|
||||
uint32_t rxbase = _WIZCHIP_IO_RXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
rxbase += getSn_RxMAX(i);
|
||||
|
||||
return rxbase;
|
||||
}
|
||||
|
||||
uint32_t getSn_TxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t txbase = _W5100_IO_BASE_ + _WIZCHIP_IO_TXBUF_;
|
||||
#else
|
||||
uint32_t txbase = _WIZCHIP_IO_TXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
txbase += getSn_TxMAX(i);
|
||||
return txbase;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
|
||||
|
||||
This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
|
||||
register. User should read upper byte first and lower byte later to get proper value.
|
||||
And this function is being used for copy the data form application buffer to Transmite
|
||||
buffer of the chip. It calculate the actual physical address where one has to write
|
||||
the data in transmite buffer. Here also take care of the condition while it exceed
|
||||
the Tx memory uper-bound of socket.
|
||||
|
||||
*/
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t dst_mask;
|
||||
uint16_t dst_ptr;
|
||||
|
||||
ptr = getSn_TX_WR(sn);
|
||||
|
||||
dst_mask = ptr & getSn_TxMASK(sn);
|
||||
dst_ptr = getSn_TxBASE(sn) + dst_mask;
|
||||
|
||||
if (dst_mask + len > getSn_TxMAX(sn))
|
||||
{
|
||||
size = getSn_TxMAX(sn) - dst_mask;
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
dst_ptr = getSn_TxBASE(sn);
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
|
||||
|
||||
This function read the Rx read pointer register
|
||||
and after copy the data from receive buffer update the Rx write pointer register.
|
||||
User should read upper byte first and lower byte later to get proper value.
|
||||
It calculate the actual physical address where one has to read
|
||||
the data from Receive buffer. Here also take care of the condition while it exceed
|
||||
the Rx memory uper-bound of socket.
|
||||
*/
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t src_mask;
|
||||
uint16_t src_ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
|
||||
src_ptr = (getSn_RxBASE(sn) + src_mask);
|
||||
|
||||
|
||||
if( (src_mask + len) > getSn_RxMAX(sn) )
|
||||
{
|
||||
size = getSn_RxMAX(sn) - src_mask;
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
src_ptr = getSn_RxBASE(sn);
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,514 +0,0 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5100S.c
|
||||
//! \brief W5100S HAL Interface.
|
||||
//! \version 1.0.0
|
||||
//! \date 2018/03/29
|
||||
//! \par Revision history
|
||||
//! <2018/03/29> 1st Release
|
||||
//! \author Peter
|
||||
//!
|
||||
//! Copyright (c) 2013, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "w5100s.h"
|
||||
|
||||
#if (_WIZCHIP_ == W5100S)
|
||||
/**
|
||||
@brief This function writes the data into W5100S registers.
|
||||
*/
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_))
|
||||
if(!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = 0xF0;
|
||||
spi_data[1] = (AddrSel & 0xFF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x00FF) >> 0;
|
||||
spi_data[3] = wb;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 4);
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
|
||||
if(!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0xFF00) >> 8;
|
||||
spi_data[1] = (AddrSel & 0x00FF) >> 0;
|
||||
spi_data[2] = 0xF0;
|
||||
spi_data[3] = wb;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 4);
|
||||
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
/**
|
||||
@brief This function reads the value from W5100S registers.
|
||||
*/
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint8_t ret;
|
||||
uint8_t spi_data[3];
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_))
|
||||
if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
spi_data[0] = 0x0F;
|
||||
spi_data[1] = (AddrSel & 0xFF00) >> 8;
|
||||
spi_data[2] = (AddrSel & 0x00FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
}
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
|
||||
if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // burst operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
}
|
||||
else
|
||||
{
|
||||
spi_data[0] = (AddrSel & 0xFF00) >> 8;
|
||||
spi_data[1] = (AddrSel & 0x00FF) >> 0;
|
||||
spi_data[2] = 0x0F
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
}
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
//ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function writes into W5100S memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i = 0;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select(); //M20150601 : Moved here.
|
||||
|
||||
#if((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_))
|
||||
|
||||
if(!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >> 0);
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]); // Data write (write 1byte data)
|
||||
}
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = 0xF0;
|
||||
spi_data[1] = (((uint16_t)(AddrSel+i)) & 0xFF00) >> 8;
|
||||
spi_data[2] = (((uint16_t)(AddrSel+i)) & 0x00FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._write_burst(pBuf, len);
|
||||
}
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
|
||||
if(!WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]); // Data write (write 1byte data)
|
||||
}
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = (((uint16_t)(AddrSel+i)) & 0xFF00) >> 8;
|
||||
spi_data[1] = (((uint16_t)(AddrSel+i)) & 0x00FF) >> 0;
|
||||
spi_data[2] = 0xF0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._write_burst(pBuf, len);
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
/*
|
||||
WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR()|MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
|
||||
setMR(getMR() & ~MR_AI);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect(); //M20150601 : Moved here.
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function reads into W5100S memory(Buffer)
|
||||
*/
|
||||
|
||||
void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[3];
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select(); //M20150601 : Moved here.
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_) )
|
||||
if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >> 0);
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
}
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = 0x0F;
|
||||
spi_data[1] = (uint16_t)((AddrSel+i) & 0xFF00) >> 8;
|
||||
spi_data[2] = (uint16_t)((AddrSel+i) & 0x00FF) >> 0;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._read_burst(pBuf, len);
|
||||
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
|
||||
if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
}
|
||||
}
|
||||
else // burst operation
|
||||
{
|
||||
spi_data[0] = (uint16_t)((AddrSel+i) & 0xFF00) >> 8;
|
||||
spi_data[1] = (uint16_t)((AddrSel+i) & 0x00FF) >> 0;
|
||||
spi_data[2] = 0x0F;
|
||||
WIZCHIP.IF.SPI._write_burst(spi_data, 3);
|
||||
WIZCHIP.IF.SPI._read_burst(pBuf, len);
|
||||
}
|
||||
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
//M20150601 : Rename the function for integrating with ioLibrary
|
||||
/*
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR() | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
setMR(getMR() & ~MR_AI);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect(); //M20150601 : Moved Here.
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// Socket N regsiter IO function //
|
||||
///////////////////////////////////
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// Sn_TXBUF & Sn_RXBUF IO function //
|
||||
/////////////////////////////////////
|
||||
uint32_t getSn_RxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t rxbase = _W5100S_IO_BASE_ + _WIZCHIP_IO_RXBUF_;
|
||||
#else
|
||||
uint32_t rxbase = _WIZCHIP_IO_RXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
rxbase += getSn_RxMAX(i);
|
||||
|
||||
return rxbase;
|
||||
}
|
||||
|
||||
uint32_t getSn_TxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t txbase = _W5100S_IO_BASE_ + _WIZCHIP_IO_TXBUF_;
|
||||
#else
|
||||
uint32_t txbase = _WIZCHIP_IO_TXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
txbase += getSn_TxMAX(i);
|
||||
return txbase;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
|
||||
|
||||
This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
|
||||
register. User should read upper byte first and lower byte later to get proper value.
|
||||
And this function is being used for copy the data form application buffer to Transmite
|
||||
buffer of the chip. It calculate the actual physical address where one has to write
|
||||
the data in transmite buffer. Here also take care of the condition while it exceed
|
||||
the Tx memory uper-bound of socket.
|
||||
|
||||
*/
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t dst_mask;
|
||||
uint16_t dst_ptr;
|
||||
|
||||
ptr = getSn_TX_WR(sn);
|
||||
|
||||
dst_mask = ptr & getSn_TxMASK(sn);
|
||||
dst_ptr = getSn_TxBASE(sn) + dst_mask;
|
||||
|
||||
if (dst_mask + len > getSn_TxMAX(sn))
|
||||
{
|
||||
size = getSn_TxMAX(sn) - dst_mask;
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
dst_ptr = getSn_TxBASE(sn);
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
|
||||
|
||||
This function read the Rx read pointer register
|
||||
and after copy the data from receive buffer update the Rx write pointer register.
|
||||
User should read upper byte first and lower byte later to get proper value.
|
||||
It calculate the actual physical address where one has to read
|
||||
the data from Receive buffer. Here also take care of the condition while it exceed
|
||||
the Rx memory uper-bound of socket.
|
||||
*/
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t src_mask;
|
||||
uint16_t src_ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
|
||||
src_ptr = (getSn_RxBASE(sn) + src_mask);
|
||||
|
||||
|
||||
if( (src_mask + len) > getSn_RxMAX(sn) )
|
||||
{
|
||||
size = getSn_RxMAX(sn) - src_mask;
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
src_ptr = getSn_RxBASE(sn);
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
void wiz_mdio_write(uint8_t PHYMDIO_regadr, uint16_t var)
|
||||
{
|
||||
WIZCHIP_WRITE(PHYRAR,PHYMDIO_regadr);
|
||||
WIZCHIP_WRITE(PHYDIR, (uint8_t)(var >> 8));
|
||||
WIZCHIP_WRITE(PHYDIR+1, (uint8_t)(var));
|
||||
WIZCHIP_WRITE(PHYACR, PHYACR_WRITE);
|
||||
while(WIZCHIP_READ(PHYACR)); //wait for command complete
|
||||
}
|
||||
|
||||
uint16_t wiz_mdio_read(uint8_t PHYMDIO_regadr)
|
||||
{
|
||||
WIZCHIP_WRITE(PHYRAR,PHYMDIO_regadr);
|
||||
WIZCHIP_WRITE(PHYACR, PHYACR_READ);
|
||||
while(WIZCHIP_READ(PHYACR)); //wait for command complete
|
||||
return ((uint16_t)WIZCHIP_READ(PHYDOR) << 8) | WIZCHIP_READ(PHYDOR+1);
|
||||
}
|
||||
|
||||
void wiz_delay_ms(uint32_t milliseconds)
|
||||
{
|
||||
uint32_t i;
|
||||
for(i = 0 ; i < milliseconds ; i++)
|
||||
{
|
||||
//Write any values to clear the TCNTCLKR register
|
||||
setTCNTCLKR(0xff);
|
||||
|
||||
// Wait until counter register value reaches 10.(10 = 1ms : TCNTR is 100us tick counter register)
|
||||
while(getTCNTR() < 0x0a){}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,353 +0,0 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5200.c
|
||||
//! \brief W5200 HAL Interface.
|
||||
//! \version 1.0.0
|
||||
//! \date 2013/10/21
|
||||
//! \par Revision history
|
||||
//! <2013/10/21> 1st Release
|
||||
//! \author MidnightCow
|
||||
//!
|
||||
//! Copyright (c) 2013, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "w5200.h"
|
||||
|
||||
#if (_WIZCHIP_ == 5200)
|
||||
/**
|
||||
@brief This function writes the data into W5200 registers.
|
||||
*/
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
|
||||
{
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_); // Data write command and Write data length upper
|
||||
WIZCHIP.IF.SPI._write_byte(0x01); // Write data length lower
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with W5300
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
/**
|
||||
@brief This function reads the value from W5200 registers.
|
||||
*/
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint8_t ret;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_READ_); // Read data length upper
|
||||
WIZCHIP.IF.SPI._write_byte(0x01); // Data length lower
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
|
||||
//add indirect bus
|
||||
//M20150601 : Rename the function for integrating with W5300
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
//WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
//ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function writes into W5200 memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
|
||||
WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
|
||||
for(i = 0; i < len; i++)
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]);
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
//M20150601 : Rename the function for integrating with W5300
|
||||
/*
|
||||
WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR() | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function reads into W5200 memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte( _W5200_SPI_READ_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
|
||||
WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
|
||||
for(i = 0; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
//M20150601 : Rename the function for integrating with W5300
|
||||
/*
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
*/
|
||||
setMR(getMR() | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
setMR(getMR() & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// Socket N regsiter IO function //
|
||||
///////////////////////////////////
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// Sn_TXBUF & Sn_RXBUF IO function //
|
||||
/////////////////////////////////////
|
||||
|
||||
uint16_t getSn_RxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
uint16_t rxbase = _WIZCHIP_IO_RXBUF_;
|
||||
for(i = 0; i < sn; i++)
|
||||
rxbase += getSn_RxMAX(i);
|
||||
return rxbase;
|
||||
}
|
||||
|
||||
uint16_t getSn_TxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
uint16_t txbase = _WIZCHIP_IO_TXBUF_;
|
||||
for(i = 0; i < sn; i++)
|
||||
txbase += getSn_TxMAX(i);
|
||||
return txbase;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
|
||||
|
||||
This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
|
||||
register. User should read upper byte first and lower byte later to get proper value.
|
||||
And this function is being used for copy the data form application buffer to Transmite
|
||||
buffer of the chip. It calculate the actual physical address where one has to write
|
||||
the data in transmite buffer. Here also take care of the condition while it exceed
|
||||
the Tx memory uper-bound of socket.
|
||||
|
||||
*/
|
||||
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t dst_mask;
|
||||
uint8_t * dst_ptr;
|
||||
|
||||
ptr = getSn_TX_WR(sn);
|
||||
|
||||
|
||||
dst_mask = (uint32_t)ptr & getSn_TxMASK(sn);
|
||||
dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn) + dst_mask);
|
||||
|
||||
if (dst_mask + len > getSn_TxMAX(sn))
|
||||
{
|
||||
size = getSn_TxMAX(sn) - dst_mask;
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn));
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
|
||||
|
||||
This function read the Rx read pointer register
|
||||
and after copy the data from receive buffer update the Rx write pointer register.
|
||||
User should read upper byte first and lower byte later to get proper value.
|
||||
It calculate the actual physical address where one has to read
|
||||
the data from Receive buffer. Here also take care of the condition while it exceed
|
||||
the Rx memory uper-bound of socket.
|
||||
*/
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t src_mask;
|
||||
uint8_t * src_ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
|
||||
src_ptr = (uint8_t *)((uint32_t)getSn_RxBASE(sn) + src_mask);
|
||||
|
||||
if( (src_mask + len) > getSn_RxMAX(sn) )
|
||||
{
|
||||
size = getSn_RxMAX(sn) - src_mask;
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
src_ptr = (uint8_t*)((uint32_t)getSn_RxBASE(sn));
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,225 +0,0 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5300.h
|
||||
//! \brief W5300 HAL implement File.
|
||||
//! \version 1.0.0
|
||||
//! \date 2015/05/01
|
||||
//! \par Revision history
|
||||
//! <2015/05/01> 1st Released for integrating with ioLibrary
|
||||
//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
|
||||
//! >> https://github.com/Wiznet/ioLibrary_Driver
|
||||
//! \author MidnightCow
|
||||
//! \copyright
|
||||
//!
|
||||
//! Copyright (c) 2015, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include <stdint.h>
|
||||
#include "wizchip_conf.h"
|
||||
|
||||
#if _WIZCHIP_ == 5300
|
||||
|
||||
extern uint8_t sock_remained_byte[_WIZCHIP_SOCK_NUM_];
|
||||
extern uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_];
|
||||
|
||||
|
||||
/***********************
|
||||
* Basic I/O Function *
|
||||
***********************/
|
||||
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint16_t wb )
|
||||
{
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
#if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
|
||||
WIZCHIP.IF.BUS._write_data(AddrSel, (uint8_t)(wb>>8));
|
||||
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(AddrSel,1),(uint8_t)wb);
|
||||
#elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
|
||||
WIZCHIP.IF.BUS._write_data(AddrSel, wb);
|
||||
#else
|
||||
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
|
||||
#endif
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
#if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
|
||||
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR,(uint8_t)(wb>>8));
|
||||
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_DR,1),(uint8_t)wb);
|
||||
#elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
|
||||
WIZCHIP.IF.BUS._write_data(IDM_DR, wb);
|
||||
#else
|
||||
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
|
||||
#endif
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
uint16_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint16_t ret;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
#if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
|
||||
ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(AddrSel)) << 8) |
|
||||
(((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(AddrSel,1))) & 0x00FF) ;
|
||||
#elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
|
||||
ret = WIZCHIP.IF.BUS._read_data(AddrSel);
|
||||
#else
|
||||
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
|
||||
#endif
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
#if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
|
||||
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
|
||||
ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(IDM_DR)) << 8) |
|
||||
(((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(IDM_DR,1))) & 0x00FF);
|
||||
#elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
|
||||
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
|
||||
ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
||||
#else
|
||||
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
|
||||
#endif
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void setTMSR(uint8_t sn,uint8_t tmsr)
|
||||
{
|
||||
uint16_t tmem;
|
||||
tmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)));
|
||||
if(sn & 0x01) tmem = (tmem & 0xFF00) | (((uint16_t)tmsr ) & 0x00FF) ;
|
||||
else tmem = (tmem & 0x00FF) | (((uint16_t)tmsr) << 8) ;
|
||||
WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)),tmem);
|
||||
}
|
||||
|
||||
uint8_t getTMSR(uint8_t sn)
|
||||
{
|
||||
if(sn & 0x01)
|
||||
return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) & 0x00FF);
|
||||
return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) >> 8);
|
||||
}
|
||||
|
||||
void setRMSR(uint8_t sn,uint8_t rmsr)
|
||||
{
|
||||
uint16_t rmem;
|
||||
rmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)));
|
||||
if(sn & 0x01) rmem = (rmem & 0xFF00) | (((uint16_t)rmsr ) & 0x00FF) ;
|
||||
else rmem = (rmem & 0x00FF) | (((uint16_t)rmsr) << 8) ;
|
||||
WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)),rmem);
|
||||
}
|
||||
|
||||
uint8_t getRMSR(uint8_t sn)
|
||||
{
|
||||
if(sn & 0x01)
|
||||
return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) & 0x00FF);
|
||||
return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) >> 8);
|
||||
}
|
||||
|
||||
uint32_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint32_t free_tx_size=0;
|
||||
uint32_t free_tx_size1=1;
|
||||
while(1)
|
||||
{
|
||||
free_tx_size = (((uint32_t)WIZCHIP_READ(Sn_TX_FSR(sn))) << 16) |
|
||||
(((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),2))) & 0x0000FFFF); // read
|
||||
if(free_tx_size == free_tx_size1) break; // if first == sencond, Sn_TX_FSR value is valid.
|
||||
free_tx_size1 = free_tx_size; // save second value into first
|
||||
}
|
||||
return free_tx_size;
|
||||
}
|
||||
|
||||
uint32_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint32_t received_rx_size=0;
|
||||
uint32_t received_rx_size1=1;
|
||||
while(1)
|
||||
{
|
||||
received_rx_size = (((uint32_t)WIZCHIP_READ(Sn_RX_RSR(sn))) << 16) |
|
||||
(((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),2))) & 0x0000FFFF);
|
||||
if(received_rx_size == received_rx_size1) break;
|
||||
received_rx_size1 = received_rx_size; // if first == sencond, Sn_RX_RSR value is valid.
|
||||
} // save second value into first
|
||||
return received_rx_size + (uint32_t)((sock_pack_info[sn] & 0x02) ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
if(len == 0) return;
|
||||
|
||||
for(i = 0; i < len ; i += 2)
|
||||
setSn_TX_FIFOR(sn, (((uint16_t)wizdata[i]) << 8) | (((uint16_t)wizdata[i+1]) & 0x00FF))
|
||||
}
|
||||
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
|
||||
{
|
||||
uint16_t rd = 0;
|
||||
uint32_t i = 0;
|
||||
|
||||
if(len == 0) return;
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
if((i & 0x01)==0)
|
||||
{
|
||||
rd = getSn_RX_FIFOR(sn);
|
||||
wizdata[i] = (uint8_t)(rd >> 8);
|
||||
}
|
||||
else wizdata[i] = (uint8_t)rd; // For checking the memory access violation
|
||||
}
|
||||
sock_remained_byte[sn] = (uint8_t)rd; // back up the remaind fifo byte.
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint32_t len)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
for(i = 0; i < len ; i += 2) getSn_RX_FIFOR(sn);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,8 +9,13 @@
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:genericCH32V203C8T6]
|
||||
platform = ch32v
|
||||
platform = https://git.hye.su/mira/platform-ch32v.git
|
||||
|
||||
platform_packages =
|
||||
toolchain-riscv @ https://git.hye.su/mira/toolchain-riscv-linux.git ; gcc 14.2.0
|
||||
framework-ch32v003fun @ https://github.com/cnlohr/ch32v003fun.git ; upstream cnlohr repo
|
||||
board = genericCH32V203C8T6
|
||||
framework = ch32v003fun
|
||||
upload_protocol = wlink # isp, minichlink, wch-link, wlink
|
||||
|
||||
build_unflags = -march=rv32imacxw
|
||||
build_flags = -march=rv32imac
|
||||
|
||||
@@ -179,10 +179,11 @@ int main(void) {
|
||||
int8_t res;
|
||||
uint8_t retries = 0;
|
||||
|
||||
while (retries < 10) {
|
||||
while (retries < 2) {
|
||||
Delay_Ms(250);
|
||||
|
||||
printf("Resolving domain name \"%s\"...\r\n", domain_name);
|
||||
|
||||
res = DNS_run(dns, (uint8_t *)domain_name, addr);
|
||||
|
||||
if (res == 1) {
|
||||
|
||||
Reference in New Issue
Block a user