ptpd-mpc831x.patch
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· PATCH 代码 · 共 610 行 · 第 1/2 页
PATCH
610 行
diff --git a/src/Makefile b/src/Makefile
index 871e229..ef128c7 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,12 +4,25 @@ RM = rm -f
CFLAGS = -Wall
#CPPFLAGS = -DPTPD_DBG -DPTPD_NO_DAEMON
+# In case this is an MPC831X system, define CONFIG_MPC831X
+CONFIG_MPC831X=1
+
+
+# Nothing to be changed below this line
+
PROG = ptpd
OBJ = ptpd.o arith.o bmc.o probe.o protocol.o \
- dep/msg.o dep/net.o dep/servo.o dep/startup.o dep/sys.o dep/timer.o
+ dep/msg.o dep/net.o dep/servo.o dep/startup.o dep/sys.o dep/timer.o
HDR = ptpd.h constants.h datatypes.h \
- dep/ptpd_dep.h dep/constants_dep.h dep/datatypes_dep.h
-
+ dep/ptpd_dep.h dep/constants_dep.h dep/datatypes_dep.h
+
+ifeq ($(CONFIG_MPC831X), 1)
+CFLAGS = -Wall -DPTPD_DBG -DCONFIG_MPC831X
+LDFLAGS = -static
+OBJ += mpc831x.o
+HDR += mpc831x.h
+CC=powerpc-e300c3-linux-gcc
+endif
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
diff --git a/src/dep/constants_dep.h b/src/dep/constants_dep.h
index 4c36854..d066629 100644
--- a/src/dep/constants_dep.h
+++ b/src/dep/constants_dep.h
@@ -56,8 +56,11 @@
# endif
#endif
-
+#ifdef CONFIG_MPC831X
+#define ADJ_FREQ_MAX 524288
+#else
#define ADJ_FREQ_MAX 512000
+#endif
/* UDP/IPv4 dependent */
diff --git a/src/dep/msg.c b/src/dep/msg.c
index 97fe997..e22933c 100644
--- a/src/dep/msg.c
+++ b/src/dep/msg.c
@@ -2,6 +2,10 @@
/* see spec annex d */
#include "../ptpd.h"
+#ifdef CONFIG_MPC831X
+#include "../mpc831x.h"
+#endif
+
Boolean msgPeek(void *buf)
{
@@ -44,9 +48,9 @@ void msgUnpackHeader(void *buf, MsgHeader *header)
void msgUnpackSync(void *buf, MsgSync *sync)
{
sync->originTimestamp.seconds = flip32(*(UInteger32*)(buf + 40));
- DBGV("msgUnpackSync: originTimestamp.seconds %u\n", sync->originTimestamp.seconds);
+ DBG("msgUnpackSync: originTimestamp.seconds %u\n", sync->originTimestamp.seconds);
sync->originTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 44));
- DBGV("msgUnpackSync: originTimestamp.nanoseconds %d\n", sync->originTimestamp.nanoseconds);
+ DBG("msgUnpackSync: originTimestamp.nanoseconds %d\n", sync->originTimestamp.nanoseconds);
sync->epochNumber = flip16(*(UInteger16*)(buf + 48));
DBGV("msgUnpackSync: epochNumber %d\n", sync->epochNumber);
sync->currentUTCOffset = flip16(*(Integer16*)(buf + 50));
@@ -215,6 +219,7 @@ UInteger8 msgUnloadManagement(void *buf, MsgManagement *manage,
externalTime.seconds = flip32(*(UInteger32*)(buf + 60));
externalTime.nanoseconds = flip32(*(Integer32*)(buf + 64));
toInternalTime(&internalTime, &externalTime, &ptpClock->halfEpoch);
+ printf( "PTP_MM_SET_TIME\n" );
setTime(&internalTime);
break;
@@ -618,8 +623,12 @@ UInteger16 msgPackManagementResponse(void *buf, MsgHeader *header, MsgManagement
case PTP_MM_GET_GLOBAL_TIME_DATA_SET:
*(UInteger8*)(buf + 55) = PTP_MM_GLOBAL_TIME_DATA_SET;
*(Integer32*)(buf + 56) = shift16(flip16(24), 1);
-
+
+#ifdef CONFIG_MPC831X
+ mpc831x_get_curr_time(&internalTime);
+#else
getTime(&internalTime);
+#endif
fromInternalTime(&internalTime, &externalTime, ptpClock->halfEpoch);
*(Integer32*)(buf + 60) = flip32(externalTime.seconds);
*(Integer32*)(buf + 64) = flip32(externalTime.nanoseconds);
diff --git a/src/dep/net.c b/src/dep/net.c
index c773eeb..7b306f6 100644
--- a/src/dep/net.c
+++ b/src/dep/net.c
@@ -1,6 +1,9 @@
/* net.c */
#include "../ptpd.h"
+#ifdef CONFIG_MPC831X
+#include "../mpc831x.h"
+#endif
Boolean lookupSubdomainAddress(Octet *subdomainName, Octet *subdomainAddress)
{
@@ -139,7 +142,11 @@ UInteger32 findIface(Octet *ifaceName, UInteger8 *communicationTechnology,
PERROR("failed to get ip address");
return 0;
}
-
+
+#ifdef CONFIG_MPC831X
+ memcpy(mpc831x_if_name, ifaceName, IFACE_NAME_LENGTH);
+#endif
+
return ((struct sockaddr_in *)&device[i].ifr_addr)->sin_addr.s_addr;
#elif defined(BSD_INTERFACE_FUNCTIONS)
@@ -231,6 +238,9 @@ Boolean netInit(NetPath *netPath, RunTimeOpts *rtOpts, PtpClock *ptpClock)
struct ip_mreq imr;
char addrStr[NET_ADDRESS_LENGTH];
char *s;
+#ifdef CONFIG_MPC831X
+ mpc831x_netPath = netPath;
+#endif
DBG("netInit\n");
@@ -402,7 +412,8 @@ Boolean netSelect(TimeInternal *timeout, NetPath *netPath)
return select(nfds + 1, &readfds, 0, 0, &tv) > 0;
}
-Boolean netRecvEvent(Octet *address, Octet *buf, TimeInternal *time, NetPath *netPath)
+Boolean netRecvEvent(Octet *address, Octet *buf, TimeInternal *time, NetPath *netPath,
+ UInteger8 port_state)
{
struct msghdr msg;
struct iovec vec[1];
@@ -452,9 +463,22 @@ Boolean netRecvEvent(Octet *address, Octet *buf, TimeInternal *time, NetPath *ne
if(tv)
{
+#ifdef CONFIG_MPC831X
+ DBGV( "MPC831X port_state : %d\n", port_state );
+ if (port_state == PTP_MASTER)
+ {
+ mpc831x_get_tx_time(time);
+ }
+ else
+ {
+ mpc831x_get_rx_time(time);
+ }
+ DBGV("MPC831X recv time stamp %us %dns\n", time->seconds, time->nanoseconds);
+#else
time->seconds = tv->tv_sec;
time->nanoseconds = tv->tv_usec*1000;
DBGV("kernel recv time stamp %us %dns\n", time->seconds, time->nanoseconds);
+#endif
}
else
{
diff --git a/src/dep/ptpd_dep.h b/src/dep/ptpd_dep.h
index 29c6a09..d44ae51 100644
--- a/src/dep/ptpd_dep.h
+++ b/src/dep/ptpd_dep.h
@@ -101,7 +101,7 @@ UInteger16 msgPackManagementResponse(void*,MsgHeader*,MsgManagement*,PtpClock*);
Boolean netInit(NetPath*,RunTimeOpts*,PtpClock*);
Boolean netShutdown(NetPath*);
Boolean netSelect(TimeInternal*,NetPath*);
-Boolean netRecvEvent(Octet*,Octet*,TimeInternal*,NetPath*);
+Boolean netRecvEvent(Octet*,Octet*,TimeInternal*,NetPath*, UInteger8);
Boolean netRecvGeneral(Octet*,Octet*,NetPath*);
Boolean netSendEvent(Octet*,Octet*,UInteger16,NetPath*);
Boolean netSendGeneral(Octet*,Octet*,UInteger16,NetPath*);
diff --git a/src/dep/servo.c b/src/dep/servo.c
index ae2da3b..f9f766f 100644
--- a/src/dep/servo.c
+++ b/src/dep/servo.c
@@ -1,9 +1,13 @@
#include "../ptpd.h"
+#ifdef CONFIG_MPC831X
+#include "../mpc831x.h"
+#endif
+
void initClock(RunTimeOpts *rtOpts, PtpClock *ptpClock)
{
DBG("initClock\n");
-
+
/* clear vars */
ptpClock->master_to_slave_delay.seconds = ptpClock->master_to_slave_delay.nanoseconds = 0;
ptpClock->slave_to_master_delay.seconds = ptpClock->slave_to_master_delay.nanoseconds = 0;
@@ -103,9 +107,17 @@ void updateClock(RunTimeOpts *rtOpts, PtpClock *ptpClock)
{
if(!rtOpts->noResetClock)
{
+#ifdef CONFIG_MPC831X
+ mpc831x_get_curr_time(&timeTmp);
+#else
getTime(&timeTmp);
+#endif
subTime(&timeTmp, &timeTmp, &ptpClock->offset_from_master);
+#ifdef CONFIG_MPC831X
+ mpc831x_set_curr_time(&timeTmp);
+#else
setTime(&timeTmp);
+#endif
initClock(rtOpts, ptpClock);
}
else
diff --git a/src/dep/sys.c b/src/dep/sys.c
index 5206d34..84834f1 100644
--- a/src/dep/sys.c
+++ b/src/dep/sys.c
@@ -1,6 +1,10 @@
/* sys.c */
#include "../ptpd.h"
+#ifdef CONFIG_MPC831X
+#include "../mpc831x.h"
+#endif
+
void displayStats(RunTimeOpts *rtOpts, PtpClock *ptpClock)
{
@@ -73,20 +77,28 @@ Boolean nanoSleep(TimeInternal *t)
void getTime(TimeInternal *time)
{
+#ifdef CONFIG_MPC831X
+ mpc831x_get_curr_time(time);
+#else
struct timeval tv;
-
+
gettimeofday(&tv, 0);
time->seconds = tv.tv_sec;
time->nanoseconds = tv.tv_usec*1000;
+#endif
}
void setTime(TimeInternal *time)
{
+#ifdef CONFIG_MPC831X
+ mpc831x_set_curr_time(time);
+#else
struct timeval tv;
tv.tv_sec = time->seconds;
tv.tv_usec = time->nanoseconds/1000;
settimeofday(&tv, 0);
+#endif
NOTIFY("resetting system clock to %ds %dns\n", time->seconds, time->nanoseconds);
}
@@ -99,7 +111,7 @@ UInteger16 getRand(UInteger32 *seed)
Boolean adjFreq(Integer32 adj)
{
struct timex t;
-
+
if(adj > ADJ_FREQ_MAX)
adj = ADJ_FREQ_MAX;
else if(adj < -ADJ_FREQ_MAX)
@@ -107,7 +119,13 @@ Boolean adjFreq(Integer32 adj)
t.modes = MOD_FREQUENCY;
t.freq = adj*((1<<16)/1000);
-
+
+#ifdef CONFIG_MPC831X
+ mpc831x_adj_addend(adj);
+ return( 1 );
+#else
return !adjtimex(&t);
+#endif
+
}
diff --git a/src/mpc831x.c b/src/mpc831x.c
new file mode 100644
index 0000000..e09ef6d
--- /dev/null
+++ b/src/mpc831x.c
@@ -0,0 +1,148 @@
+#include "ptpd.h"
+#include "mpc831x.h"
+#include <unistd.h>
+
+#define NSEC ((unsigned long long)1000000000)
+
+#define BOARD_TIME_TO_SEC(board_time) \
+ ((uint32_t)(board_time/NSEC))
+
+#define BOARD_TIME_TO_NSEC(board_time, board_time_sec)\
+ ((uint32_t)(board_time - (((unsigned long long)board_time_sec) * NSEC)))
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?