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 + -
显示快捷键?