static int m_spi_read(lua_State * L) { struct lspi_t * spi = luaL_checkudata(L, 1, MT_HARDWARE_SPI); int count = luaL_checkinteger(L, 2); if(count <= 0) { lua_pushnil(L); } else if(count <= SZ_4K) { char buf[SZ_4K]; if(!(spi_device_write_then_read(spi->dev, 0, 0, buf, count) < 0)) lua_pushlstring(L, buf, count); else lua_pushnil(L); } else { char * p = malloc(count); if(p && !(spi_device_write_then_read(spi->dev, 0, 0, p, count) < 0)) lua_pushlstring(L, p, count); else lua_pushnil(L); free(p); } return 1; }
static void spi_flash_write_one_page(struct spi_device_t * dev, u64_t addr, u8_t * buf) { u8_t tx[4]; spi_flash_write_enable(dev); spi_device_chipselect(dev, 1); tx[0] = OPCODE_PP; tx[1] = (u8_t)(addr >> 16); tx[2] = (u8_t)(addr >> 8); tx[3] = (u8_t)(addr >> 0); spi_device_write_then_read(dev, tx, 4, 0, 0); spi_device_write_then_read(dev, buf, 256, 0, 0); spi_device_chipselect(dev, 0); spi_flash_wait_for_busy(dev); }
static void ssd1309_write_command(struct fb_ssd1309_pdata_t * pdat, u8_t cmd) { spi_device_select(pdat->dev); gpio_set_value(pdat->cd, 0); spi_device_write_then_read(pdat->dev, &cmd, 1, 0, 0); gpio_set_value(pdat->cd, 1); spi_device_deselect(pdat->dev); }
static void spi_flash_write_disable(struct spi_device_t * dev) { u8_t tx[1]; spi_device_chipselect(dev, 1); tx[0] = OPCODE_WRDI; spi_device_write_then_read(dev, tx, 1, 0, 0); spi_device_chipselect(dev, 0); }
static void spi_flash_write_status_register(struct spi_device_t * dev, u8_t sr) { u8_t tx[2]; spi_device_chipselect(dev, 1); tx[0] = OPCODE_WRSR; tx[1] = sr; spi_device_write_then_read(dev, tx, 2, 0, 0); spi_device_chipselect(dev, 0); }
static int m_spi_write(lua_State * L) { struct lspi_t * spi = luaL_checkudata(L, 1, MT_HARDWARE_SPI); int count; const char * buf = luaL_checklstring(L, 2, (size_t *)&count); if(count > 0) lua_pushboolean(L, (spi_device_write_then_read(spi->dev, (void *)buf, count, 0, 0) < 0) ? 0 : 1); else lua_pushboolean(L, 0); return 1; }
static void spi_flash_normal_read_bytes(struct spi_device_t * dev, u64_t addr, u8_t * buf, u32_t count) { u8_t tx[4]; spi_device_chipselect(dev, 1); tx[0] = OPCODE_NREAD; tx[1] = (u8_t)(addr >> 16); tx[2] = (u8_t)(addr >> 8); tx[3] = (u8_t)(addr >> 0); spi_device_write_then_read(dev, tx, 4, buf, count); spi_device_chipselect(dev, 0); }
static u8_t spi_flash_read_status_register(struct spi_device_t * dev) { u8_t tx[1]; u8_t rx[1]; spi_device_chipselect(dev, 1); tx[0] = OPCODE_RDSR; spi_device_write_then_read(dev, tx, 1, rx, 1); spi_device_chipselect(dev, 0); return rx[0]; }
static void spi_flash_sector_erase_4k(struct spi_device_t * dev, u64_t addr) { u8_t tx[4]; spi_flash_write_enable(dev); spi_flash_wait_for_busy(dev); spi_device_chipselect(dev, 1); tx[0] = OPCODE_BE_4K; tx[1] = (u8_t)(addr >> 16); tx[2] = (u8_t)(addr >> 8); tx[3] = (u8_t)(addr >> 0); spi_device_write_then_read(dev, tx, 4, 0, 0); spi_device_chipselect(dev, 0); spi_flash_wait_for_busy(dev); }
struct spi_flash_id_t * spi_flash_read_id(struct spi_device_t * dev) { struct spi_flash_id_t * id; u8_t tx[1]; u8_t rx[6]; int res, i; spi_device_chipselect(dev, 1); tx[0] = OPCODE_RDID; res = spi_device_write_then_read(dev, tx, 1, rx, 6); spi_device_chipselect(dev, 0); if(res < 0) return NULL; for(i = 0; i < ARRAY_SIZE(spi_flash_ids); i++) { id = &spi_flash_ids[i]; if((id->id_len > 0) && (memcmp(id->id, rx, id->id_len) == 0)) return id; } return NULL; }
static void ssd1309_write_data(struct fb_ssd1309_pdata_t * pdat, u8_t dat) { spi_device_select(pdat->dev); spi_device_write_then_read(pdat->dev, &dat, 1, 0, 0); spi_device_deselect(pdat->dev); }