}
}
-static void ce_prepare_run_bin(ce_bin *bin)
+static void ce_init_drv_globals(void)
{
- ce_driver_globals *drv_glb;
struct ce_magic *ce_magic = (void *)CONFIG_SYS_SDRAM_BASE + 0x160;
ce_std_driver_globals *std_drv_glb = &ce_magic->drv_glb;
+ debug("Copying CE MAGIC from %p to %p..%p\n",
+ &ce_magic_template, ce_magic,
+ (void *)ce_magic + sizeof(*ce_magic) - 1);
+ memcpy(ce_magic, &ce_magic_template, sizeof(*ce_magic));
+
+ ce_setup_std_drv_globals(std_drv_glb);
+ ce_magic->size = sizeof(*std_drv_glb) +
+ strlen(std_drv_glb->mtdparts) + 1;
+ ce_dump_block(ce_magic, offsetof(struct ce_magic, drv_glb) +
+ ce_magic->size);
+}
+
+static void ce_prepare_run_bin(ce_bin *bin)
+{
/* Clear os RAM area (if needed) */
if (bin->edbgConfig.flags & EDBG_FL_CLEANBOOT) {
debug("cleaning memory from %p to %p\n",
printf("ok\n");
}
- /* Prepare driver globals (if needed) */
- if (bin->eDrvGlb) {
- debug("Copying CE MAGIC from %p to %p..%p\n",
- &ce_magic_template, ce_magic,
- (void *)ce_magic + sizeof(*ce_magic) - 1);
- memcpy(ce_magic, &ce_magic_template, sizeof(*ce_magic));
-
- ce_setup_std_drv_globals(std_drv_glb);
- ce_magic->size = sizeof(*std_drv_glb) +
- strlen(std_drv_glb->mtdparts) + 1;
- ce_dump_block(ce_magic, offsetof(struct ce_magic, drv_glb) +
- ce_magic->size);
-
- drv_glb = bin->eDrvGlb;
- memset(drv_glb, 0, sizeof(*drv_glb));
-
- drv_glb->signature = DRV_GLB_SIGNATURE;
-
- /* Local ethernet MAC address */
- memcpy(drv_glb->macAddr, std_drv_glb->kitl.mac,
- sizeof(drv_glb->macAddr));
- debug("got MAC address %pM from environment\n",
- drv_glb->macAddr);
-
- /* Local IP address */
- drv_glb->ipAddr = getenv_IPaddr("ipaddr");
-
- /* Subnet mask */
- drv_glb->ipMask = getenv_IPaddr("netmask");
-
- /* Gateway config */
- drv_glb->ipGate = getenv_IPaddr("gatewayip");
-#ifdef DEBUG
- debug("got IP address %pI4 from environment\n",
- &drv_glb->ipAddr);
- debug("got IP mask %pI4 from environment\n",
- &drv_glb->ipMask);
- debug("got gateway address %pI4 from environment\n",
- &drv_glb->ipGate);
-#endif
- /* EDBG services config */
- memcpy(&drv_glb->edbgConfig, &bin->edbgConfig,
- sizeof(bin->edbgConfig));
- }
+ ce_init_drv_globals();
/*
* Make sure, all the above makes it into SDRAM because
e32->e32_entryrva;
bin->eRamStart = CE_FIX_ADDRESS(header->ramStart);
bin->eRamLen = header->ramEnd - header->ramStart;
- // Save driver_globals address
- // Must follow RAM section in CE config.bib file
- //
- // eg.
- //
- // RAM 80900000 03200000 RAM
- // DRV_GLB 83B00000 00001000 RESERVED
- //
- bin->eDrvGlb = CE_FIX_ADDRESS(header->ramEnd);
return 1;
}
}
size_t image_size;
if (argc > 1) {
+ if (strcmp(argv[1], "-i") == 0) {
+ ce_init_drv_globals();
+ return CMD_RET_SUCCESS;
+ }
addr = (void *)simple_strtoul(argv[1], NULL, 16);
image_size = INT_MAX; /* actually we do not know the image size */
} else if (getenv("fileaddr") != NULL) {
bootce, 2, 0, do_bootce,
"Boot a Windows CE image from RAM",
"[addr]\n"
- "\taddr\t\tboot image from address addr (default ${fileaddr})"
+ "\taddr\t\tboot image from address addr (default ${fileaddr})\n"
+ "or\n"
+ "\t-i\t\tinitialize the WinCE globals data structure (before loading a .nb0 image)"
);
+#ifdef CONFIG_CMD_NAND
static int ce_nand_load(ce_bin *bin, loff_t *offset, void *buf, size_t max_len)
{
int ret;
break;
case CE_PR_EOF:
+ ce_prepare_run_bin(&g_bin);
+ break;
+
case CE_PR_ERROR:
break;
}
"\toff\t\t- flash offset (hex)\n"
"\tpartition\t- partition name"
);
+#endif
static int ce_send_write_ack(ce_net *net)
{
return 0;
}
-#define UINT_MAX ~0UL
-
static inline int ce_download_file(ce_net *net, ulong timeout)
{
ulong start = get_timer_masked();
timeout = simple_strtoul(argv[i],
NULL, 0);
if (timeout >= UINT_MAX / CONFIG_SYS_HZ) {
- printf("Timeout value %lu out of range (max.: %lu)\n",
+ printf("Timeout value %lu out of range (max.: %u)\n",
timeout, UINT_MAX / CONFIG_SYS_HZ - 1);
return CMD_RET_USAGE;
}