/* Read queue from a stream */ vqueue * vq_read(FILE *fp) { double priority; vscalar *s; int num, i; vqueue *q; q = vq_create(); /* No. of entries */ if (!v_read_long(&num, fp)) return NULL; vq_require(q, num); /* The entries */ for (i = 0; i < num; i++) { if (!v_read_double(&priority, fp)) return NULL; if ((s = vs_read(fp)) == NULL) return NULL; vq_store(q, s, priority); } return q; }
int init_config(void) { int id, ret, len = 0; void * cfg = (void *)ITEMS_LOWBASE; printf("cfg: 0x%p\n", cfg); id = boot_device(); switch(id) { case DEV_EEPROM: case DEV_FLASH: cfg = (void *)(IRAM_BASE_PA + BL_SIZE_FIXED - ITEM_SIZE_EMBEDDED); len = ITEM_SIZE_EMBEDDED; break ; case DEV_BND: id = DEV_NAND; default: printf("read items: id=%d\n", id); ret = vs_assign_by_id(id, 1); if (ret) return ret; ret = vs_read(cfg, BL_LOC_CONFIG, ITEM_SIZE_NORMAL, 0); if (ret < 0) return ret; len = ITEM_SIZE_NORMAL; } printf("begin init.\n"); return item_init(cfg, len); }
static int pdp_demux(void) { int ret; u8 ch; size_t len; struct pdp_info *dev = NULL; struct pdp_hdr hdr; /* read header */ ret = dpram_read(dpram_filp, &hdr, sizeof(hdr)); if (ret < 0) { return ret; } len = hdr.len - sizeof(struct pdp_hdr); /* check header */ down(&pdp_lock); dev = pdp_get_dev(hdr.id); if (dev == NULL) { printk("invalid id: %u, there is no existing device.\n", hdr.id); ret = -ENODEV; goto err; } /* read data */ switch (dev->type) { case DEV_TYPE_NET: ret = vnet_recv(dev, len); break; case DEV_TYPE_SERIAL: ret = vs_read(dev, len); break; default: ret = -1; } if (ret < 0) { goto err; } up(&pdp_lock); /* check stop byte */ ret = dpram_read(dpram_filp, &ch, sizeof(ch)); if (ret < 0 || ch != 0x7e) { return ret; } return 0; err: up(&pdp_lock); /* flush the remaining data including stop byte. */ dpram_flush_rx(dpram_filp, len + 1); return ret; }