diff -u ../linux-2.6/drivers/ieee1394/ieee1394-ioctl.h ieee1394-2.6.20/ieee1394-ioctl.h
--- ../linux-2.6/drivers/ieee1394/ieee1394-ioctl.h 2007-01-26 18:11:17.000000000 +0100
+++ ieee1394-2.6.20/ieee1394-ioctl.h 2007-01-26 18:40:04.000000000 +0100
@@ -100,5 +100,6 @@
_IO ('#', 0x28)
#define RAW1394_IOC_ISO_RECV_FLUSH \
_IO ('#', 0x29)
-
+#define RAW1394_IOC_GET_CYCLE_TIMER \
+ _IOR ('#', 0x30, struct _raw1394_cycle_timer)
#endif /* __IEEE1394_IOCTL_H */
diff -u ../linux-2.6/drivers/ieee1394/raw1394.c ieee1394-2.6.20/raw1394.c
--- ../linux-2.6/drivers/ieee1394/raw1394.c 2007-01-26 18:11:17.000000000 +0100
+++ ieee1394-2.6.20/raw1394.c 2007-01-26 18:37:16.000000000 +0100
@@ -2675,7 +2675,22 @@
return dma_region_mmap(&fi->iso_handle->data_buf, file, vma);
}
-/* ioctl is only used for rawiso operations */
+/* read the Isochronous Cycle Counter along with the cpu time */
+static int raw1394_read_cycle_timer(struct file_info *fi, void __user * uaddr)
+{
+ struct _raw1394_cycle_timer ctr;
+ struct hpsb_host *host = fi->host;
+
+ hpsb_read_cycle_timer(host, &ctr.cycle_timer, &ctr.local_time);
+ if (copy_to_user(uaddr, &ctr, sizeof(ctr)))
+ return -EFAULT;
+
+ return 0;
+}
+
+/* ioctl is only used for rawiso operations,
+ * and to read the cycle timer
+ */
static int raw1394_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
@@ -2772,6 +2787,13 @@
break;
}
+ switch(cmd) {
+ case RAW1394_IOC_GET_CYCLE_TIMER:
+ return raw1394_read_cycle_timer(fi, argp);
+ default:
+ break;
+ }
+
return -EINVAL;
}
diff -u ../linux-2.6/drivers/ieee1394/raw1394.h ieee1394-2.6.20/raw1394.h
--- ../linux-2.6/drivers/ieee1394/raw1394.h 2007-01-26 13:15:58.000000000 +0100
+++ ieee1394-2.6.20/raw1394.h 2007-01-26 18:37:16.000000000 +0100
@@ -178,4 +178,11 @@
__s16 xmit_cycle;
};
+/* Simultanous Isochronous Cycle Timer read and local clock read */
+struct _raw1394_cycle_timer {
+ __u32 cycle_timer;
+
+ /* local time in microseconds */
+ __u64 local_time;
+};
#endif /* IEEE1394_RAW1394_H */
------------------------------------------------------------------------
Index: src/ieee1394-ioctl.h
===================================================================
--- src/ieee1394-ioctl.h (revision 168)
+++ src/ieee1394-ioctl.h (working copy)
@@ -106,6 +106,6 @@
_IO ('#', 0x28)
#define RAW1394_IOC_ISO_RECV_FLUSH \
_IO ('#', 0x29)
-
-
+#define RAW1394_IOC_GET_CYCLE_TIMER \
+ _IOR ('#', 0x30, struct _raw1394_cycle_timer)
#endif /* __IEEE1394_IOCTL_H */
Index: src/raw1394.h
===================================================================
--- src/raw1394.h (revision 168)
+++ src/raw1394.h (working copy)
@@ -118,7 +118,14 @@
RAW1394_MODIFY_FREE
};
+/* Simultanous Isochronous Cycle Timer read and local clock read */
+struct raw1394_cycle_timer {
+ u_int32_t cycle_timer;
+ /* local time in microseconds */
+ u_int64_t local_time;
+};
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -328,6 +335,18 @@
**/
void raw1394_iso_shutdown(raw1394handle_t handle);
+/**
+ * raw1394_get_cycle_timer - get the current value of the cycle timer
+ * @handle: libraw1394 handle
+ * @ctr: pointer to the target raw1394_cycle_timer struct
+ *
+ * Reads the cycle timer register, together with the system clock. It returns
+ * a reasonable estimate of the system time the cycle timer was read.
+ *
+ * Returns: the error code of the ioctl, or 0 if successful.
+ **/
+int raw1394_read_cycle_timer(raw1394handle_t handle, struct raw1394_cycle_timer *ctr);
+
typedef int raw1394_errcode_t;
#define raw1394_make_errcode(ack, rcode) (((ack) << 16) | rcode)
#define raw1394_internal_err(errcode) ((errcode) < 0)
Index: src/main.c
===================================================================
--- src/main.c (revision 168)
+++ src/main.c (working copy)
@@ -478,3 +478,15 @@
return 0;
}
+int raw1394_read_cycle_timer(raw1394handle_t handle, struct raw1394_cycle_timer *ctr)
+{
+ int err;
+
+ err = ioctl(handle->fd, RAW1394_IOC_GET_CYCLE_TIMER, ctr);
+ if(err != 0) {
+ return err;
+ }
+
+ return 0;
+}
+
Index: src/kernel-raw1394.h
===================================================================
--- src/kernel-raw1394.h (revision 168)
+++ src/kernel-raw1394.h (working copy)
@@ -177,4 +177,11 @@
__s16 xmit_cycle;
};
+/* Simultanous Isochronous Cycle Timer read and local clock read */
+struct _raw1394_cycle_timer {
+ __u32 cycle_timer;
+
+ /* local time in microseconds */
+ __u64 local_time;
+};
#endif /* IEEE1394_RAW1394_H */