⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntp_client.lst

📁 ENC28J60 System HTTP
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"ntp_client.c"
   2               	__SREG__ = 0x3f
   3               	__SP_H__ = 0x3e
   4               	__SP_L__ = 0x3d
   5               	__CCP__  = 0x34
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
 120               	.global	ntp_client_init
 122               	ntp_client_init:
   1:net/ntp_client.c **** /*
   2:net/ntp_client.c **** ,-----------------------------------------------------------------------------------------.
   3:net/ntp_client.c **** | net/ntp_client
   4:net/ntp_client.c **** |-----------------------------------------------------------------------------------------
   5:net/ntp_client.c **** | this file describes a very simple ntp client.
   6:net/ntp_client.c **** | - it does not check the UDP checksum
   7:net/ntp_client.c **** | - it does not really do the ntp sequence, it justs sends ONE request
   8:net/ntp_client.c **** |   and uses the reply timestamp as valid clock (-> network delay -> wrong clock)
   9:net/ntp_client.c **** |   (i do not really need a very accurate clock...)
  10:net/ntp_client.c **** |
  11:net/ntp_client.c **** | Author   : Simon Schulz / avr{AT}auctionant.de
  12:net/ntp_client.c **** |
  13:net/ntp_client.c **** | 
  14:net/ntp_client.c **** |
  15:net/ntp_client.c **** |-----------------------------------------------------------------------------------------
  16:net/ntp_client.c **** | License:
  17:net/ntp_client.c **** | This program is free software; you can redistribute it and/or modify it under
  18:net/ntp_client.c **** | the terms of the GNU General Public License as published by the Free Software
  19:net/ntp_client.c **** | Foundation; either version 2 of the License, or (at your option) any later
  20:net/ntp_client.c **** | version.
  21:net/ntp_client.c **** | This program is distributed in the hope that it will be useful, but
  22:net/ntp_client.c **** |
  23:net/ntp_client.c **** | WITHOUT ANY WARRANTY;
  24:net/ntp_client.c **** |
  25:net/ntp_client.c **** | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  26:net/ntp_client.c **** | PURPOSE. See the GNU General Public License for more details.
  27:net/ntp_client.c **** |
  28:net/ntp_client.c **** | You should have received a copy of the GNU General Public License along with
  29:net/ntp_client.c **** | this program; if not, write to the Free Software Foundation, Inc., 51
  30:net/ntp_client.c **** | Franklin St, Fifth Floor, Boston, MA 02110, USA
  31:net/ntp_client.c **** |
  32:net/ntp_client.c **** | http://www.gnu.de/gpl-ger.html
  33:net/ntp_client.c **** `-----------------------------------------------------------------------------------------*/
  34:net/ntp_client.c **** #include "ntp_client.h"
  35:net/ntp_client.c **** 
  36:net/ntp_client.c **** //ACTIVATE DEBUG by editing this file:
  37:net/ntp_client.c **** #include "debug.h"
  38:net/ntp_client.c **** 
  39:net/ntp_client.c **** uint32_t ntp_client_server_ip;
  40:net/ntp_client.c **** char ntp_client_call_again;
  41:net/ntp_client.c **** 
  42:net/ntp_client.c **** void ntp_client_init(){
 123               	
 124               	.LM0:
 125               	.LFBB1:
 126               	/* prologue: function */
 127               	/* frame size = 0 */
  43:net/ntp_client.c **** ESS;
 128               	abn	68,0,43,.LM1-.LFBB1
 129               	.LM1:
 130 0000 81E4      		ldi r24,lo8(1083055169)
 131 0002 9CE1      		ldi r25,hi8(1083055169)
 132 0004 AEE8      		ldi r26,hlo8(1083055169)
 133 0006 B0E4      		ldi r27,hhi8(1083055169)
 134 0008 8093 0000 		sts ntp_client_server_ip,r24
 135 000c 9093 0000 		sts (ntp_client_server_ip)+1,r25
 136 0010 A093 0000 		sts (ntp_client_server_ip)+2,r26
 137 0014 B093 0000 		sts (ntp_client_server_ip)+3,r27
  44:net/ntp_client.c **** ntp_client_call_again = 0;
 138               	,0,44,.LM2-.LFBB1
 139               	.LM2:
 140 0018 1092 0000 		sts ntp_client_call_again,__zero_reg__
 141               	/* epilogue start */
  45:net/ntp_client.c **** 
 142               	abn	68,0,45,.LM3-.LFBB1
 143               	.LM3:
 144 001c 0895      		ret
 146               	.Lscope1:
 150               	.global	ntp_client_timestamp_to_time
 152               	ntp_client_timestamp_to_time:
  46:net/ntp_client.c **** 
  47:net/ntp_client.c **** void ntp_client_send_request(unsigned char *buffer){
  48:net/ntp_client.c **** 	unsigned int i;
  49:net/ntp_client.c **** 
  50:net/ntp_client.c **** 	//set NTP flags (client)
  51:net/ntp_client.c **** 	buffer[NTP_POS_FLAGS] = 0xE3;
  52:net/ntp_client.c **** 
  53:net/ntp_client.c **** 	//set peer clock stratum to unspecified
  54:net/ntp_client.c **** 	buffer[NTP_POS_STRATUM] = 0x00;
  55:net/ntp_client.c **** 
  56:net/ntp_client.c **** 	//set poll intervall to 4 (=16sec)
  57:net/ntp_client.c **** 	buffer[NTP_POS_POLL_INTERVAL] = 0x04;
  58:net/ntp_client.c **** 
  59:net/ntp_client.c **** 	//set precision (??)
  60:net/ntp_client.c **** 	buffer[NTP_POS_PRECISION] = 0xFA;
  61:net/ntp_client.c **** 
  62:net/ntp_client.c **** 	//clear data buffer:
  63:net/ntp_client.c **** 	//-> we only need to set some values because many data is 0x00
  64:net/ntp_client.c **** 	for(i=NTP_POS_ROOT_DELAY; i<NTP_POS_LAST_DATA; i++)
  65:net/ntp_client.c **** 		buffer[i] = 0x00;
  66:net/ntp_client.c **** 
  67:net/ntp_client.c **** 	//set root delay to 1s -> 0x00 0x01 0x00 0x00
  68:net/ntp_client.c **** 	buffer[NTP_POS_ROOT_DELAY+1] = 0x01; //rest is zero, see above
  69:net/ntp_client.c **** 
  70:net/ntp_client.c **** 	//set clock dispersion to 1s -> 0x00 0x01 0x00 0x00
  71:net/ntp_client.c **** 	buffer[NTP_POS_CLOCK_DISP+1] = 0x01; //rest is zero, see above
  72:net/ntp_client.c **** 
  73:net/ntp_client.c **** 	//reference clock id = 0x00 0x00 0x00 0x00
  74:net/ntp_client.c **** 	//reference clock update time NULL = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  75:net/ntp_client.c **** 	//originate timestamp         NULL= 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  76:net/ntp_client.c **** 	//receive timestamp           NULL= 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  77:net/ntp_client.c **** 	
  78:net/ntp_client.c **** 	//tx timestamp:
  79:net/ntp_client.c **** 	//send NULL ... MAYBE add timestamp calc from localclock here
  80:net/ntp_client.c **** 	//tx timestamp           NULL= 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  81:net/ntp_client.c **** 
  82:net/ntp_client.c **** 	//generate an udp packet:
  83:net/ntp_client.c **** 	unsigned char *dest_mac;
  84:net/ntp_client.c **** 	unsigned int arp_idx;
  85:net/ntp_client.c **** 	unsigned long *server_ip;
  86:net/ntp_client.c **** 
  87:net/ntp_client.c **** 	//target ip in the same network ?!
  88:net/ntp_client.c **** 	if ((ntp_client_server_ip & NIC_IP_NETMASK) != (nic_ip & NIC_IP_NETMASK)){
  89:net/ntp_client.c **** 		#if NTP_CLIENT_DEBUG
  90:net/ntp_client.c **** 		softuart_puts_progmem("NTP : ntp server ");
  91:net/ntp_client.c **** 		softuart_put_ip(ntp_client_server_ip);
  92:net/ntp_client.c **** 		softuart_puts_progmem(" outside home net -> use gateway\r\n");
  93:net/ntp_client.c **** 		#endif
  94:net/ntp_client.c **** 		server_ip = &nic_gateway_ip;
  95:net/ntp_client.c **** 	}else{
  96:net/ntp_client.c **** 		server_ip = &ntp_client_server_ip;
  97:net/ntp_client.c **** 	}
  98:net/ntp_client.c **** 	
  99:net/ntp_client.c **** 	arp_idx = arp_search_by_ip(*server_ip);
 100:net/ntp_client.c **** 
 101:net/ntp_client.c **** 	if (arp_idx == -1){
 102:net/ntp_client.c **** 		//target ip (gateway) unknown
 103:net/ntp_client.c **** 		//->send arp request and exit,
 104:net/ntp_client.c **** 		//this is called later again and we hopefully know the mac then
 105:net/ntp_client.c **** 		arp_send_request(buffer, server_ip);
 106:net/ntp_client.c **** 		
 107:net/ntp_client.c **** 		//ntp client must be called again after we finished the arp comm!
 108:net/ntp_client.c **** 		ntp_client_call_again = 1;
 109:net/ntp_client.c **** 		return;
 110:net/ntp_client.c **** 	}
 111:net/ntp_client.c **** 	//no need to be called again, we know the mac address of gateway
 112:net/ntp_client.c **** 	ntp_client_call_again = 0;
 113:net/ntp_client.c **** 
 114:net/ntp_client.c **** 	dest_mac = (arp_table[arp_idx].mac);
 115:net/ntp_client.c **** 
 116:net/ntp_client.c **** 	/*dest_mac[0] = 0x00;
 117:net/ntp_client.c **** 	dest_mac[1] = 0xE0;
 118:net/ntp_client.c **** 	dest_mac[2] = 0x4C;
 119:net/ntp_client.c **** 	dest_mac[3] = 0x6A;
 120:net/ntp_client.c **** 	dest_mac[4] = 0xBF;
 121:net/ntp_client.c **** 	dest_mac[5] = 0xDE;*/
 122:net/ntp_client.c **** 
 123:net/ntp_client.c **** 	udp_generate_packet(buffer, &ntp_client_server_ip, dest_mac , IP_PORT_NTP_CLIENT, IP_PORT_NTP, NTP
 124:net/ntp_client.c **** 
 125:net/ntp_client.c **** 	//send packet:
 126:net/ntp_client.c **** 	nic_send_packet(buffer, 14+(IP_HEADER_LENGTH<<2)+8+NTP_DATALENGTH);
 127:net/ntp_client.c **** }
 128:net/ntp_client.c **** 
 129:net/ntp_client.c **** //decode an ntp packet & extract time data
 130:net/ntp_client.c **** //this is called after ip+udp decidet this packet is valid & is for us.
 131:net/ntp_client.c **** //-> ip+udp checks are done before (!)
 132:net/ntp_client.c **** void ntp_client_decode_packet(unsigned char *buffer, unsigned int len){
 133:net/ntp_client.c **** 	unsigned long timestamp;
 134:net/ntp_client.c **** 	//check for valid flags, should be:
 135:net/ntp_client.c **** 	//- NTP Version 4
 136:net/ntp_client.c **** 	//- Server Mode
 137:net/ntp_client.c **** 	//-> ignore Leap indicator
 138:net/ntp_client.c **** 	if ((buffer[NTP_POS_FLAGS]&0x3F) != NTP_FLAG_NTP4_SERVER)
 139:net/ntp_client.c **** 		return;
 140:net/ntp_client.c **** 
 141:net/ntp_client.c **** 	//extract timestamp
 142:net/ntp_client.c **** 	//NOTE: because we do not really need the exact clock, we
 143:net/ntp_client.c **** 	//      only use the TX timestamp and hope that the transfer
 144:net/ntp_client.c **** 	//      did not take too long -> maybe fix this later
 145:net/ntp_client.c **** 	//      (and we dont use the microseconds...)
 146:net/ntp_client.c **** 	timestamp = buffer[NTP_POS_TX_TIMESTAMP+0]<<8;
 147:net/ntp_client.c **** 	timestamp = (timestamp + buffer[NTP_POS_TX_TIMESTAMP+1])<<8;
 148:net/ntp_client.c **** 	timestamp = (timestamp + buffer[NTP_POS_TX_TIMESTAMP+2])<<8;
 149:net/ntp_client.c **** 	timestamp = (timestamp + buffer[NTP_POS_TX_TIMESTAMP+3]);
 150:net/ntp_client.c **** 
 151:net/ntp_client.c **** 	#if NTP_CLIENT_DEBUG
 152:net/ntp_client.c **** 	softuart_puts_progmem("NTP : timestamp is ");
 153:net/ntp_client.c **** 	for(int i=0; i<4; i++){
 154:net/ntp_client.c **** 		softuart_put_uint8(buffer[0x52+i]);
 155:net/ntp_client.c **** 		softuart_putc(' ');
 156:net/ntp_client.c **** 	}
 157:net/ntp_client.c **** 	softuart_putnewline();
 158:net/ntp_client.c **** 	#endif
 159:net/ntp_client.c **** 	unsigned char date[6];
 160:net/ntp_client.c **** 	ntp_client_timestamp_to_time(timestamp, date);
 161:net/ntp_client.c **** 
 162:net/ntp_client.c **** 	#if NTP_CLIENT_DEBUG
 163:net/ntp_client.c **** 	//german format !
 164:net/ntp_client.c **** 	softuart_puts_progmem("DATE: ");
 165:net/ntp_client.c **** 	softuart_put_uint8(date[NTP_TIME_DAY]);
 166:net/ntp_client.c **** 	softuart_putc('.');
 167:net/ntp_client.c **** 	softuart_put_uint8(date[NTP_TIME_MONTH]);
 168:net/ntp_client.c **** 	softuart_putc('.');
 169:net/ntp_client.c **** 	softuart_put_uint16(1900 + date[NTP_TIME_YEAR]);
 170:net/ntp_client.c **** 	
 171:net/ntp_client.c **** 	softuart_puts_progmem(" TIME: ");
 172:net/ntp_client.c **** 	softuart_put_uint8(date[NTP_TIME_HOUR]);
 173:net/ntp_client.c **** 	softuart_putc(':');
 174:net/ntp_client.c **** 	softuart_put_uint8(date[NTP_TIME_MIN]);
 175:net/ntp_client.c **** 	softuart_putc(':');
 176:net/ntp_client.c **** 	softuart_put_uint8(date[NTP_TIME_SEC]);
 177:net/ntp_client.c **** 	softuart_puts_progmem(" (UTC!)");
 178:net/ntp_client.c **** 	softuart_putnewline();
 179:net/ntp_client.c **** 	#endif
 180:net/ntp_client.c **** 
 181:net/ntp_client.c **** 	clock_do();
 182:net/ntp_client.c **** 	clock[CLOCK_HOUR] = date[NTP_TIME_HOUR]+2;
 183:net/ntp_client.c **** 	clock[CLOCK_MIN] = date[NTP_TIME_MIN];
 184:net/ntp_client.c **** 	clock[CLOCK_SEC] = date[NTP_TIME_SEC];	
 185:net/ntp_client.c **** }
 186:net/ntp_client.c **** 
 187:net/ntp_client.c **** //lookup table
 188:net/ntp_client.c **** PROGMEM char NTP_CLIENT_MONTH_TO_DAYS[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 189:net/ntp_client.c **** 
 190:net/ntp_client.c **** //convert unix timestamp to date/time.
 191:net/ntp_client.c **** //returns: year,month,day,hour,min,sec (year ist realyear-1970)
 192:net/ntp_client.c **** //
 193:net/ntp_client.c **** //inspired by code posted on mikrocontroller.net by peter dannegger:
 194:net/ntp_client.c **** // see http://www.mikrocontroller.net/forum/read-4-140631.html#new
 195:net/ntp_client.c **** void ntp_client_timestamp_to_time(unsigned long timestamp, unsigned char *time){
 153               	0,195,.LM4-.LFBB2
 154               	.LM4:
 155               	.LFBB2:
 156 001e EF92      		push r14
 157 0020 FF92      		push r15
 158 0022 0F93      		push r16
 159 0024 1F93      		push r17
 160 0026 CF93      		push r28
 161 0028 DF93      		push r29
 162               	/* prologue: function */
 163               	/* frame size = 0 */
 164 002a 7B01      		movw r14,r22
 165 002c 8C01      		movw r16,r24
 166 002e EA01      		movw r28,r20
 196:net/ntp_client.c **** lient_timestamp_to_time(unsigned long timestamp, unsigned char *time){
 197:net/ntp_client.c **** 	unsigned char tmp;
 198:net/ntp_client.c **** 	unsigned char tmp_year;
 199:net/ntp_client.c **** 	unsigned int tmp_day;
 200:net/ntp_client.c **** 	unsigned char leap400;
 201:net/ntp_client.c **** 
 202:net/ntp_client.c **** 	//calculate seconds:
 167               	02,.LM5-.LFBB2
 168               	.LM5:
 169 0030 2CE3      		ldi r18,lo8(60)
 170 0032 30E0      		ldi r19,hi8(60)
 171 0034 40E0      		ldi r20,hlo8(60)
 172 0036 50E0      		ldi r21,hhi8(60)
 173 0038 0E94 0000 		call __udivmodsi4
 174 003c 6D83      		std Y+5,r22
 203:net/ntp_client.c **** gned int tmp_day;
 175               	68,0,203,.LM6-.LFBB2
 176               	.LM6:
 177 003e C801      		movw r24,r16
 178 0040 B701      		movw r22,r14
 179 0042 2CE3      		ldi r18,lo8(60)
 180 0044 30E0      		ldi r19,hi8(60)
 181 0046 40E0      		ldi r20,hlo8(60)
 182 0048 50E0      		ldi r21,hhi8(60)
 183 004a 0E94 0000 		call __udivmodsi4
 184 004e 122F      		mov r17,r18
 185 0050 032F      		mov r16,r19
 186 0052 F42E      		mov r15,r20
 187 0054 E52E      		mov r14,r21
 204:net/ntp_client.c **** 	unsigned char tmp;
 205:net/ntp_client.c **** 	unsigned char tmp_year;
 206:net/ntp_client.c **** 	unsigned int tmp_day;
 188               	206,.LM7-.LFBB2
 189               	.LM7:
 190 0056 622F      		mov r22,r18
 191 0058 732F      		mov r23,r19
 192 005a 842F      		mov r24,r20
 193 005c 952F      		mov r25,r21
 194 005e 2CE3      		ldi r18,lo8(60)
 195 0060 30E0      		ldi r19,hi8(60)
 196 0062 40E0      		ldi r20,hlo8(60)
 197 0064 50E0      		ldi r21,hhi8(60)
 198 0066 0E94 0000 		call __udivmodsi4
 199 006a 6C83      		std Y+4,r22
 207:net/ntp_client.c **** 	unsigned char tmp;
 200               	,207,.LM8-.LFBB2
 201               	.LM8:
 202 006c 612F      		mov r22,r17
 203 006e 702F      		mov r23,r16
 204 0070 8F2D      		mov r24,r15
 205 0072 9E2D      		mov r25,r14
 206 0074 2CE3      		ldi r18,lo8(60)
 207 0076 30E0      		ldi r19,hi8(60)
 208 0078 40E0      		ldi r20,hlo8(60)
 209 007a 50E0      		ldi r21,hhi8(60)
 210 007c 0E94 0000 		call __udivmodsi4
 211 0080 122F      		mov r17,r18
 212 0082 032F      		mov r16,r19
 213 0084 F42E      		mov r15,r20
 214 0086 E52E      		mov r14,r21
 208:net/ntp_client.c **** me(unsigned long timestamp, unsigned char *time){
 209:net/ntp_client.c **** 	unsigned char tmp;
 210:net/ntp_client.c **** 	unsigned char tmp_year;
 215               	0,.LM9-.LFBB2
 216               	.LM9:
 217 0088 622F      		mov r22,r18
 218 008a 732F      		mov r23,r19
 219 008c 842F      		mov r24,r20
 220 008e 952F      		mov r25,r21

⌨️ 快捷键说明

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