aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2022-05-08 15:33:32 +0900
committer坂本 貴史 <o-takashi@sakamocchi.jp>2022-05-08 15:36:32 +0900
commit62ed285e4b456b18d347995325f5a2bc7c400408 (patch)
tree12a747721e362bcbf6e9dcfea74a704603219c9e
parent3850166fe0931f3063a0667f69ad10e5682730e0 (diff)
downloadlibhinoko-62ed285e4b456b18d347995325f5a2bc7c400408.tar.gz
cycle_timer: add helper functions to compute value of CYCLE_TIMER register
The layout of CYCLE_TIMER register is defined in IEEE 1394 specification. This commit adds helper function for constant value. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-rw-r--r--src/cycle_timer.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/cycle_timer.c b/src/cycle_timer.c
index e3bd80c..b50f023 100644
--- a/src/cycle_timer.c
+++ b/src/cycle_timer.c
@@ -65,18 +65,41 @@ void hinoko_cycle_timer_get_clock_id(HinokoCycleTimer *self, gint *clock_id)
*clock_id = self->clk_id;
}
+#define IEEE1394_CYCLE_TIMER_SEC_MASK 0xfe000000
+#define IEEE1394_CYCLE_TIMER_SEC_SHIFT 25
+#define IEEE1394_CYCLE_TIMER_CYCLE_MASK 0x01fff000
+#define IEEE1394_CYCLE_TIMER_CYCLE_SHIFT 12
+#define IEEE1394_CYCLE_TIMER_OFFSET_MASK 0x00000fff
+
+static guint ieee1394_cycle_timer_to_sec(guint32 cycle_timer)
+{
+ return (cycle_timer & IEEE1394_CYCLE_TIMER_SEC_MASK) >> IEEE1394_CYCLE_TIMER_SEC_SHIFT;
+}
+
+static guint ieee1394_cycle_timer_to_cycle(guint32 cycle_timer)
+{
+ return (cycle_timer & IEEE1394_CYCLE_TIMER_CYCLE_MASK) >> IEEE1394_CYCLE_TIMER_CYCLE_SHIFT;
+}
+
+static guint ieee1394_cycle_timer_to_offset(guint32 cycle_timer)
+{
+ return cycle_timer & IEEE1394_CYCLE_TIMER_OFFSET_MASK;
+}
+
/**
* hinoko_cycle_timer_get_cycle_timer:
* @self: A [struct@CycleTimer].
* @cycle_timer: (array fixed-size=3)(out caller-allocates): The value of cycle timer register of
* 1394 OHCI, including three elements; second, cycle, and offset.
*
- * Get the value of cycle timer in 1394 OHCI controller.
+ * Get the value of cycle timer in 1394 OHCI controller. The first element of array expresses the
+ * value of sec field, up to 127. The second element of array expresses the value of cycle field,
+ * up to 7999. The third element of array expresses the value of offset field, up to 3071.
*/
void hinoko_cycle_timer_get_cycle_timer(HinokoCycleTimer *self,
guint16 cycle_timer[3])
{
- cycle_timer[0] = (self->cycle_timer & 0xfe000000) >> 25;
- cycle_timer[1] = (self->cycle_timer & 0x01fff000) >> 12;
- cycle_timer[2] = self->cycle_timer & 0x00000fff;
+ cycle_timer[0] = ieee1394_cycle_timer_to_sec(self->cycle_timer);
+ cycle_timer[1] = ieee1394_cycle_timer_to_cycle(self->cycle_timer);
+ cycle_timer[2] = ieee1394_cycle_timer_to_offset(self->cycle_timer);
}