* Adapt TRAB configuration and auto_update to new memory layout
authordzu <dzu>
Mon, 29 Sep 2003 21:55:54 +0000 (21:55 +0000)
committerdzu <dzu>
Mon, 29 Sep 2003 21:55:54 +0000 (21:55 +0000)
CHANGELOG
board/trab/auto_update.c
cpu/arm920t/usb_ohci.c
include/configs/trab.h

index 2ce5ccf5a95affb8794e83a697642202c4f4f829..6563c683d76cde24664e775449b7c64198e800a7 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
 Changes for U-Boot 1.0.0:
 ======================================================================
 
+* Adapt TRAB configuration and auto_update to new memory layout
+
 * Add configuration for wtk board
 
 * Add support for the Sharp LQ065T9DR51U LCD display
index 9371637e9258f31d7b42a0a4655a3c31b18af15e..c9c61eaabe63a474d892f1fdd2f2995795b345a7 100644 (file)
@@ -105,14 +105,14 @@ struct flash_layout
 #define AU_FL_APP_ND           0x005BFFFF
 #define AU_FL_DISK_ST          0x005C0000
 #define AU_FL_DISK_ND          0x00FFFFFF
-#else                                          /*  8 MB Flash, 16 MB RAM */
+#else                                          /*  8 MB Flash, 32 MB RAM */
 #define AU_FL_FIRMWARE_ST      0x00000000
-#define AU_FL_FIRMWARE_ND      0x0003FFFF
-#define AU_FL_KERNEL_ST                0x00040000
-#define AU_FL_KERNEL_ND                0x0011FFFF
-#define AU_FL_APP_ST           0x00120000
-#define AU_FL_APP_ND           0x003FFFFF
-#define AU_FL_DISK_ST          0x00400000
+#define AU_FL_FIRMWARE_ND      0x0005FFFF
+#define AU_FL_KERNEL_ST                0x00060000
+#define AU_FL_KERNEL_ND                0x0013FFFF
+#define AU_FL_APP_ST           0x00140000
+#define AU_FL_APP_ND           0x0067FFFF
+#define AU_FL_DISK_ST          0x00680000
 #define AU_FL_DISK_ND          0x007DFFFF
 #define AU_FL_VFD_ST           0x007E0000
 #define AU_FL_VFD_ND           0x007FFFFF
@@ -186,8 +186,8 @@ struct flash_layout aufl_layout[AU_MAXFILES - 3] = { \
 #define LOAD_ADDR ((unsigned char *)0x0C100100)
 /* where to build strings in memory - 256 bytes should be enough */
 #define STRING_ADDR ((char *)0x0C100000)
-/* the disk is the largest image */
-#define MAX_LOADSZ ausize[IDX_DISK]
+/* the app is the largest image */
+#define MAX_LOADSZ ausize[IDX_APP]
 
 /* externals */
 extern int fat_register_device(block_dev_desc_t *, int);
@@ -222,7 +222,7 @@ au_check_valid(int idx, long nbytes)
 #endif
        if (ntohl(hdr->ih_magic) != IH_MAGIC ||
            hdr->ih_arch != IH_CPU_ARM ||
-           nbytes < ntohl(hdr->ih_size))
+           nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size)))
        {
                printf ("Image %s bad MAGIC or ARCH or SIZE\n", aufile[idx]);
                return -1;
@@ -589,6 +589,9 @@ do_auto_update(void)
                 */
                if (got_ctrlc == 0)
                        au_update_eeprom(i);
+               else
+                       /* enable the power switch */
+                       *CPLD_VFD_BK &= ~POWER_OFF;
        }
        usb_stop();
        /* restore the old state */
index 8d3901ba194bae782d1350a8223682ebc16662dd..bd7e6ca941a06d78581c83f774421bf2a357924d 100644 (file)
@@ -51,8 +51,6 @@
 #define        OHCI_CONTROL_INIT \
        (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE
 
-#define OHCI_UNLINK_TIMEOUT    (CFG_HZ / 10)
-
 #define readl(a) (*((vu_long *)(a)))
 #define writel(a, b) (*((vu_long *)(b)) = ((vu_long)a))
 
@@ -85,6 +83,10 @@ struct ohci_hcca *phcca;
 struct ohci_device ohci_dev;
 /* urb_priv */
 urb_priv_t urb_priv;
+/* RHSC flag */
+int got_rhsc;
+/* device which was disconnected */
+struct usb_device *devgone;
 
 /*-------------------------------------------------------------------------*/
 
@@ -952,8 +954,29 @@ static unsigned char root_hub_str_index1[] =
 
 /* request to virtual root hub */
 
-static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-               int transfer_len, struct devrequest *cmd)
+int rh_check_port_status(ohci_t *controller)
+{
+       __u32 temp, ndp, i;
+       int res;
+
+       res = -1;
+       temp = roothub_a (controller);
+       ndp = (temp & RH_A_NDP);
+       for (i = 0; i < ndp; i++) {
+               temp = roothub_portstatus (controller, i);
+               /* check for a device disconnect */
+               if (((temp & (RH_PS_PESC | RH_PS_CSC)) ==
+                       (RH_PS_PESC | RH_PS_CSC)) &&
+                       ((temp & RH_PS_CCS) == 0)) {
+                       res = i;
+                       break;
+               }
+       }
+       return res;
+}
+
+static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
+               void *buffer, int transfer_len, struct devrequest *cmd)
 {
        void * data = buffer;
        int leni = transfer_len;
@@ -1178,6 +1201,12 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        int maxsize = usb_maxpacket(dev, pipe);
        int timeout;
 
+       /* device pulled? Shortcut the action. */
+       if (devgone == dev) {
+               dev->status = USB_ST_CRC_ERR;
+               return 0;
+       }
+
 #ifdef DEBUG
        urb_priv.actual_length = 0;
        pkt_print(dev, pipe, buffer, transfer_len, setup, "SUB", usb_pipein(pipe));
@@ -1210,7 +1239,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                /* check whether the controller is done */
                stat = hc_interrupt();
                if (stat < 0) {
-                       stat = 1;
+                       stat = USB_ST_CRC_ERR;
                        break;
                }
                if (stat >= 0 && stat != 0xff) {
@@ -1220,11 +1249,33 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                if (--timeout) {
                        wait_ms(1);
                } else {
-                       err("CTL:TIMEOUT");
-                       stat = 1;
+                       err("CTL:TIMEOUT ");
+                       stat = USB_ST_CRC_ERR;
                        break;
                }
        }
+       /* we got an Root Hub Status Change interrupt */
+       if (got_rhsc) {
+#ifdef DEBUG
+               ohci_dump_roothub (&gohci, 1);
+#endif
+               got_rhsc = 0;
+               /* abuse timeout */
+               timeout = rh_check_port_status(&gohci);
+               if (timeout >= 0) {
+#if 0 /* this does nothing useful, but leave it here in case that changes */
+                       /* the called routine adds 1 to the passed value */
+                       usb_hub_port_connect_change(gohci.rh.dev, timeout - 1);
+#endif
+                       /*
+                        * XXX
+                        * This is potentially dangerous because it assumes
+                        * that only one device is ever plugged in!
+                        */
+                       devgone = dev;
+               }
+       }
+
        dev->status = stat;
        dev->act_len = transfer_len;
 
@@ -1264,10 +1315,12 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                        pipe);
                return -1;
        }
-       if (((pipe >> 8) & 0x7f) == gohci.rh.devnum)
+       if (((pipe >> 8) & 0x7f) == gohci.rh.devnum) {
+               gohci.rh.dev = dev;
                /* root hub - redirect */
                return ohci_submit_rh_msg(dev, pipe, buffer, transfer_len,
                        setup);
+       }
 
        return submit_common_msg(dev, pipe, buffer, transfer_len, setup, 0);
 }
@@ -1356,9 +1409,17 @@ static int hc_start (ohci_t * ohci)
        ohci->disabled = 0;
        writel (ohci->hc_control, &ohci->regs->control);
 
-       /* Choose the interrupts we care about now, others later on demand */
-       mask = OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_WDH | OHCI_INTR_SO;
+       /* disable all interrupts */
+       mask = (OHCI_INTR_SO | OHCI_INTR_WDH | OHCI_INTR_SF | OHCI_INTR_RD |
+                       OHCI_INTR_UE | OHCI_INTR_FNO | OHCI_INTR_RHSC |
+                       OHCI_INTR_OC | OHCI_INTR_MIE);
+       writel (mask, &ohci->regs->intrdisable);
+       /* clear all interrupts */
+       mask &= ~OHCI_INTR_MIE;
        writel (mask, &ohci->regs->intrstatus);
+       /* Choose the interrupts we care about now  - but w/o MIE */
+       mask = OHCI_INTR_RHSC | OHCI_INTR_UE | OHCI_INTR_WDH | OHCI_INTR_SO;
+       writel (mask, &ohci->regs->intrenable);
 
 #ifdef OHCI_USE_NPS
        /* required for AMD-756 and some Mac platforms */
@@ -1397,6 +1458,10 @@ hc_interrupt (void)
 
        /* dbg("Interrupt: %x frame: %x", ints, le16_to_cpu (ohci->hcca->frame_no)); */
 
+       if (ints & OHCI_INTR_RHSC) {
+               got_rhsc = 1;
+       }
+
        if (ints & OHCI_INTR_UE) {
                ohci->disabled++;
                err ("OHCI Unrecoverable Error, controller usb-%s disabled",
index 80a4b583806b92b44db5ab4924683a913ceefb0f..e6b43d6605f1429170232ebebb51d14879c15b2e 100644 (file)
@@ -28,8 +28,8 @@
 
 #ifdef CONFIG_OLD_VERSION              /* Old configuration:           */
 #define        CONFIG_RAM_16MB                 /*      16 MB SDRAM             */
-#define CONFIG_FLASH_8MB               /*       8 MB Flash             */
 #endif
+#define CONFIG_FLASH_8MB               /*       8 MB Flash             */
 
 /*
  * If we are developing, we might want to start armboot from ram