add SNTP support and expand time server and time offset fields of DHCP support. See doc/README.SNTP * Patch by Steven Scholz, 13 Dec 2004: Fix bug in at91rm920 ethernet drivermaster
parent
ef2807c667
commit
ea287debe1
@ -0,0 +1,17 @@ |
||||
To use SNTP support, add a define CFG_CMD_SNTP to CONFIG_COMMANDS in |
||||
the configuration file of the board. |
||||
|
||||
The "sntp" command gets network time from NTP time server and |
||||
syncronize RTC of the board. This command needs the command line |
||||
parameter of server's IP address or environment variable |
||||
"ntpserverip". The network time is sent as UTC. So if you want to |
||||
set local time to RTC, set the offset in second from UTC to the |
||||
enviroment variable "time offset". |
||||
|
||||
If the DHCP server provides time server's IP or time offset, you |
||||
don't need to set the above environment variables yourself. |
||||
|
||||
Current limitations of SNTP support: |
||||
1. The roundtrip time is ignored. |
||||
2. Only the 1st NTP server IP, in the option ntp-servers of DHCP, will |
||||
be used. |
@ -0,0 +1,93 @@ |
||||
/*
|
||||
* SNTP support driver |
||||
* |
||||
* Masami Komiya <mkomiya@sonare.it> 2005 |
||||
* |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <net.h> |
||||
#include <rtc.h> |
||||
|
||||
#include "sntp.h" |
||||
|
||||
#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_SNTP)) |
||||
|
||||
#define SNTP_TIMEOUT 10 |
||||
|
||||
static int SntpOurPort; |
||||
|
||||
static void |
||||
SntpSend (void) |
||||
{ |
||||
struct sntp_pkt_t pkt; |
||||
int pktlen = SNTP_PACKET_LEN; |
||||
int sport; |
||||
|
||||
debug ("%s\n", __FUNCTION__); |
||||
|
||||
memset (&pkt, 0, sizeof(pkt)); |
||||
|
||||
pkt.li = NTP_LI_NOLEAP; |
||||
pkt.vn = NTP_VERSION; |
||||
pkt.mode = NTP_MODE_CLIENT; |
||||
|
||||
memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen); |
||||
|
||||
SntpOurPort = 10000 + (get_timer(0) % 4096); |
||||
sport = NTP_SERVICE_PORT; |
||||
|
||||
NetSendUDPPacket (NetServerEther, NetNtpServerIP, sport, SntpOurPort, pktlen); |
||||
} |
||||
|
||||
static void |
||||
SntpTimeout (void) |
||||
{ |
||||
puts ("Timeout\n"); |
||||
NetState = NETLOOP_FAIL; |
||||
return; |
||||
} |
||||
|
||||
static void |
||||
SntpHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) |
||||
{ |
||||
struct sntp_pkt_t rpkt; |
||||
struct rtc_time tm; |
||||
|
||||
debug ("%s\n", __FUNCTION__); |
||||
|
||||
if (dest != SntpOurPort) return; |
||||
|
||||
memcpy ((unsigned char *)&rpkt, pkt, len); |
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP) |
||||
to_tm(ntohl(rpkt.transmit_timestamp), &tm); |
||||
printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n", |
||||
tm.tm_year, tm.tm_mon, tm.tm_mday, |
||||
tm.tm_hour, tm.tm_min, tm.tm_sec); |
||||
to_tm(ntohl(rpkt.transmit_timestamp) - 2208988800u + NetTimeOffset, &tm); |
||||
#if (CONFIG_COMMANDS & CFG_CMD_DATE) |
||||
rtc_set (&tm); |
||||
#endif |
||||
printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n", |
||||
tm.tm_year, tm.tm_mon, tm.tm_mday, |
||||
tm.tm_hour, tm.tm_min, tm.tm_sec); |
||||
#endif |
||||
|
||||
NetState = NETLOOP_SUCCESS; |
||||
} |
||||
|
||||
void |
||||
SntpStart (void) |
||||
{ |
||||
debug ("%s\n", __FUNCTION__); |
||||
|
||||
NetSetTimeout (SNTP_TIMEOUT * CFG_HZ, SntpTimeout); |
||||
NetSetHandler(SntpHandler); |
||||
memset (NetServerEther, 0, 6); |
||||
|
||||
SntpSend (); |
||||
} |
||||
|
||||
#endif /* CONFIG_COMMANDS & CFG_CMD_SNTP */ |
@ -0,0 +1,61 @@ |
||||
/*
|
||||
* (C) Masami Komiya <mkomiya@sonare.it> 2005 |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2, or (at |
||||
* your option) any later version. |
||||
*/ |
||||
|
||||
#ifndef __SNTP_H__ |
||||
#define __SNTP_H__ |
||||
|
||||
#define NTP_SERVICE_PORT 123 |
||||
#define SNTP_PACKET_LEN 48 |
||||
|
||||
|
||||
/* Leap Indicator */ |
||||
#define NTP_LI_NOLEAP 0x0 |
||||
#define NTP_LI_61SECS 0x1 |
||||
#define NTP_LI_59SECS 0x2 |
||||
#define NTP_LI_ALARM 0x3 |
||||
|
||||
/* Version */ |
||||
|
||||
#define NTP_VERSION 4 |
||||
|
||||
/* Mode */ |
||||
#define NTP_MODE_RESERVED 0 |
||||
#define NTP_MODE_SYMACTIVE 1 /* Symmetric Active */ |
||||
#define NTP_MODE_SYMPASSIVE 2 /* Symmetric Passive */ |
||||
#define NTP_MODE_CLIENT 3 |
||||
#define NTP_MODE_SERVER 4 |
||||
#define NTP_MODE_BROADCAST 5 |
||||
#define NTP_MODE_NTPCTRL 6 /* Reserved for NTP control message */ |
||||
#define NTP_MODE_PRIVATE 7 /* Reserved for private use */ |
||||
|
||||
struct sntp_pkt_t { |
||||
#if __LITTLE_ENDIAN |
||||
uchar mode:3; |
||||
uchar vn:3; |
||||
uchar li:2; |
||||
#else |
||||
uchar li:2; |
||||
uchar vn:3; |
||||
uchar mode:3; |
||||
#endif |
||||
uchar stratum; |
||||
uchar poll; |
||||
uchar precision; |
||||
uint root_delay; |
||||
uint root_dispersion; |
||||
uint reference_id; |
||||
unsigned long long reference_timestamp; |
||||
unsigned long long originate_timestamp; |
||||
unsigned long long receive_timestamp; |
||||
unsigned long long transmit_timestamp; |
||||
}; |
||||
|
||||
extern void SntpStart (void); /* Begin SNTP */ |
||||
|
||||
#endif /* __SNTP_H__ */ |
Loading…
Reference in new issue