示例#1
0
文件: l-spi.c 项目: xboot/xboot
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;
}
示例#2
0
文件: spi-flash.c 项目: mirsys/xboot
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);
}
示例#3
0
文件: fb-ssd1309.c 项目: xboot/xboot
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);
}
示例#4
0
文件: spi-flash.c 项目: mirsys/xboot
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);
}
示例#5
0
文件: spi-flash.c 项目: mirsys/xboot
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);
}
示例#6
0
文件: l-spi.c 项目: xboot/xboot
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;
}
示例#7
0
文件: spi-flash.c 项目: mirsys/xboot
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);
}
示例#8
0
文件: spi-flash.c 项目: mirsys/xboot
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];
}
示例#9
0
文件: spi-flash.c 项目: mirsys/xboot
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);
}
示例#10
0
文件: spi-flash.c 项目: mirsys/xboot
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;
}
示例#11
0
文件: fb-ssd1309.c 项目: xboot/xboot
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);
}