Send commitlog mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r3722 - in
      trunk/src/target/OM-2007.2/applications/openmoko-messages2: . src
      ([EMAIL PROTECTED])
   2. r3723 - trunk/src/host/qemu-neo1973 ([EMAIL PROTECTED])
   3. r3724 - trunk/src/host/qemu-neo1973/hw ([EMAIL PROTECTED])
   4. r3725 - trunk/src/host/qemu-neo1973/hw ([EMAIL PROTECTED])
   5. r3726 - in trunk/src/host/qemu-neo1973: . hw
      ([EMAIL PROTECTED])
--- Begin Message ---
Author: chris
Date: 2007-12-21 18:23:07 +0100 (Fri, 21 Dec 2007)
New Revision: 3722

Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h
Log:
        * src/sms-main.c:
        * src/sms-notes.c: (sms_notes_data_func), (sms_notes_page_new):
        * src/sms.h:
        Add emblem support for sent/sending/rejected messages


Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog        
2007-12-21 15:33:47 UTC (rev 3721)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog        
2007-12-21 17:23:07 UTC (rev 3722)
@@ -1,5 +1,12 @@
 2007-12-21  Chris Lord  <[EMAIL PROTECTED]>
 
+       * src/sms-main.c:
+       * src/sms-notes.c: (sms_notes_data_func), (sms_notes_page_new):
+       * src/sms.h:
+       Add emblem support for sent/sending/rejected messages
+
+2007-12-21  Chris Lord  <[EMAIL PROTECTED]>
+
        * src/sms-notes.c: (mark_messages_read_idle):
        Fix to possible crash actually caused infinite loop. Fix properly.
 

Modified: 
trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c   
2007-12-21 15:33:47 UTC (rev 3721)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c   
2007-12-21 17:23:07 UTC (rev 3722)
@@ -21,7 +21,7 @@
 #include "sms-contacts.h"
 #include "sms-notes.h"
 #include "sms-compose.h"
-#include <moko-stock.h>
+#include <libmokoui2/moko-stock.h>
 
 static void
 notebook_add_page_with_icon (GtkWidget *notebook, GtkWidget *child,

Modified: 
trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c  
2007-12-21 15:33:47 UTC (rev 3721)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c  
2007-12-21 17:23:07 UTC (rev 3722)
@@ -28,6 +28,7 @@
 #include <libjana-ecal/jana-ecal.h>
 #include <libmokoui2/moko-finger-scroll.h>
 #include <libmokoui2/moko-search-bar.h>
+#include <libmokoui2/moko-stock.h>
 #include <libebook/e-book.h>
 #include <string.h>
 
@@ -326,7 +327,6 @@
                                break;
                        }
                }
-               g_strfreev (categories);
        }
        
        /* Replace numbers with contact names */
@@ -362,9 +362,11 @@
                "justify", outgoing ?
                      GTK_JUSTIFY_LEFT : GTK_JUSTIFY_RIGHT,
                "icon", outgoing ?
-                     data->recipient_icon : data->author_icon,
+                     data->author_icon : data->recipient_icon,
+               "categories", categories,
                NULL);
        
+       g_strfreev (categories);
        g_free (author);
        /*g_free (recipient);*/
        g_free (body);
@@ -712,6 +714,8 @@
        GtkWidget *scroll, *vbox, *notes_combo;
        GtkCellRenderer *renderer;
        GHashTable *colours_hash;
+       GtkIconTheme *icon_theme;
+       gint size;
        
        data->author_uid = NULL;
        data->author_icon = NULL;
@@ -723,6 +727,22 @@
        data->unassigned_notes = NULL;
        data->notes_scroll_idle = 0;
        
+       /* Create note emblem hash-table */
+       data->note_emblems = g_hash_table_new_full (g_str_hash, g_str_equal,
+               NULL, (GDestroyNotify)g_object_unref);
+       icon_theme = gtk_icon_theme_get_default ();
+       /* FIXME: These are temporary icons */
+       gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &size, NULL);
+       g_hash_table_insert (data->note_emblems, "Sent",
+               gtk_icon_theme_load_icon (icon_theme, MOKO_STOCK_MAIL_SEND,
+                       size, 0, NULL));
+       g_hash_table_insert (data->note_emblems, "Sending",
+               gtk_icon_theme_load_icon (icon_theme, MOKO_STOCK_SMS_NEW,
+                       size, 0, NULL));
+       g_hash_table_insert (data->note_emblems, "Rejected",
+               gtk_icon_theme_load_icon (icon_theme, MOKO_STOCK_CALL_REJECT,
+                       size, 0, NULL));
+       
        /* Create note store */
        data->notes = jana_ecal_store_new (JANA_COMPONENT_NOTE);
        g_signal_connect (data->notes, "opened",
@@ -749,7 +769,8 @@
        gtk_tree_view_set_headers_visible (
                GTK_TREE_VIEW (data->notes_treeview), FALSE);
        renderer = jana_gtk_cell_renderer_note_new ();
-       g_object_set (renderer, "draw_box", TRUE, "show_recipient", TRUE, NULL);
+       g_object_set (renderer, "draw_box", TRUE, "show_recipient", TRUE,
+               "category_icon_hash", data->note_emblems, NULL);
        gtk_tree_view_insert_column_with_data_func (
                GTK_TREE_VIEW (data->notes_treeview), 0, "Messages", renderer,
                (GtkTreeCellDataFunc)sms_notes_data_func, data, NULL);

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h        
2007-12-21 15:33:47 UTC (rev 3721)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h        
2007-12-21 17:23:07 UTC (rev 3722)
@@ -40,6 +40,7 @@
        GHashTable *note_count;
        guint note_count_idle;
        GList *unassigned_notes;
+       GHashTable *note_emblems;
        
        EBook *ebook;
        GtkTreeModel *contacts_store;




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-22 02:16:13 +0100 (Sat, 22 Dec 2007)
New Revision: 3723

Modified:
   trunk/src/host/qemu-neo1973/VERSION
Log:
Set a specific VERSION string indentifying the tree.


Modified: trunk/src/host/qemu-neo1973/VERSION
===================================================================
--- trunk/src/host/qemu-neo1973/VERSION 2007-12-21 17:23:07 UTC (rev 3722)
+++ trunk/src/host/qemu-neo1973/VERSION 2007-12-22 01:16:13 UTC (rev 3723)
@@ -1 +1 @@
-0.9.0-cvs
\ No newline at end of file
+0.9.0-openmoko-svn




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-22 03:24:37 +0100 (Sat, 22 Dec 2007)
New Revision: 3724

Modified:
   trunk/src/host/qemu-neo1973/hw/sd.c
   trunk/src/host/qemu-neo1973/hw/sd.h
Log:
Make sd_state_e global, implement SD CMD8 and R7 from SD spec 2.00.


Modified: trunk/src/host/qemu-neo1973/hw/sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 01:16:13 UTC (rev 3723)
+++ trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 02:24:37 UTC (rev 3724)
@@ -51,6 +51,7 @@
     sd_r2_s,      /* CSD register */
     sd_r3,        /* OCR register */
     sd_r6 = 6,    /* Published RCA response */
+    sd_r7,        /* Operating voltage */
     sd_r1b = -1,
 } sd_rsp_type_t;
 
@@ -60,18 +61,7 @@
         sd_card_identification_mode,
         sd_data_transfer_mode,
     } mode;
-    enum {
-        sd_inactive_state = -1,
-        sd_idle_state = 0,
-        sd_ready_state,
-        sd_identification_state,
-        sd_standby_state,
-        sd_transfer_state,
-        sd_sendingdata_state,
-        sd_receivingdata_state,
-        sd_programming_state,
-        sd_disconnect_state,
-    } state;
+    enum st_state_e state;
     uint32_t ocr;
     uint8_t scr[8];
     uint8_t cid[16];
@@ -79,6 +69,7 @@
     uint16_t rca;
     uint32_t card_status;
     uint8_t sd_status[64];
+    uint32_t vhs;
     int wp_switch;
     int *wp_groups;
     uint32_t size;
@@ -128,9 +119,9 @@
     sd->card_status |= sd->state << 9;
 }
 
-const sd_cmd_type_t sd_cmd_type[64] = {
+static const sd_cmd_type_t sd_cmd_type[64] = {
     sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
-    sd_none, sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
+    sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
     sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
     sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
     sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
@@ -139,7 +130,7 @@
     sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
 };
 
-const sd_cmd_type_t sd_acmd_type[64] = {
+static const sd_cmd_type_t sd_acmd_type[64] = {
     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
     sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
@@ -192,6 +183,7 @@
 
 static void sd_set_ocr(SDState *sd)
 {
+    /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
     sd->ocr = 0x80ffff80;
 }
 
@@ -286,10 +278,6 @@
     sd->rca += 0x4567;
 }
 
-#define CARD_STATUS_A  0x02004100
-#define CARD_STATUS_B  0x00c01e00
-#define CARD_STATUS_C  0xfd39a028
-
 static void sd_set_cardstatus(SDState *sd)
 {
     sd->card_status = 0x00000100;
@@ -351,6 +339,14 @@
     response[3] = status & 0xff;
 }
 
+static void sd_response_r7_make(SDState *sd, uint8_t *response)
+{
+    response[0] = (sd->vhs >> 24) & 0xff;
+    response[1] = (sd->vhs >> 16) & 0xff;
+    response[2] = (sd->vhs >>  8) & 0xff;
+    response[3] = (sd->vhs >>  0) & 0xff;
+}
+
 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
 {
     uint32_t size;
@@ -662,6 +658,25 @@
         }
         break;
 
+    case 8:    /* CMD8:   SEND_IF_COND */
+        /* Physical Layer Specification Version 2.00 command */
+        switch (sd->state) {
+        case sd_idle_state:
+            sd->vhs = 0;
+
+            /* No response if not exactly one VHS bit is set.  */
+            if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
+                return sd->spi ? sd_r7 : sd_r0;
+
+            /* Accept.  */
+            sd->vhs = req.arg;
+            return sd_r7;
+
+        default:
+            break;
+        }
+        break;
+
     case 9:    /* CMD9:   SEND_CSD */
         switch (sd->state) {
         case sd_standby_state:
@@ -1234,6 +1249,11 @@
         rsplen = 4;
         break;
 
+    case sd_r7:
+        sd_response_r7_make(sd, response);
+        rsplen = 4;
+        break;
+
     case sd_r0:
     default:
         rsplen = 0;

Modified: trunk/src/host/qemu-neo1973/hw/sd.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-22 01:16:13 UTC (rev 3723)
+++ trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-22 02:24:37 UTC (rev 3724)
@@ -46,11 +46,17 @@
 #define WP_ERASE_SKIP          (1 << 15)
 #define CARD_ECC_DISABLED      (1 << 14)
 #define ERASE_RESET            (1 << 13)
-#define CURRENT_STATE          (7 << 9)
+#define CURRENT_STATE          (15 << 9)
 #define READY_FOR_DATA         (1 << 8)
 #define APP_CMD                        (1 << 5)
 #define AKE_SEQ_ERROR          (1 << 3)
 
+#define CARD_STATUS_A          0x02004100
+#define CARD_STATUS_B          0x00c01e00
+#define CARD_STATUS_C          0xfd39a028
+
+#define CARD_STATUS_SDIO_MASK  0x80c81e04
+
 typedef enum {
     sd_none = -1,
     sd_bc = 0, /* broadcast -- no response */
@@ -65,6 +71,22 @@
     uint8_t crc;
 };
 
+enum sd_state_e {
+    sd_inactive_state = -1,    /* No-exit state */
+    sd_idle_state = 0,
+    sd_ready_state,
+    sd_identification_state,
+    sd_standby_state,
+    sd_transfer_state,
+    sd_sendingdata_state,
+    sd_receivingdata_state,
+    sd_programming_state,
+    sd_disconnect_state,
+    /* SDIO only */
+    sd_command_state,
+    sd_initialization_state = sd_idle_state,
+};
+
 typedef struct sd_card_s {
     void *opaque;
     int (*do_command)(void *opaque, struct sd_request_s *req,
@@ -104,4 +126,7 @@
 int ssi_sd_xfer(void *opaque, int val);
 void *ssi_sd_init(BlockDriverState *bs);
 
+/* ar6000.c */
+struct sd_card_s *ar6k_init(NICInfo *nd);
+
 #endif /* __hw_sd_h */




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-22 03:30:17 +0100 (Sat, 22 Dec 2007)
New Revision: 3725

Modified:
   trunk/src/host/qemu-neo1973/hw/sd.c
Log:
Fix errors and warnings resulting from new SDIO only states.


Modified: trunk/src/host/qemu-neo1973/hw/sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 02:24:37 UTC (rev 3724)
+++ trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 02:30:17 UTC (rev 3725)
@@ -61,7 +61,7 @@
         sd_card_identification_mode,
         sd_data_transfer_mode,
     } mode;
-    enum st_state_e state;
+    enum sd_state_e state;
     uint32_t ocr;
     uint8_t scr[8];
     uint8_t cid[16];
@@ -111,6 +111,7 @@
     case sd_receivingdata_state:
     case sd_programming_state:
     case sd_disconnect_state:
+    case sd_command_state:
         sd->mode = sd_data_transfer_mode;
         break;
     }




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-22 04:01:31 +0100 (Sat, 22 Dec 2007)
New Revision: 3726

Added:
   trunk/src/host/qemu-neo1973/hw/ar6000.c
Modified:
   trunk/src/host/qemu-neo1973/Makefile
   trunk/src/host/qemu-neo1973/hw/neo1973.c
   trunk/src/host/qemu-neo1973/hw/pcmcia.h
   trunk/src/host/qemu-neo1973/hw/sd.c
   trunk/src/host/qemu-neo1973/hw/sd.h
Log:
Initial version of Atheros AR6001 files.  Currently it's a dummy SDIO with the
correct Manufacturer/Card ID.  SDIO FBR I/O not yet support.
Attach the AR6k to the SD slot of gta02fake.
Add missing CISTPL IDs to pcmcia.h as they're now shared with SDIO.


Modified: trunk/src/host/qemu-neo1973/Makefile
===================================================================
--- trunk/src/host/qemu-neo1973/Makefile        2007-12-22 02:30:17 UTC (rev 
3725)
+++ trunk/src/host/qemu-neo1973/Makefile        2007-12-22 03:01:31 UTC (rev 
3726)
@@ -59,7 +59,7 @@
 OBJS+=scsi-disk.o cdrom.o
 OBJS+=usb.o usb-hub.o usb-linux.o usb-linux-gadget.o
 OBJS+=usb-hid.o usb-msd.o usb-wacom.o usb-net.o usb-bt.o
-OBJS+=sd.o ssi-sd.o
+OBJS+=sd.o ssi-sd.o ar6000.o
 
 ifdef CONFIG_WIN32
 OBJS+=tap-win32.o

Added: trunk/src/host/qemu-neo1973/hw/ar6000.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-22 02:30:17 UTC (rev 
3725)
+++ trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-22 03:01:31 UTC (rev 
3726)
@@ -0,0 +1,880 @@
+/*
+ * Atheros AR600X Wireless Ethernet SDIO cards.  Firmware 1.3.
+ *
+ * Copyright (c) 2007 OpenMoko, Inc.
+ * Author: Andrzej Zaborowski <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * BIG TODO: Merge all the generic SDIO emulation back into sd.c and
+ * allow hooks for card specific functions to be registered.  This file
+ * then would solely provide callbacks for these hooks.
+ */
+
+#include "hw.h"
+#include "net.h"
+#include "sd.h"
+#include "pcmcia.h"
+
+typedef enum {
+    sd_r0 = 0, /* no response */
+    sd_r1,     /* normal response command */
+    sd_r2_i,   /* CID register */
+    sd_r2_s,   /* CSD register */
+    sd_r3,     /* OCR register */
+    sd_r4,     /* SDIO OCR register */
+    sd_r5,     /* SDIO direct I/O */
+    sd_r6,     /* Published RCA response */
+    sd_r7,     /* Operating voltage */
+    sd_r1b = -1,
+} sd_rsp_type_t;
+
+struct sdio_s {
+    enum sd_state_e state;
+    uint32_t ioocr;
+    uint16_t rca;
+    uint32_t card_status;
+
+    struct {
+        uint8_t io_enable;
+        uint8_t intr_enable;
+        uint8_t intr;
+        uint8_t bus;
+        uint8_t e4mi;
+        uint8_t power;
+        uint8_t speed;
+    } cccr;
+    struct {
+    } fbr[7];
+    const uint8_t *cis;
+    int cislen;
+
+    qemu_irq *func_irq;
+
+    int spi;
+    int sdio_ok;
+    int current_cmd;
+    uint16_t blk_len[8];
+    struct {
+        uint8_t func;
+        int dir;
+        int blk_len;
+        int blk_num;
+        int step;
+        uint32_t data_start;
+        uint32_t data_offset;
+        uint8_t data[2048];
+    } transfer;                /* TODO Move to per function struct to support 
sspnd */
+
+    void (*write[8])(struct sdio_s *sd, uint32_t addr, uint8_t *data, int len);
+    void (*read[8])(struct sdio_s *sd, uint32_t addr, uint8_t *data, int len);
+    void (*reset)(struct sdio_s *sd);
+
+    struct sd_card_s card;
+};
+
+#define SDIO_SIZE      0x20000
+#define SDIO_ADDR_MASK (SDIO_SIZE - 1)
+
+static const sd_cmd_type_t sd_cmd_type[64] = {
+    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
+    sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
+    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
+    sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
+    sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
+    sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
+    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
+    sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
+};
+
+static const int sd_cmd_class[64] = {
+    0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+    2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
+    5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
+    7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
+};
+
+static void sd_set_ioocr(struct sdio_s *sd)
+{
+    /* 2.0 - 3.6 V, No memory present, One function only */
+    sd->ioocr = 0x00ffff00;
+}
+
+static void sd_set_rca(struct sdio_s *sd)
+{
+    sd->rca += 0x4567;
+}
+
+static void sd_set_cardstatus(struct sdio_s *sd)
+{
+    sd->card_status = 0x00001e00;
+}
+
+static int sd_req_crc_validate(struct sd_request_s *req)
+{
+    uint8_t buffer[5];
+    buffer[0] = 0x40 | req->cmd;
+    buffer[1] = (req->arg >> 24) & 0xff;
+    buffer[2] = (req->arg >> 16) & 0xff;
+    buffer[3] = (req->arg >> 8) & 0xff;
+    buffer[4] = (req->arg >> 0) & 0xff;
+    return 0;
+    return sd_crc7(buffer, 5) != req->crc;     /* TODO */
+}
+
+static void sd_response_r1_make(struct sdio_s *sd,
+                                uint8_t *response, uint32_t last_status)
+{
+    uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
+    uint32_t status;
+
+    status = (sd->card_status & ~mask) | (last_status & mask);
+    sd->card_status &= ~CARD_STATUS_C;
+
+    response[0] = (status >> 24) & 0xff;
+    response[1] = (status >> 16) & 0xff;
+    response[2] = (status >> 8) & 0xff;
+    response[3] = (status >> 0) & 0xff;
+}
+
+static void sd_response_r4_make(struct sdio_s *sd, uint8_t *response)
+{
+    response[0] = (sd->ioocr >> 24) & 0xff;
+    response[1] = (sd->ioocr >> 16) & 0xff;
+    response[2] = (sd->ioocr >> 8) & 0xff;
+    response[3] = (sd->ioocr >> 0) & 0xff;
+}
+
+static void sd_response_r5_make(struct sdio_s *sd, uint8_t *response)
+{
+    int byte = 0;
+    uint8_t status, state;
+
+    switch (sd->state) {
+    case sd_initialization_state:
+    case sd_standby_state:
+    case sd_inactive_state:
+    default:
+        state = 0x00;
+        break;
+    case sd_command_state:
+        state = 0x01;
+        break;
+    case sd_transfer_state:
+        state = 0x02;
+        break;
+    }
+
+    if (sd->spi) {
+        status = ((sd->card_status & 0xb7380003) ? (1 << 6) : 0) |
+                ((sd->card_status & ADDRESS_ERROR) ? (1 << 4) : 0) |
+                ((sd->card_status & COM_CRC_ERROR) ? (1 << 3) : 0) |
+                ((sd->card_status & ILLEGAL_COMMAND) ? (1 << 2) : 0) |
+                ((state == 0x00) ? (1 << 0) : 0);
+    } else {
+        status = ((sd->card_status & COM_CRC_ERROR) ? (1 << 7) : 0) |
+                ((sd->card_status & ILLEGAL_COMMAND) ? (1 << 6) : 0) |
+                (state << 4) |
+                ((sd->card_status & 0x37380003) ? (1 << 3) : 0) |
+                ((sd->card_status & ADDRESS_ERROR) ? (1 << 1) : 0) |
+                ((sd->card_status & OUT_OF_RANGE) ? (1 << 0) : 0);
+
+        response[byte ++] = 0;
+        response[byte ++] = 0;
+    }
+    sd->card_status &= ~0xf7f80003;                    /* TODO check */
+
+    response[byte ++] = status;
+    response[byte ++] = sd->transfer.data[sd->transfer.data_offset];
+}
+
+static void sd_response_r6_make(struct sdio_s *sd, uint8_t *response)
+{
+    uint16_t arg;
+    uint16_t status;
+
+    arg = sd->rca;
+    status =
+            ((sd->card_status & SD_ERROR)        ? (1 << 13) : 0) |
+            ((sd->card_status & ILLEGAL_COMMAND) ? (1 << 14) : 0) |
+            ((sd->card_status & COM_CRC_ERROR)   ? (1 << 15) : 0);
+
+    response[0] = (arg >> 8) & 0xff;
+    response[1] = arg & 0xff;
+    response[2] = (status >> 8) & 0xff;
+    response[3] = 0;
+}
+
+static void sdio_intr_update(struct sdio_s *sd)
+{
+    int level;
+
+    if (!(sd->cccr.intr_enable & 1) ||                         /* IENM */
+                    ((sd->cccr.bus & 3) == 2 &&                        /* 
BusWidth */
+                     !sd->cccr.e4mi && sd->state == sd_transfer_state) ||
+                    (sd->spi && !((sd->cccr.bus & (1 << 6)) && /* SCSI */
+                                  (sd->cccr.bus & (1 << 5))))) /* ECSI */
+        level = 0;
+    else
+        level = !!((sd->cccr.intr << 1) & sd->cccr.intr_enable);
+
+    qemu_set_irq(sd->card.irq, level);
+}
+
+static void sdio_reset(struct sdio_s *sd)
+{
+    int i;
+
+    sd->state = sd_initialization_state;
+    sd->rca = 0x0000;
+    sd->sdio_ok = 0;
+    sd_set_ioocr(sd);
+    sd_set_cardstatus(sd);
+
+    memset(&sd->cccr, 0, sizeof(sd->cccr));
+    memset(&sd->fbr,  0, sizeof(sd->fbr));
+    for (i = 0; i < 8; i ++)
+        sd->blk_len[i] = 0;
+    if (sd->reset)
+        sd->reset(sd);
+
+    /* TODO: should preserve CDDisable (sd->cccr.bus & (1 << 7)) */
+}
+
+static void sdio_transfer_done(struct sdio_s *sd)
+{
+    sd->state = sd_command_state;
+
+    /* Must check interrupts because of 4-wire mode Interrupt Period.  */
+    if ((sd->cccr.bus & 3) == 2)                       /* BusWidth */
+        sdio_intr_update(sd);
+}
+
+static sd_rsp_type_t sdio_normal_command(struct sdio_s *sd,
+                struct sd_request_s req)
+{
+    uint32_t rca = 0x0000;
+    uint32_t addr;
+    uint8_t fun;
+
+    if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
+        rca = req.arg >> 16;
+
+    switch (req.cmd) {
+    /* Basic commands (Class 0) */
+    case 0:    /* CMD0:   GO_IDLE_STATE */
+        /* XXX: Used to switch to SPI mode and back */
+        printf("%s: Bus mode switch attempt\n", __FUNCTION__);
+        break;
+
+    case 3:    /* CMD3:   SEND_RELATIVE_ADDR */
+        if (sd->spi || !sd->sdio_ok)
+            goto bad_cmd;
+        switch (sd->state) {
+        case sd_initialization_state:
+        case sd_standby_state:
+            sd->state = sd_standby_state;
+            sd_set_rca(sd);
+            return sd_r6;
+
+        default:
+            break;
+        }
+        break;
+
+    /* I/O mode commands (Class 9) */
+    case 5:    /* CMD5:   IO_SEND_OP_COND */
+        switch (sd->state) {
+        case sd_initialization_state:
+            /* We accept any voltage.  10000 V is nothing.  */
+            if (req.arg) {
+                sd->state = sd_ready_state;
+                sd->sdio_ok = 1;
+            }
+
+            return sd_r4;
+
+        default:
+            break;
+        }
+        break;
+
+    /* Basic commands (Class 0) */
+    case 7:    /* CMD7:   SELECT/DESELECT_CARD */
+        if (sd->spi)
+            goto bad_cmd;
+        switch (sd->state) {
+        case sd_standby_state:
+            if (sd->rca != rca)
+                return sd_r0;
+
+            sd->state = sd_command_state;
+            return sd_r1b;
+
+        case sd_command_state:
+            if (sd->rca != rca)
+                sd->state = sd_standby_state;
+
+            return sd_r1b;
+
+        default:
+            break;
+        }
+        break;
+
+    case 15:   /* CMD15:  GO_INACTIVE_STATE */
+        if (sd->spi)
+            goto bad_cmd;
+        switch (sd->state) {
+        case sd_initialization_state:
+        case sd_standby_state:
+        case sd_command_state:
+            if (sd->rca && sd->rca != rca)
+                return sd_r0;
+
+            sd->state = sd_inactive_state;
+            return sd_r0;
+
+        default:
+            break;
+        }
+        break;
+
+    /* I/O mode commands (Class 9) */
+    case 52:   /* CMD52:  IO_RW_DIRECT */
+        /* XXX In some situations this must preserve cmdNo and restore later */
+        switch (sd->state) {
+        case sd_command_state:
+        case sd_transfer_state:
+            fun = (req.arg >> 28) & 7;
+            addr = (req.arg >> 9) & SDIO_ADDR_MASK;
+            sd->transfer.data_offset = 0;
+            sd->transfer.step = 1;
+
+            if (unlikely(fun > ((sd->ioocr >> 28) & 7))) {
+                sd->card_status |= ADDRESS_ERROR;
+                sd->transfer.data[sd->transfer.data_offset] = req.arg & 0xff;
+                return sd_r5;
+            }
+
+            if ((req.arg >> 31) & 1) {                         /* R/W */
+                sd->transfer.data[sd->transfer.data_offset] = req.arg & 0xff;
+                sd->write[fun](sd, addr, sd->transfer.data +
+                                sd->transfer.data_offset, 1);
+            }
+
+            if (((~req.arg >> 31) & 1) ||                      /* !R/W */
+                            ((req.arg >> 27) & 1))             /* RAW */
+                sd->read[fun](sd, addr, sd->transfer.data +
+                                sd->transfer.data_offset, 1);
+
+            return sd_r5;
+
+        default:
+            break;
+        }
+        break;
+
+    case 53:   /* CMD53:  IO_RW_EXTENDED */
+        switch (sd->state) {
+        case sd_command_state:
+            fun = (req.arg >> 28) & 7;
+            addr = (req.arg >> 9) & SDIO_ADDR_MASK;
+
+            if (unlikely(fun > ((sd->ioocr >> 28) & 7))) {
+                sd->card_status |= ADDRESS_ERROR;
+                return sd_r1b;
+            }
+
+            sd->transfer.dir = (req.arg >> 31) & 1;            /* R/W */
+            sd->transfer.step = (req.arg >> 27) & 1;           /* OPCode */
+            sd->transfer.func = fun;
+            sd->transfer.data_start = addr;
+            sd->transfer.data_offset = 0;
+            if ((req.arg >> 28) & 1) {                         /* BlockMode */
+                if (sd->blk_len[fun] < 1 || sd->blk_len[fun] > 2048)
+                    return sd_r1b;
+
+                sd->transfer.blk_len = sd->blk_len[fun];
+            } else
+                sd->transfer.blk_len = 1;
+            sd->transfer.blk_num = ((req.arg >> 0) & 0x1ff) ?:
+                    ((req.arg >> 28) & 1) ? -1 : 0x200;                /* 
BlockMode */
+
+            sd->state = sd_transfer_state;
+            return sd_r1b;
+
+        default:
+            break;
+        }
+        break;
+
+    /* Basic commands (Class 0) */
+    case 59:   /* CMD59:  CRC_ON_OFF */
+        if (!sd->spi)
+            goto bad_cmd;
+        /* TODO */
+        return sd_r1;
+
+    default:
+    bad_cmd:
+        sd->card_status |= ILLEGAL_COMMAND;
+
+        printf("%s: Unknown CMD%i\n", __FUNCTION__, req.cmd);
+        return sd->spi ? sd_r1 : sd_r0;
+    }
+
+    sd->card_status |= ILLEGAL_COMMAND;
+    printf("%s: CMD%i in a wrong state\n", __FUNCTION__, req.cmd);
+    return sd->spi ? sd_r1 : sd_r0;
+}
+
+static int sdio_do_command(struct sdio_s *sd, struct sd_request_s *req,
+                uint8_t *response)
+{
+    uint32_t last_status = sd->card_status;
+    sd_rsp_type_t rtype;
+    int rsplen;
+
+    if (sd_req_crc_validate(req)) {
+        sd->card_status &= ~COM_CRC_ERROR;
+        return 0;
+    }
+
+    sd->card_status &= ~CARD_STATUS_B;
+
+    rtype = sdio_normal_command(sd, *req);
+
+    sd->current_cmd = req->cmd;
+
+    switch (rtype) {
+    case sd_r1:
+    case sd_r1b:
+        sd_response_r1_make(sd, response, last_status);
+        rsplen = 4;
+        break;
+
+    case sd_r4:
+        sd_response_r4_make(sd, response);
+        rsplen = 4;
+        break;
+
+    case sd_r5:
+        sd_response_r5_make(sd, response);
+        rsplen = sd->spi ? 2 : 4;
+        break;
+
+    case sd_r6:
+        sd_response_r6_make(sd, response);
+        rsplen = 4;
+        break;
+
+    case sd_r0:
+    default:
+        rsplen = 0;
+        break;
+    }
+
+    if (sd->card_status & ILLEGAL_COMMAND)
+        rsplen = 0;
+
+    return rsplen;
+}
+
+static void sdio_write_data(struct sdio_s *sd, uint8_t value)
+{
+    if (sd->state != sd_transfer_state) {
+        printf("%s: not in Transfer state\n", __FUNCTION__);
+        return;
+    }
+
+    if (sd->card_status & (ADDRESS_ERROR | OUT_OF_RANGE | SD_ERROR))
+        return;
+
+    switch (sd->current_cmd) {
+    case 53:   /* CMD53:  IO_RW_EXTENDED */
+        if (!sd->transfer.dir)
+            goto bad_cmd;
+
+        sd->transfer.data[sd->transfer.data_offset ++] = value;
+        if (sd->transfer.data_offset >= sd->transfer.blk_len) {
+            /* TODO: Check CRC before committing */
+            sd->write[sd->transfer.func](sd, sd->transfer.data_start,
+                            sd->transfer.data, sd->transfer.blk_len);
+
+            if (sd->transfer.blk_num >= 0)
+                if (!-- sd->transfer.blk_num) {
+                    sdio_transfer_done(sd);
+                    break;
+                }
+
+            sd->transfer.data_start +=
+                    sd->transfer.blk_len * sd->transfer.step;
+            sd->transfer.data_offset = 0;
+        }
+        break;
+
+    default:
+    bad_cmd:
+        printf("%s: unknown command\n", __FUNCTION__);
+        break;
+    }
+}
+
+static uint8_t sdio_read_data(struct sdio_s *sd)
+{
+    /* TODO: Append CRCs */
+    uint8_t ret;
+
+    if (sd->state != sd_receivingdata_state) {
+        printf("%s: not in Transfer state\n", __FUNCTION__);
+        return 0x00;
+    }
+
+    if (sd->card_status & (ADDRESS_ERROR | OUT_OF_RANGE | SD_ERROR))
+        return 0x00;
+
+    switch (sd->current_cmd) {
+    case 53:   /* CMD53:  IO_RW_EXTENDED */
+        if (sd->transfer.dir)
+            goto bad_cmd;
+
+        if (!sd->transfer.data_offset)
+            sd->read[sd->transfer.func](sd, sd->transfer.data_start,
+                            sd->transfer.data, sd->transfer.blk_len);
+
+        ret = sd->transfer.data[sd->transfer.data_offset ++];
+
+        if (sd->transfer.data_offset >= sd->transfer.blk_len) {
+            if (sd->transfer.blk_num >= 0)
+                if (!-- sd->transfer.blk_num) {
+                    sdio_transfer_done(sd);
+                    break;
+                }
+
+            sd->transfer.data_start +=
+                    sd->transfer.blk_len * sd->transfer.step;
+            sd->transfer.data_offset = 0;
+        }
+        break;
+
+    default:
+    bad_cmd:
+        printf("%s: unknown command\n", __FUNCTION__);
+        return 0x00;
+    }
+
+    return ret;
+}
+
+static int sdio_data_ready(struct sdio_s *sd)
+{
+    return sd->state == sd_transfer_state;
+}
+
+static void sdio_cccr_write(struct sdio_s *sd, uint32_t offset, uint8_t value)
+{
+    switch (offset) {
+    case 0x02: /* I/O Enable */
+        sd->cccr.io_enable =
+                value & (((1 << ((sd->ioocr >> 28) & 7)) - 1) << 1);
+        /* TODO: reset the disabled functions */
+        break;
+
+    case 0x04: /* Int Enable */
+        sd->cccr.intr_enable = value;
+        sdio_intr_update(sd);
+        break;
+
+    case 0x06: /* I/O Abort */
+        if ((value >> 3) & 1)                          /* RES */
+            sdio_reset(sd);
+        else if ((value >> 0) & 7) {                   /* ASx */
+            if (sd->state == sd_transfer_state &&
+                            sd->transfer.func == (value & 7) && !sd->spi)
+                sdio_transfer_done(sd);
+            else
+                fprintf(stderr, "%s: no transfer to abort for function %i\n",
+                                __FUNCTION__, value & 7);
+        }
+
+        break;
+
+    case 0x07: /* Bus Interface Control */
+        sd->cccr.bus = (value & 0xe3) | 0x40;
+        if (value & 1)
+            fprintf(stderr, "%s: wrong bus-width selected\n", __FUNCTION__);
+        if (sd->spi)
+            sdio_intr_update(sd);
+        /* XXX Possibly toggle some SD_DETECT gpio on CDDisable change */
+        break;
+
+    case 0x08: /* Card Capability */
+        sd->cccr.e4mi = value & 0x20;
+        break;
+
+    /* Since SBS == 0, Function Select and Bus Suspend are R/O.  */
+
+    case 0x0f: /* Ready Flags */
+        break;
+
+    case 0x10: /* Fn0 Block Size LSB */
+        sd->blk_len[0] &= 0xff << 8;
+        sd->blk_len[0] |= value;
+        break;
+
+    case 0x11: /* Fn0 Block Size MSB */
+        sd->blk_len[0] &= 0xff;
+        sd->blk_len[0] |= value << 8;
+        break;
+
+    case 0x12: /* Power Control */
+        sd->cccr.power |= value & 0x02;                                /* EMPC 
*/
+        break;
+
+    case 0x13: /* High-Speed */
+        sd->cccr.speed |= value & 0x02;                                /* EHS 
*/
+        break;
+
+    default:
+        printf("%s: unknown register %02x\n", __FUNCTION__, offset);
+    }
+}
+
+static uint8_t sdio_cccr_read(struct sdio_s *sd, uint32_t offset)
+{
+    switch (offset) {
+    case 0x00: /* CCCR/SDIO Revison */
+        return 0x32;
+
+    case 0x01: /* SD Specification Revision */
+        return 0x02;   /* SD Physical Specification Version 2.00 (May 2006) */
+
+    case 0x02: /* I/O Enable */
+        return sd->cccr.io_enable;
+
+    case 0x03: /* I/O Ready */
+        return sd->cccr.io_enable;
+
+    case 0x04: /* Int Enable */
+        return sd->cccr.intr_enable;
+
+    case 0x05: /* Int Pending */
+        return sd->cccr.intr << 1;
+
+    case 0x07: /* Bus Interface Control */
+        return sd->cccr.bus;
+
+    case 0x08: /* Card Capability */
+        /* XXX: set SDC (01) when CMD52 learns to preserve current_cmd */
+        return 0x12 | sd->cccr.e4mi;   /* SMB | S4MI | E4MI | Full-Speed */
+
+    case 0x09: /* Common CIS Pointer */
+    case 0x0a: /* Common CIS Pointer */
+    case 0x0b: /* Common CIS Pointer */
+        return 0x00;   /* Starts at 0x1000 */
+
+    case 0x1c: /* Bus Suspend */
+        return 0x00;
+
+    case 0x1d: /* Function Select */
+        return sd->transfer.func;
+
+    case 0x0e: /* Exec Flags */
+        return 0x00;
+
+    case 0x0f: /* Ready Flags */
+        return 0x00;
+
+    case 0x10: /* Fn0 Block Size LSB */
+        return (sd->blk_len[0] >> 0) & 0xff;
+
+    case 0x11: /* Fn0 Block Size MSB */
+        return (sd->blk_len[0] >> 8) & 0xff;
+
+    case 0x12: /* Power Control */
+        return sd->cccr.power | 0x01;
+
+    case 0x13: /* High-Speed */
+        return sd->cccr.speed | 0x01;
+
+    default:
+        printf("%s: unknown register %02x\n", __FUNCTION__, offset);
+        return 0;
+    }
+}
+
+static void sdio_fbr_write(struct sdio_s *sd,
+                int fn, uint32_t offset, uint8_t value)
+{
+    switch (offset) {
+    default:
+        printf("%s: unknown register %02x\n", __FUNCTION__, offset);
+    }
+}
+
+static uint8_t sdio_fbr_read(struct sdio_s *sd,
+                int fn, uint32_t offset)
+{
+    switch (offset) {
+    default:
+        printf("%s: unknown register %02x\n", __FUNCTION__, offset);
+        return 0;
+    }
+}
+
+static void sdio_cia_write(struct sdio_s *sd,
+                uint32_t addr, uint8_t *data, int len)
+{
+    /* CCCR */
+    for (; len && addr < 0x100; len --, addr += sd->transfer.step)
+        sdio_cccr_write(sd, addr, *data ++);
+
+    /* FBR */
+    for (; len && addr < 0x800; len --, addr += sd->transfer.step)
+        sdio_fbr_write(sd, addr >> 8, addr & 0xff, *data ++);
+
+    if (len)
+        fprintf(stderr, "%s: bad write at %x (%i bytes)\n",
+                        __FUNCTION__, addr, len);
+}
+
+static void sdio_cia_read(struct sdio_s *sd,
+                uint32_t addr, uint8_t *data, int len)
+{
+    int llen;
+
+    /* CCCR */
+    for (; len && addr < 0x100; len --, addr += sd->transfer.step)
+        *data ++ = sdio_cccr_read(sd, addr);
+
+    /* FBR */
+    for (; len && addr < 0x800; len --, addr += sd->transfer.step)
+        *data ++ = sdio_fbr_read(sd, addr >> 8, addr & 0xff);
+
+    /* RFU */
+    if (len && unlikely(addr < 0x1000)) {
+        llen = sd->transfer.step ? MIN(len, 0x1000 - addr) : len;
+        memset(data, 0, llen);
+        data += llen;
+        len -= llen;
+        addr = 0x1000;
+    }
+
+    /* CIS */
+    addr -= 0x1000;
+    if (len && addr < sd->cislen) {
+        llen = MIN(len, sd->cislen - addr);
+        memcpy(data, sd->cis + addr, llen);
+        data += llen;
+        len -= llen;
+    }
+
+    /* RFU */
+    if (len)
+        memset(data, 0, len);
+}
+
+static void sdio_dummy_write(struct sdio_s *sd,
+                uint32_t addr, uint8_t *data, int len)
+{
+    fprintf(stderr, "%s: writing %i bytes at %x\n", __FUNCTION__, len, addr);
+}
+
+static void sdio_dummy_read(struct sdio_s *sd,
+                uint32_t addr, uint8_t *data, int len)
+{
+    fprintf(stderr, "%s: reading %i bytes at %x\n", __FUNCTION__, len, addr);
+    memset(data, 0, sd->transfer.step ? len : 1);
+}
+
+static void sdio_set_irq(void *opaque, int line, int level)
+{
+    struct sdio_s *s = opaque;
+
+    if (level)
+        s->cccr.intr |= 1 << line;
+    else
+        s->cccr.intr &= ~(1 << line);
+
+    sdio_intr_update(s);
+}
+
+struct sd_card_s *sdio_init(struct sdio_s *s)
+{
+    int i;
+
+    for (i = 0; i < 8; i ++) {
+        s->write[i] = i ? sdio_dummy_write : sdio_cia_write;
+        s->read[i]  = i ? sdio_dummy_read  : sdio_cia_read;
+    }
+
+    s->func_irq = qemu_allocate_irqs(sdio_set_irq, s, 7);
+
+    s->card.opaque = s;
+    s->card.do_command = (void *) sdio_do_command;
+    s->card.write_data = (void *) sdio_write_data;
+    s->card.read_data  = (void *) sdio_read_data;
+    s->card.data_ready = (void *) sdio_data_ready;
+
+    sdio_reset(s);
+
+    return &s->card;
+}
+
+struct ar6k_s {
+    struct sdio_s sd;
+    NICInfo *nd;
+};
+
+static void ar6k_set_ioocr(struct sdio_s *sd)
+{
+    /* 2.9 - 3.6 V, No memory present, Two functions only */
+    sd->ioocr = 0x10fe0000;
+}
+
+static void ar6k_reset(struct ar6k_s *s)
+{
+    ar6k_set_ioocr(&s->sd);
+}
+
+/* TODO: dump real values from an Atheros AR6001 - need hw access! */
+const static uint8_t ar6k_cis[] = {
+    CISTPL_MANFID, 4,
+    0x0a, 0x01,                        /* SDIO Card manufacturer code */
+    0x71, 0x02,                        /* Manufacturer information (Part No, 
Rev) */
+
+    CISTPL_FUNCID, 2,
+    0x0c,                      /* Card funcion code: SDIO */
+    0x00,                      /* System initialization mask */
+
+    CISTPL_END, 0xff,
+};
+
+struct sd_card_s *ar6k_init(NICInfo *nd)
+{
+    struct ar6k_s *s = (struct ar6k_s *) qemu_mallocz(sizeof(struct ar6k_s));
+    struct sd_card_s *ret = sdio_init(&s->sd);
+
+    s->nd = nd;
+    s->sd.reset = (void *) ar6k_reset;
+    s->sd.cis = ar6k_cis;
+    s->sd.cislen = sizeof(ar6k_cis);
+
+    ar6k_reset(s);
+
+    return ret;
+}

Modified: trunk/src/host/qemu-neo1973/hw/neo1973.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/neo1973.c    2007-12-22 02:30:17 UTC (rev 
3725)
+++ trunk/src/host/qemu-neo1973/hw/neo1973.c    2007-12-22 03:01:31 UTC (rev 
3726)
@@ -27,6 +27,12 @@
 
 #define GTA01Bv4               1
 
+enum {
+    NEO1973_GTA01      = 1182,
+    NEO1973_GTA02      = 1304,
+    NEO1973_GTA02F     = 1555,
+};
+
 /* Wiring common to all revisions */
 #define GTA01_GPIO_BACKLIGHT   S3C_GPB(0)
 #define GTA01_GPIO_GPS_PWRON   S3C_GPB(1)
@@ -261,7 +267,9 @@
 
     s3c_timers_cmp_handler_set(s->cpu->timers, 0, neo_bl_intensity, s);
 
-    sd_set_cb(s->mmc, 0, s3c_gpio_in_get(s->cpu->io)[GTA01_IRQ_nSD_DETECT]);
+    if (s->id == NEO1973_GTA01)
+        sd_set_cb(s->mmc, 0,
+                        s3c_gpio_in_get(s->cpu->io)[GTA01_IRQ_nSD_DETECT]);
 }
 
 /* PMB 2520 Hammerhead A-GPS chip */
@@ -524,7 +532,7 @@
         sd = sd_init(drives_table[sd_idx].bdrv, 0);
 
     neo1973_init_common(ram_size, ds,
-                    kernel_filename, cpu_model, sd, 1304);
+                    kernel_filename, cpu_model, sd, NEO1973_GTA01);
 }
 
 static void gta02f_init(int ram_size, int vga_ram_size,
@@ -533,9 +541,10 @@
                 const char *initrd_filename, const char *cpu_model)
 {
     struct neo_board_s *neo;
+    struct sd_card_s *sd = ar6k_init(&nd_table[0]);
 
     neo = neo1973_init_common(ram_size, ds,
-                    kernel_filename, cpu_model, 0, 1555);
+                    kernel_filename, cpu_model, sd, NEO1973_GTA02F);
 
     neo_gps_setup(neo);
     neo_machid_init(neo);

Modified: trunk/src/host/qemu-neo1973/hw/pcmcia.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/pcmcia.h     2007-12-22 02:30:17 UTC (rev 
3725)
+++ trunk/src/host/qemu-neo1973/hw/pcmcia.h     2007-12-22 03:01:31 UTC (rev 
3726)
@@ -28,9 +28,12 @@
     void (*io_write)(void *state, uint32_t address, uint16_t value);
 };
 
+#define CISTPL_NULL            0x00    /* Null Tuple */
 #define CISTPL_DEVICE          0x01    /* 5V Device Information Tuple */
+#define CISTPL_CHECKSUM                0x10    /* Checksum Control Tuple */
 #define CISTPL_NO_LINK         0x14    /* No Link Tuple */
 #define CISTPL_VERS_1          0x15    /* Level 1 Version Tuple */
+#define CISTPL_ALTSTR          0x16    /* The Alternate Language String */
 #define CISTPL_JEDEC_C         0x18    /* JEDEC ID Tuple */
 #define CISTPL_JEDEC_A         0x19    /* JEDEC ID Tuple */
 #define CISTPL_CONFIG          0x1a    /* Configuration Tuple */
@@ -39,12 +42,16 @@
 #define CISTPL_DEVICE_OA       0x1d    /* Additional Device Information */
 #define CISTPL_DEVICE_GEO      0x1e    /* Additional Device Information */
 #define CISTPL_DEVICE_GEO_A    0x1f    /* Additional Device Information */
-#define CISTPL_MANFID          0x20    /* Manufacture ID Tuple */
+#define CISTPL_MANFID          0x20    /* Manufacture ID String Tuple */
 #define CISTPL_FUNCID          0x21    /* Function ID Tuple */
 #define CISTPL_FUNCE           0x22    /* Function Extension Tuple */
-#define CISTPL_END             0xff    /* Tuple End */
+#define CISTPL_END             0xff    /* End-of-chain Tuple */
 #define CISTPL_ENDMARK         0xff
 
+/* SDIO Unique Tuples */
+#define CISTPL_SDIO_STD                0x91    /* Application Spec. Support 
Info */
+#define CISTPL_SDIO_EXT                0x92    /* SDIO Future-Use Reserved */
+
 /* dscm1xxxx.c */
 struct pcmcia_card_s *dscm1xxxx_init(BlockDriverState *bdrv);
 

Modified: trunk/src/host/qemu-neo1973/hw/sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 02:30:17 UTC (rev 3725)
+++ trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-22 03:01:31 UTC (rev 3726)
@@ -149,39 +149,6 @@
     7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
 };
 
-static uint8_t sd_crc7(void *message, size_t width)
-{
-    int i, bit;
-    uint8_t shift_reg = 0x00;
-    uint8_t *msg = (uint8_t *) message;
-
-    for (i = 0; i < width; i ++, msg ++)
-        for (bit = 7; bit >= 0; bit --) {
-            shift_reg <<= 1;
-            if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
-                shift_reg ^= 0x89;
-        }
-
-    return shift_reg;
-}
-
-static uint16_t sd_crc16(void *message, size_t width)
-{
-    int i, bit;
-    uint16_t shift_reg = 0x0000;
-    uint16_t *msg = (uint16_t *) message;
-    width <<= 1;
-
-    for (i = 0; i < width; i ++, msg ++)
-        for (bit = 15; bit >= 0; bit --) {
-            shift_reg <<= 1;
-            if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
-                shift_reg ^= 0x1011;
-        }
-
-    return shift_reg;
-}
-
 static void sd_set_ocr(SDState *sd)
 {
     /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */

Modified: trunk/src/host/qemu-neo1973/hw/sd.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-22 02:30:17 UTC (rev 3725)
+++ trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-22 03:01:31 UTC (rev 3726)
@@ -118,6 +118,39 @@
     return sd->data_ready(sd->opaque);
 }
 
+static inline uint8_t sd_crc7(void *message, size_t width)
+{
+    int i, bit;
+    uint8_t shift_reg = 0x00;
+    uint8_t *msg = (uint8_t *) message;
+
+    for (i = 0; i < width; i ++, msg ++)
+        for (bit = 7; bit >= 0; bit --) {
+            shift_reg <<= 1;
+            if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
+                shift_reg ^= 0x89;
+        }
+
+    return shift_reg;
+}
+
+static inline uint16_t sd_crc16(void *message, size_t width)
+{
+    int i, bit;
+    uint16_t shift_reg = 0x0000;
+    uint16_t *msg = (uint16_t *) message;
+    width <<= 1;
+
+    for (i = 0; i < width; i ++, msg ++)
+        for (bit = 15; bit >= 0; bit --) {
+            shift_reg <<= 1;
+            if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
+                shift_reg ^= 0x1011;
+        }
+
+    return shift_reg;
+}
+
 /* sd.c */
 struct sd_card_s *sd_init(BlockDriverState *bs, int is_spi);
 void sd_set_cb(struct sd_card_s *sd, qemu_irq readonly, qemu_irq insert);




--- End Message ---
_______________________________________________
commitlog mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to