* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
-//#define DEBUG
-//#define TEST_LAUNCH
-//#define DDEBUG
-#ifdef DDEBUG
-#define _debug printf
-#else
-#define _debug debug
-#endif
#include <common.h>
#include <command.h>
#include <net.h>
#include <wince.h>
+#include <nand.h>
+#include <malloc.h>
#include <asm/errno.h>
+#include <jffs2/load_kernel.h>
DECLARE_GLOBAL_DATA_PTR;
#define CE_FIX_ADDRESS(a) ((void *)((a) - WINCE_VRAM_BASE + CONFIG_SYS_SDRAM_BASE))
#ifndef INT_MAX
-#define INT_MAX ((int)(~0 >> 1))
+#define INT_MAX ((int)(~0U >> 1))
#endif
/* Bin image parse states */
#define CE_MIN(a, b) (((a) < (b)) ? (a) : (b))
#define CE_MAX(a, b) (((a) > (b)) ? (a) : (b))
-#define _STRMAC(s) #s
-#define STRMAC(s) _STRMAC(s)
-
static ce_bin __attribute__ ((aligned (32))) g_bin;
static ce_net __attribute__ ((aligned (32))) g_net;
-static IPaddr_t server_ip;
+static struct in_addr server_ip;
static void ce_init_bin(ce_bin *bin, unsigned char *dataBuffer)
{
memset(bin, 0, sizeof(*bin));
-debug("%s@%d: \n", __func__, __LINE__);
bin->data = dataBuffer;
bin->parseState = CE_PS_RTI_ADDR;
bin->parsePtr = (unsigned char *)bin;
-debug("%s@%d: \n", __func__, __LINE__);
}
static int ce_is_bin_image(void *image, int imglen)
snprintf(std_drv_glb->deviceId, sizeof(std_drv_glb->deviceId),
"Triton%02X", eth_get_dev()->enetaddr[5]);
- NetCopyIP(&std_drv_glb->kitl.ipAddress, &NetOurIP);
- std_drv_glb->kitl.ipMask = getenv_IPaddr("netmask");
- std_drv_glb->kitl.ipRoute = getenv_IPaddr("gatewayip");
+ net_copy_ip(&std_drv_glb->kitl.ipAddress, &net_ip);
+ std_drv_glb->kitl.ipMask = getenv_ip("netmask").s_addr;
+ std_drv_glb->kitl.ipRoute = getenv_ip("gatewayip").s_addr;
if (mtdparts) {
strncpy(std_drv_glb->mtdparts, mtdparts, max_len);
}
}
-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 %02x:%02x:%02x:%02x:%02x:%02x from environment\n",
- drv_glb->macAddr[0], drv_glb->macAddr[1],
- drv_glb->macAddr[2], drv_glb->macAddr[3],
- drv_glb->macAddr[4], drv_glb->macAddr[5]);
-
- /* 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;
}
}
static int ce_parse_bin(ce_bin *bin)
{
- unsigned char *pbData = g_net.data + 4;//bin->data;
+ unsigned char *pbData = bin->data;
int len = bin->dataLen;
int copyLen;
debug("starting ce image parsing:\n\tbin->binLen: 0x%08X\n", bin->binLen);
- debug("\tlen=%d\n", len);
- debug("\tparse_state=%d\n", bin->parseState);
if (len) {
- ce_dump_block(pbData, len);
-#if 0
-if (bin->binLen > 1024)
- return CE_PR_EOF;
-#endif
if (bin->binLen == 0) {
// Check for the .BIN signature first
if (!ce_is_bin_image(pbData, len)) {
entry();
}
-static int do_bootce(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_bootce(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
void *addr;
size_t image_size;
- char *s;
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) {
addr = (void *)getenv_ulong("fileaddr", 16, 0);
image_size = getenv_ulong("filesize", 16, INT_MAX);
} else {
- printf ("Usage:\n%s\n", cmdtp->usage);
- return 1;
+ return CMD_RET_USAGE;
}
printf ("## Booting Windows CE Image from address %p ...\n", addr);
/* Ops! Corrupted .BIN image! */
/* Handle error here ... */
printf("corrupted .BIN image !!!\n");
- return 1;
+ return CMD_RET_FAILURE;
}
- if ((s = getenv("autostart")) != NULL) {
- if (*s != 'y') {
- /*
- * just use bootce to load the image to SDRAM;
- * Do not start it automatically.
- */
- setenv_addr("fileaddr",
- g_bin.eEntryPoint);
- return 0;
- }
+ if (getenv_yesno("autostart") != 1) {
+ /*
+ * just use bootce to load the image to SDRAM;
+ * Do not start it automatically.
+ */
+ setenv_addr("fileaddr", g_bin.eEntryPoint);
+ return CMD_RET_SUCCESS;
}
ce_run_bin(g_bin.eEntryPoint); /* start the image */
} else {
printf("Image does not seem to be a valid Windows CE image!\n");
- return 1;
+ return CMD_RET_FAILURE;
+ }
+ return CMD_RET_FAILURE; /* never reached - just to keep compiler happy */
+}
+U_BOOT_CMD(
+ bootce, 2, 0, do_bootce,
+ "Boot a Windows CE image from RAM",
+ "[addr]\n"
+ "\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;
+ size_t len = max_len;
+ nand_info_t *nand = &nand_info[0];
+
+ while (nand_block_isbad(nand, *offset & ~(max_len - 1))) {
+ printf("Skipping bad block 0x%08llx\n",
+ *offset & ~(max_len - 1));
+ *offset += max_len;
+ if (*offset + max_len > nand->size)
+ return -EINVAL;
}
- return 1; /* never reached - just to keep compiler happy */
+
+ ret = nand_read(nand, *offset, &len, buf);
+ if (ret < 0)
+ return ret;
+
+ bin->dataLen = len;
+ return len;
}
+static int do_nbootce(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+ int ret;
+ struct mtd_device *dev;
+ struct part_info *part_info;
+ u8 part_num;
+ loff_t offset;
+ char *end;
+ void *buffer;
+ size_t bufsize = nand_info[0].erasesize, len;
+
+ if (argc < 2 || argc > 3)
+ return CMD_RET_USAGE;
+
+ ret = mtdparts_init();
+ if (ret)
+ return CMD_RET_FAILURE;
+
+ offset = simple_strtoul(argv[1], &end, 16);
+ if (*end != '\0') {
+ ret = find_dev_and_part(argv[1], &dev, &part_num,
+ &part_info);
+ if (ret != 0) {
+ printf("Partition '%s' not found\n", argv[1]);
+ return CMD_RET_FAILURE;
+ }
+ offset = part_info->offset;
+ printf ("## Booting Windows CE Image from NAND partition %s at offset %08llx\n",
+ argv[1], offset);
+ } else {
+ printf ("## Booting Windows CE Image from NAND offset %08llx\n",
+ offset);
+ }
+
+ buffer = malloc(bufsize);
+ if (buffer == NULL) {
+ printf("Failed to allocate %u byte buffer\n", bufsize);
+ return CMD_RET_FAILURE;
+ }
+
+ ce_init_bin(&g_bin, buffer);
+
+ ret = ce_nand_load(&g_bin, &offset, buffer, bufsize);
+ if (ret < 0) {
+ printf("Failed to read NAND: %d\n", ret);
+ goto err;
+ }
+ len = ret;
+ /* check if there is a valid windows CE image header */
+ if (ce_is_bin_image(buffer, len)) {
+ do {
+ ret = ce_parse_bin(&g_bin);
+ switch (ret) {
+ case CE_PR_MORE:
+ {
+ if (ctrlc()) {
+ printf("NBOOTCE - canceled by user\n");
+ goto err;
+ }
+ offset += len;
+ len = ce_nand_load(&g_bin, &offset, buffer,
+ bufsize);
+ if (len < 0) {
+ printf("Nand read error: %d\n", len);
+ ret = len;
+ goto err;
+ }
+ }
+ break;
+
+ case CE_PR_EOF:
+ ce_prepare_run_bin(&g_bin);
+ break;
+
+ case CE_PR_ERROR:
+ break;
+ }
+ } while (ret == CE_PR_MORE);
+ free(buffer);
+ if (ret != CE_PR_EOF)
+ return CMD_RET_FAILURE;
+
+ if (getenv_yesno("autostart") != 1) {
+ /*
+ * just use bootce to load the image to SDRAM;
+ * Do not start it automatically.
+ */
+ setenv_addr("fileaddr", g_bin.eEntryPoint);
+ return CMD_RET_SUCCESS;
+ }
+ ce_run_bin(g_bin.eEntryPoint); /* start the image */
+ } else {
+ printf("Image does not seem to be a valid Windows CE image!\n");
+ }
+err:
+ free(buffer);
+ return CMD_RET_FAILURE;
+}
U_BOOT_CMD(
- bootce, 2, 0, do_bootce,
- "bootce\t- Boot a Windows CE image from memory \n",
- "[args..]\n"
- "\taddr\t\t-boot image from address addr\n"
+ nbootce, 2, 0, do_nbootce,
+ "Boot a Windows CE image from NAND",
+ "off|partitition\n"
+ "\toff\t\t- flash offset (hex)\n"
+ "\tpartition\t- partition name"
);
+#endif
static int ce_send_write_ack(ce_net *net)
{
printf("Failed to send write ack %d; retries=%d\n",
ret, retries);
}
-debug("*");
} while (ret != 0 && retries-- > 0);
return ret;
}
blknum = ntohs(blknum);
if (blknum == nxt) {
net->blockNum = blknum;
-debug("#");
} else {
int rc = ce_send_write_ack(net);
- printf("Dropping out of sequence packet with ID %d (expected %d)\n",
- blknum, nxt);
+ if (net->verbose)
+ printf("Dropping out of sequence packet with ID %d (expected %d)\n",
+ blknum, nxt);
if (rc != 0)
return rc;
if (net->state == BOOTME_INIT) {
// Check file name for WRITE request
// CE EShell uses "boot.bin" file name
-#if 0
- printf(">>>>>>>> First Frame, IP: %s, port: %d\n",
- inet_ntoa((in_addr_t *)&net->srvAddrRecv),
- ntohs(net->srvAddrRecv.sin_port));
-#endif
if (strncmp((char *)&net->data[2],
"boot.bin", 8) == 0) {
// Some diag output
if (net->verbose) {
printf("Locked Down download link, IP: %pI4\n",
- &NetServerIP);
+ &net_server_ip);
printf("Sending BOOTME request [%d] to %pI4\n",
- net->seqNum, &NetServerIP);
+ net->seqNum, &net_server_ip);
}
// Lock down EShell download link
-// net->link = 1;
ret = BOOTME_DOWNLOAD;
} else {
// Unknown link
case EDBG_CMD_WRITE:
/* Fixup data len */
+ bin->data = &net->data[4];
bin->dataLen = net->dataLen - 4;
ret = ce_parse_bin(bin);
if (ret != CE_PR_ERROR) {
enum bootme_state ret = net->state;
eth_dbg_hdr header;
-debug("%s: received packet of %u byte @ %p\n", __func__, net->dataLen, net->data);
if (net->dataLen < sizeof(header)) {
/* Bad packet */
printf("Invalid packet size %u\n", net->dataLen);
net->dataLen = 0;
return ret;
}
-debug("%s@%d: Copying header from %p..%p to %p\n", __func__, __LINE__,
- net->data, net->data + sizeof(header) - 1, &header);
memcpy(&header, net->data, sizeof(header));
if (header.id != EDBG_ID) {
/* Bad packet */
return ret;
}
-debug("%s@%d\n", __func__, __LINE__);
if (header.service != EDBG_SVC_ADMIN) {
/* Unknown service */
printf("Bad EDBG service %02x\n", header.service);
return ret;
}
-debug("%s@%d\n", __func__, __LINE__);
if (net->state == BOOTME_INIT) {
/* Some diag output */
if (net->verbose) {
printf("Locked Down EDBG service link, IP: %pI4\n",
- &NetServerIP);
+ &net_server_ip);
}
/* Lock down EDBG link */
-// net->link = 1;
net->state = BOOTME_DEBUG;
}
-debug("%s@%d\n", __func__, __LINE__);
switch (header.cmd) {
case EDBG_CMD_JUMPIMG:
-debug("%s@%d\n", __func__, __LINE__);
net->gotJumpingRequest = 1;
if (net->verbose) {
printf("Received JUMPING command\n");
}
/* Just pass through and copy CONFIG structure */
+ ret = BOOTME_DONE;
case EDBG_CMD_OS_CONFIG:
-debug("%s@%d\n", __func__, __LINE__);
/* Copy config structure */
- memcpy(&bin->edbgConfig, header.data,
+ memcpy(&bin->edbgConfig, &net->data[sizeof(header)],
sizeof(edbg_os_config_data));
if (net->verbose) {
printf("Received CONFIG command\n");
if (bin->edbgConfig.flags & EDBG_FL_DBGMSG) {
- printf("--> Enabling DBGMSG service, IP: %d.%d.%d.%d, port: %d\n",
- (bin->edbgConfig.dbgMsgIPAddr >> 0) & 0xFF,
- (bin->edbgConfig.dbgMsgIPAddr >> 8) & 0xFF,
- (bin->edbgConfig.dbgMsgIPAddr >> 16) & 0xFF,
- (bin->edbgConfig.dbgMsgIPAddr >> 24) & 0xFF,
+ printf("--> Enabling DBGMSG service, IP: %pI4, port: %d\n",
+ &bin->edbgConfig.dbgMsgIPAddr,
ntohs(bin->edbgConfig.dbgMsgPort));
}
if (bin->edbgConfig.flags & EDBG_FL_PPSH) {
- printf("--> Enabling PPSH service, IP: %d.%d.%d.%d, port: %d\n",
- (bin->edbgConfig.ppshIPAddr >> 0) & 0xFF,
- (bin->edbgConfig.ppshIPAddr >> 8) & 0xFF,
- (bin->edbgConfig.ppshIPAddr >> 16) & 0xFF,
- (bin->edbgConfig.ppshIPAddr >> 24) & 0xFF,
+ printf("--> Enabling PPSH service, IP: %pI4, port: %d\n",
+ &bin->edbgConfig.ppshIPAddr,
ntohs(bin->edbgConfig.ppshPort));
}
if (bin->edbgConfig.flags & EDBG_FL_KDBG) {
- printf("--> Enabling KDBG service, IP: %d.%d.%d.%d, port: %d\n",
- (bin->edbgConfig.kdbgIPAddr >> 0) & 0xFF,
- (bin->edbgConfig.kdbgIPAddr >> 8) & 0xFF,
- (bin->edbgConfig.kdbgIPAddr >> 16) & 0xFF,
- (bin->edbgConfig.kdbgIPAddr >> 24) & 0xFF,
+ printf("--> Enabling KDBG service, IP: %pI4, port: %d\n",
+ &bin->edbgConfig.kdbgIPAddr,
ntohs(bin->edbgConfig.kdbgPort));
}
printf("--> Force clean boot\n");
}
}
- ret = BOOTME_DEBUG;
break;
default:
/* Respond with ack */
header.flags = EDBG_FL_FROM_DEV | EDBG_FL_ACK;
+ memcpy(net->data, &header, sizeof(header));
net->dataLen = EDBG_DATA_OFFSET;
-debug("%s@%d: sending packet %p len %u\n", __func__, __LINE__,
- net->data, net->dataLen);
- bootme_send_frame(net->data, net->dataLen);
- return ret;
+
+ int retries = 10;
+ int rc;
+ do {
+ rc = bootme_send_frame(net->data, net->dataLen);
+ if (rc != 0) {
+ printf("Failed to send ACK: %d\n", rc);
+ }
+ } while (rc && retries-- > 0);
+ return rc ?: ret;
}
static enum bootme_state ce_edbg_handler(const void *buf, size_t len)
{
- enum bootme_state ret;
-
- if (len == 0) {
- _debug("%s: EOF\n", __func__);
+ if (len == 0)
return BOOTME_DONE;
- }
-#if 0
- if (len > sizeof(g_net.data)) {
- debug("Dropping oversized packet of %u bytes (max. size %u)\n",
- len, sizeof(g_net.data));
- return g_net.state;
- }
- debug("Copying network packet of %u bytes from %p to %p\n",
- len, buf, g_net.data);
- memcpy(g_net.data, buf, len);
- g_net.dataLen = len;
-#else
+
g_net.data = (void *)buf;
g_net.dataLen = len;
-#endif
- ret = ce_process_edbg(&g_net, &g_bin);
- return ret;
+
+ return ce_process_edbg(&g_net, &g_bin);
}
static void ce_init_edbg_link(ce_net *net)
static enum bootme_state ce_download_handler(const void *buf, size_t len)
{
-#if 0
- if (len > sizeof(g_net.data)) {
- debug("Dropping oversized packet of %u bytes (max. size %u)\n",
- len, sizeof(g_net.data));
- return g_net.state;
- }
- debug("Copying network packet of %u bytes from %p to %p\n",
- len, buf, g_net.data);
- memcpy(g_net.data, buf, len);
- g_net.dataLen = len;
-#else
g_net.data = (void *)buf;
g_net.dataLen = len;
-#endif
+
g_net.state = ce_process_download(&g_net, &g_bin);
return g_net.state;
}
eth_dbg_hdr *header;
edbg_bootme_data *data;
unsigned char txbuf[PKTSIZE_ALIGN];
-#ifdef DEBUG_
+#ifdef DEBUG
int i;
unsigned char *pkt;
#endif
/* Fill out BOOTME packet */
-net->data = txbuf;
-assert(net->data != NULL);
+ net->data = txbuf;
+
memset(net->data, 0, PKTSIZE);
header = (eth_dbg_hdr *)net->data;
data = (edbg_bootme_data *)header->data;
}
/* IP address from active config */
- NetCopyIP(&data->ipAddr, &NetOurIP);
+ net_copy_ip(&data->ipAddr, &net_ip);
// Device name string (NULL terminated). Should include
// platform and number based on Ether address (e.g. Odo42, CEPCLS2346, etc)
snprintf(data->deviceName, sizeof(data->deviceName), "%s%02X",
data->platformId, data->macAddr[5]);
-#ifdef DEBUG_
- printf("header->id: %08X\r\n", header->id);
- printf("header->service: %08X\r\n", header->service);
- printf("header->flags: %08X\r\n", header->flags);
- printf("header->seqNum: %08X\r\n", header->seqNum);
- printf("header->cmd: %08X\r\n\r\n", header->cmd);
-
- printf("data->versionMajor: %08X\r\n", data->versionMajor);
- printf("data->versionMinor: %08X\r\n", data->versionMinor);
- printf("data->cpuId: %08X\r\n", data->cpuId);
- printf("data->bootmeVer: %08X\r\n", data->bootmeVer);
- printf("data->bootFlags: %08X\r\n", data->bootFlags);
- printf("data->svcPort: %08X\r\n\r\n", ntohs(data->svcPort));
-
- printf("data->macAddr: %02X-%02X-%02X-%02X-%02X-%02X\r\n",
- data->macAddr[0], data->macAddr[1],
- data->macAddr[2], data->macAddr[3],
- data->macAddr[4], data->macAddr[5]);
-
- printf("data->ipAddr: %d.%d.%d.%d\r\n",
- (data->ipAddr >> 0) & 0xFF,
- (data->ipAddr >> 8) & 0xFF,
- (data->ipAddr >> 16) & 0xFF,
- (data->ipAddr >> 24) & 0xFF);
-
- printf("data->platformId: %s\r\n", data->platformId);
-
- printf("data->deviceName: %s\r\n", data->deviceName);
+#ifdef DEBUG
+ printf("header->id: %08X\n", header->id);
+ printf("header->service: %08X\n", header->service);
+ printf("header->flags: %08X\n", header->flags);
+ printf("header->seqNum: %08X\n", header->seqNum);
+ printf("header->cmd: %08X\n\n", header->cmd);
+
+ printf("data->versionMajor: %08X\n", data->versionMajor);
+ printf("data->versionMinor: %08X\n", data->versionMinor);
+ printf("data->cpuId: %08X\n", data->cpuId);
+ printf("data->bootmeVer: %08X\n", data->bootmeVer);
+ printf("data->bootFlags: %08X\n", data->bootFlags);
+ printf("data->svcPort: %08X\n\n", ntohs(data->svcPort));
+
+ printf("data->macAddr: %pM\n", data->macAddr);
+ printf("data->ipAddr: %pI4\n", &data->ipAddr);
+ printf("data->platformId: %s\n", data->platformId);
+ printf("data->deviceName: %s\n", data->deviceName);
#endif
// Some diag output ...
if (net->verbose) {
net->dataLen = BOOTME_PKT_SIZE;
// net->status = CE_PR_MORE;
net->state = BOOTME_INIT;
-#ifdef DEBUG_
+#ifdef DEBUG
debug("Start of buffer: %p\n", net->data);
debug("Start of ethernet buffer: %p\n", net->data);
debug("Start of CE header: %p\n", header);
net->verbose = verbose;
- ce_init_bin(bin, NULL);//&net->data[4]);
+ /* buffer will be dynamically assigned in ce_download_handler() */
+ ce_init_bin(bin, NULL);
return 0;
}
-#define UINT_MAX ~0UL
-
static inline int ce_download_file(ce_net *net, ulong timeout)
{
ulong start = get_timer_masked();
}
ret = BootMeDownload(ce_download_handler);
- printf("BootMeDownload() returned %d\n", ret);
if (ret == BOOTME_ERROR) {
printf("CELOAD - aborted\n");
return 1;
int ret = 1;
int i;
- server_ip = 0;
+ server_ip.s_addr = 0;
for (i = 1; i < argc; i++){
if (*argv[i] != '-')
i++;
if (argc > i) {
timeout = simple_strtoul(argv[i],
- NULL, 10);
+ 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 1;
+ return CMD_RET_USAGE;
}
timeout *= CONFIG_SYS_HZ;
} else {
printf("Option requires an argument - t\n");
- return 1;
+ return CMD_RET_USAGE;
}
} else if (argv[i][1] == 'h') {
i++;
server_ip = string_to_ip(argv[i]);
printf("Using server %pI4\n", &server_ip);
} else {
- printf("Option requires an argument - t\n");
- return 1;
+ printf("Option requires an argument - h\n");
+ return CMD_RET_USAGE;
}
}
}
-#ifndef TEST_LAUNCH
+
if (ce_init_download_link(&g_net, &g_bin, verbose) != 0)
goto err;
if (ce_download_file(&g_net, timeout))
goto err;
-#else
-g_bin.binLen = 1;
-#endif
+
if (g_bin.binLen) {
// Try to receive edbg commands from host
-_debug("%s@%d: \n", __func__, __LINE__);
ce_init_edbg_link(&g_net);
-_debug("%s@%d: \n", __func__, __LINE__);
if (verbose)
printf("Waiting for EDBG commands ...\n");
-_debug("%s@%d: \n", __func__, __LINE__);
ret = BootMeDebugStart(ce_edbg_handler);
-_debug("%s@%d: ret=%d\n", __func__, __LINE__, ret);
if (ret != BOOTME_DONE)
goto err;
-_debug("%s@%d: \n", __func__, __LINE__);
// Prepare WinCE image for execution
ce_prepare_run_bin(&g_bin);
-_debug("%s@%d: \n", __func__, __LINE__);
// Launch WinCE, if necessary
if (g_net.gotJumpingRequest)
ce_run_bin(g_bin.eEntryPoint);
-_debug("%s@%d: \n", __func__, __LINE__);
}
ret = 0;
err:
ce_disconnect();
- return ret;
+ return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
}
-
U_BOOT_CMD(
- ceconnect, 4, 1, do_ceconnect,
- "ceconnect - Set up a connection to the CE host PC over TCP/IP and download the run-time image\n",
- "ceconnect [-v] [-t <timeout>]\n"
- " -v verbose operation\n"
- " -t <timeout> - max wait time (#sec) for the connection\n"
+ ceconnect, 6, 1, do_ceconnect,
+ "Set up a connection to the CE host PC over TCP/IP and download the run-time image",
+ "[-v] [-t <timeout>] [-h host]\n"
+ " -v - verbose operation\n"
+ " -t <timeout> - max wait time (#sec) for the connection\n"
+ " -h <host> - send BOOTME requests to <host> (default: broadcast address 255.255.255.255)"
);