コード例 #1
0
ファイル: generate.c プロジェクト: numpad/generator
/* registers a block r,g,b and returns it's id */
int js_register_block(duk_context *ctx) {
	/* get r, g, b values */
	const int r = duk_get_int(ctx, 0);
	const int g = duk_get_int(ctx, 1);
	const int b = duk_get_int(ctx, 2);
	
	/* registers block, may allocate more memory */
	register_block(r, g, b);
	
	/* return block's id */
	duk_push_int(ctx, blocks_len - 1);

	return 1;
}
コード例 #2
0
ファイル: romdisk.c プロジェクト: IngenicC/xboot
static bool_t register_romdisk(const char * name, void * start, void * end)
{
	struct block_t * blk;
	struct romdisk_t * romdisk;
	u64_t size;

	if(!name)
		return FALSE;

	size = (u64_t)(end - start);
	size = (size + SZ_512) / SZ_512;
	if(size <= 0)
		return FALSE;

	blk = malloc(sizeof(struct block_t));
	if(!blk)
		return FALSE;

	romdisk = malloc(sizeof(struct romdisk_t));
	if(!romdisk)
	{
		free(blk);
		return FALSE;
	}

	romdisk->name = strdup(name);
	romdisk->start = start;
	romdisk->end = end;

	blk->name	= romdisk->name;
	blk->blksz	= SZ_512;
	blk->blkcnt	= size;
	blk->read 	= romdisk_read;
	blk->write	= romdisk_write;
	blk->sync	= romdisk_sync;
	blk->suspend = romdisk_suspend;
	blk->resume = romdisk_resume;
	blk->priv	= romdisk;

	if(!register_block(blk))
	{
		free(romdisk->name);
		free(romdisk);
		free(blk);
		return FALSE;
	}

	return TRUE;
}
コード例 #3
0
ファイル: sandbox-app.c プロジェクト: IngenicC/xboot
static bool_t register_application(const char * name, void * start, void * end)
{
	struct block_t * blk;
	struct application_t * app;
	u64_t size;

	if(!name)
		return FALSE;

	size = (u64_t)(end - start);
	size = (size + SZ_512) / SZ_512;
	if(size <= 0)
		return FALSE;

	blk = malloc(sizeof(struct block_t));
	if(!blk)
		return FALSE;

	app = malloc(sizeof(struct application_t));
	if(!app)
	{
		free(blk);
		return FALSE;
	}

	app->name = strdup(name);
	app->start = start;
	app->end = end;

	blk->name	= app->name;
	blk->blksz	= SZ_512;
	blk->blkcnt	= size;
	blk->read 	= application_read;
	blk->write	= application_write;
	blk->sync	= application_sync;
	blk->suspend = application_suspend;
	blk->resume = application_resume;
	blk->priv	= app;

	if(!register_block(blk))
	{
		free(app->name);
		free(app);
		free(blk);
		return FALSE;
	}

	return TRUE;
}
コード例 #4
0
ファイル: romdisk.c プロジェクト: xboot/xboot
static struct device_t * romdisk_probe(struct driver_t * drv, struct dtnode_t * n)
{
	struct romdisk_pdata_t * pdat;
	struct block_t * blk;
	struct device_t * dev;
	virtual_addr_t addr = strtoull(dt_read_string(n, "address", "0"), NULL, 0);
	virtual_size_t size = strtoull(dt_read_string(n, "size", "0"), NULL, 0);

	if(size <= 0)
		return NULL;
	size = (size + SZ_512) / SZ_512;

	pdat = malloc(sizeof(struct romdisk_pdata_t));
	if(!pdat)
		return NULL;

	blk = malloc(sizeof(struct block_t));
	if(!blk)
	{
		free(pdat);
		return NULL;
	}

	pdat->addr = addr;
	pdat->size = size;

	blk->name = alloc_device_name(dt_read_name(n), dt_read_id(n));
	blk->blksz	= SZ_512;
	blk->blkcnt	= (u64_t)size;
	blk->read = romdisk_read;
	blk->write = romdisk_write;
	blk->sync = romdisk_sync;
	blk->priv = pdat;

	if(!register_block(&dev, blk))
	{
		free_device_name(blk->name);
		free(blk->priv);
		free(blk);
		return NULL;
	}
	dev->driver = drv;

	return dev;
}
コード例 #5
0
ファイル: spi-flash.c プロジェクト: mirsys/xboot
static bool_t spi_flash_register(struct resource_t * res)
{
	struct spi_flash_data_t * rdat = (struct spi_flash_data_t *)res->data;
	struct spi_flash_private_data_t * dat;
	struct spi_device_t * dev;
	struct spi_flash_id_t * id;
	struct block_t * blk;
	char name[64];

	dev = spi_device_alloc(rdat->spibus, rdat->mode, 8, rdat->speed);
	if(!dev)
		return FALSE;

	id = spi_flash_read_id(dev);
	if(!id)
	{
		spi_device_free(dev);
		return FALSE;
	}

	dat = malloc(sizeof(struct spi_flash_private_data_t));
	if(!dat)
	{
		spi_device_free(dev);
		return FALSE;
	}

	blk = malloc(sizeof(struct block_t));
	if(!blk)
	{
		spi_device_free(dev);
		free(dat);
		return FALSE;
	}

	snprintf(name, sizeof(name), "%s.%d", res->name, res->id);
	dat->dev = dev;
	dat->id = id;

	blk->name = strdup(name);
	if(id->flags & SECTOR_4K)
	{
		blk->blksz = 4096;
		blk->blkcnt = id->sector_size * id->sector_count / 4096;
	}
	else
	{
		blk->blksz = id->sector_size;
		blk->blkcnt = id->sector_count;
	}
	blk->read = spi_flash_read;
	blk->write = spi_flash_write;
	blk->sync = spi_flash_sync;
	blk->suspend = spi_flash_suspend;
	blk->resume = spi_flash_resume;
	blk->priv = dat;

	spi_flash_write_enable(dev);
	spi_flash_write_status_register(dev, 0);

	if(register_block(blk))
		return TRUE;

	spi_device_free(dev);
	free(blk->priv);
	free(blk->name);
	free(blk);
	return FALSE;
}