Exemple #1
0
static int l_spi_new(lua_State * L)
{
	const char * name = luaL_checkstring(L, 1);
	int cs = luaL_optinteger(L, 2, 0);
	int type = luaL_optinteger(L, 3, 1);
	int mode = luaL_optinteger(L, 4, 0);
	int bits = luaL_optinteger(L, 5, 8);
	int speed = luaL_optinteger(L, 6, 0);
	struct spi_device_t * dev = spi_device_alloc(name, cs, type, mode, bits, speed);
	if(!dev)
		return 0;
	struct lspi_t * spi = lua_newuserdata(L, sizeof(struct lspi_t));
	spi->dev = dev;
	luaL_setmetatable(L, MT_HARDWARE_SPI);
	return 1;
}
Exemple #2
0
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;
}