summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorWangHuachen <[email protected]>2020-11-08 19:30:50 +0800
committerGitHub <[email protected]>2020-11-08 19:30:50 +0800
commit9756c77f0447f9ce4f00a37600298a1f1fd90cda (patch)
tree093247a1719c087dba33783be3a4ee44c1026b2d /components/drivers
parent9545529b33cbaae137f1e389dd0e3a5233d516da (diff)
parent4b2b9a87c6f0a87b125e5c5a18bcfcf663de9fbb (diff)
Merge pull request #1 from RT-Thread/master
同步原有仓库
Diffstat (limited to 'components/drivers')
-rwxr-xr-xcomponents/drivers/Kconfig14
-rw-r--r--components/drivers/can/can.c1
-rw-r--r--components/drivers/hwtimer/hwtimer.c1
-rw-r--r--components/drivers/include/drivers/alarm.h7
-rw-r--r--components/drivers/include/drivers/dac.h42
-rw-r--r--components/drivers/include/drivers/pin.h3
-rw-r--r--components/drivers/include/drivers/rt_inputcapture.h2
-rw-r--r--components/drivers/include/drivers/spi.h26
-rw-r--r--components/drivers/include/drivers/usb_common.h16
-rw-r--r--components/drivers/include/rtdevice.h4
-rw-r--r--components/drivers/misc/SConscript3
-rw-r--r--components/drivers/misc/dac.c231
-rw-r--r--components/drivers/misc/pin.c15
-rw-r--r--components/drivers/rtc/alarm.c150
-rw-r--r--components/drivers/rtc/rtc.c4
-rw-r--r--components/drivers/sensors/sensor.c3
-rwxr-xr-xcomponents/drivers/sensors/sensor.h17
-rwxr-xr-xcomponents/drivers/sensors/sensor_cmd.c36
-rw-r--r--components/drivers/serial/serial.c15
-rw-r--r--components/drivers/spi/sfud/inc/sfud_cfg.h12
-rw-r--r--components/drivers/spi/sfud/inc/sfud_flash_def.h13
-rw-r--r--components/drivers/spi/spi_flash_sfud.c132
-rw-r--r--components/drivers/spi/spi_flash_sfud.h13
-rw-r--r--components/drivers/spi/spi_msd.c10
-rw-r--r--components/drivers/src/dataqueue.c1
-rw-r--r--components/drivers/src/pipe.c15
-rw-r--r--components/drivers/usb/usbdevice/SConscript2
-rw-r--r--components/drivers/usb/usbdevice/class/cdc_vcom.c5
-rw-r--r--components/drivers/usb/usbdevice/class/hid.c18
-rw-r--r--components/drivers/usb/usbdevice/class/mstorage.c28
-rw-r--r--components/drivers/usb/usbdevice/class/winusb.c2
-rw-r--r--components/drivers/usb/usbdevice/core/usbdevice_core.c (renamed from components/drivers/usb/usbdevice/core/core.c)0
-rw-r--r--components/drivers/usb/usbhost/SConscript2
-rw-r--r--components/drivers/usb/usbhost/class/udisk.c2
-rw-r--r--components/drivers/usb/usbhost/core/hub.c15
-rw-r--r--components/drivers/usb/usbhost/core/usbhost_core.c (renamed from components/drivers/usb/usbhost/core/core.c)8
-rw-r--r--components/drivers/watchdog/watchdog.c2
-rw-r--r--components/drivers/wlan/wlan_mgnt.c2
38 files changed, 719 insertions, 153 deletions
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index 5408761c6a..457b8751fe 100755
--- a/components/drivers/Kconfig
+++ b/components/drivers/Kconfig
@@ -95,12 +95,12 @@ if RT_USING_I2C
config RT_USING_I2C_BITOPS
bool "Use GPIO to simulate I2C"
default y
-endif
-if RT_USING_I2C_BITOPS
- config RT_I2C_BITOPS_DEBUG
- bool "Use simulate I2C debug message"
- default n
+ if RT_USING_I2C_BITOPS
+ config RT_I2C_BITOPS_DEBUG
+ bool "Use simulate I2C debug message"
+ default n
+ endif
endif
config RT_USING_PIN
@@ -111,6 +111,10 @@ config RT_USING_ADC
bool "Using ADC device drivers"
default n
+config RT_USING_DAC
+ bool "Using DAC device drivers"
+ default n
+
config RT_USING_PWM
bool "Using PWM device drivers"
default n
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index 3d60dbaa55..9f4612355b 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -422,6 +422,7 @@ static rt_err_t rt_can_close(struct rt_device *dev)
tx_fifo = (struct rt_can_tx_fifo *)can->can_tx;
RT_ASSERT(tx_fifo != RT_NULL);
+ rt_sem_detach(&(tx_fifo->sem));
rt_free(tx_fifo);
dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
can->can_tx = RT_NULL;
diff --git a/components/drivers/hwtimer/hwtimer.c b/components/drivers/hwtimer/hwtimer.c
index 83a76c7b9d..3953919fae 100644
--- a/components/drivers/hwtimer/hwtimer.c
+++ b/components/drivers/hwtimer/hwtimer.c
@@ -255,6 +255,7 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args)
*((struct rt_hwtimer_info*)args) = *timer->info;
}
+ break;
case HWTIMER_CTRL_MODE_SET:
{
rt_hwtimer_mode_t *m;
diff --git a/components/drivers/include/drivers/alarm.h b/components/drivers/include/drivers/alarm.h
index b5ebbc86d9..dd59f4c1e8 100644
--- a/components/drivers/include/drivers/alarm.h
+++ b/components/drivers/include/drivers/alarm.h
@@ -6,6 +6,8 @@
* Change Logs:
* Date Author Notes
* 2012-10-27 heyuanjie87 first version.
+ * 2013-05-17 aozima initial alarm event & mutex in system init.
+ * 2020-10-15 zhangsz add alarm flags hour minute second.
*/
#ifndef __ALARM_H__
@@ -22,6 +24,9 @@
#define RT_ALARM_WEEKLY 0x200 /* alarm weekly at Monday or Friday etc. */
#define RT_ALARM_MONTHLY 0x400 /* alarm monthly at someday */
#define RT_ALARM_YAERLY 0x800 /* alarm yearly at a certain date */
+#define RT_ALARM_HOUR 0x1000 /* alarm each hour at a certain min:second */
+#define RT_ALARM_MINUTE 0x2000 /* alarm each minute at a certain second */
+#define RT_ALARM_SECOND 0x4000 /* alarm each second */
/* alarm control cmd */
#define RT_ALARM_CTRL_MODIFY 1 /* modify alarm time or alarm flag */
@@ -67,6 +72,6 @@ void rt_alarm_update(rt_device_t dev, rt_uint32_t event);
rt_err_t rt_alarm_delete(rt_alarm_t alarm);
rt_err_t rt_alarm_start(rt_alarm_t alarm);
rt_err_t rt_alarm_stop(rt_alarm_t alarm);
-void rt_alarm_system_init(void);
+int rt_alarm_system_init(void);
#endif /* __ALARM_H__ */
diff --git a/components/drivers/include/drivers/dac.h b/components/drivers/include/drivers/dac.h
new file mode 100644
index 0000000000..b6043348dc
--- /dev/null
+++ b/components/drivers/include/drivers/dac.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-06-19 thread-liu the first version
+ */
+
+#ifndef __DAC_H__
+#define __DAC_H__
+#include <rtthread.h>
+
+struct rt_dac_device;
+struct rt_dac_ops
+{
+ rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel);
+ rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel);
+ rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value);
+};
+
+struct rt_dac_device
+{
+ struct rt_device parent;
+ const struct rt_dac_ops *ops;
+};
+typedef struct rt_dac_device *rt_dac_device_t;
+
+typedef enum
+{
+ RT_DAC_CMD_ENABLE,
+ RT_DAC_CMD_DISABLE,
+} rt_dac_cmd_t;
+
+rt_err_t rt_hw_dac_register(rt_dac_device_t dac,const char *name, const struct rt_dac_ops *ops, const void *user_data);
+
+rt_uint32_t rt_dac_write(rt_dac_device_t dev, rt_uint32_t channel, rt_uint32_t value);
+rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel);
+rt_err_t rt_dac_disable(rt_dac_device_t dev, rt_uint32_t channel);
+
+#endif /* __dac_H__ */
diff --git a/components/drivers/include/drivers/pin.h b/components/drivers/include/drivers/pin.h
index ca35407932..f5b2ded9f6 100644
--- a/components/drivers/include/drivers/pin.h
+++ b/components/drivers/include/drivers/pin.h
@@ -74,10 +74,13 @@ struct rt_pin_ops
rt_uint32_t mode, void (*hdr)(void *args), void *args);
rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_int32_t pin);
rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled);
+ rt_base_t (*pin_get)(const char *name);
};
int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data);
+/* Get pin number by name,such as PA.0,P0.12 */
+rt_base_t rt_pin_get(const char *name);
void rt_pin_mode(rt_base_t pin, rt_base_t mode);
void rt_pin_write(rt_base_t pin, rt_base_t value);
int rt_pin_read(rt_base_t pin);
diff --git a/components/drivers/include/drivers/rt_inputcapture.h b/components/drivers/include/drivers/rt_inputcapture.h
index 0cadf6444c..40cd55883d 100644
--- a/components/drivers/include/drivers/rt_inputcapture.h
+++ b/components/drivers/include/drivers/rt_inputcapture.h
@@ -48,7 +48,7 @@ struct rt_inputcapture_ops
rt_err_t (*get_pulsewidth)(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us);
};
-void rt_hw_capture_isr(struct rt_inputcapture_device *inputcapture, rt_bool_t level);
+void rt_hw_inputcapture_isr(struct rt_inputcapture_device *inputcapture, rt_bool_t level);
rt_err_t rt_device_inputcapture_register(struct rt_inputcapture_device *inputcapture,
const char *name,
diff --git a/components/drivers/include/drivers/spi.h b/components/drivers/include/drivers/spi.h
index 301726fda8..d92518cd94 100644
--- a/components/drivers/include/drivers/spi.h
+++ b/components/drivers/include/drivers/spi.h
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-11-23 Bernard Add extern "C"
+ * 2020-06-13 armink fix the 3 wires issue
*/
#ifndef __SPI_H__
@@ -18,8 +19,6 @@
extern "C"{
#endif
-#define RT_SPI_CPHA (1<<0) /* bit[0]:CPHA, clock phase */
-#define RT_SPI_CPOL (1<<1) /* bit[1]:CPOL, clock polarity */
/**
* 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)
@@ -32,26 +31,29 @@ extern "C"{
* - For CPHA=1, data are captured on clock's rising edge and data are propagated
* on a falling edge.
*/
+#define RT_SPI_CPHA (1<<0) /* bit[0]:CPHA, clock phase */
+#define RT_SPI_CPOL (1<<1) /* bit[1]:CPOL, clock polarity */
+
#define RT_SPI_LSB (0<<2) /* bit[2]: 0-LSB */
#define RT_SPI_MSB (1<<2) /* bit[2]: 1-MSB */
#define RT_SPI_MASTER (0<<3) /* SPI master device */
#define RT_SPI_SLAVE (1<<3) /* SPI slave device */
+#define RT_SPI_CS_HIGH (1<<4) /* Chipselect active high */
+#define RT_SPI_NO_CS (1<<5) /* No chipselect */
+#define RT_SPI_3WIRE (1<<6) /* SI/SO pin shared */
+#define RT_SPI_READY (1<<7) /* Slave pulls low to pause */
+
+#define RT_SPI_MODE_MASK (RT_SPI_CPHA | RT_SPI_CPOL | RT_SPI_MSB | RT_SPI_SLAVE | RT_SPI_CS_HIGH | RT_SPI_NO_CS | RT_SPI_3WIRE | RT_SPI_READY)
+
#define RT_SPI_MODE_0 (0 | 0) /* CPOL = 0, CPHA = 0 */
#define RT_SPI_MODE_1 (0 | RT_SPI_CPHA) /* CPOL = 0, CPHA = 1 */
#define RT_SPI_MODE_2 (RT_SPI_CPOL | 0) /* CPOL = 1, CPHA = 0 */
#define RT_SPI_MODE_3 (RT_SPI_CPOL | RT_SPI_CPHA) /* CPOL = 1, CPHA = 1 */
-#define RT_SPI_MODE_MASK (RT_SPI_CPHA | RT_SPI_CPOL | RT_SPI_MSB | RT_SPI_SLAVE)
-
-#define RT_SPI_BUS_MODE_SPI (1<<0)
-#define RT_SPI_BUS_MODE_QSPI (1<<1)
-
-#define RT_SPI_CS_HIGH (1<<4) /* Chipselect active high */
-#define RT_SPI_NO_CS (1<<5) /* No chipselect */
-#define RT_SPI_3WIRE (1<<6) /* SI/SO pin shared */
-#define RT_SPI_READY (1<<7) /* Slave pulls low to pause */
+#define RT_SPI_BUS_MODE_SPI (1<<0)
+#define RT_SPI_BUS_MODE_QSPI (1<<1)
/**
* SPI message structure
diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h
index c26d83391e..4d85a85e35 100644
--- a/components/drivers/include/drivers/usb_common.h
+++ b/components/drivers/include/drivers/usb_common.h
@@ -435,15 +435,15 @@ typedef struct usb_os_proerty * usb_os_proerty_t;
// 5 A big-endian 32-bit integer (REG_DWORD_BIG_ENDIAN)
// 6 A NULL-terminated Unicode string that contains a symbolic link (REG_LINK)
// 7 Multiple NULL-terminated Unicode strings (REG_MULTI_SZ)
-#define USB_OS_PROERTY_TYPE_REG_SZ 0x01UL
-#define USB_OS_PROERTY_TYPE_REG_EXPAND_SZ 0x02UL
-#define USB_OS_PROERTY_TYPE_REG_BINARY 0x03UL
-#define USB_OS_PROERTY_TYPE_REG_DWORD_LITTLE_ENDIAN 0x04UL
-#define USB_OS_PROERTY_TYPE_REG_DWORD_BIG_ENDIAN 0x05UL
-#define USB_OS_PROERTY_TYPE_REG_LINK 0x06UL
-#define USB_OS_PROERTY_TYPE_REG_MULTI_SZ 0x07UL
+#define USB_OS_PROPERTY_TYPE_REG_SZ 0x01UL
+#define USB_OS_PROPERTY_TYPE_REG_EXPAND_SZ 0x02UL
+#define USB_OS_PROPERTY_TYPE_REG_BINARY 0x03UL
+#define USB_OS_PROPERTY_TYPE_REG_DWORD_LITTLE_ENDIAN 0x04UL
+#define USB_OS_PROPERTY_TYPE_REG_DWORD_BIG_ENDIAN 0x05UL
+#define USB_OS_PROPERTY_TYPE_REG_LINK 0x06UL
+#define USB_OS_PROPERTY_TYPE_REG_MULTI_SZ 0x07UL
-#define USB_OS_PROERTY_DESC(PropertyDataType,PropertyName,PropertyData) \
+#define USB_OS_PROPERTY_DESC(PropertyDataType,PropertyName,PropertyData) \
{\
.dwSize = sizeof(struct usb_os_proerty)-sizeof(const char *)*2\
+sizeof(PropertyName)*2+sizeof(PropertyData)*2,\
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index 623c085430..f54290097c 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -103,6 +103,10 @@ extern "C" {
#include "drivers/adc.h"
#endif
+#ifdef RT_USING_DAC
+#include "drivers/dac.h"
+#endif
+
#ifdef RT_USING_PWM
#include "drivers/rt_drv_pwm.h"
#endif
diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript
index 8a9fdb5eb9..72058eeeca 100644
--- a/components/drivers/misc/SConscript
+++ b/components/drivers/misc/SConscript
@@ -11,6 +11,9 @@ if GetDepend(['RT_USING_PIN']):
if GetDepend(['RT_USING_ADC']):
src = src + ['adc.c']
+if GetDepend(['RT_USING_DAC']):
+ src = src + ['dac.c']
+
if GetDepend(['RT_USING_PWM']):
src = src + ['rt_drv_pwm.c']
diff --git a/components/drivers/misc/dac.c b/components/drivers/misc/dac.c
new file mode 100644
index 0000000000..336c78d018
--- /dev/null
+++ b/components/drivers/misc/dac.c
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-06-19 thread-liu the first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#define DBG_TAG "dac"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+static rt_size_t _dac_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ rt_err_t result = RT_EOK;
+ rt_size_t i;
+ struct rt_dac_device *dac = (struct rt_dac_device *)dev;
+ rt_uint32_t *value = (rt_uint32_t *)buffer;
+
+ for (i = 0; i < size; i += sizeof(int))
+ {
+ result = dac->ops->convert(dac, pos + i, value);
+ if (result != RT_EOK)
+ {
+ return 0;
+ }
+ value++;
+ }
+
+ return i;
+}
+
+static rt_err_t _dac_control(rt_device_t dev, int cmd, void *args)
+{
+ rt_err_t result = RT_EOK;
+ rt_dac_device_t dac = (struct rt_dac_device *)dev;
+
+ if (dac->ops->enabled == RT_NULL)
+ {
+ return -RT_ENOSYS;
+ }
+ if (cmd == RT_DAC_CMD_ENABLE)
+ {
+ result = dac->ops->enabled(dac, (rt_uint32_t)args);
+ }
+ else if (cmd == RT_DAC_CMD_DISABLE)
+ {
+ result = dac->ops->disabled(dac, (rt_uint32_t)args);
+ }
+
+ return result;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops dac_ops =
+{
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ _dac_write,
+ _dac_control,
+};
+#endif
+
+rt_err_t rt_hw_dac_register(rt_dac_device_t device, const char *name, const struct rt_dac_ops *ops, const void *user_data)
+{
+ rt_err_t result = RT_EOK;
+ RT_ASSERT(ops != RT_NULL && ops->convert != RT_NULL);
+
+ device->parent.type = RT_Device_Class_Miscellaneous;
+ device->parent.rx_indicate = RT_NULL;
+ device->parent.tx_complete = RT_NULL;
+
+#ifdef RT_USING_DEVICE_OPS
+ device->parent.ops = &dac_ops;
+#else
+ device->parent.init = RT_NULL;
+ device->parent.open = RT_NULL;
+ device->parent.close = RT_NULL;
+ device->parent.read = RT_NULL;
+ device->parent.write = _dac_write;
+ device->parent.control = _dac_control;
+#endif
+ device->ops = ops;
+ device->parent.user_data = (void *)user_data;
+
+ result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR);
+
+ return result;
+}
+
+rt_uint32_t rt_dac_write(rt_dac_device_t dev, rt_uint32_t channel, rt_uint32_t value)
+{
+ RT_ASSERT(dev);
+
+ dev->ops->convert(dev, channel, &value);
+
+ return RT_EOK;
+}
+
+rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel)
+{
+ rt_err_t result = RT_EOK;
+
+ RT_ASSERT(dev);
+ if (dev->ops->enabled != RT_NULL)
+ {
+ result = dev->ops->enabled(dev, channel);
+ }
+ else
+ {
+ result = -RT_ENOSYS;
+ }
+
+ return result;
+}
+
+rt_err_t rt_dac_disabled(rt_dac_device_t dev, rt_uint32_t channel)
+{
+ rt_err_t result = RT_EOK;
+
+ RT_ASSERT(dev);
+ if (dev->ops->disabled != RT_NULL)
+ {
+ result = dev->ops->disabled(dev, channel);
+ }
+ else
+ {
+ result = -RT_ENOSYS;
+ }
+
+ return result;
+}
+
+#ifdef FINSH_USING_MSH
+
+static int dac(int argc, char **argv)
+{
+ int result = RT_EOK;
+ static rt_dac_device_t dac_device = RT_NULL;
+ char *result_str;
+
+ if (argc > 1)
+ {
+ if (!strcmp(argv[1], "probe"))
+ {
+ if (argc == 3)
+ {
+ dac_device = (rt_dac_device_t)rt_device_find(argv[2]);
+ result_str = (dac_device == RT_NULL) ? "failure" : "success";
+ rt_kprintf("probe %s %s \n", argv[2], result_str);
+ }
+ else
+ {
+ rt_kprintf("dac probe <dac_name> - probe dac by name\n");
+ }
+ }
+ else
+ {
+ if (dac_device == RT_NULL)
+ {
+ rt_kprintf("Please using 'dac probe <dac_name>' first\n");
+ return -RT_ERROR;
+ }
+ if (!strcmp(argv[1], "enable"))
+ {
+ if (argc == 3)
+ {
+ result = rt_dac_enable(dac_device, atoi(argv[2]));
+ result_str = (result == RT_EOK) ? "success" : "failure";
+ rt_kprintf("%s channel %d enables %s \n", dac_device->parent.parent.name, atoi(argv[2]), result_str);
+ }
+ else
+ {
+ rt_kprintf("dac enable <channel> - enable dac channel\n");
+ }
+ }
+ else if (!strcmp(argv[1], "write"))
+ {
+ if (argc == 4)
+ {
+ rt_dac_write(dac_device, atoi(argv[2]), atoi(argv[3]));
+ rt_kprintf("%s channel %d write value is %d \n", dac_device->parent.parent.name, atoi(argv[2]), atoi(argv[3]));
+ }
+ else
+ {
+ rt_kprintf("dac write <channel> <value> - write dac value on the channel\n");
+ }
+ }
+ else if (!strcmp(argv[1], "disable"))
+ {
+ if (argc == 3)
+ {
+ result = rt_dac_disabled(dac_device, atoi(argv[2]));
+ result_str = (result == RT_EOK) ? "success" : "failure";
+ rt_kprintf("%s channel %d disable %s \n", dac_device->parent.parent.name, atoi(argv[2]), result_str);
+ }
+ else
+ {
+ rt_kprintf("dac disable <channel> - disable dac channel\n");
+ }
+ }
+ else
+ {
+ rt_kprintf("Unknown command. Please enter 'dac' for help\n");
+ }
+ }
+ }
+ else
+ {
+ rt_kprintf("Usage: \n");
+ rt_kprintf("dac probe <dac_name> - probe dac by name\n");
+ rt_kprintf("dac write <channel> <value> - write dac value on the channel\n");
+ rt_kprintf("dac disable <channel> - disable dac channel\n");
+ rt_kprintf("dac enable <channel> - enable dac channel\n");
+ result = -RT_ERROR;
+ }
+ return RT_EOK;
+}
+MSH_CMD_EXPORT(dac, dac function);
+
+#endif /* FINSH_USING_MSH */
diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c
index aca58ee21b..2750f5105a 100644
--- a/components/drivers/misc/pin.c
+++ b/components/drivers/misc/pin.c
@@ -151,3 +151,18 @@ int rt_pin_read(rt_base_t pin)
return _hw_pin.ops->pin_read(&_hw_pin.parent, pin);
}
FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_read, pinRead, read status from hardware pin);
+
+rt_base_t rt_pin_get(const char *name)
+{
+ RT_ASSERT(_hw_pin.ops != RT_NULL);
+ RT_ASSERT(name[0] == 'P');
+
+ if(_hw_pin.ops->pin_get == RT_NULL)
+ {
+ return -RT_ENOSYS;
+ }
+
+ return _hw_pin.ops->pin_get(name);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_get, pinGet, get pin number from hardware pin);
+
diff --git a/components/drivers/rtc/alarm.c b/components/drivers/rtc/alarm.c
index c497ebf727..71b6e7236a 100644
--- a/components/drivers/rtc/alarm.c
+++ b/components/drivers/rtc/alarm.c
@@ -7,6 +7,7 @@
* Date Author Notes
* 2012-10-27 heyuanjie87 first version.
* 2013-05-17 aozima initial alarm event & mutex in system init.
+ * 2020-10-15 zhangsz add alarm flags hour minute second.
*/
#include <rtthread.h>
@@ -97,6 +98,61 @@ static void alarm_wakeup(struct rt_alarm *alarm, struct tm *now)
}
}
break;
+ case RT_ALARM_SECOND:
+ {
+ alarm->wktime.tm_hour = now->tm_hour;
+ alarm->wktime.tm_min = now->tm_min;
+ alarm->wktime.tm_sec = alarm->wktime.tm_sec + 1;
+ if (alarm->wktime.tm_sec > 59)
+ {
+ alarm->wktime.tm_sec = 0;
+ alarm->wktime.tm_min = alarm->wktime.tm_min + 1;
+ if (alarm->wktime.tm_min > 59)
+ {
+ alarm->wktime.tm_min = 0;
+ alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ }
+ }
+ wakeup = RT_TRUE;
+ }
+ break;
+ case RT_ALARM_MINUTE:
+ {
+ alarm->wktime.tm_hour = now->tm_hour;
+ if (alarm->wktime.tm_sec == now->tm_sec)
+ {
+ alarm->wktime.tm_min = alarm->wktime.tm_min + 1;
+ if (alarm->wktime.tm_min > 59)
+ {
+ alarm->wktime.tm_min = 0;
+ alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ }
+ wakeup = RT_TRUE;
+ }
+ }
+ break;
+ case RT_ALARM_HOUR:
+ {
+ if ((alarm->wktime.tm_min == now->tm_min) &&
+ (alarm->wktime.tm_sec == now->tm_sec))
+ {
+ alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ wakeup = RT_TRUE;
+ }
+ }
+ break;
case RT_ALARM_DAILY:
{
if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm))
@@ -177,7 +233,7 @@ static void alarm_update(rt_uint32_t event)
/* calculate seconds from 00:00:00 */
sec_alarm = alarm_mkdaysec(&alarm->wktime);
- if ((alarm->flag & RT_ALARM_STATE_START) && (alarm != _container.current))
+ if (alarm->flag & RT_ALARM_STATE_START)
{
sec_tmp = sec_alarm - sec_now;
if (sec_tmp > 0)
@@ -212,6 +268,11 @@ static void alarm_update(rt_uint32_t event)
if (alarm_set(alm_prev) == RT_EOK)
_container.current = alm_prev;
}
+ else
+ {
+ if (_container.current != RT_NULL)
+ alarm_set(_container.current);
+ }
}
rt_mutex_release(&_container.mutex);
}
@@ -279,6 +340,51 @@ static rt_err_t alarm_setup(rt_alarm_t alarm, struct tm *wktime)
switch (alarm->flag & 0xFF00)
{
+ case RT_ALARM_SECOND:
+ {
+ alarm->wktime.tm_hour = now.tm_hour;
+ alarm->wktime.tm_min = now.tm_min;
+ alarm->wktime.tm_sec = now.tm_sec + 1;
+ if (alarm->wktime.tm_sec > 59)
+ {
+ alarm->wktime.tm_sec = 0;
+ alarm->wktime.tm_min = alarm->wktime.tm_min + 1;
+ if (alarm->wktime.tm_min > 59)
+ {
+ alarm->wktime.tm_min = 0;
+ alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ }
+ }
+ }
+ break;
+ case RT_ALARM_MINUTE:
+ {
+ alarm->wktime.tm_hour = now.tm_hour;
+ alarm->wktime.tm_min = now.tm_min + 1;
+ if (alarm->wktime.tm_min > 59)
+ {
+ alarm->wktime.tm_min = 0;
+ alarm->wktime.tm_hour = alarm->wktime.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ }
+ }
+ break;
+ case RT_ALARM_HOUR:
+ {
+ alarm->wktime.tm_hour = now.tm_hour + 1;
+ if (alarm->wktime.tm_hour > 23)
+ {
+ alarm->wktime.tm_hour = 0;
+ }
+ }
+ break;
case RT_ALARM_DAILY:
{
/* do nothing but needed */
@@ -426,17 +532,17 @@ rt_err_t rt_alarm_start(rt_alarm_t alarm)
if (alarm == RT_NULL)
return (ret);
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
- if (!(alarm->flag & RT_ALARM_STATE_INITED))
+
+ if (!(alarm->flag & RT_ALARM_STATE_START))
{
if (alarm_setup(alarm, &alarm->wktime) != RT_EOK)
goto _exit;
- }
- if ((alarm->flag & 0x01) == RT_ALARM_STATE_STOP)
- {
+
timestamp = time(RT_NULL);
localtime_r(&timestamp, &now);
alarm->flag |= RT_ALARM_STATE_START;
+
/* set alarm */
if (_container.current == RT_NULL)
{
@@ -518,10 +624,10 @@ _exit:
*/
rt_err_t rt_alarm_delete(rt_alarm_t alarm)
{
- rt_err_t ret = RT_ERROR;
+ rt_err_t ret = RT_EOK;
if (alarm == RT_NULL)
- return (ret);
+ return RT_ERROR;
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
/* stop the alarm */
alarm->flag &= ~RT_ALARM_STATE_START;
@@ -551,9 +657,11 @@ rt_alarm_t rt_alarm_create(rt_alarm_callback_t callback, struct rt_alarm_setup *
if (setup == RT_NULL)
return (RT_NULL);
+
alarm = rt_malloc(sizeof(struct rt_alarm));
if (alarm == RT_NULL)
return (RT_NULL);
+
rt_list_init(&alarm->list);
alarm->wktime = setup->wktime;
@@ -586,13 +694,33 @@ static void rt_alarmsvc_thread_init(void *param)
}
}
+void rt_alarm_dump(void)
+{
+ rt_list_t *next;
+ rt_alarm_t alarm;
+ rt_uint8_t index = 0;
+
+ rt_kprintf("| alarm_id | YYYY-MM-DD hh:mm:ss | weekday | flags |\n");
+ rt_kprintf("+----------+---------------------+---------+---------+\n");
+ for (next = _container.head.next; next != &_container.head; next = next->next)
+ {
+ alarm = rt_list_entry(next, struct rt_alarm, list);
+ rt_kprintf("| No %5d | %04d-%02d-%02d %02d:%02d:%02d | %7d | 0x%04x |\n",
+ index++, alarm->wktime.tm_year + 1900, alarm->wktime.tm_mon + 1, alarm->wktime.tm_mday,
+ alarm->wktime.tm_hour, alarm->wktime.tm_min, alarm->wktime.tm_sec,
+ alarm->wktime.tm_wday, alarm->flag);
+ }
+ rt_kprintf("+----------+---------------------+---------+---------+\n");
+}
+
+FINSH_FUNCTION_EXPORT_ALIAS(rt_alarm_dump, __cmd_alarm_dump, dump alarm info);
/** \brief initialize alarm service system
*
* \param none
* \return none
*/
-void rt_alarm_system_init(void)
+int rt_alarm_system_init(void)
{
rt_thread_t tid;
@@ -602,8 +730,12 @@ void rt_alarm_system_init(void)
tid = rt_thread_create("alarmsvc",
rt_alarmsvc_thread_init, RT_NULL,
- 512, 8, 1);
+ 2048, 10, 5);
if (tid != RT_NULL)
rt_thread_startup(tid);
+
+ return 0;
}
+
+INIT_PREV_EXPORT(rt_alarm_system_init);
#endif
diff --git a/components/drivers/rtc/rtc.c b/components/drivers/rtc/rtc.c
index e17c0fe7dd..682515ce98 100644
--- a/components/drivers/rtc/rtc.c
+++ b/components/drivers/rtc/rtc.c
@@ -179,7 +179,7 @@ void list_date(void)
time_t now;
now = time(RT_NULL);
- rt_kprintf("%s\n", ctime(&now));
+ rt_kprintf("%.*s\n", 25, ctime(&now));
}
FINSH_FUNCTION_EXPORT(list_date, show date and time.)
@@ -194,7 +194,7 @@ static void date(uint8_t argc, char **argv)
time_t now;
/* output current time */
now = time(RT_NULL);
- rt_kprintf("%s", ctime(&now));
+ rt_kprintf("%.*s", 25, ctime(&now));
}
else if (argc >= 7)
{
diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c
index 08127bc292..eb5c97a574 100644
--- a/components/drivers/sensors/sensor.c
+++ b/components/drivers/sensors/sensor.c
@@ -34,7 +34,8 @@ static char *const sensor_name_str[] =
"step_", /* Step sensor */
"forc_", /* Force sensor */
"dust_", /* Dust sensor */
- "eco2_" /* eCO2 sensor */
+ "eco2_", /* eCO2 sensor */
+ "gnss_" /* GPS/GNSS sensor */
};
/* Sensor interrupt correlation function */
diff --git a/components/drivers/sensors/sensor.h b/components/drivers/sensors/sensor.h
index a0eaaae9ea..5a069edc25 100755
--- a/components/drivers/sensors/sensor.h
+++ b/components/drivers/sensors/sensor.h
@@ -47,6 +47,7 @@ extern "C" {
#define RT_SENSOR_CLASS_FORCE (13) /* Force sensor */
#define RT_SENSOR_CLASS_DUST (14) /* Dust sensor */
#define RT_SENSOR_CLASS_ECO2 (15) /* eCO2 sensor */
+#define RT_SENSOR_CLASS_GNSS (16) /* GPS/GNSS sensor */
/* Sensor vendor types */
@@ -61,6 +62,11 @@ extern "C" {
#define RT_SENSOR_VENDOR_ASAIR (8) /* Aosong */
#define RT_SENSOR_VENDOR_SHARP (9) /* Sharp */
#define RT_SENSOR_VENDOR_SENSIRION (10) /* Sensirion */
+#define RT_SENSOR_VENDOR_TI (11) /* Texas Instruments */
+#define RT_SENSOR_VENDOR_PLANTOWER (12) /* Plantower */
+#define RT_SENSOR_VENDOR_AMS (13) /* ams AG */
+#define RT_SENSOR_VENDOR_MAXIM (14) /* Maxim Integrated */
+
/* Sensor unit types */
@@ -78,6 +84,10 @@ extern "C" {
#define RT_SENSOR_UNIT_BPM (11) /* Heart rate unit: bpm */
#define RT_SENSOR_UNIT_MM (12) /* Distance unit: mm */
#define RT_SENSOR_UNIT_MN (13) /* Force unit: mN */
+#define RT_SENSOR_UNIT_PPM (14) /* Concentration unit: ppm */
+#define RT_SENSOR_UNIT_PPB (15) /* Concentration unit: ppb */
+#define RT_SENSOR_UNIT_DMS (16) /* Coordinates unit: DMS */
+#define RT_SENSOR_UNIT_DD (17) /* Coordinates unit: DD */
/* Sensor communication interface types */
@@ -178,6 +188,12 @@ struct sensor_3_axis
rt_int32_t z;
};
+struct coordinates
+{
+ double longitude;
+ double latitude;
+};
+
struct rt_sensor_data
{
rt_uint32_t timestamp; /* The timestamp when the data was received */
@@ -187,6 +203,7 @@ struct rt_sensor_data
struct sensor_3_axis acce; /* Accelerometer. unit: mG */
struct sensor_3_axis gyro; /* Gyroscope. unit: mdps */
struct sensor_3_axis mag; /* Magnetometer. unit: mGauss */
+ struct coordinates coord; /* Coordinates unit: degrees */
rt_int32_t temp; /* Temperature. unit: dCelsius */
rt_int32_t humi; /* Relative humidity. unit: permillage */
rt_int32_t baro; /* Pressure. unit: pascal (Pa) */
diff --git a/components/drivers/sensors/sensor_cmd.c b/components/drivers/sensors/sensor_cmd.c
index 27359ad54f..284db75cf6 100755
--- a/components/drivers/sensors/sensor_cmd.c
+++ b/components/drivers/sensors/sensor_cmd.c
@@ -34,8 +34,11 @@ static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor
case RT_SENSOR_CLASS_MAG:
LOG_I("num:%3d, x:%5d, y:%5d, z:%5d mGauss, timestamp:%5d", num, sensor_data->data.mag.x, sensor_data->data.mag.y, sensor_data->data.mag.z, sensor_data->timestamp);
break;
+ case RT_SENSOR_CLASS_GNSS:
+ LOG_I("num:%3d, lon:%5d, lat:%5d, timestamp:%5d", num, sensor_data->data.coord.longitude, sensor_data->data.coord.latitude, sensor_data->timestamp);
+ break;
case RT_SENSOR_CLASS_TEMP:
- LOG_I("num:%3d, temp:%3d.%d C, timestamp:%5d", num, sensor_data->data.temp / 10, sensor_data->data.temp % 10, sensor_data->timestamp);
+ LOG_I("num:%3d, temp:%3d.%d C, timestamp:%5d", num, sensor_data->data.temp / 10, (rt_uint32_t)sensor_data->data.temp % 10, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_HUMI:
LOG_I("num:%3d, humi:%3d.%d%%, timestamp:%5d", num, sensor_data->data.humi / 10, sensor_data->data.humi % 10, sensor_data->timestamp);
@@ -226,6 +229,7 @@ static void sensor_polling(int argc, char **argv)
rt_sensor_t sensor;
struct rt_sensor_data data;
rt_size_t res, i;
+ rt_int32_t delay;
dev = rt_device_find(argv[1]);
if (dev == RT_NULL)
@@ -237,6 +241,7 @@ static void sensor_polling(int argc, char **argv)
num = atoi(argv[2]);
sensor = (rt_sensor_t)dev;
+ delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
{
@@ -256,7 +261,7 @@ static void sensor_polling(int argc, char **argv)
{
sensor_show_data(i, sensor, &data);
}
- rt_thread_mdelay(100);
+ rt_thread_mdelay(delay);
}
rt_device_close(dev);
}
@@ -268,7 +273,9 @@ static void sensor(int argc, char **argv)
{
static rt_device_t dev = RT_NULL;
struct rt_sensor_data data;
+ rt_sensor_t sensor;
rt_size_t res, i;
+ rt_int32_t delay;
/* If the number of arguments less than 2 */
if (argc < 2)
@@ -329,6 +336,18 @@ static void sensor(int argc, char **argv)
case RT_SENSOR_VENDOR_SENSIRION:
rt_kprintf("vendor :Sensirion\n");
break;
+ case RT_SENSOR_VENDOR_TI:
+ rt_kprintf("vendor :Texas Instruments\n");
+ break;
+ case RT_SENSOR_VENDOR_PLANTOWER:
+ rt_kprintf("vendor :Plantower\n");
+ break;
+ case RT_SENSOR_VENDOR_AMS:
+ rt_kprintf("vendor :AMS\n");
+ break;
+ case RT_SENSOR_VENDOR_MAXIM:
+ rt_kprintf("vendor :Maxim Integrated\n");
+ break;
}
rt_kprintf("model :%s\n", info.model);
switch (info.unit)
@@ -375,6 +394,12 @@ static void sensor(int argc, char **argv)
case RT_SENSOR_UNIT_MN:
rt_kprintf("unit :mN\n");
break;
+ case RT_SENSOR_UNIT_PPM:
+ rt_kprintf("unit :ppm\n");
+ break;
+ case RT_SENSOR_UNIT_PPB:
+ rt_kprintf("unit :ppb\n");
+ break;
}
rt_kprintf("range_max :%d\n", info.range_max);
rt_kprintf("range_min :%d\n", info.range_min);
@@ -395,6 +420,9 @@ static void sensor(int argc, char **argv)
num = atoi(argv[2]);
}
+ sensor = (rt_sensor_t)dev;
+ delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
+
for (i = 0; i < num; i++)
{
res = rt_device_read(dev, 0, &data, 1);
@@ -404,9 +432,9 @@ static void sensor(int argc, char **argv)
}
else
{
- sensor_show_data(i, (rt_sensor_t)dev, &data);
+ sensor_show_data(i, sensor, &data);
}
- rt_thread_mdelay(100);
+ rt_thread_mdelay(delay);
}
}
else if (argc == 3)
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c
index c442b052b1..2511f18102 100644
--- a/components/drivers/serial/serial.c
+++ b/components/drivers/serial/serial.c
@@ -22,6 +22,8 @@
* 2017-11-15 JasonJia fix poll rx issue when data is full.
* add TCFLSH and FIONREAD support.
* 2018-12-08 Ernest Chen add DMA choice
+ * 2020-09-14 WillianChan add a line feed to the carriage return character
+ * when using interrupt tx
*/
#include <rthw.h>
@@ -315,6 +317,19 @@ rt_inline int _serial_int_tx(struct rt_serial_device *serial, const rt_uint8_t *
while (length)
{
+ /*
+ * to be polite with serial console add a line feed
+ * to the carriage return character
+ */
+ if (*data == '\n' && (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM))
+ {
+ if (serial->ops->putc(serial, '\r') == -1)
+ {
+ rt_completion_wait(&(tx->completion), RT_WAITING_FOREVER);
+ continue;
+ }
+ }
+
if (serial->ops->putc(serial, *(char*)data) == -1)
{
rt_completion_wait(&(tx->completion), RT_WAITING_FOREVER);
diff --git a/components/drivers/spi/sfud/inc/sfud_cfg.h b/components/drivers/spi/sfud/inc/sfud_cfg.h
index 3b7860062d..01255775c8 100644
--- a/components/drivers/spi/sfud/inc/sfud_cfg.h
+++ b/components/drivers/spi/sfud/inc/sfud_cfg.h
@@ -38,6 +38,18 @@
#define SFUD_DEBUG_MODE
#endif
+#ifdef RT_DEBUG_SFUD
+#define DBG_LVL DBG_LOG
+#define SFUD_DEBUG(fmt, ...) LOG_D("(%s:%ld) "fmt"", __FILE__, __LINE__, ##__VA_ARGS__)
+#else
+#define DBG_LVL DBG_INFO
+#endif /* RT_DEBUG_SFUD */
+
+#define DBG_TAG "SFUD"
+#include <rtdbg.h>
+extern void rt_kprintf(const char *fmt, ...);
+#define SFUD_INFO(...) LOG_I(__VA_ARGS__)
+
/**
* Using probe flash JEDEC SFDP parameter.
*/
diff --git a/components/drivers/spi/sfud/inc/sfud_flash_def.h b/components/drivers/spi/sfud/inc/sfud_flash_def.h
index 13a0e702a8..03b95cd008 100644
--- a/components/drivers/spi/sfud/inc/sfud_flash_def.h
+++ b/components/drivers/spi/sfud/inc/sfud_flash_def.h
@@ -87,7 +87,7 @@ typedef struct {
#define SFUD_MF_ID_FUDAN 0xA1
#define SFUD_MF_ID_HYUNDAI 0xAD
#define SFUD_MF_ID_SST 0xBF
-#define SFUD_MF_ID_MICRONIX 0xC2
+#define SFUD_MF_ID_MACRONIX 0xC2
#define SFUD_MF_ID_GIGADEVICE 0xC8
#define SFUD_MF_ID_ISSI 0xD5
#define SFUD_MF_ID_WINBOND 0xEF
@@ -110,7 +110,7 @@ typedef struct {
{"GigaDevice", SFUD_MF_ID_GIGADEVICE}, \
{"ISSI", SFUD_MF_ID_ISSI}, \
{"Winbond", SFUD_MF_ID_WINBOND}, \
- {"Micronix", SFUD_MF_ID_MICRONIX}, \
+ {"Macronix", SFUD_MF_ID_MACRONIX}, \
}
#ifdef SFUD_USING_FLASH_INFO_TABLE
@@ -124,6 +124,7 @@ typedef struct {
{"AT45DB161E", SFUD_MF_ID_ATMEL, 0x26, 0x00, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_DUAL_BUFFER, 512, 0x81}, \
{"W25Q40BV", SFUD_MF_ID_WINBOND, 0x40, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
{"W25Q16BV", SFUD_MF_ID_WINBOND, 0x40, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
+ {"W25Q64CV", SFUD_MF_ID_WINBOND, 0x40, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
{"W25Q64DW", SFUD_MF_ID_WINBOND, 0x60, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
{"W25Q128BV", SFUD_MF_ID_WINBOND, 0x40, 0x18, 16L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
{"W25Q256FV", SFUD_MF_ID_WINBOND, 0x40, 0x19, 32L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
@@ -143,7 +144,7 @@ typedef struct {
#endif /* SFUD_USING_FLASH_INFO_TABLE */
#ifdef SFUD_USING_QSPI
-/* This table saves flash read-fast instructions in QSPI mode,
+/* This table saves flash read-fast instructions in QSPI mode,
* SFUD can use this table to select the most appropriate read instruction for flash.
* | mf_id | type_id | capacity_id | qspi_read_mode |
*/
@@ -156,7 +157,7 @@ typedef struct {
/* W25Q16BV */ \
{SFUD_MF_ID_WINBOND, 0x40, 0x15, NORMAL_SPI_READ|DUAL_OUTPUT}, \
/* W25Q32BV */ \
- {SFUD_MF_ID_WINBOND, 0x40, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT}, \
+ {SFUD_MF_ID_WINBOND, 0x40, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT|QUAD_OUTPUT|QUAD_IO}, \
/* W25Q64JV */ \
{SFUD_MF_ID_WINBOND, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \
/* W25Q128JV */ \
@@ -172,7 +173,9 @@ typedef struct {
/* A25LQ64 */ \
{SFUD_MF_ID_AMIC, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_IO}, \
/* MX25L3206E and KH25L3206E */ \
- {SFUD_MF_ID_MICRONIX, 0x20, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT}, \
+ {SFUD_MF_ID_MACRONIX, 0x20, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT}, \
+ /* MX25L51245G */ \
+ {SFUD_MF_ID_MACRONIX, 0x20, 0x1A, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \
/* GD25Q64B */ \
{SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT}, \
}
diff --git a/components/drivers/spi/spi_flash_sfud.c b/components/drivers/spi/spi_flash_sfud.c
index eff604fe02..2333c9ccb3 100644
--- a/components/drivers/spi/spi_flash_sfud.c
+++ b/components/drivers/spi/spi_flash_sfud.c
@@ -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_ex(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;
}
@@ -464,6 +416,26 @@ error:
}
/**
+ * 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_ex(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_ex(spi_flash_dev_name, spi_dev_name, &cfg, &qspi_cfg);
+#endif
+}
+
+/**
* Delete SPI flash device
*
* @param spi_flash_dev 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;
}
@@ -712,11 +684,13 @@ static void sf(uint8_t argc, char **argv) {
addr = 0;
size = sfud_dev->chip.capacity;
uint32_t start_time, time_cast;
- size_t write_size = SFUD_WRITE_MAX_PAGE_SIZE, read_size = SFUD_WRITE_MAX_PAGE_SIZE;
+ size_t write_size = SFUD_WRITE_MAX_PAGE_SIZE, read_size = SFUD_WRITE_MAX_PAGE_SIZE, cur_op_size;
uint8_t *write_data = rt_malloc(write_size), *read_data = rt_malloc(read_size);
if (write_data && read_data) {
- rt_memset(write_data, 0x55, write_size);
+ for (i = 0; i < write_size; i ++) {
+ write_data[i] = i & 0xFF;
+ }
/* benchmark testing */
rt_kprintf("Erasing the %s %ld bytes data, waiting...\n", sfud_dev->name, size);
start_time = rt_tick_get();
@@ -732,7 +706,12 @@ static void sf(uint8_t argc, char **argv) {
rt_kprintf("Writing the %s %ld bytes data, waiting...\n", sfud_dev->name, size);
start_time = rt_tick_get();
for (i = 0; i < size; i += write_size) {
- result = sfud_write(sfud_dev, addr + i, write_size, write_data);
+ if (i + write_size <= size) {
+ cur_op_size = write_size;
+ } else {
+ cur_op_size = size - i;
+ }
+ result = sfud_write(sfud_dev, addr + i, cur_op_size, write_data);
if (result != SFUD_SUCCESS) {
rt_kprintf("Writing %s failed, already wr for %lu bytes, write %d each time\n", sfud_dev->name, i, write_size);
break;
@@ -750,12 +729,13 @@ static void sf(uint8_t argc, char **argv) {
start_time = rt_tick_get();
for (i = 0; i < size; i += read_size) {
if (i + read_size <= size) {
- result = sfud_read(sfud_dev, addr + i, read_size, read_data);
+ cur_op_size = read_size;
} else {
- result = sfud_read(sfud_dev, addr + i, size - i, read_data);
+ cur_op_size = size - i;
}
+ result = sfud_read(sfud_dev, addr + i, cur_op_size, read_data);
/* data check */
- if (memcmp(write_data, read_data, read_size))
+ if (memcmp(write_data, read_data, cur_op_size))
{
rt_kprintf("Data check ERROR! Please check you flash by other command.\n");
result = SFUD_ERR_READ;
diff --git a/components/drivers/spi/spi_flash_sfud.h b/components/drivers/spi/spi_flash_sfud.h
index 490f2feadb..932b7f879c 100644
--- a/components/drivers/spi/spi_flash_sfud.h
+++ b/components/drivers/spi/spi_flash_sfud.h
@@ -27,6 +27,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_ex(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
*
* @param spi_flash_dev SPI flash device
diff --git a/components/drivers/spi/spi_msd.c b/components/drivers/spi/spi_msd.c
index a109fd9488..191933e421 100644
--- a/components/drivers/spi/spi_msd.c
+++ b/components/drivers/spi/spi_msd.c
@@ -234,24 +234,30 @@ static rt_err_t _send_cmd(
else if (type == response_r2)
{
/* initial message */
+ /* Prevent non-aligned address access, use recv_buffer to receive data */
message.send_buf = RT_NULL;
- message.recv_buf = response + 1;
+ message.recv_buf = recv_buffer;
message.length = 1;
message.cs_take = message.cs_release = 0;
/* transfer message */
device->bus->ops->xfer(device, &message);
+ response[1] = recv_buffer[0];
}
else if ((type == response_r3) || (type == response_r7))
{
/* initial message */
message.send_buf = RT_NULL;
- message.recv_buf = response + 1;
+ message.recv_buf = recv_buffer;
message.length = 4;
message.cs_take = message.cs_release = 0;
/* transfer message */
device->bus->ops->xfer(device, &message);
+ response[1] = recv_buffer[0];
+ response[2] = recv_buffer[1];
+ response[3] = recv_buffer[2];
+ response[4] = recv_buffer[3];
}
else
{
diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c
index 5a802c0711..ba4a921da0 100644
--- a/components/drivers/src/dataqueue.c
+++ b/components/drivers/src/dataqueue.c
@@ -28,6 +28,7 @@ rt_data_queue_init(struct rt_data_queue *queue,
void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event))
{
RT_ASSERT(queue != RT_NULL);
+ RT_ASSERT((0x10000 % size) == 0);
queue->evt_notify = evt_notify;
diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c
index ae87b6f5f2..2a7e143f6c 100644
--- a/components/drivers/src/pipe.c
+++ b/components/drivers/src/pipe.c
@@ -323,18 +323,29 @@ static const struct dfs_file_ops pipe_fops =
rt_err_t rt_pipe_open (rt_device_t device, rt_uint16_t oflag)
{
rt_pipe_t *pipe = (rt_pipe_t *)device;
+ rt_err_t ret = RT_EOK;
- if (device == RT_NULL) return -RT_EINVAL;
+ if (device == RT_NULL)
+ {
+ ret = -RT_EINVAL;
+ goto __exit;
+ }
+
rt_mutex_take(&(pipe->lock), RT_WAITING_FOREVER);
if (pipe->fifo == RT_NULL)
{
pipe->fifo = rt_ringbuffer_create(pipe->bufsz);
+ if (pipe->fifo == RT_NULL)
+ {
+ ret = -RT_ENOMEM;
+ }
}
rt_mutex_release(&(pipe->lock));
- return RT_EOK;
+__exit:
+ return ret;
}
rt_err_t rt_pipe_close (rt_device_t device)
diff --git a/components/drivers/usb/usbdevice/SConscript b/components/drivers/usb/usbdevice/SConscript
index 010b9837a4..b6dfa8da10 100644
--- a/components/drivers/usb/usbdevice/SConscript
+++ b/components/drivers/usb/usbdevice/SConscript
@@ -3,7 +3,7 @@ from building import *
cwd = GetCurrentDir()
src = Split("""
-core/core.c
+core/usbdevice_core.c
core/usbdevice.c
""")
diff --git a/components/drivers/usb/usbdevice/class/cdc_vcom.c b/components/drivers/usb/usbdevice/class/cdc_vcom.c
index c4fc3b0ad9..64230533ae 100644
--- a/components/drivers/usb/usbdevice/class/cdc_vcom.c
+++ b/components/drivers/usb/usbdevice/class/cdc_vcom.c
@@ -589,8 +589,9 @@ ufunction_t rt_usbd_function_cdc_create(udevice_t device)
/* create a cdc function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
- //not support HS
- //rt_usbd_device_set_qualifier(device, &dev_qualifier);
+
+ /* support HS */
+ rt_usbd_device_set_qualifier(device, &dev_qualifier);
/* allocate memory for cdc vcom data */
data = (struct vcom*)rt_malloc(sizeof(struct vcom));
diff --git a/components/drivers/usb/usbdevice/class/hid.c b/components/drivers/usb/usbdevice/class/hid.c
index 5df63daddf..a4acce75ea 100644
--- a/components/drivers/usb/usbdevice/class/hid.c
+++ b/components/drivers/usb/usbdevice/class/hid.c
@@ -29,7 +29,7 @@ struct hid_s
uep_t ep_in;
uep_t ep_out;
int status;
- rt_uint16_t protocol;
+ rt_uint8_t protocol;
rt_uint8_t report_buf[MAX_REPORT_SIZE];
struct rt_messagequeue hid_mq;
};
@@ -246,7 +246,7 @@ static struct udevice_descriptor _dev_desc =
USB_DESC_LENGTH_DEVICE, //bLength;
USB_DESC_TYPE_DEVICE, //type;
USB_BCD_VERSION, //bcdUSB;
- USB_CLASS_HID, //bDeviceClass;
+ 0x0, //bDeviceClass;
0x00, //bDeviceSubClass;
0x00, //bDeviceProtocol;
64, //bMaxPacketSize0;
@@ -266,8 +266,8 @@ static struct usb_qualifier_descriptor dev_qualifier =
sizeof(dev_qualifier), //bLength
USB_DESC_TYPE_DEVICEQUALIFIER, //bDescriptorType
0x0200, //bcdUSB
- USB_CLASS_MASS_STORAGE, //bDeviceClass
- 0x06, //bDeviceSubClass
+ 0x0, //bDeviceClass
+ 0x0, //bDeviceSubClass
0x50, //bDeviceProtocol
64, //bMaxPacketSize0
0x01, //bNumConfigurations
@@ -347,7 +347,7 @@ const static struct uhid_comm_descriptor _hid_comm_desc =
USB_DYNAMIC | USB_DIR_IN,
USB_EP_ATTR_INT,
0x40,
- 0x01,
+ 0x0A,
},
/* Endpoint Descriptor OUT */
@@ -458,6 +458,7 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
struct hid_s *data = (struct hid_s *) func->user_data;
+
switch (setup->bRequest)
{
case USB_REQ_GET_DESCRIPTOR:
@@ -486,7 +487,7 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
dcd_ep0_send_status(func->device->dcd);
break;
case USB_HID_REQ_GET_PROTOCOL:
- rt_usbd_ep0_write(func->device, &data->protocol,2);
+ rt_usbd_ep0_write(func->device, &data->protocol,1);
break;
case USB_HID_REQ_SET_REPORT:
@@ -692,8 +693,9 @@ ufunction_t rt_usbd_function_hid_create(udevice_t device)
/* create a cdc function */
func = rt_usbd_function_new(device, &_dev_desc, &ops);
- //not support hs
- //rt_usbd_device_set_qualifier(device, &_dev_qualifier);
+
+ /* For high speed mode supporting */
+ rt_usbd_device_set_qualifier(device, &dev_qualifier);
/* allocate memory for cdc vcom data */
data = (struct hid_s*)rt_malloc(sizeof(struct hid_s));
diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c
index 43fb25afe4..d0a2b7f736 100644
--- a/components/drivers/usb/usbdevice/class/mstorage.c
+++ b/components/drivers/usb/usbdevice/class/mstorage.c
@@ -426,7 +426,7 @@ static rt_size_t _read_capacity(ufunction_t func, ustorage_cbw_t cbw)
data = (struct mstorage*)func->user_data;
buf = data->ep_in->buffer;
- sector_count = data->geometry.sector_count;
+ sector_count = data->geometry.sector_count - 1; /* Last Logical Block Address */
sector_size = data->geometry.bytes_per_sector;
buf[0] = sector_count >> 24;
@@ -610,8 +610,11 @@ static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
rt_usbd_ep_set_stall(func->device, data->ep_out);
}
else
- {
- rt_usbd_ep_set_stall(func->device, data->ep_in);
+ {
+ //rt_kprintf("warning:in stall path but not stall\n");
+
+ /* FIXME: Disable the operation or the disk cannot work. */
+ //rt_usbd_ep_set_stall(func->device, data->ep_in);
}
data->csw_response.data_reside = 0;
}
@@ -719,9 +722,22 @@ static void _cb_len_calc(ufunction_t func, struct scsi_cmd* cmd,
break;
}
}
+
+ //workaround: for stability in full-speed mode
+ else if(cmd->cmd_len == 12)
+ {
+ switch(cmd->type)
+ {
+ case COUNT:
+ data->cb_data_size = cbw->cb[4];
+ break;
+ default:
+ break;
+ }
+ }
else
{
-// rt_kprintf("cmd_len error %d\n", cmd->cmd_len);
+ rt_kprintf("cmd_len error %d\n", cmd->cmd_len);
}
}
@@ -737,7 +753,7 @@ static rt_bool_t _cbw_verify(ufunction_t func, struct scsi_cmd* cmd,
data = (struct mstorage*)func->user_data;
if(cmd->cmd_len != cbw->cb_len)
{
- // rt_kprintf("cb_len error\n");
+ rt_kprintf("cb_len error\n");
cmd->cmd_len = cbw->cb_len;
}
@@ -768,7 +784,7 @@ static rt_bool_t _cbw_verify(ufunction_t func, struct scsi_cmd* cmd,
if(cbw->xfer_len < data->cb_data_size)
{
- // rt_kprintf("xfer_len < data_size\n");
+ rt_kprintf("xfer_len < data_size\n");
data->cb_data_size = cbw->xfer_len;
data->csw_response.status = 1;
}
diff --git a/components/drivers/usb/usbdevice/class/winusb.c b/components/drivers/usb/usbdevice/class/winusb.c
index bf4b353d73..729e39f663 100644
--- a/components/drivers/usb/usbdevice/class/winusb.c
+++ b/components/drivers/usb/usbdevice/class/winusb.c
@@ -121,7 +121,7 @@ const static char* _ustring[] =
ALIGN(4)
struct usb_os_proerty winusb_proerty[] =
{
- USB_OS_PROERTY_DESC(USB_OS_PROERTY_TYPE_REG_SZ,"DeviceInterfaceGUID",RT_WINUSB_GUID),
+ USB_OS_PROPERTY_DESC(USB_OS_PROPERTY_TYPE_REG_SZ,"DeviceInterfaceGUID",RT_WINUSB_GUID),
};
ALIGN(4)
diff --git a/components/drivers/usb/usbdevice/core/core.c b/components/drivers/usb/usbdevice/core/usbdevice_core.c
index ef569d7bf2..ef569d7bf2 100644
--- a/components/drivers/usb/usbdevice/core/core.c
+++ b/components/drivers/usb/usbdevice/core/usbdevice_core.c
diff --git a/components/drivers/usb/usbhost/SConscript b/components/drivers/usb/usbhost/SConscript
index b12adfc5ad..081c732819 100644
--- a/components/drivers/usb/usbhost/SConscript
+++ b/components/drivers/usb/usbhost/SConscript
@@ -3,7 +3,7 @@ from building import *
cwd = GetCurrentDir()
src = Split("""
-core/core.c
+core/usbhost_core.c
core/driver.c
core/usbhost.c
core/hub.c
diff --git a/components/drivers/usb/usbhost/class/udisk.c b/components/drivers/usb/usbhost/class/udisk.c
index 1509a26105..6c8030b29a 100644
--- a/components/drivers/usb/usbhost/class/udisk.c
+++ b/components/drivers/usb/usbhost/class/udisk.c
@@ -186,7 +186,7 @@ rt_err_t rt_udisk_run(struct uhintf* intf)
{
int i = 0;
rt_err_t ret;
- char dname[4];
+ char dname[8];
char sname[8];
rt_uint8_t max_lun, *sector, sense[18], inquiry[36];
struct dfs_partition part[MAX_PARTITION_COUNT];
diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c
index fb6cd9c406..eefa571472 100644
--- a/components/drivers/usb/usbhost/core/hub.c
+++ b/components/drivers/usb/usbhost/core/hub.c
@@ -417,8 +417,13 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
if(reconnect)
{
- if(hub->child[i] != RT_NULL && hub->child[i]->status != DEV_STATUS_IDLE)
+ if(hub->child[i] != RT_NULL && hub->child[i]->status != DEV_STATUS_IDLE)
+ {
rt_usbh_detach_instance(hub->child[i]);
+
+ /* Child device have been detach. Set hub->child[i] to NULL. */
+ hub->child[i] = RT_NULL;
+ }
ret = rt_usbh_hub_port_debounce(hub, i + 1);
if(ret != RT_EOK) continue;
@@ -532,7 +537,12 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
}
/* get hub ports number */
- hub->num_ports = hub->hub_desc.num_ports;
+ /* If hub device supported ports over USB_HUB_PORT_NUM(Ex: 8 port hub). Set hub->num_ports to USB_HUB_PORT_NUM */
+ if(hub->hub_desc.num_ports > USB_HUB_PORT_NUM)
+ hub->num_ports = USB_HUB_PORT_NUM;
+ else
+ hub->num_ports = hub->hub_desc.num_ports;
+
hub->hcd = device->hcd;
hub->self = device;
@@ -607,7 +617,6 @@ static rt_err_t rt_usbh_hub_disable(void* arg)
}
if(hub != RT_NULL) rt_free(hub);
- if(intf != RT_NULL) rt_free(intf);
return RT_EOK;
}
diff --git a/components/drivers/usb/usbhost/core/core.c b/components/drivers/usb/usbhost/core/usbhost_core.c
index 71341a33c3..d72dca82f2 100644
--- a/components/drivers/usb/usbhost/core/core.c
+++ b/components/drivers/usb/usbhost/core/usbhost_core.c
@@ -162,6 +162,10 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
/* alloc memory for configuration descriptor */
device->cfg_desc = (ucfg_desc_t)rt_malloc(cfg_desc.wTotalLength);
+ if(device->cfg_desc == RT_NULL)
+ {
+ return RT_ENOMEM;
+ }
rt_memset(device->cfg_desc, 0, cfg_desc.wTotalLength);
/* get full configuration descriptor */
@@ -219,6 +223,10 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
{
/* allocate memory for interface device */
device->intf[i] = (struct uhintf*)rt_malloc(sizeof(struct uhintf));
+ if(device->intf[i] == RT_NULL)
+ {
+ return RT_ENOMEM;
+ }
device->intf[i]->drv = drv;
device->intf[i]->device = device;
device->intf[i]->intf_desc = intf_desc;
diff --git a/components/drivers/watchdog/watchdog.c b/components/drivers/watchdog/watchdog.c
index 196f02039d..09a6bf4fad 100644
--- a/components/drivers/watchdog/watchdog.c
+++ b/components/drivers/watchdog/watchdog.c
@@ -14,7 +14,7 @@
/* RT-Thread Device Interface */
/*
- * This function initializes serial
+ * This function initializes watchdog
*/
static rt_err_t rt_watchdog_init(struct rt_device *dev)
{
diff --git a/components/drivers/wlan/wlan_mgnt.c b/components/drivers/wlan/wlan_mgnt.c
index cf2204c6b3..fefe700acc 100644
--- a/components/drivers/wlan/wlan_mgnt.c
+++ b/components/drivers/wlan/wlan_mgnt.c
@@ -713,7 +713,7 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
}
COMPLETE_UNLOCK();
#ifdef RT_WLAN_WORK_THREAD_ENABLE
- rt_wlan_send_to_thread(user_event, RT_NULL, 0);
+ rt_wlan_send_to_thread(user_event, user_buff.data, user_buff.len);
#else
{
void *user_parameter;