static lws_filefd_type esp8266_lws_fops_open(struct lws *wsi, const char *filename, unsigned long *filelen, int flags) { struct esp8266_file *f = malloc(sizeof(*f)); if (!f) return NULL; f->i = romfs_lookup(romfs, romfs, filename); if (!f->i) { free(f); return NULL; } *filelen = romfs_inode_size(f->i); f->ofs = 0; f->size = *filelen; return f; }
static int load_module(const char *name) { int len, i; void *addr; void *link_addr; module_init_t module_init; // Load modules right after the SNK... // FIXME: hard-coded offset! link_addr = (void*)__client_start + 0x800000; // snk_kernel_interface.print("Loading Module '%s'\n", name); /* find module in module list and lookup link address */ for(i=0; modules[i].name; ++i) { if(strcmp(modules[i].name, name) == 0) break; } if( modules[i].name == 0 ) { /* module not in list */ return -1; } /* check if link address is used already */ for(i=1; i<MODULES_MAX; ++i) { if(snk_modules[i] /* && snk_modules[i]->link_addr == link_addr*/) { // busy, can't load modules return -2; } } /* find empty position in array of loaded modules */ for(i=0; i<MODULES_MAX; ++i) { if(snk_modules[i] == 0) { break; } } if(i == MODULES_MAX) { // no space avaliable! return -3; } /* Read module from FLASH */ len = romfs_lookup(name, &addr); if (len <= 0) { /* file not found */ return -4; } /* Copy image from flash to RAM */ if (elf_load_file_to_addr(addr, link_addr, (void*)&module_init, NULL, flush_cache) != 2) { snk_kernel_interface.print("ELF loading failed!\n"); return -5; } snk_modules[i] = module_init(&snk_kernel_interface, &snk_kernel_interface.pci_conf); if(snk_modules[i] == 0) { /* no device found that can be managed by this module */ return -5; } if(snk_modules[i]->type == MOD_TYPE_NETWORK) { /* Get mac address from device tree */ get_mac(snk_modules[i]->mac_addr); } return i; }
static int load_module(const char *name) { int len, i; void *addr; void *link_addr; module_init_t module_init; /* find module in module list and lookup link address */ for(i=0; modules[i].name; ++i) { if(strcmp(modules[i].name, name) == 0) break; } if( modules[i].name == 0 ) { /* module not in list */ return -1; } link_addr = modules[i].link_addr; /* check if link address is used already */ for(i=0; i<MODULES_MAX; ++i) { if(snk_modules[i] && snk_modules[i]->link_addr == link_addr) { /* busy, can't load modules */ return -2; } } /* find empty position in array of loaded modules */ for(i=0; i<MODULES_MAX; ++i) { if(snk_modules[i] == 0) { break; } } if(i == MODULES_MAX) { // no space avaliable! return -3; } /* Read module from FLASH */ len = romfs_lookup(name, &addr); if (len <= 0) { /* file not found */ return -4; } /* Copy image from flash to RAM * FIXME fix address 8MB */ memcpy(link_addr, addr, len); flush_cache(link_addr, len); /* Module starts with opd structure of the module_init * function. */ module_init = (module_init_t) link_addr; snk_modules[i] = module_init(&snk_kernel_interface, &snk_kernel_interface.pci_conf); if(snk_modules[i] == 0) { /* no device found that can be managed by this module */ return -5; } if(snk_modules[i]->type == MOD_TYPE_NETWORK) { /* Get mac address from device tree */ get_mac(snk_modules[i]->mac_addr); } return i; }