mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-01-18 09:53:30 +08:00
[SFUD] Add new probe API (rt_sfud_flash_probe_ext) for using user SPI configuration.
This commit is contained in:
parent
930de79000
commit
6a9e081ec5
@ -15,12 +15,6 @@
|
||||
|
||||
#ifdef RT_USING_SFUD
|
||||
|
||||
#ifdef RT_DEBUG_SFUD
|
||||
#define DEBUG_TRACE rt_kprintf("[SFUD] "); rt_kprintf
|
||||
#else
|
||||
#define DEBUG_TRACE(...)
|
||||
#endif /* RT_DEBUG_SFUD */
|
||||
|
||||
#ifndef RT_SFUD_DEFAULT_SPI_CFG
|
||||
|
||||
#ifndef RT_SFUD_SPI_MAX_HZ
|
||||
@ -34,7 +28,7 @@
|
||||
.data_width = 8, \
|
||||
.max_hz = RT_SFUD_SPI_MAX_HZ, \
|
||||
}
|
||||
#endif
|
||||
#endif /* RT_SFUD_DEFAULT_SPI_CFG */
|
||||
|
||||
#ifdef SFUD_USING_QSPI
|
||||
#define RT_SFUD_DEFAULT_QSPI_CFG \
|
||||
@ -44,11 +38,7 @@
|
||||
.ddr_mode = 0, \
|
||||
.qspi_dl_width = 4, \
|
||||
}
|
||||
#endif
|
||||
|
||||
static char log_buf[RT_CONSOLEBUF_SIZE];
|
||||
|
||||
void sfud_log_debug(const char *file, const long line, const char *format, ...);
|
||||
#endif /* SFUD_USING_QSPI */
|
||||
|
||||
static rt_err_t rt_sfud_control(rt_device_t dev, int cmd, void *args) {
|
||||
RT_ASSERT(dev);
|
||||
@ -259,44 +249,6 @@ static void retry_delay_100us(void) {
|
||||
rt_thread_delay((RT_TICK_PER_SECOND * 1 + 9999) / 10000);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is print debug info.
|
||||
*
|
||||
* @param file the file which has call this function
|
||||
* @param line the line number which has call this function
|
||||
* @param format output format
|
||||
* @param ... args
|
||||
*/
|
||||
void sfud_log_debug(const char *file, const long line, const char *format, ...) {
|
||||
va_list args;
|
||||
|
||||
/* args point to the first variable parameter */
|
||||
va_start(args, format);
|
||||
rt_kprintf("[SFUD] (%s:%ld) ", file, line);
|
||||
/* must use vprintf to print */
|
||||
rt_vsnprintf(log_buf, sizeof(log_buf), format, args);
|
||||
rt_kprintf("%s\n", log_buf);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is print routine info.
|
||||
*
|
||||
* @param format output format
|
||||
* @param ... args
|
||||
*/
|
||||
void sfud_log_info(const char *format, ...) {
|
||||
va_list args;
|
||||
|
||||
/* args point to the first variable parameter */
|
||||
va_start(args, format);
|
||||
rt_kprintf("[SFUD] ");
|
||||
/* must use vprintf to print */
|
||||
rt_vsnprintf(log_buf, sizeof(log_buf), format, args);
|
||||
rt_kprintf("%s\n", log_buf);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
sfud_err sfud_spi_port_init(sfud_flash *flash) {
|
||||
sfud_err result = SFUD_SUCCESS;
|
||||
|
||||
@ -311,7 +263,7 @@ sfud_err sfud_spi_port_init(sfud_flash *flash) {
|
||||
flash->spi.unlock = spi_unlock;
|
||||
flash->spi.user_data = flash;
|
||||
if (RT_TICK_PER_SECOND < 1000) {
|
||||
rt_kprintf("[SFUD] Warning: The OS tick(%d) is less than 1000. So the flash write will take more time.\n", RT_TICK_PER_SECOND);
|
||||
LOG_W("[SFUD] Warning: The OS tick(%d) is less than 1000. So the flash write will take more time.", RT_TICK_PER_SECOND);
|
||||
}
|
||||
/* 100 microsecond delay */
|
||||
flash->retry.delay = retry_delay_100us;
|
||||
@ -334,23 +286,23 @@ const static struct rt_device_ops flash_device_ops =
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 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 by specified configuration.
|
||||
*
|
||||
* @param spi_flash_dev_name the name which will create SPI flash device
|
||||
* @param spi_dev_name using SPI device name
|
||||
* @param spi_cfg SPI device configuration
|
||||
* @param qspi_cfg QSPI device configuration
|
||||
*
|
||||
* @return probed SPI flash device, probe failed will return RT_NULL
|
||||
*/
|
||||
rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const char *spi_dev_name) {
|
||||
rt_spi_flash_device_t rt_sfud_flash_probe_ext(const char *spi_flash_dev_name, const char *spi_dev_name,
|
||||
struct rt_spi_configuration *spi_cfg, struct rt_qspi_configuration *qspi_cfg)
|
||||
{
|
||||
rt_spi_flash_device_t rtt_dev = RT_NULL;
|
||||
sfud_flash *sfud_dev = RT_NULL;
|
||||
char *spi_flash_dev_name_bak = RT_NULL, *spi_dev_name_bak = RT_NULL;
|
||||
/* using default flash SPI configuration for initialize SPI Flash
|
||||
* @note you also can change the SPI to other configuration after initialized finish */
|
||||
struct rt_spi_configuration cfg = RT_SFUD_DEFAULT_SPI_CFG;
|
||||
extern sfud_err sfud_device_init(sfud_flash *flash);
|
||||
#ifdef SFUD_USING_QSPI
|
||||
struct rt_qspi_configuration qspi_cfg = RT_SFUD_DEFAULT_QSPI_CFG;
|
||||
struct rt_qspi_device *qspi_dev = RT_NULL;
|
||||
#endif
|
||||
|
||||
@ -380,7 +332,7 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||
/* RT-Thread SPI device initialize */
|
||||
rtt_dev->rt_spi_device = (struct rt_spi_device *) rt_device_find(spi_dev_name);
|
||||
if (rtt_dev->rt_spi_device == RT_NULL || rtt_dev->rt_spi_device->parent.type != RT_Device_Class_SPIDevice) {
|
||||
rt_kprintf("ERROR: SPI device %s not found!\n", spi_dev_name);
|
||||
LOG_E("ERROR: SPI device %s not found!", spi_dev_name);
|
||||
goto error;
|
||||
}
|
||||
sfud_dev->spi.name = spi_dev_name_bak;
|
||||
@ -389,12 +341,12 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||
/* set the qspi line number and configure the QSPI bus */
|
||||
if(rtt_dev->rt_spi_device->bus->mode &RT_SPI_BUS_MODE_QSPI) {
|
||||
qspi_dev = (struct rt_qspi_device *)rtt_dev->rt_spi_device;
|
||||
qspi_cfg.qspi_dl_width = qspi_dev->config.qspi_dl_width;
|
||||
rt_qspi_configure(qspi_dev, &qspi_cfg);
|
||||
qspi_cfg->qspi_dl_width = qspi_dev->config.qspi_dl_width;
|
||||
rt_qspi_configure(qspi_dev, qspi_cfg);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
rt_spi_configure(rtt_dev->rt_spi_device, &cfg);
|
||||
rt_spi_configure(rtt_dev->rt_spi_device, spi_cfg);
|
||||
}
|
||||
/* SFUD flash device initialize */
|
||||
{
|
||||
@ -406,7 +358,7 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||
sfud_dev->user_data = rtt_dev;
|
||||
/* initialize SFUD device */
|
||||
if (sfud_device_init(sfud_dev) != SFUD_SUCCESS) {
|
||||
rt_kprintf("ERROR: SPI flash probe failed by SPI device %s.\n", spi_dev_name);
|
||||
LOG_E("ERROR: SPI flash probe failed by SPI device %s.", spi_dev_name);
|
||||
goto error;
|
||||
}
|
||||
/* when initialize success, then copy SFUD flash device's geometry to RT-Thread SPI flash device */
|
||||
@ -416,8 +368,8 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||
#ifdef SFUD_USING_QSPI
|
||||
/* reconfigure the QSPI bus for medium size */
|
||||
if(rtt_dev->rt_spi_device->bus->mode &RT_SPI_BUS_MODE_QSPI) {
|
||||
qspi_cfg.medium_size = sfud_dev->chip.capacity;
|
||||
rt_qspi_configure(qspi_dev, &qspi_cfg);
|
||||
qspi_cfg->medium_size = sfud_dev->chip.capacity;
|
||||
rt_qspi_configure(qspi_dev, qspi_cfg);
|
||||
if(qspi_dev->enter_qspi_mode != RT_NULL)
|
||||
qspi_dev->enter_qspi_mode(qspi_dev);
|
||||
|
||||
@ -442,10 +394,10 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
|
||||
|
||||
rt_device_register(&(rtt_dev->flash_device), spi_flash_dev_name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
|
||||
|
||||
DEBUG_TRACE("Probe SPI flash %s by SPI device %s success.\n",spi_flash_dev_name, spi_dev_name);
|
||||
LOG_I("Probe SPI flash %s by SPI device %s success.",spi_flash_dev_name, spi_dev_name);
|
||||
return rtt_dev;
|
||||
} else {
|
||||
rt_kprintf("ERROR: Low memory.\n");
|
||||
LOG_E("ERROR: Low memory.");
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -463,6 +415,26 @@ error:
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Probe SPI flash by SFUD(Serial Flash Universal Driver) driver library and though SPI device.
|
||||
*
|
||||
* @param spi_flash_dev_name the name which will create SPI flash device
|
||||
* @param spi_dev_name using SPI device name
|
||||
*
|
||||
* @return probed SPI flash device, probe failed will return RT_NULL
|
||||
*/
|
||||
rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const char *spi_dev_name)
|
||||
{
|
||||
struct rt_spi_configuration cfg = RT_SFUD_DEFAULT_SPI_CFG;
|
||||
#ifndef SFUD_USING_QSPI
|
||||
return rt_sfud_flash_probe_ext(spi_flash_dev_name, spi_dev_name, &cfg, RT_NULL);
|
||||
#else
|
||||
struct rt_qspi_configuration qspi_cfg = RT_SFUD_DEFAULT_QSPI_CFG;
|
||||
|
||||
return rt_sfud_flash_probe_ext(spi_flash_dev_name, spi_dev_name, &cfg, &qspi_cfg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete SPI flash device
|
||||
*
|
||||
@ -496,7 +468,7 @@ sfud_flash_t rt_sfud_flash_find(const char *spi_dev_name)
|
||||
|
||||
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);
|
||||
LOG_E("ERROR: SPI device %s not found!", spi_dev_name);
|
||||
goto __error;
|
||||
}
|
||||
|
||||
@ -505,7 +477,7 @@ sfud_flash_t rt_sfud_flash_find(const char *spi_dev_name)
|
||||
sfud_dev = (sfud_flash_t) (rtt_dev->user_data);
|
||||
return sfud_dev;
|
||||
} else {
|
||||
rt_kprintf("ERROR: SFUD flash device not found!\n");
|
||||
LOG_E("ERROR: SFUD flash device not found!");
|
||||
goto __error;
|
||||
}
|
||||
|
||||
@ -520,7 +492,7 @@ sfud_flash_t rt_sfud_flash_find_by_dev_name(const char *flash_dev_name)
|
||||
|
||||
rtt_dev = (rt_spi_flash_device_t) rt_device_find(flash_dev_name);
|
||||
if (rtt_dev == RT_NULL || rtt_dev->flash_device.type != RT_Device_Class_Block) {
|
||||
rt_kprintf("ERROR: Flash device %s not found!\n", flash_dev_name);
|
||||
LOG_E("ERROR: Flash device %s not found!", flash_dev_name);
|
||||
goto __error;
|
||||
}
|
||||
|
||||
@ -528,7 +500,7 @@ sfud_flash_t rt_sfud_flash_find_by_dev_name(const char *flash_dev_name)
|
||||
sfud_dev = (sfud_flash_t) (rtt_dev->user_data);
|
||||
return sfud_dev;
|
||||
} else {
|
||||
rt_kprintf("ERROR: SFUD flash device not found!\n");
|
||||
LOG_E("ERROR: SFUD flash device not found!");
|
||||
goto __error;
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,19 @@
|
||||
*/
|
||||
rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const char *spi_dev_name);
|
||||
|
||||
/**
|
||||
* Probe SPI flash by SFUD (Serial Flash Universal Driver) driver library and though SPI device by specified configuration.
|
||||
*
|
||||
* @param spi_flash_dev_name the name which will create SPI flash device
|
||||
* @param spi_dev_name using SPI device name
|
||||
* @param spi_cfg SPI device configuration
|
||||
* @param qspi_cfg QSPI device configuration
|
||||
*
|
||||
* @return probed SPI flash device, probe failed will return RT_NULL
|
||||
*/
|
||||
rt_spi_flash_device_t rt_sfud_flash_probe_ext(const char *spi_flash_dev_name, const char *spi_dev_name,
|
||||
struct rt_spi_configuration *spi_cfg, struct rt_qspi_configuration *qspi_cfg);
|
||||
|
||||
/**
|
||||
* Delete SPI flash device
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user