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; }
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; }