Merge pull request #1722 from zhaojuntao/sfud
[components/drivers/spi] 增加 sfud flash 设备查找接口
This commit is contained in:
commit
ea48042fe3
|
@ -36,8 +36,8 @@ extern "C"{
|
||||||
#define RT_SPI_CPOL (1<<1) /* bit[1]:CPOL, clock polarity */
|
#define RT_SPI_CPOL (1<<1) /* bit[1]:CPOL, clock polarity */
|
||||||
/**
|
/**
|
||||||
* At CPOL=0 the base value of the clock is zero
|
* At CPOL=0 the base value of the clock is zero
|
||||||
* - For CPHA=0, data are captured on the clock's rising edge (low¡úhigh transition)
|
* - For CPHA=0, data are captured on the clock's rising edge (low->high transition)
|
||||||
* and data are propagated on a falling edge (high¡úlow clock transition).
|
* and data are propagated on a falling edge (high->low clock transition).
|
||||||
* - For CPHA=1, data are captured on the clock's falling edge and data are
|
* - For CPHA=1, data are captured on the clock's falling edge and data are
|
||||||
* propagated on a rising edge.
|
* propagated on a rising edge.
|
||||||
* At CPOL=1 the base value of the clock is one (inversion of CPOL=0)
|
* At CPOL=1 the base value of the clock is one (inversion of CPOL=0)
|
||||||
|
@ -118,6 +118,7 @@ struct rt_spi_device
|
||||||
struct rt_spi_bus *bus;
|
struct rt_spi_bus *bus;
|
||||||
|
|
||||||
struct rt_spi_configuration config;
|
struct rt_spi_configuration config;
|
||||||
|
void *user_data;
|
||||||
};
|
};
|
||||||
#define SPI_DEVICE(dev) ((struct rt_spi_device *)(dev))
|
#define SPI_DEVICE(dev) ((struct rt_spi_device *)(dev))
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ static rt_err_t rt_sfud_control(rt_device_t dev, int cmd, void *args) {
|
||||||
static rt_size_t rt_sfud_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) {
|
static rt_size_t rt_sfud_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) {
|
||||||
struct spi_flash_device *rtt_dev = (struct spi_flash_device *) (dev->user_data);
|
struct spi_flash_device *rtt_dev = (struct spi_flash_device *) (dev->user_data);
|
||||||
sfud_flash *sfud_dev = (sfud_flash *) (rtt_dev->user_data);
|
sfud_flash *sfud_dev = (sfud_flash *) (rtt_dev->user_data);
|
||||||
/* change the block device¡¯s logic address to physical address */
|
/* change the block device's logic address to physical address */
|
||||||
rt_off_t phy_pos = pos * rtt_dev->geometry.bytes_per_sector;
|
rt_off_t phy_pos = pos * rtt_dev->geometry.bytes_per_sector;
|
||||||
rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector;
|
rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector;
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ static rt_size_t rt_sfud_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_si
|
||||||
static rt_size_t rt_sfud_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) {
|
static rt_size_t rt_sfud_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) {
|
||||||
struct spi_flash_device *rtt_dev = (struct spi_flash_device *) (dev->user_data);
|
struct spi_flash_device *rtt_dev = (struct spi_flash_device *) (dev->user_data);
|
||||||
sfud_flash *sfud_dev = (sfud_flash *) (rtt_dev->user_data);
|
sfud_flash *sfud_dev = (sfud_flash *) (rtt_dev->user_data);
|
||||||
/* change the block device¡¯s logic address to physical address */
|
/* change the block device's logic address to physical address */
|
||||||
rt_off_t phy_pos = pos * rtt_dev->geometry.bytes_per_sector;
|
rt_off_t phy_pos = pos * rtt_dev->geometry.bytes_per_sector;
|
||||||
rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector;
|
rt_size_t phy_size = size * rtt_dev->geometry.bytes_per_sector;
|
||||||
|
|
||||||
|
@ -298,6 +298,7 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||||
sfud_dev->name = spi_flash_dev_name_bak;
|
sfud_dev->name = spi_flash_dev_name_bak;
|
||||||
/* accessed each other */
|
/* accessed each other */
|
||||||
rtt_dev->user_data = sfud_dev;
|
rtt_dev->user_data = sfud_dev;
|
||||||
|
rtt_dev->rt_spi_device->user_data = rtt_dev;
|
||||||
rtt_dev->flash_device.user_data = rtt_dev;
|
rtt_dev->flash_device.user_data = rtt_dev;
|
||||||
sfud_dev->user_data = rtt_dev;
|
sfud_dev->user_data = rtt_dev;
|
||||||
/* initialize SFUD device */
|
/* initialize SFUD device */
|
||||||
|
@ -606,6 +607,35 @@ static void sf(uint8_t argc, char **argv) {
|
||||||
}
|
}
|
||||||
MSH_CMD_EXPORT(sf, SPI Flash operate.);
|
MSH_CMD_EXPORT(sf, SPI Flash operate.);
|
||||||
|
|
||||||
|
sfud_flash_t rt_sfud_flash_find(const char *spi_dev_name)
|
||||||
|
{
|
||||||
|
rt_spi_flash_device_t rtt_dev = RT_NULL;
|
||||||
|
struct rt_spi_device *rt_spi_device = RT_NULL;
|
||||||
|
sfud_flash_t sfud_dev = RT_NULL;
|
||||||
|
|
||||||
|
rt_spi_device = (struct rt_spi_device *) rt_device_find(spi_dev_name);
|
||||||
|
if (rt_spi_device == RT_NULL || rt_spi_device->parent.type != RT_Device_Class_SPIDevice)
|
||||||
|
{
|
||||||
|
rt_kprintf("ERROR: SPI device %s not found!\n", spi_dev_name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtt_dev = (rt_spi_flash_device_t)(rt_spi_device->user_data);
|
||||||
|
if (rtt_dev && rtt_dev->user_data)
|
||||||
|
{
|
||||||
|
sfud_dev = (sfud_flash_t)(rtt_dev->user_data);
|
||||||
|
return sfud_dev;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt_kprintf("ERROR: SFUD flash device not found!\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
|
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
|
||||||
|
|
||||||
#endif /* RT_USING_SFUD */
|
#endif /* RT_USING_SFUD */
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
#include "./sfud/inc/sfud.h"
|
#include "./sfud/inc/sfud.h"
|
||||||
|
#include "spi_flash.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Probe SPI flash by SFUD(Serial Flash Universal Driver) driver library and though SPI device.
|
* Probe SPI flash by SFUD(Serial Flash Universal Driver) driver library and though SPI device.
|
||||||
|
@ -47,4 +48,13 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||||
*/
|
*/
|
||||||
rt_err_t rt_sfud_flash_delete(rt_spi_flash_device_t spi_flash_dev);
|
rt_err_t rt_sfud_flash_delete(rt_spi_flash_device_t spi_flash_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find sfud flash device
|
||||||
|
*
|
||||||
|
* @param spi_dev_name using SPI device name
|
||||||
|
*
|
||||||
|
* @return sfud flash device if success, otherwise return RT_NULL
|
||||||
|
*/
|
||||||
|
sfud_flash_t rt_sfud_flash_find(const char *spi_dev_name);
|
||||||
|
|
||||||
#endif /* _SPI_FLASH_SFUD_H_ */
|
#endif /* _SPI_FLASH_SFUD_H_ */
|
||||||
|
|
Loading…
Reference in New Issue