r4249 - in trunk/src/host/qemu-neo1973: hw openmoko

andrew at sita.openmoko.org andrew at sita.openmoko.org
Tue Mar 25 23:12:34 CET 2008


Author: andrew
Date: 2008-03-25 23:12:32 +0100 (Tue, 25 Mar 2008)
New Revision: 4249

Modified:
   trunk/src/host/qemu-neo1973/hw/neo1973.c
   trunk/src/host/qemu-neo1973/openmoko/README
Log:
Implement basic LIS302DL accelerometer logic.


Modified: trunk/src/host/qemu-neo1973/hw/neo1973.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/neo1973.c	2008-03-25 21:06:51 UTC (rev 4248)
+++ trunk/src/host/qemu-neo1973/hw/neo1973.c	2008-03-25 22:12:32 UTC (rev 4249)
@@ -355,6 +355,9 @@
     uint8_t regs[0x40];
     int reg;
 
+    int enable;
+    uint64_t interval;
+
     QEMUTimer *sample;
 };
 
@@ -367,24 +370,88 @@
     s->regs[0x20] = 0x07;	/* Ctrl_Reg1 */
 }
 
-static void piccolo_sample_sched(struct piccolo_s *s)
+static void piccolo_data_update(struct piccolo_s *s, int mask)
 {
-    int rate = (s->regs[0x20] & (1 << 7)) ? 400 : 100;	/* DR */
+    /* TODO: poll the Qemu SDL window position to find 2d acceleration */
 
-    qemu_mod_timer(s->sample,
-                    qemu_get_clock(vm_clock) + ticks_per_sec / rate);
+    /* 1G */
+    int x = 0x00, y = 0x00, z = 0x10;
+
+    if (mask & (1 << 0))
+        s->regs[0x29] = x;
+    if (mask & (1 << 1))
+        s->regs[0x2b] = y;
+    if (mask & (1 << 2))
+        s->regs[0x2d] = z;
 }
 
+static void piccolo_intr_update(struct piccolo_s *s)
+{
+    int inv = (s->regs[0x22] >> 7) & 1;
+    int level;
+    int i;
+
+    for (i = 0; i < 6; i += 3) {
+        switch ((s->regs[0x22] >> i) & 7) {
+        case 0:
+        default:
+            level = 0;
+            break;
+        case 1:
+            level = (s->regs[0x31] >> 6) & 1;
+            break;
+        case 2:
+            level = (s->regs[0x35] >> 6) & 1;
+            break;
+        case 3:
+            level = ((s->regs[0x31] | s->regs[0x35]) >> 6) & 1;
+            break;
+        case 4:
+            level = !!s->regs[0x27];
+            break;
+        }
+
+        qemu_set_irq(s->intr[!!i], level ^ inv);
+    }
+}
+
+static void piccolo_ff_wu_update(struct piccolo_s *s)
+{
+    /* TODO: update high and low interrupts */
+    /* TODO: also update the counter and check treshold */
+}
+
+static void piccolo_sample_sched(struct piccolo_s *s)
+{
+    qemu_mod_timer(s->sample, qemu_get_clock(vm_clock) + s->interval);
+}
+
 static void piccolo_sample_tick(void *opaque)
 {
     struct piccolo_s *s = (struct piccolo_s *) opaque;
+    int nu_data = s->regs[0x20] & 7;
 
-    /* TODO */
+    if (nu_data == 7)
+        nu_data |= 8;
+    s->regs[0x27] |= nu_data | ((s->regs[0x27] & nu_data) << 4);
+
+    piccolo_data_update(s, nu_data & 7);
+    piccolo_ff_wu_update(s);
+    piccolo_intr_update(s);
     piccolo_sample_sched(s);
 }
 
 static void piccolo_sample_update(struct piccolo_s *s)
 {
+    int rate = (s->regs[0x20] & (1 << 7)) ? 400 : 100;	/* DR */
+
+    s->enable = (s->regs[0x20] >> 6) & 1;		/* PD */
+    if (!s->enable) {
+        qemu_del_timer(s->sample);
+        return;
+    }
+
+    s->interval = ticks_per_sec / rate;
     if (!(s->regs[0x20] & 7))				/* Xen | Yen | Zen */
         qemu_del_timer(s->sample);
     else if (!qemu_timer_pending(s->sample))
@@ -403,6 +470,7 @@
 {
     struct piccolo_s *s = (struct piccolo_s *) i2c;
     int reg = s->reg;
+    int ret;
 
     if (reg >= 0x80) {
         reg -= 0x80;
@@ -424,13 +492,22 @@
     case 0x2b:	/* OutY */
     case 0x2d:	/* OutZ */
     case 0x30:	/* FF_WU_CFG_1 */
-    case 0x31:	/* FF_WU_SRC_1 */
     case 0x32:	/* FF_WU_THS_1 */
     case 0x33:	/* FF_WU_DURATION_1 */
     case 0x34:	/* FF_WU_CFG_2 */
-    case 0x35:	/* FF_WU_SRC_2 */
     case 0x36:	/* FF_WU_THS_2 */
     case 0x37:	/* FF_WU_DURATION_2 */
+        break;
+
+    case 0x31:	/* FF_WU_SRC_1 */
+    case 0x35:	/* FF_WU_SRC_2 */
+        ret = s->regs[reg];
+        if ((s->regs[reg - 1] >> 6) & 1) {			/* LIR */
+            s->regs[reg] = 0;
+            piccolo_intr_update(s);
+        }
+        return ret;
+
     case 0x38:	/* CLICK_CFG */
     case 0x39:	/* CLICK_SRC */
     case 0x3b:	/* CLICK_THSY_X */
@@ -438,7 +515,6 @@
     case 0x3d:	/* CLICK_timelimit */
     case 0x3e:	/* CLICK_latency */
     case 0x3f:	/* CLICK_window */
-        break;
     default:
         fprintf(stderr, "%s: unknown register %02x\n", __FUNCTION__, reg);
         return 0x00;
@@ -470,8 +546,8 @@
         fprintf(stderr, "%s: write to a \"do not modify\" register %02x\n",
                         __FUNCTION__, s->reg);
         fprintf(stderr, "%s: may cause permanent damage!\n", __FUNCTION__);
-        s->regs[reg] = data;
         break;
+
     case 0x20:	/* Ctrl_Reg1 */
         s->regs[reg] = data;
         if (data & (3 << 3))
@@ -480,13 +556,24 @@
         break;
 
     case 0x21:	/* Ctrl_Reg2 */
+        if (data & (1 << 6)) {
+            /* Memory reboot */
+            data &= ~(1 << 6);
+        }
+        break;
+
     case 0x22:	/* Ctrl_Reg3 */
+        piccolo_intr_update(s);
+        break;
+
     case 0x30:	/* FF_WU_CFG_1 */
     case 0x32:	/* FF_WU_THS_1 */
     case 0x33:	/* FF_WU_DURATION_1 */
     case 0x34:	/* FF_WU_CFG_2 */
     case 0x36:	/* FF_WU_THS_2 */
     case 0x37:	/* FF_WU_DURATION_2 */
+        break;
+
     case 0x38:	/* CLICK_CFG */
     case 0x39:	/* CLICK_SRC */
     case 0x3b:	/* CLICK_THSY_X */
@@ -494,15 +581,12 @@
     case 0x3d:	/* CLICK_timelimit */
     case 0x3e:	/* CLICK_latency */
     case 0x3f:	/* CLICK_window */
-        /* TODO */
-        s->regs[reg] = data;
-        break;
-
     default:
         fprintf(stderr, "%s: unknown register %02x\n", __FUNCTION__, reg);
         return 1;
     }
 
+    s->regs[reg] = data;
     return 0;
 }
 
@@ -520,6 +604,8 @@
 
     qemu_get_buffer(f, s->regs, sizeof(s->regs));
     i2c_slave_load(f, &s->i2c);
+
+    piccolo_sample_update(s);
     return 0;
 }
 

Modified: trunk/src/host/qemu-neo1973/openmoko/README
===================================================================
--- trunk/src/host/qemu-neo1973/openmoko/README	2008-03-25 21:06:51 UTC (rev 4248)
+++ trunk/src/host/qemu-neo1973/openmoko/README	2008-03-25 22:12:32 UTC (rev 4249)
@@ -2,15 +2,14 @@
 code but are in some way related or useful to have at hand.
 
 The kernel patch with GTA02fake support is based on:
- * kernel 2.6.22.5
+ * kernel 2.6.24
  * OpenMoko patchset revision 3610 from
-   http://svn.openmoko.org/trunk/src/target/kernel/patches/
- * Samuel's Atheros WLAN driver revision 3610 from
-   http://svn.openmoko.org/developers/sameo/patches/ar6k-atheros/
+   http://svn.openmoko.org/branches/src/target/kernel/2.6.24.x/patches/
 
 The following sequence can be used to obtain a working tree on which the
 patch can be applied:
 
+cg-clone git://source.mvista.com/git/linux-omap-2.6.git
 tar -xvjf linux-2.6.22.5.tar.bz2
 cd linux-2.6.22.5
 cg-init





More information about the commitlog mailing list