summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorguo <[email protected]>2021-09-28 10:36:54 +0800
committerGitHub <[email protected]>2021-09-28 10:36:54 +0800
commit55a302cd092758a44b589d65470a69d9e8ae4ced (patch)
treee60fc53994c426007e9eb4877e5bd123f124ef39 /components/drivers
parent00727d6b6db92dc1cf98f028f26fd6168594b905 (diff)
parent00d42ef73cff61ecda7ff006b077a73e1a4ff669 (diff)
Merge branch 'master' into usbh_construct
Diffstat (limited to 'components/drivers')
-rwxr-xr-xcomponents/drivers/Kconfig52
-rw-r--r--components/drivers/audio/audio.c2
-rw-r--r--components/drivers/audio/audio_pipe.c2
-rw-r--r--components/drivers/audio/audio_pipe.h2
-rw-r--r--components/drivers/can/can.c5
-rw-r--r--components/drivers/cputime/cputime.c15
-rw-r--r--components/drivers/cputime/cputime_cortexm.c12
-rw-r--r--components/drivers/hwcrypto/hw_bignum.c36
-rw-r--r--components/drivers/hwcrypto/hw_bignum.h34
-rw-r--r--components/drivers/hwcrypto/hw_crc.c10
-rw-r--r--components/drivers/hwcrypto/hw_crc.h6
-rw-r--r--components/drivers/hwcrypto/hw_gcm.c2
-rw-r--r--components/drivers/hwcrypto/hw_gcm.h2
-rw-r--r--components/drivers/hwcrypto/hw_hash.c2
-rw-r--r--components/drivers/hwcrypto/hw_hash.h2
-rw-r--r--components/drivers/hwcrypto/hw_rng.c4
-rw-r--r--components/drivers/hwcrypto/hw_rng.h4
-rw-r--r--components/drivers/hwcrypto/hw_symmetric.c4
-rw-r--r--components/drivers/hwcrypto/hw_symmetric.h2
-rw-r--r--components/drivers/hwcrypto/hwcrypto.c2
-rw-r--r--components/drivers/hwcrypto/hwcrypto.h2
-rw-r--r--components/drivers/hwtimer/hwtimer.c4
-rw-r--r--components/drivers/i2c/i2c-bit-ops.c4
-rw-r--r--components/drivers/i2c/i2c_core.c23
-rw-r--r--components/drivers/i2c/i2c_dev.c16
-rw-r--r--components/drivers/include/drivers/adc.h2
-rw-r--r--components/drivers/include/drivers/alarm.h2
-rw-r--r--components/drivers/include/drivers/audio.h2
-rw-r--r--components/drivers/include/drivers/can.h2
-rw-r--r--components/drivers/include/drivers/cputime.h4
-rw-r--r--components/drivers/include/drivers/crypto.h2
-rw-r--r--components/drivers/include/drivers/dac.h2
-rw-r--r--components/drivers/include/drivers/hwtimer.h2
-rw-r--r--components/drivers/include/drivers/i2c-bit-ops.h2
-rw-r--r--components/drivers/include/drivers/i2c.h6
-rw-r--r--components/drivers/include/drivers/i2c_dev.h4
-rw-r--r--components/drivers/include/drivers/mmc.h244
-rw-r--r--components/drivers/include/drivers/mmcsd_card.h190
-rw-r--r--components/drivers/include/drivers/mmcsd_cmd.h12
-rw-r--r--components/drivers/include/drivers/mmcsd_core.h265
-rw-r--r--components/drivers/include/drivers/mmcsd_host.h148
-rw-r--r--components/drivers/include/drivers/mtd_nand.h2
-rw-r--r--components/drivers/include/drivers/mtd_nor.h44
-rw-r--r--components/drivers/include/drivers/phy.h2
-rw-r--r--components/drivers/include/drivers/phy_mdio.h2
-rw-r--r--components/drivers/include/drivers/pin.h9
-rw-r--r--components/drivers/include/drivers/pm.h3
-rw-r--r--components/drivers/include/drivers/pulse_encoder.h2
-rw-r--r--components/drivers/include/drivers/rt_drv_pwm.h2
-rw-r--r--components/drivers/include/drivers/rt_inputcapture.h2
-rw-r--r--components/drivers/include/drivers/rtc.h38
-rw-r--r--components/drivers/include/drivers/sd.h2
-rw-r--r--components/drivers/include/drivers/sdio.h14
-rw-r--r--components/drivers/include/drivers/sdio_func_ids.h4
-rw-r--r--components/drivers/include/drivers/sensor.h239
-rw-r--r--components/drivers/include/drivers/serial.h13
-rw-r--r--components/drivers/include/drivers/serial_v2.h185
-rw-r--r--components/drivers/include/drivers/spi.h4
-rw-r--r--components/drivers/include/drivers/usb_common.h22
-rw-r--r--components/drivers/include/drivers/usb_device.h23
-rw-r--r--components/drivers/include/drivers/usb_host.h36
-rw-r--r--components/drivers/include/drivers/watchdog.h4
-rw-r--r--components/drivers/include/drivers/wlan.h2
-rw-r--r--components/drivers/include/ipc/completion.h2
-rw-r--r--components/drivers/include/ipc/dataqueue.h2
-rw-r--r--components/drivers/include/ipc/pipe.h2
-rw-r--r--components/drivers/include/ipc/poll.h2
-rw-r--r--components/drivers/include/ipc/ringblk_buf.h7
-rw-r--r--components/drivers/include/ipc/ringbuffer.h10
-rw-r--r--components/drivers/include/ipc/waitqueue.h4
-rw-r--r--components/drivers/include/ipc/workqueue.h27
-rw-r--r--components/drivers/include/rtdevice.h46
-rw-r--r--components/drivers/misc/adc.c6
-rw-r--r--components/drivers/misc/dac.c8
-rw-r--r--components/drivers/misc/pin.c10
-rw-r--r--components/drivers/misc/pulse_encoder.c2
-rw-r--r--components/drivers/misc/rt_drv_pwm.c6
-rw-r--r--components/drivers/misc/rt_inputcapture.c2
-rw-r--r--components/drivers/mtd/mtd_nand.c10
-rw-r--r--components/drivers/mtd/mtd_nor.c6
-rw-r--r--components/drivers/phy/phy.c8
-rw-r--r--components/drivers/pm/pm.c8
-rw-r--r--components/drivers/rtc/README.md19
-rw-r--r--components/drivers/rtc/SConscript12
-rw-r--r--components/drivers/rtc/alarm.c4
-rw-r--r--components/drivers/rtc/rtc.c221
-rw-r--r--components/drivers/rtc/soft_rtc.c6
-rw-r--r--components/drivers/sdio/block_dev.c84
-rw-r--r--components/drivers/sdio/mmc.c151
-rw-r--r--components/drivers/sdio/mmcsd_core.c90
-rw-r--r--components/drivers/sdio/sd.c60
-rw-r--r--components/drivers/sdio/sdio.c124
-rw-r--r--components/drivers/sensors/sensor.c114
-rwxr-xr-xcomponents/drivers/sensors/sensor.h226
-rwxr-xr-xcomponents/drivers/sensors/sensor_cmd.c22
-rw-r--r--components/drivers/serial/SConscript12
-rw-r--r--components/drivers/serial/serial.c144
-rw-r--r--components/drivers/serial/serial_v2.c1268
-rw-r--r--components/drivers/spi/SConscript5
-rw-r--r--components/drivers/spi/enc28j60.c4
-rw-r--r--components/drivers/spi/enc28j60.h2
-rw-r--r--components/drivers/spi/qspi_core.c10
-rw-r--r--components/drivers/spi/sfud/inc/sfud_def.h4
-rw-r--r--components/drivers/spi/sfud/src/sfud.c2
-rw-r--r--components/drivers/spi/sfud/src/sfud_sfdp.c2
-rw-r--r--components/drivers/spi/spi_core.c2
-rw-r--r--components/drivers/spi/spi_dev.c10
-rw-r--r--components/drivers/spi/spi_flash.h10
-rw-r--r--components/drivers/spi/spi_flash_sfud.c7
-rw-r--r--components/drivers/spi/spi_flash_sfud.h2
-rw-r--r--components/drivers/spi/spi_msd.c6
-rw-r--r--components/drivers/spi/spi_msd.h14
-rw-r--r--components/drivers/spi/spi_wifi_rw009.c4
-rw-r--r--components/drivers/spi/spi_wifi_rw009.h4
-rw-r--r--components/drivers/src/completion.c29
-rw-r--r--components/drivers/src/dataqueue.c28
-rw-r--r--components/drivers/src/pipe.c36
-rw-r--r--components/drivers/src/ringblk_buf.c48
-rw-r--r--components/drivers/src/ringbuffer.c113
-rw-r--r--components/drivers/src/waitqueue.c6
-rw-r--r--components/drivers/src/workqueue.c393
-rw-r--r--components/drivers/touch/touch.c33
-rw-r--r--components/drivers/touch/touch.h2
-rw-r--r--components/drivers/usb/usbdevice/class/audio.h676
-rw-r--r--components/drivers/usb/usbdevice/class/audio_mic.c75
-rw-r--r--components/drivers/usb/usbdevice/class/audio_speaker.c69
-rw-r--r--components/drivers/usb/usbdevice/class/cdc.h16
-rw-r--r--components/drivers/usb/usbdevice/class/cdc_vcom.c84
-rw-r--r--components/drivers/usb/usbdevice/class/ecm.c36
-rw-r--r--components/drivers/usb/usbdevice/class/hid.c35
-rw-r--r--components/drivers/usb/usbdevice/class/hid.h2
-rw-r--r--components/drivers/usb/usbdevice/class/mstorage.c258
-rw-r--r--components/drivers/usb/usbdevice/class/mstorage.h6
-rw-r--r--components/drivers/usb/usbdevice/class/ndis.h84
-rw-r--r--components/drivers/usb/usbdevice/class/rndis.c31
-rw-r--r--components/drivers/usb/usbdevice/class/rndis.h196
-rw-r--r--components/drivers/usb/usbdevice/class/uaudioreg.h418
-rw-r--r--components/drivers/usb/usbdevice/class/winusb.c26
-rw-r--r--components/drivers/usb/usbdevice/class/winusb.h2
-rw-r--r--components/drivers/usb/usbdevice/core/usbdevice.c6
-rw-r--r--components/drivers/usb/usbdevice/core/usbdevice_core.c182
-rw-r--r--components/drivers/usb/usbhost/class/adk.c2
-rw-r--r--components/drivers/usb/usbhost/class/adk.h4
-rw-r--r--components/drivers/usb/usbhost/class/hid.c233
-rw-r--r--components/drivers/usb/usbhost/class/hid.h16
-rw-r--r--components/drivers/usb/usbhost/class/mass.c178
-rw-r--r--components/drivers/usb/usbhost/class/mass.h10
-rw-r--r--components/drivers/usb/usbhost/class/udisk.c2
-rw-r--r--components/drivers/usb/usbhost/class/ukbd.c20
-rw-r--r--components/drivers/usb/usbhost/class/umouse.c27
-rw-r--r--components/drivers/usb/usbhost/core/driver.c22
-rw-r--r--components/drivers/usb/usbhost/core/hub.c187
-rw-r--r--components/drivers/usb/usbhost/core/usbhost.c6
-rw-r--r--components/drivers/usb/usbhost/core/usbhost_core.c126
-rw-r--r--components/drivers/watchdog/watchdog.c8
-rw-r--r--components/drivers/wlan/wlan_cfg.c2
-rw-r--r--components/drivers/wlan/wlan_cfg.h2
-rw-r--r--components/drivers/wlan/wlan_cmd.c6
-rw-r--r--components/drivers/wlan/wlan_dev.c2
-rw-r--r--components/drivers/wlan/wlan_dev.h4
-rw-r--r--components/drivers/wlan/wlan_lwip.c2
-rw-r--r--components/drivers/wlan/wlan_mgnt.c2
-rw-r--r--components/drivers/wlan/wlan_mgnt.h2
-rw-r--r--components/drivers/wlan/wlan_prot.c2
-rw-r--r--components/drivers/wlan/wlan_prot.h2
-rw-r--r--components/drivers/wlan/wlan_workqueue.c2
-rw-r--r--components/drivers/wlan/wlan_workqueue.h2
167 files changed, 5023 insertions, 3343 deletions
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index 006497519f..d3fd14b52d 100755
--- a/components/drivers/Kconfig
+++ b/components/drivers/Kconfig
@@ -24,22 +24,30 @@ if RT_USING_DEVICE_IPC
endif
endif
-config RT_USING_SERIAL
- bool "Using serial device drivers"
+menuconfig RT_USING_SERIAL
+ bool "USING Serial device drivers"
select RT_USING_DEVICE_IPC
select RT_USING_DEVICE
default y
-if RT_USING_SERIAL
- config RT_SERIAL_USING_DMA
- bool "Enable serial DMA mode"
- default y
-
- config RT_SERIAL_RB_BUFSZ
- int "Set RX buffer size"
- default 64
+ if RT_USING_SERIAL
+ choice
+ prompt "Choice Serial version"
+ default RT_USING_SERIAL_V1
+ config RT_USING_SERIAL_V1
+ bool "RT_USING_SERIAL_V1"
+ config RT_USING_SERIAL_V2
+ bool "RT_USING_SERIAL_V2"
+ endchoice
+ config RT_SERIAL_USING_DMA
+ bool "Enable serial DMA mode"
+ default y
-endif
+ config RT_SERIAL_RB_BUFSZ
+ int "Set RX buffer size"
+ depends on !RT_USING_SERIAL_V2
+ default 64
+ endif
config RT_USING_CAN
bool "Using CAN device drivers"
@@ -153,20 +161,6 @@ config RT_USING_RTC
config RT_USING_SOFT_RTC
bool "Using software simulation RTC device"
default n
-
- config RTC_SYNC_USING_NTP
- bool "Using NTP auto sync RTC time"
- depends on PKG_NETUTILS_NTP
- default y
-
- if RTC_SYNC_USING_NTP
- config RTC_NTP_FIRST_SYNC_DELAY
- int "NTP first sync delay time(second) for network connect"
- default 30
- config RTC_NTP_SYNC_PERIOD
- int "NTP auto sync period(second)"
- default 3600
- endif
endif
config RT_USING_SDIO
@@ -642,6 +636,14 @@ menu "Using USB"
string "Udisk mount dir"
default "/"
endif
+ config RT_USBH_HID
+ bool "Enable HID Drivers"
+ default n
+ if RT_USBH_HID
+ config RT_USBH_HID_MOUSE
+ bool "Enable HID mouse protocol"
+ default n
+ endif
endif
config RT_USING_USB_DEVICE
bool "Using USB device"
diff --git a/components/drivers/audio/audio.c b/components/drivers/audio/audio.c
index c3f8723db6..f9d42aeb5c 100644
--- a/components/drivers/audio/audio.c
+++ b/components/drivers/audio/audio.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/audio/audio_pipe.c b/components/drivers/audio/audio_pipe.c
index e9de1ffb74..4dd1138610 100644
--- a/components/drivers/audio/audio_pipe.c
+++ b/components/drivers/audio/audio_pipe.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/audio/audio_pipe.h b/components/drivers/audio/audio_pipe.h
index 3ae3bc8498..6c4719d56d 100644
--- a/components/drivers/audio/audio_pipe.h
+++ b/components/drivers/audio/audio_pipe.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index 9f4612355b..358220013f 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -966,6 +966,5 @@ int cmd_canstat(int argc, void **argv)
}
return 0;
}
-FINSH_FUNCTION_EXPORT_ALIAS(cmd_canstat, __cmd_canstat, Stat Can Device Status.);
+MSH_CMD_EXPORT_ALIAS(cmd_canstat, canstat, stat can device status);
#endif
-
diff --git a/components/drivers/cputime/cputime.c b/components/drivers/cputime/cputime.c
index 3ec860d5c5..750733f366 100644
--- a/components/drivers/cputime/cputime.c
+++ b/components/drivers/cputime/cputime.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -10,11 +10,12 @@
#include <rtdevice.h>
#include <rtthread.h>
+#include <sys/errno.h>
static const struct rt_clock_cputime_ops *_cputime_ops = RT_NULL;
/**
- * The clock_cpu_getres() function shall return the resolution of CPU time, the
+ * The clock_cpu_getres() function shall return the resolution of CPU time, the
* number of nanosecond per tick.
*
* @return the number of nanosecond per tick
@@ -24,7 +25,7 @@ float clock_cpu_getres(void)
if (_cputime_ops)
return _cputime_ops->cputime_getres();
- rt_set_errno(-ENOSYS);
+ rt_set_errno(ENOSYS);
return 0;
}
@@ -38,12 +39,12 @@ uint32_t clock_cpu_gettime(void)
if (_cputime_ops)
return _cputime_ops->cputime_gettime();
- rt_set_errno(-ENOSYS);
+ rt_set_errno(ENOSYS);
return 0;
}
/**
- * The clock_cpu_microsecond() fucntion shall return the microsecond according to
+ * The clock_cpu_microsecond() fucntion shall return the microsecond according to
* cpu_tick parameter.
*
* @param cpu_tick the cpu tick
@@ -58,7 +59,7 @@ uint32_t clock_cpu_microsecond(uint32_t cpu_tick)
}
/**
- * The clock_cpu_microsecond() fucntion shall return the millisecond according to
+ * The clock_cpu_microsecond() fucntion shall return the millisecond according to
* cpu_tick parameter.
*
* @param cpu_tick the cpu tick
@@ -74,7 +75,7 @@ uint32_t clock_cpu_millisecond(uint32_t cpu_tick)
/**
* The clock_cpu_seops() function shall set the ops of cpu time.
- *
+ *
* @return always return 0.
*/
int clock_cpu_setops(const struct rt_clock_cputime_ops *ops)
diff --git a/components/drivers/cputime/cputime_cortexm.c b/components/drivers/cputime/cputime_cortexm.c
index 05ed6ed447..071acfe9bb 100644
--- a/components/drivers/cputime/cputime_cortexm.c
+++ b/components/drivers/cputime/cputime_cortexm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -19,7 +19,7 @@
static float cortexm_cputime_getres(void)
{
float ret = 1000 * 1000 * 1000;
-
+
ret = ret / SystemCoreClock;
return ret;
}
@@ -29,7 +29,7 @@ static uint32_t cortexm_cputime_gettime(void)
return DWT->CYCCNT;
}
-const static struct rt_clock_cputime_ops _cortexm_ops =
+const static struct rt_clock_cputime_ops _cortexm_ops =
{
cortexm_cputime_getres,
cortexm_cputime_gettime
@@ -38,13 +38,13 @@ const static struct rt_clock_cputime_ops _cortexm_ops =
int cortexm_cputime_init(void)
{
/* check support bit */
- if ((DWT->CTRL & (1UL << DWT_CTRL_NOCYCCNT_Pos)) == 0)
+ if ((DWT->CTRL & (1UL << DWT_CTRL_NOCYCCNT_Pos)) == 0)
{
/* enable trace*/
CoreDebug->DEMCR |= (1UL << CoreDebug_DEMCR_TRCENA_Pos);
-
+
/* whether cycle counter not enabled */
- if ((DWT->CTRL & (1UL << DWT_CTRL_CYCCNTENA_Pos)) == 0)
+ if ((DWT->CTRL & (1UL << DWT_CTRL_CYCCNTENA_Pos)) == 0)
{
/* enable cycle counter */
DWT->CTRL |= (1UL << DWT_CTRL_CYCCNTENA_Pos);
diff --git a/components/drivers/hwcrypto/hw_bignum.c b/components/drivers/hwcrypto/hw_bignum.c
index 88813566b1..0488a16f08 100644
--- a/components/drivers/hwcrypto/hw_bignum.c
+++ b/components/drivers/hwcrypto/hw_bignum.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -56,7 +56,7 @@ rt_err_t rt_hwcrypto_bignum_default(struct rt_hwcrypto_device *device)
/**
* @brief Init bignum obj
- *
+ *
* @param n bignum obj
*/
void rt_hwcrypto_bignum_init(struct hw_bignum_mpi *n)
@@ -87,9 +87,9 @@ void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n)
/**
* @brief Get length of bignum as an unsigned binary buffer
- *
+ *
* @param n bignum obj
- *
+ *
* @return binary buffer length
*/
int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n)
@@ -112,11 +112,11 @@ int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n)
/**
* @brief Export n into unsigned binary data, big endian
- *
+ *
* @param n bignum obj
* @param buf Buffer for the binary number
* @param len Length of the buffer
- *
+ *
* @return export bin length
*/
int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len)
@@ -139,11 +139,11 @@ int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int
/**
* @brief Import n from unsigned binary data, big endian
- *
+ *
* @param n bignum obj
* @param buf Buffer for the binary number
* @param len Length of the buffer
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len)
@@ -179,11 +179,11 @@ rt_err_t rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf,
/**
* @brief x = a + b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x,
@@ -206,11 +206,11 @@ rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x,
/**
* @brief x = a - b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x,
@@ -233,11 +233,11 @@ rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x,
/**
* @brief x = a * b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x,
@@ -260,11 +260,11 @@ rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x,
/**
* @brief x = a * b (mod c)
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x,
@@ -288,11 +288,11 @@ rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x,
/**
* @brief x = a ^ b (mod c)
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_exptmod(struct hw_bignum_mpi *x,
diff --git a/components/drivers/hwcrypto/hw_bignum.h b/components/drivers/hwcrypto/hw_bignum.h
index a1f567e68f..442b28f558 100644
--- a/components/drivers/hwcrypto/hw_bignum.h
+++ b/components/drivers/hwcrypto/hw_bignum.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -83,42 +83,42 @@ void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n);
/**
* @brief Get length of bignum as an unsigned binary buffer
- *
+ *
* @param n bignum obj
- *
+ *
* @return binary buffer Length
*/
int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n);
/**
* @brief Export n into unsigned binary data, big endian
- *
+ *
* @param n bignum obj
* @param buf Buffer for the binary number
* @param len Length of the buffer
- *
+ *
* @return export bin length
*/
int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len);
/**
* @brief Import n from unsigned binary data, big endian
- *
+ *
* @param n bignum obj
* @param buf Buffer for the binary number
* @param len Length of the buffer
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len);
/**
* @brief x = a + b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x,
@@ -127,11 +127,11 @@ rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x,
/**
* @brief x = a - b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x,
@@ -140,11 +140,11 @@ rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x,
/**
* @brief x = a * b
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x,
@@ -153,11 +153,11 @@ rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x,
/**
* @brief x = a * b (mod c)
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x,
@@ -167,11 +167,11 @@ rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x,
/**
* @brief x = a ^ b (mod c)
- *
+ *
* @param a bignum obj
* @param b bignum obj
* @param c bignum obj
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_bignum_exptmod(struct hw_bignum_mpi *x,
diff --git a/components/drivers/hwcrypto/hw_crc.c b/components/drivers/hwcrypto/hw_crc.c
index 20579711e2..a1d95793e2 100644
--- a/components/drivers/hwcrypto/hw_crc.c
+++ b/components/drivers/hwcrypto/hw_crc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -20,7 +20,7 @@
*
* @return CRC context
*/
-struct rt_hwcrypto_ctx *rt_hwcrypto_crc_create(struct rt_hwcrypto_device *device,
+struct rt_hwcrypto_ctx *rt_hwcrypto_crc_create(struct rt_hwcrypto_device *device,
hwcrypto_crc_mode mode)
{
struct hwcrypto_crc *crc_ctx;
@@ -89,8 +89,8 @@ void rt_hwcrypto_crc_destroy(struct rt_hwcrypto_ctx *ctx)
*
* @return RT_EOK on success.
*/
-rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
- const rt_uint8_t *input,
+rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
+ const rt_uint8_t *input,
rt_size_t length)
{
struct hwcrypto_crc *crc_ctx = (struct hwcrypto_crc *)ctx;
@@ -107,7 +107,7 @@ rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
* @param ctx CRC context
* @param cfg CRC config
*/
-void rt_hwcrypto_crc_cfg(struct rt_hwcrypto_ctx *ctx,
+void rt_hwcrypto_crc_cfg(struct rt_hwcrypto_ctx *ctx,
struct hwcrypto_crc_cfg *cfg)
{
if (cfg)
diff --git a/components/drivers/hwcrypto/hw_crc.h b/components/drivers/hwcrypto/hw_crc.h
index a6df92a2ef..8e0fcefccf 100644
--- a/components/drivers/hwcrypto/hw_crc.h
+++ b/components/drivers/hwcrypto/hw_crc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -129,7 +129,7 @@ void rt_hwcrypto_crc_destroy(struct rt_hwcrypto_ctx *ctx);
*
* @return CRC value
*/
-rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
+rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
const rt_uint8_t *input, rt_size_t length);
/**
@@ -138,7 +138,7 @@ rt_uint32_t rt_hwcrypto_crc_update(struct rt_hwcrypto_ctx *ctx,
* @param ctx CRC context
* @param cfg CRC config
*/
-void rt_hwcrypto_crc_cfg(struct rt_hwcrypto_ctx *ctx,
+void rt_hwcrypto_crc_cfg(struct rt_hwcrypto_ctx *ctx,
struct hwcrypto_crc_cfg *cfg);
#ifdef __cplusplus
diff --git a/components/drivers/hwcrypto/hw_gcm.c b/components/drivers/hwcrypto/hw_gcm.c
index 8d0f49149a..a8106694f9 100644
--- a/components/drivers/hwcrypto/hw_gcm.c
+++ b/components/drivers/hwcrypto/hw_gcm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hw_gcm.h b/components/drivers/hwcrypto/hw_gcm.h
index a73b2b0634..3a2f87bc30 100644
--- a/components/drivers/hwcrypto/hw_gcm.h
+++ b/components/drivers/hwcrypto/hw_gcm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hw_hash.c b/components/drivers/hwcrypto/hw_hash.c
index b20069ac0e..cf5ec8d70a 100644
--- a/components/drivers/hwcrypto/hw_hash.c
+++ b/components/drivers/hwcrypto/hw_hash.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hw_hash.h b/components/drivers/hwcrypto/hw_hash.h
index de0310e84c..41abd06c4c 100644
--- a/components/drivers/hwcrypto/hw_hash.h
+++ b/components/drivers/hwcrypto/hw_hash.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hw_rng.c b/components/drivers/hwcrypto/hw_rng.c
index 13a17cc6be..b6f62db347 100644
--- a/components/drivers/hwcrypto/hw_rng.c
+++ b/components/drivers/hwcrypto/hw_rng.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -81,7 +81,7 @@ rt_err_t rt_hwcrypto_rng_default(struct rt_hwcrypto_device *device)
* @brief Getting Random Numbers from RNG Context
*
* @param ctx RNG context
- *
+ *
* @return Random number
*/
rt_uint32_t rt_hwcrypto_rng_update_ctx(struct rt_hwcrypto_ctx *ctx)
diff --git a/components/drivers/hwcrypto/hw_rng.h b/components/drivers/hwcrypto/hw_rng.h
index fc28afdb1e..3c014f6bee 100644
--- a/components/drivers/hwcrypto/hw_rng.h
+++ b/components/drivers/hwcrypto/hw_rng.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -60,7 +60,7 @@ rt_err_t rt_hwcrypto_rng_default(struct rt_hwcrypto_device *device);
* @brief Getting Random Numbers from RNG Context
*
* @param ctx RNG context
- *
+ *
* @return Random number
*/
rt_uint32_t rt_hwcrypto_rng_update_ctx(struct rt_hwcrypto_ctx *ctx);
diff --git a/components/drivers/hwcrypto/hw_symmetric.c b/components/drivers/hwcrypto/hw_symmetric.c
index 789c5c1a2c..9398298fed 100644
--- a/components/drivers/hwcrypto/hw_symmetric.c
+++ b/components/drivers/hwcrypto/hw_symmetric.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -215,7 +215,7 @@ void rt_hwcrypto_symmetric_get_ivoff(struct rt_hwcrypto_ctx *ctx, rt_int32_t *iv
*
* @param des The destination symmetric crypto context
* @param src The symmetric crypto context to be copy
- *
+ *
* @return RT_EOK on success.
*/
rt_err_t rt_hwcrypto_symmetric_cpy(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src)
diff --git a/components/drivers/hwcrypto/hw_symmetric.h b/components/drivers/hwcrypto/hw_symmetric.h
index 12f4dbec30..f3f78fb21c 100644
--- a/components/drivers/hwcrypto/hw_symmetric.h
+++ b/components/drivers/hwcrypto/hw_symmetric.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hwcrypto.c b/components/drivers/hwcrypto/hwcrypto.c
index bbe1ff63fb..473b52fb9a 100644
--- a/components/drivers/hwcrypto/hwcrypto.c
+++ b/components/drivers/hwcrypto/hwcrypto.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwcrypto/hwcrypto.h b/components/drivers/hwcrypto/hwcrypto.h
index a428f4437d..cdf057c49d 100644
--- a/components/drivers/hwcrypto/hwcrypto.h
+++ b/components/drivers/hwcrypto/hwcrypto.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/hwtimer/hwtimer.c b/components/drivers/hwtimer/hwtimer.c
index 976d8bbf32..49a57be9af 100644
--- a/components/drivers/hwtimer/hwtimer.c
+++ b/components/drivers/hwtimer/hwtimer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -325,7 +325,7 @@ void rt_device_hwtimer_isr(rt_hwtimer_t *timer)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops hwtimer_ops =
+const static struct rt_device_ops hwtimer_ops =
{
rt_hwtimer_init,
rt_hwtimer_open,
diff --git a/components/drivers/i2c/i2c-bit-ops.c b/components/drivers/i2c/i2c-bit-ops.c
index 96af567a1e..ae1f4db9c0 100644
--- a/components/drivers/i2c/i2c-bit-ops.c
+++ b/components/drivers/i2c/i2c-bit-ops.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -375,6 +375,8 @@ static rt_size_t i2c_bit_xfer(struct rt_i2c_bus_device *bus,
rt_int32_t i, ret;
rt_uint16_t ignore_nack;
+ if (num == 0) return 0;
+
for (i = 0; i < num; i++)
{
msg = &msgs[i];
diff --git a/components/drivers/i2c/i2c_core.c b/components/drivers/i2c/i2c_core.c
index f358c2b758..47ba76d2be 100644
--- a/components/drivers/i2c/i2c_core.c
+++ b/components/drivers/i2c/i2c_core.c
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-04-25 weety first version
+ * 2021-04-20 RiceChen added support for bus control api
*/
#include <rtdevice.h>
@@ -81,6 +82,26 @@ rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
}
}
+rt_err_t rt_i2c_control(struct rt_i2c_bus_device *bus,
+ rt_uint32_t cmd,
+ rt_uint32_t arg)
+{
+ rt_err_t ret;
+
+ if(bus->ops->i2c_bus_control)
+ {
+ ret = bus->ops->i2c_bus_control(bus, cmd, arg);
+
+ return ret;
+ }
+ else
+ {
+ LOG_E("I2C bus operation not supported");
+
+ return 0;
+ }
+}
+
rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
rt_uint16_t addr,
rt_uint16_t flags,
diff --git a/components/drivers/i2c/i2c_dev.c b/components/drivers/i2c/i2c_dev.c
index 59f728be09..c30bb62a92 100644
--- a/components/drivers/i2c/i2c_dev.c
+++ b/components/drivers/i2c/i2c_dev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -7,6 +7,7 @@
* Date Author Notes
* 2012-04-25 weety first version
* 2014-08-03 bernard fix some compiling warning
+ * 2021-04-20 RiceChen added support for bus clock control
*/
#include <rtdevice.h>
@@ -66,6 +67,7 @@ static rt_err_t i2c_bus_device_control(rt_device_t dev,
rt_err_t ret;
struct rt_i2c_priv_data *priv_data;
struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)dev->user_data;
+ rt_uint32_t bus_clock;
RT_ASSERT(bus != RT_NULL);
@@ -89,6 +91,14 @@ static rt_err_t i2c_bus_device_control(rt_device_t dev,
return -RT_EIO;
}
break;
+ case RT_I2C_DEV_CTRL_CLK:
+ bus_clock = *(rt_uint32_t *)args;
+ ret = rt_i2c_control(bus, cmd, bus_clock);
+ if (ret < 0)
+ {
+ return -RT_EIO;
+ }
+ break;
default:
break;
}
@@ -97,9 +107,9 @@ static rt_err_t i2c_bus_device_control(rt_device_t dev,
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops i2c_ops =
+const static struct rt_device_ops i2c_ops =
{
- RT_NULL,
+ RT_NULL,
RT_NULL,
RT_NULL,
i2c_bus_device_read,
diff --git a/components/drivers/include/drivers/adc.h b/components/drivers/include/drivers/adc.h
index 8e3498e791..e2ce087fb9 100644
--- a/components/drivers/include/drivers/adc.h
+++ b/components/drivers/include/drivers/adc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/alarm.h b/components/drivers/include/drivers/alarm.h
index e59c4142c7..11637df949 100644
--- a/components/drivers/include/drivers/alarm.h
+++ b/components/drivers/include/drivers/alarm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/audio.h b/components/drivers/include/drivers/audio.h
index 86057e7626..45c31be2f3 100644
--- a/components/drivers/include/drivers/audio.h
+++ b/components/drivers/include/drivers/audio.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/can.h b/components/drivers/include/drivers/can.h
index d4fcc845b4..bb05317d4f 100644
--- a/components/drivers/include/drivers/can.h
+++ b/components/drivers/include/drivers/can.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/cputime.h b/components/drivers/include/drivers/cputime.h
index 78c22fc1da..26a1e40f8e 100644
--- a/components/drivers/include/drivers/cputime.h
+++ b/components/drivers/include/drivers/cputime.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -11,6 +11,8 @@
#ifndef CPUTIME_H__
#define CPUTIME_H__
+#include <stdint.h>
+
struct rt_clock_cputime_ops
{
float (*cputime_getres) (void);
diff --git a/components/drivers/include/drivers/crypto.h b/components/drivers/include/drivers/crypto.h
index 5341d9ee48..8270a78b09 100644
--- a/components/drivers/include/drivers/crypto.h
+++ b/components/drivers/include/drivers/crypto.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/dac.h b/components/drivers/include/drivers/dac.h
index b6043348dc..7d5ff3592a 100644
--- a/components/drivers/include/drivers/dac.h
+++ b/components/drivers/include/drivers/dac.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/hwtimer.h b/components/drivers/include/drivers/hwtimer.h
index d00dbd8a13..0bf4893790 100644
--- a/components/drivers/include/drivers/hwtimer.h
+++ b/components/drivers/include/drivers/hwtimer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/i2c-bit-ops.h b/components/drivers/include/drivers/i2c-bit-ops.h
index ddf9a36d73..0d94de114a 100644
--- a/components/drivers/include/drivers/i2c-bit-ops.h
+++ b/components/drivers/include/drivers/i2c-bit-ops.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/i2c.h b/components/drivers/include/drivers/i2c.h
index d93e82fc2b..7bf99d26cc 100644
--- a/components/drivers/include/drivers/i2c.h
+++ b/components/drivers/include/drivers/i2c.h
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-04-25 weety first version
+ * 2021-04-20 RiceChen added support for bus control api
*/
#ifndef __I2C_H__
@@ -74,6 +75,9 @@ struct rt_i2c_bus_device *rt_i2c_bus_device_find(const char *bus_name);
rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
struct rt_i2c_msg msgs[],
rt_uint32_t num);
+rt_err_t rt_i2c_control(struct rt_i2c_bus_device *bus,
+ rt_uint32_t cmd,
+ rt_uint32_t arg);
rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
rt_uint16_t addr,
rt_uint16_t flags,
diff --git a/components/drivers/include/drivers/i2c_dev.h b/components/drivers/include/drivers/i2c_dev.h
index 5ef9dd1a8c..080ff26f87 100644
--- a/components/drivers/include/drivers/i2c_dev.h
+++ b/components/drivers/include/drivers/i2c_dev.h
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-04-25 weety first version
+ * 2021-04-20 RiceChen added bus clock command
*/
#ifndef __I2C_DEV_H__
@@ -21,6 +22,7 @@ extern "C" {
#define RT_I2C_DEV_CTRL_ADDR 0x21
#define RT_I2C_DEV_CTRL_TIMEOUT 0x22
#define RT_I2C_DEV_CTRL_RW 0x23
+#define RT_I2C_DEV_CTRL_CLK 0x24
struct rt_i2c_priv_data
{
diff --git a/components/drivers/include/drivers/mmc.h b/components/drivers/include/drivers/mmc.h
index 95dce7178a..d472bbbc5d 100644
--- a/components/drivers/include/drivers/mmc.h
+++ b/components/drivers/include/drivers/mmc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -22,163 +22,163 @@ extern "C" {
* EXT_CSD fields
*/
-#define EXT_CSD_FLUSH_CACHE 32 /* W */
-#define EXT_CSD_CACHE_CTRL 33 /* R/W */
-#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
-#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
-#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
-#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
-#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
-#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
-#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
-#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
-#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
-#define EXT_CSD_HPI_MGMT 161 /* R/W */
-#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
-#define EXT_CSD_BKOPS_EN 163 /* R/W */
-#define EXT_CSD_BKOPS_START 164 /* W */
-#define EXT_CSD_SANITIZE_START 165 /* W */
-#define EXT_CSD_WR_REL_PARAM 166 /* RO */
-#define EXT_CSD_RPMB_MULT 168 /* RO */
-#define EXT_CSD_BOOT_WP 173 /* R/W */
-#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
-#define EXT_CSD_PART_CONFIG 179 /* R/W */
-#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
-#define EXT_CSD_BUS_WIDTH 183 /* R/W */
-#define EXT_CSD_HS_TIMING 185 /* R/W */
-#define EXT_CSD_POWER_CLASS 187 /* R/W */
-#define EXT_CSD_REV 192 /* RO */
-#define EXT_CSD_STRUCTURE 194 /* RO */
-#define EXT_CSD_CARD_TYPE 196 /* RO */
-#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
+#define EXT_CSD_FLUSH_CACHE 32 /* W */
+#define EXT_CSD_CACHE_CTRL 33 /* R/W */
+#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
+#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
+#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
+#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
+#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
+#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
+#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
+#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
+#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
+#define EXT_CSD_HPI_MGMT 161 /* R/W */
+#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
+#define EXT_CSD_BKOPS_EN 163 /* R/W */
+#define EXT_CSD_BKOPS_START 164 /* W */
+#define EXT_CSD_SANITIZE_START 165 /* W */
+#define EXT_CSD_WR_REL_PARAM 166 /* RO */
+#define EXT_CSD_RPMB_MULT 168 /* RO */
+#define EXT_CSD_BOOT_WP 173 /* R/W */
+#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
+#define EXT_CSD_PART_CONFIG 179 /* R/W */
+#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
+#define EXT_CSD_BUS_WIDTH 183 /* R/W */
+#define EXT_CSD_HS_TIMING 185 /* R/W */
+#define EXT_CSD_POWER_CLASS 187 /* R/W */
+#define EXT_CSD_REV 192 /* RO */
+#define EXT_CSD_STRUCTURE 194 /* RO */
+#define EXT_CSD_CARD_TYPE 196 /* RO */
+#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
-#define EXT_CSD_PWR_CL_52_195 200 /* RO */
-#define EXT_CSD_PWR_CL_26_195 201 /* RO */
-#define EXT_CSD_PWR_CL_52_360 202 /* RO */
-#define EXT_CSD_PWR_CL_26_360 203 /* RO */
-#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
-#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
-#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
-#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
-#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
-#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
-#define EXT_CSD_BOOT_MULT 226 /* RO */
-#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
-#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
-#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
-#define EXT_CSD_TRIM_MULT 232 /* RO */
-#define EXT_CSD_PWR_CL_200_195 236 /* RO */
-#define EXT_CSD_PWR_CL_200_360 237 /* RO */
-#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
-#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
-#define EXT_CSD_BKOPS_STATUS 246 /* RO */
-#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
-#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
-#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
-#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
-#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
-#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
-#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
-#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
-#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
-#define EXT_CSD_HPI_FEATURES 503 /* RO */
+#define EXT_CSD_PWR_CL_52_195 200 /* RO */
+#define EXT_CSD_PWR_CL_26_195 201 /* RO */
+#define EXT_CSD_PWR_CL_52_360 202 /* RO */
+#define EXT_CSD_PWR_CL_26_360 203 /* RO */
+#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
+#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
+#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
+#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
+#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
+#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
+#define EXT_CSD_BOOT_MULT 226 /* RO */
+#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
+#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
+#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
+#define EXT_CSD_TRIM_MULT 232 /* RO */
+#define EXT_CSD_PWR_CL_200_195 236 /* RO */
+#define EXT_CSD_PWR_CL_200_360 237 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
+#define EXT_CSD_BKOPS_STATUS 246 /* RO */
+#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
+#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
+#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
+#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
+#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
+#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
+#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
+#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
+#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
+#define EXT_CSD_HPI_FEATURES 503 /* RO */
/*
* EXT_CSD field definitions
*/
-#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
+#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
-#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40)
-#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10)
-#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04)
-#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01)
+#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40)
+#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10)
+#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04)
+#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01)
-#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
-#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
-#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3)
-#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4)
+#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
+#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
+#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3)
+#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4)
-#define EXT_CSD_PART_SUPPORT_PART_EN (0x1)
+#define EXT_CSD_PART_SUPPORT_PART_EN (0x1)
-#define EXT_CSD_CMD_SET_NORMAL (1<<0)
-#define EXT_CSD_CMD_SET_SECURE (1<<1)
-#define EXT_CSD_CMD_SET_CPSECURE (1<<2)
+#define EXT_CSD_CMD_SET_NORMAL (1<<0)
+#define EXT_CSD_CMD_SET_SECURE (1<<1)
+#define EXT_CSD_CMD_SET_CPSECURE (1<<2)
-#define EXT_CSD_CARD_TYPE_HS_26 (1<<0) /* Card can run at 26MHz */
-#define EXT_CSD_CARD_TYPE_HS_52 (1<<1) /* Card can run at 52MHz */
-#define EXT_CSD_CARD_TYPE_HS (EXT_CSD_CARD_TYPE_HS_26 | \
+#define EXT_CSD_CARD_TYPE_HS_26 (1<<0) /* Card can run at 26MHz */
+#define EXT_CSD_CARD_TYPE_HS_52 (1<<1) /* Card can run at 52MHz */
+#define EXT_CSD_CARD_TYPE_HS (EXT_CSD_CARD_TYPE_HS_26 | \
EXT_CSD_CARD_TYPE_HS_52)
#define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */
/* DDR mode @1.8V or 3V I/O */
#define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */
- /* DDR mode @1.2V I/O */
+ /* DDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \
| EXT_CSD_CARD_TYPE_DDR_1_2V)
-#define EXT_CSD_CARD_TYPE_HS200_1_8V (1<<4) /* Card can run at 200MHz */
-#define EXT_CSD_CARD_TYPE_HS200_1_2V (1<<5) /* Card can run at 200MHz */
- /* SDR mode @1.2V I/O */
-#define EXT_CSD_CARD_TYPE_HS200 (EXT_CSD_CARD_TYPE_HS200_1_8V | \
- EXT_CSD_CARD_TYPE_HS200_1_2V)
-#define EXT_CSD_CARD_TYPE_HS400_1_8V (1<<6) /* Card can run at 200MHz DDR, 1.8V */
-#define EXT_CSD_CARD_TYPE_HS400_1_2V (1<<7) /* Card can run at 200MHz DDR, 1.2V */
-#define EXT_CSD_CARD_TYPE_HS400 (EXT_CSD_CARD_TYPE_HS400_1_8V | \
- EXT_CSD_CARD_TYPE_HS400_1_2V)
+#define EXT_CSD_CARD_TYPE_HS200_1_8V (1<<4) /* Card can run at 200MHz */
+#define EXT_CSD_CARD_TYPE_HS200_1_2V (1<<5) /* Card can run at 200MHz */
+ /* SDR mode @1.2V I/O */
+#define EXT_CSD_CARD_TYPE_HS200 (EXT_CSD_CARD_TYPE_HS200_1_8V | \
+ EXT_CSD_CARD_TYPE_HS200_1_2V)
+#define EXT_CSD_CARD_TYPE_HS400_1_8V (1<<6) /* Card can run at 200MHz DDR, 1.8V */
+#define EXT_CSD_CARD_TYPE_HS400_1_2V (1<<7) /* Card can run at 200MHz DDR, 1.2V */
+#define EXT_CSD_CARD_TYPE_HS400 (EXT_CSD_CARD_TYPE_HS400_1_8V | \
+ EXT_CSD_CARD_TYPE_HS400_1_2V)
-#define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */
-#define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */
-#define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */
-#define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */
-#define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */
+#define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */
+#define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */
+#define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */
+#define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */
+#define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */
-#define EXT_CSD_TIMING_BC 0 /* Backwards compatility */
-#define EXT_CSD_TIMING_HS 1 /* High speed */
-#define EXT_CSD_TIMING_HS200 2 /* HS200 */
-#define EXT_CSD_TIMING_HS400 3 /* HS400 */
+#define EXT_CSD_TIMING_BC 0 /* Backwards compatility */
+#define EXT_CSD_TIMING_HS 1 /* High speed */
+#define EXT_CSD_TIMING_HS200 2 /* HS200 */
+#define EXT_CSD_TIMING_HS400 3 /* HS400 */
-#define EXT_CSD_SEC_ER_EN BIT(0)
-#define EXT_CSD_SEC_BD_BLK_EN BIT(2)
-#define EXT_CSD_SEC_GB_CL_EN BIT(4)
-#define EXT_CSD_SEC_SANITIZE BIT(6) /* v4.5 only */
+#define EXT_CSD_SEC_ER_EN BIT(0)
+#define EXT_CSD_SEC_BD_BLK_EN BIT(2)
+#define EXT_CSD_SEC_GB_CL_EN BIT(4)
+#define EXT_CSD_SEC_SANITIZE BIT(6) /* v4.5 only */
-#define EXT_CSD_RST_N_EN_MASK 0x3
-#define EXT_CSD_RST_N_ENABLED 1 /* RST_n is enabled on card */
+#define EXT_CSD_RST_N_EN_MASK 0x3
+#define EXT_CSD_RST_N_ENABLED 1 /* RST_n is enabled on card */
-#define EXT_CSD_NO_POWER_NOTIFICATION 0
-#define EXT_CSD_POWER_ON 1
-#define EXT_CSD_POWER_OFF_SHORT 2
-#define EXT_CSD_POWER_OFF_LONG 3
+#define EXT_CSD_NO_POWER_NOTIFICATION 0
+#define EXT_CSD_POWER_ON 1
+#define EXT_CSD_POWER_OFF_SHORT 2
+#define EXT_CSD_POWER_OFF_LONG 3
-#define EXT_CSD_PWR_CL_8BIT_MASK 0xF0 /* 8 bit PWR CLS */
-#define EXT_CSD_PWR_CL_4BIT_MASK 0x0F /* 8 bit PWR CLS */
-#define EXT_CSD_PWR_CL_8BIT_SHIFT 4
-#define EXT_CSD_PWR_CL_4BIT_SHIFT 0
+#define EXT_CSD_PWR_CL_8BIT_MASK 0xF0 /* 8 bit PWR CLS */
+#define EXT_CSD_PWR_CL_4BIT_MASK 0x0F /* 8 bit PWR CLS */
+#define EXT_CSD_PWR_CL_8BIT_SHIFT 4
+#define EXT_CSD_PWR_CL_4BIT_SHIFT 0
-#define EXT_CSD_PACKED_EVENT_EN BIT(3)
+#define EXT_CSD_PACKED_EVENT_EN BIT(3)
/*
* EXCEPTION_EVENT_STATUS field
*/
-#define EXT_CSD_URGENT_BKOPS BIT(0)
-#define EXT_CSD_DYNCAP_NEEDED BIT(1)
-#define EXT_CSD_SYSPOOL_EXHAUSTED BIT(2)
-#define EXT_CSD_PACKED_FAILURE BIT(3)
+#define EXT_CSD_URGENT_BKOPS BIT(0)
+#define EXT_CSD_DYNCAP_NEEDED BIT(1)
+#define EXT_CSD_SYSPOOL_EXHAUSTED BIT(2)
+#define EXT_CSD_PACKED_FAILURE BIT(3)
-#define EXT_CSD_PACKED_GENERIC_ERROR BIT(0)
-#define EXT_CSD_PACKED_INDEXED_ERROR BIT(1)
+#define EXT_CSD_PACKED_GENERIC_ERROR BIT(0)
+#define EXT_CSD_PACKED_INDEXED_ERROR BIT(1)
/*
* BKOPS status level
*/
-#define EXT_CSD_BKOPS_LEVEL_2 0x2
+#define EXT_CSD_BKOPS_LEVEL_2 0x2
/*
* MMC_SWITCH access modes
*/
-#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
-#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
-#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
-#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
-
+#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
+#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
+#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
+#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
+
/*
* extern function
*/
diff --git a/components/drivers/include/drivers/mmcsd_card.h b/components/drivers/include/drivers/mmcsd_card.h
index 3ee5a20465..511cc1167d 100644
--- a/components/drivers/include/drivers/mmcsd_card.h
+++ b/components/drivers/include/drivers/mmcsd_card.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2011-07-25 weety first version
+ * Date Author Notes
+ * 2011-07-25 weety first version
*/
#ifndef __MMCSD_CARD_H__
@@ -17,87 +17,87 @@
extern "C" {
#endif
-#define SD_SCR_BUS_WIDTH_1 (1 << 0)
-#define SD_SCR_BUS_WIDTH_4 (1 << 2)
+#define SD_SCR_BUS_WIDTH_1 (1 << 0)
+#define SD_SCR_BUS_WIDTH_4 (1 << 2)
struct rt_mmcsd_cid {
- rt_uint8_t mid; /* ManufacturerID */
- rt_uint8_t prv; /* Product Revision */
- rt_uint16_t oid; /* OEM/Application ID */
- rt_uint32_t psn; /* Product Serial Number */
- rt_uint8_t pnm[5]; /* Product Name */
- rt_uint8_t reserved1;/* reserved */
- rt_uint16_t mdt; /* Manufacturing Date */
- rt_uint8_t crc; /* CID CRC */
- rt_uint8_t reserved2;/* not used, always 1 */
+ rt_uint8_t mid; /* ManufacturerID */
+ rt_uint8_t prv; /* Product Revision */
+ rt_uint16_t oid; /* OEM/Application ID */
+ rt_uint32_t psn; /* Product Serial Number */
+ rt_uint8_t pnm[5]; /* Product Name */
+ rt_uint8_t reserved1;/* reserved */
+ rt_uint16_t mdt; /* Manufacturing Date */
+ rt_uint8_t crc; /* CID CRC */
+ rt_uint8_t reserved2;/* not used, always 1 */
};
struct rt_mmcsd_csd {
- rt_uint8_t csd_structure; /* CSD register version */
- rt_uint8_t taac;
- rt_uint8_t nsac;
- rt_uint8_t tran_speed; /* max data transfer rate */
- rt_uint16_t card_cmd_class; /* card command classes */
- rt_uint8_t rd_blk_len; /* max read data block length */
- rt_uint8_t rd_blk_part;
- rt_uint8_t wr_blk_misalign;
- rt_uint8_t rd_blk_misalign;
- rt_uint8_t dsr_imp; /* DSR implemented */
- rt_uint8_t c_size_mult; /* CSD 1.0 , device size multiplier */
- rt_uint32_t c_size; /* device size */
- rt_uint8_t r2w_factor;
- rt_uint8_t wr_blk_len; /* max wtire data block length */
- rt_uint8_t wr_blk_partial;
- rt_uint8_t csd_crc;
-
+ rt_uint8_t csd_structure; /* CSD register version */
+ rt_uint8_t taac;
+ rt_uint8_t nsac;
+ rt_uint8_t tran_speed; /* max data transfer rate */
+ rt_uint16_t card_cmd_class; /* card command classes */
+ rt_uint8_t rd_blk_len; /* max read data block length */
+ rt_uint8_t rd_blk_part;
+ rt_uint8_t wr_blk_misalign;
+ rt_uint8_t rd_blk_misalign;
+ rt_uint8_t dsr_imp; /* DSR implemented */
+ rt_uint8_t c_size_mult; /* CSD 1.0 , device size multiplier */
+ rt_uint32_t c_size; /* device size */
+ rt_uint8_t r2w_factor;
+ rt_uint8_t wr_blk_len; /* max wtire data block length */
+ rt_uint8_t wr_blk_partial;
+ rt_uint8_t csd_crc;
+
};
struct rt_sd_scr {
- rt_uint8_t sd_version;
- rt_uint8_t sd_bus_widths;
+ rt_uint8_t sd_version;
+ rt_uint8_t sd_bus_widths;
};
struct rt_sdio_cccr {
- rt_uint8_t sdio_version;
- rt_uint8_t sd_version;
- rt_uint8_t direct_cmd:1, /* Card Supports Direct Commands during data transfer
- only SD mode, not used for SPI mode */
- multi_block:1, /* Card Supports Multi-Block */
- read_wait:1, /* Card Supports Read Wait
- only SD mode, not used for SPI mode */
- suspend_resume:1, /* Card supports Suspend/Resume
- only SD mode, not used for SPI mode */
- s4mi:1, /* generate interrupts during a 4-bit
- multi-block data transfer */
- e4mi:1, /* Enable the multi-block IRQ during
- 4-bit transfer for the SDIO card */
- low_speed:1, /* Card is a Low-Speed card */
- low_speed_4:1; /* 4-bit support for Low-Speed cards */
+ rt_uint8_t sdio_version;
+ rt_uint8_t sd_version;
+ rt_uint8_t direct_cmd:1, /* Card Supports Direct Commands during data transfer
+ only SD mode, not used for SPI mode */
+ multi_block:1, /* Card Supports Multi-Block */
+ read_wait:1, /* Card Supports Read Wait
+ only SD mode, not used for SPI mode */
+ suspend_resume:1, /* Card supports Suspend/Resume
+ only SD mode, not used for SPI mode */
+ s4mi:1, /* generate interrupts during a 4-bit
+ multi-block data transfer */
+ e4mi:1, /* Enable the multi-block IRQ during
+ 4-bit transfer for the SDIO card */
+ low_speed:1, /* Card is a Low-Speed card */
+ low_speed_4:1; /* 4-bit support for Low-Speed cards */
+
+ rt_uint8_t bus_width:1, /* Support SDIO bus width, 1:4bit, 0:1bit */
+ cd_disable:1, /* Connect[0]/Disconnect[1] the 10K-90K ohm pull-up
+ resistor on CD/DAT[3] (pin 1) of the card */
+ power_ctrl:1, /* Support Master Power Control */
+ high_speed:1; /* Support High-Speed */
+
- rt_uint8_t bus_width:1, /* Support SDIO bus width, 1:4bit, 0:1bit */
- cd_disable:1, /* Connect[0]/Disconnect[1] the 10K-90K ohm pull-up
- resistor on CD/DAT[3] (pin 1) of the card */
- power_ctrl:1, /* Support Master Power Control */
- high_speed:1; /* Support High-Speed */
-
-
};
struct rt_sdio_cis {
- rt_uint16_t manufacturer;
- rt_uint16_t product;
- rt_uint16_t func0_blk_size;
- rt_uint32_t max_tran_speed;
+ rt_uint16_t manufacturer;
+ rt_uint16_t product;
+ rt_uint16_t func0_blk_size;
+ rt_uint32_t max_tran_speed;
};
/*
* SDIO function CIS tuple (unknown to the core)
*/
struct rt_sdio_function_tuple {
- struct rt_sdio_function_tuple *next;
- rt_uint8_t code;
- rt_uint8_t size;
- rt_uint8_t *data;
+ struct rt_sdio_function_tuple *next;
+ rt_uint8_t code;
+ rt_uint8_t size;
+ rt_uint8_t *data;
};
struct rt_sdio_function;
@@ -107,60 +107,60 @@ typedef void (rt_sdio_irq_handler_t)(struct rt_sdio_function *);
* SDIO function devices
*/
struct rt_sdio_function {
- struct rt_mmcsd_card *card; /* the card this device belongs to */
- rt_sdio_irq_handler_t *irq_handler; /* IRQ callback */
- rt_uint8_t num; /* function number */
+ struct rt_mmcsd_card *card; /* the card this device belongs to */
+ rt_sdio_irq_handler_t *irq_handler; /* IRQ callback */
+ rt_uint8_t num; /* function number */
+
+ rt_uint8_t func_code; /* Standard SDIO Function interface code */
+ rt_uint16_t manufacturer; /* manufacturer id */
+ rt_uint16_t product; /* product id */
- rt_uint8_t func_code; /* Standard SDIO Function interface code */
- rt_uint16_t manufacturer; /* manufacturer id */
- rt_uint16_t product; /* product id */
+ rt_uint32_t max_blk_size; /* maximum block size */
+ rt_uint32_t cur_blk_size; /* current block size */
- rt_uint32_t max_blk_size; /* maximum block size */
- rt_uint32_t cur_blk_size; /* current block size */
+ rt_uint32_t enable_timeout_val; /* max enable timeout in msec */
- rt_uint32_t enable_timeout_val; /* max enable timeout in msec */
+ struct rt_sdio_function_tuple *tuples;
- struct rt_sdio_function_tuple *tuples;
-
void *priv;
};
-#define SDIO_MAX_FUNCTIONS 7
+#define SDIO_MAX_FUNCTIONS 7
struct rt_mmcsd_card {
- struct rt_mmcsd_host *host;
- rt_uint32_t rca; /* card addr */
- rt_uint32_t resp_cid[4]; /* card CID register */
- rt_uint32_t resp_csd[4]; /* card CSD register */
- rt_uint32_t resp_scr[2]; /* card SCR register */
+ struct rt_mmcsd_host *host;
+ rt_uint32_t rca; /* card addr */
+ rt_uint32_t resp_cid[4]; /* card CID register */
+ rt_uint32_t resp_csd[4]; /* card CSD register */
+ rt_uint32_t resp_scr[2]; /* card SCR register */
- rt_uint16_t tacc_clks; /* data access time by ns */
- rt_uint32_t tacc_ns; /* data access time by clk cycles */
- rt_uint32_t max_data_rate; /* max data transfer rate */
- rt_uint32_t card_capacity; /* card capacity, unit:KB */
- rt_uint32_t card_blksize; /* card block size */
- rt_uint32_t erase_size; /* erase size in sectors */
- rt_uint16_t card_type;
+ rt_uint16_t tacc_clks; /* data access time by ns */
+ rt_uint32_t tacc_ns; /* data access time by clk cycles */
+ rt_uint32_t max_data_rate; /* max data transfer rate */
+ rt_uint32_t card_capacity; /* card capacity, unit:KB */
+ rt_uint32_t card_blksize; /* card block size */
+ rt_uint32_t erase_size; /* erase size in sectors */
+ rt_uint16_t card_type;
#define CARD_TYPE_MMC 0 /* MMC card */
#define CARD_TYPE_SD 1 /* SD card */
#define CARD_TYPE_SDIO 2 /* SDIO card */
#define CARD_TYPE_SDIO_COMBO 3 /* SD combo (IO+mem) card */
- rt_uint16_t flags;
+ rt_uint16_t flags;
#define CARD_FLAG_HIGHSPEED (1 << 0) /* SDIO bus speed 50MHz */
#define CARD_FLAG_SDHC (1 << 1) /* SDHC card */
#define CARD_FLAG_SDXC (1 << 2) /* SDXC card */
- struct rt_sd_scr scr;
- struct rt_mmcsd_csd csd;
- rt_uint32_t hs_max_data_rate; /* max data transfer rate in high speed mode */
+ struct rt_sd_scr scr;
+ struct rt_mmcsd_csd csd;
+ rt_uint32_t hs_max_data_rate; /* max data transfer rate in high speed mode */
- rt_uint8_t sdio_function_num; /* totol number of SDIO functions */
- struct rt_sdio_cccr cccr; /* common card info */
- struct rt_sdio_cis cis; /* common tuple info */
- struct rt_sdio_function *sdio_function[SDIO_MAX_FUNCTIONS + 1]; /* SDIO functions (devices) */
+ rt_uint8_t sdio_function_num; /* totol number of SDIO functions */
+ struct rt_sdio_cccr cccr; /* common card info */
+ struct rt_sdio_cis cis; /* common tuple info */
+ struct rt_sdio_function *sdio_function[SDIO_MAX_FUNCTIONS + 1]; /* SDIO functions (devices) */
};
diff --git a/components/drivers/include/drivers/mmcsd_cmd.h b/components/drivers/include/drivers/mmcsd_cmd.h
index 7c2f26e892..2993fe5406 100644
--- a/components/drivers/include/drivers/mmcsd_cmd.h
+++ b/components/drivers/include/drivers/mmcsd_cmd.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2011-07-25 weety first version
+ * Date Author Notes
+ * 2011-07-25 weety first version
*/
#ifndef __CMD_H__
@@ -85,9 +85,9 @@ extern "C" {
#define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */
#define SD_APP_SEND_SCR 51 /* adtc R1 */
-#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
-#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
-#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00 */
+#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
+#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
+#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00 */
/* SDIO commands type argument response */
diff --git a/components/drivers/include/drivers/mmcsd_core.h b/components/drivers/include/drivers/mmcsd_core.h
index 05a5af6d79..51263d35f2 100644
--- a/components/drivers/include/drivers/mmcsd_core.h
+++ b/components/drivers/include/drivers/mmcsd_core.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2011-07-25 weety first version
+ * Date Author Notes
+ * 2011-07-25 weety first version
*/
#ifndef __CORE_H__
@@ -27,139 +27,139 @@ extern "C" {
#endif
struct rt_mmcsd_data {
- rt_uint32_t blksize;
- rt_uint32_t blks;
- rt_uint32_t *buf;
- rt_int32_t err;
- rt_uint32_t flags;
-#define DATA_DIR_WRITE (1 << 0)
-#define DATA_DIR_READ (1 << 1)
-#define DATA_STREAM (1 << 2)
+ rt_uint32_t blksize;
+ rt_uint32_t blks;
+ rt_uint32_t *buf;
+ rt_int32_t err;
+ rt_uint32_t flags;
+#define DATA_DIR_WRITE (1 << 0)
+#define DATA_DIR_READ (1 << 1)
+#define DATA_STREAM (1 << 2)
- unsigned int bytes_xfered;
+ unsigned int bytes_xfered;
- struct rt_mmcsd_cmd *stop; /* stop command */
- struct rt_mmcsd_req *mrq; /* associated request */
+ struct rt_mmcsd_cmd *stop; /* stop command */
+ struct rt_mmcsd_req *mrq; /* associated request */
- rt_uint32_t timeout_ns;
- rt_uint32_t timeout_clks;
+ rt_uint32_t timeout_ns;
+ rt_uint32_t timeout_clks;
};
struct rt_mmcsd_cmd {
- rt_uint32_t cmd_code;
- rt_uint32_t arg;
- rt_uint32_t resp[4];
- rt_uint32_t flags;
-/*rsponse types
+ rt_uint32_t cmd_code;
+ rt_uint32_t arg;
+ rt_uint32_t resp[4];
+ rt_uint32_t flags;
+/*rsponse types
*bits:0~3
*/
-#define RESP_MASK (0xF)
-#define RESP_NONE (0)
-#define RESP_R1 (1 << 0)
-#define RESP_R1B (2 << 0)
-#define RESP_R2 (3 << 0)
-#define RESP_R3 (4 << 0)
-#define RESP_R4 (5 << 0)
-#define RESP_R6 (6 << 0)
-#define RESP_R7 (7 << 0)
-#define RESP_R5 (8 << 0) /*SDIO command response type*/
-/*command types
+#define RESP_MASK (0xF)
+#define RESP_NONE (0)
+#define RESP_R1 (1 << 0)
+#define RESP_R1B (2 << 0)
+#define RESP_R2 (3 << 0)
+#define RESP_R3 (4 << 0)
+#define RESP_R4 (5 << 0)
+#define RESP_R6 (6 << 0)
+#define RESP_R7 (7 << 0)
+#define RESP_R5 (8 << 0) /*SDIO command response type*/
+/*command types
*bits:4~5
*/
-#define CMD_MASK (3 << 4) /* command type */
-#define CMD_AC (0 << 4)
-#define CMD_ADTC (1 << 4)
-#define CMD_BC (2 << 4)
-#define CMD_BCR (3 << 4)
+#define CMD_MASK (3 << 4) /* command type */
+#define CMD_AC (0 << 4)
+#define CMD_ADTC (1 << 4)
+#define CMD_BC (2 << 4)
+#define CMD_BCR (3 << 4)
-#define resp_type(cmd) ((cmd)->flags & RESP_MASK)
+#define resp_type(cmd) ((cmd)->flags & RESP_MASK)
-/*spi rsponse types
+/*spi rsponse types
*bits:6~8
*/
-#define RESP_SPI_MASK (0x7 << 6)
-#define RESP_SPI_R1 (1 << 6)
-#define RESP_SPI_R1B (2 << 6)
-#define RESP_SPI_R2 (3 << 6)
-#define RESP_SPI_R3 (4 << 6)
-#define RESP_SPI_R4 (5 << 6)
-#define RESP_SPI_R5 (6 << 6)
-#define RESP_SPI_R7 (7 << 6)
+#define RESP_SPI_MASK (0x7 << 6)
+#define RESP_SPI_R1 (1 << 6)
+#define RESP_SPI_R1B (2 << 6)
+#define RESP_SPI_R2 (3 << 6)
+#define RESP_SPI_R3 (4 << 6)
+#define RESP_SPI_R4 (5 << 6)
+#define RESP_SPI_R5 (6 << 6)
+#define RESP_SPI_R7 (7 << 6)
-#define spi_resp_type(cmd) ((cmd)->flags & RESP_SPI_MASK)
+#define spi_resp_type(cmd) ((cmd)->flags & RESP_SPI_MASK)
/*
* These are the command types.
*/
-#define cmd_type(cmd) ((cmd)->flags & CMD_MASK)
-
- rt_int32_t retries; /* max number of retries */
- rt_int32_t err;
+#define cmd_type(cmd) ((cmd)->flags & CMD_MASK)
- struct rt_mmcsd_data *data;
- struct rt_mmcsd_req *mrq; /* associated request */
+ rt_int32_t retries; /* max number of retries */
+ rt_int32_t err;
+
+ struct rt_mmcsd_data *data;
+ struct rt_mmcsd_req *mrq; /* associated request */
};
struct rt_mmcsd_req {
- struct rt_mmcsd_data *data;
- struct rt_mmcsd_cmd *cmd;
- struct rt_mmcsd_cmd *stop;
+ struct rt_mmcsd_data *data;
+ struct rt_mmcsd_cmd *cmd;
+ struct rt_mmcsd_cmd *stop;
};
/*the following is response bit*/
-#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
-#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
-#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
-#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
-#define R1_ERASE_PARAM (1 << 27) /* ex, c */
-#define R1_WP_VIOLATION (1 << 26) /* erx, c */
-#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
-#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
-#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
-#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
-#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
-#define R1_CC_ERROR (1 << 20) /* erx, c */
-#define R1_ERROR (1 << 19) /* erx, c */
-#define R1_UNDERRUN (1 << 18) /* ex, c */
-#define R1_OVERRUN (1 << 17) /* ex, c */
-#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
-#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
-#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
-#define R1_ERASE_RESET (1 << 13) /* sr, c */
+#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
+#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
+#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
+#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
+#define R1_ERASE_PARAM (1 << 27) /* ex, c */
+#define R1_WP_VIOLATION (1 << 26) /* erx, c */
+#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
+#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
+#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
+#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
+#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
+#define R1_CC_ERROR (1 << 20) /* erx, c */
+#define R1_ERROR (1 << 19) /* erx, c */
+#define R1_UNDERRUN (1 << 18) /* ex, c */
+#define R1_OVERRUN (1 << 17) /* ex, c */
+#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
+#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
+#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
+#define R1_ERASE_RESET (1 << 13) /* sr, c */
#define R1_STATUS(x) (x & 0xFFFFE000)
-#define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */
-#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
-#define R1_APP_CMD (1 << 5) /* sr, c */
+#define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */
+#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
+#define R1_APP_CMD (1 << 5) /* sr, c */
-#define R1_SPI_IDLE (1 << 0)
-#define R1_SPI_ERASE_RESET (1 << 1)
-#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
-#define R1_SPI_COM_CRC (1 << 3)
-#define R1_SPI_ERASE_SEQ (1 << 4)
-#define R1_SPI_ADDRESS (1 << 5)
-#define R1_SPI_PARAMETER (1 << 6)
+#define R1_SPI_IDLE (1 << 0)
+#define R1_SPI_ERASE_RESET (1 << 1)
+#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
+#define R1_SPI_COM_CRC (1 << 3)
+#define R1_SPI_ERASE_SEQ (1 << 4)
+#define R1_SPI_ADDRESS (1 << 5)
+#define R1_SPI_PARAMETER (1 << 6)
/* R1 bit 7 is always zero */
-#define R2_SPI_CARD_LOCKED (1 << 8)
-#define R2_SPI_WP_ERASE_SKIP (1 << 9) /* or lock/unlock fail */
-#define R2_SPI_LOCK_UNLOCK_FAIL R2_SPI_WP_ERASE_SKIP
-#define R2_SPI_ERROR (1 << 10)
-#define R2_SPI_CC_ERROR (1 << 11)
-#define R2_SPI_CARD_ECC_ERROR (1 << 12)
-#define R2_SPI_WP_VIOLATION (1 << 13)
-#define R2_SPI_ERASE_PARAM (1 << 14)
-#define R2_SPI_OUT_OF_RANGE (1 << 15) /* or CSD overwrite */
-#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
+#define R2_SPI_CARD_LOCKED (1 << 8)
+#define R2_SPI_WP_ERASE_SKIP (1 << 9) /* or lock/unlock fail */
+#define R2_SPI_LOCK_UNLOCK_FAIL R2_SPI_WP_ERASE_SKIP
+#define R2_SPI_ERROR (1 << 10)
+#define R2_SPI_CC_ERROR (1 << 11)
+#define R2_SPI_CARD_ECC_ERROR (1 << 12)
+#define R2_SPI_WP_VIOLATION (1 << 13)
+#define R2_SPI_ERASE_PARAM (1 << 14)
+#define R2_SPI_OUT_OF_RANGE (1 << 15) /* or CSD overwrite */
+#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
-#define CARD_BUSY 0x80000000 /* Card Power up status bit */
+#define CARD_BUSY 0x80000000 /* Card Power up status bit */
/* R5 response bits */
-#define R5_COM_CRC_ERROR (1 << 15)
-#define R5_ILLEGAL_COMMAND (1 << 14)
-#define R5_ERROR (1 << 11)
-#define R5_FUNCTION_NUMBER (1 << 9)
-#define R5_OUT_OF_RANGE (1 << 8)
-#define R5_STATUS(x) (x & 0xCB00)
-#define R5_IO_CURRENT_STATE(x) ((x & 0x3000) >> 12)
+#define R5_COM_CRC_ERROR (1 << 15)
+#define R5_ILLEGAL_COMMAND (1 << 14)
+#define R5_ERROR (1 << 11)
+#define R5_FUNCTION_NUMBER (1 << 9)
+#define R5_OUT_OF_RANGE (1 << 8)
+#define R5_STATUS(x) (x & 0xCB00)
+#define R5_IO_CURRENT_STATE(x) ((x & 0x3000) >> 12)
@@ -173,36 +173,36 @@ struct rt_mmcsd_req {
rt_inline rt_uint32_t __rt_fls(rt_uint32_t val)
{
- rt_uint32_t bit = 32;
+ rt_uint32_t bit = 32;
- if (!val)
- return 0;
- if (!(val & 0xffff0000u))
- {
- val <<= 16;
- bit -= 16;
- }
- if (!(val & 0xff000000u))
- {
- val <<= 8;
- bit -= 8;
- }
- if (!(val & 0xf0000000u))
- {
- val <<= 4;
- bit -= 4;
- }
- if (!(val & 0xc0000000u))
- {
- val <<= 2;
- bit -= 2;
- }
- if (!(val & 0x80000000u))
- {
- bit -= 1;
- }
+ if (!val)
+ return 0;
+ if (!(val & 0xffff0000u))
+ {
+ val <<= 16;
+ bit -= 16;
+ }
+ if (!(val & 0xff000000u))
+ {
+ val <<= 8;
+ bit -= 8;
+ }
+ if (!(val & 0xf0000000u))
+ {
+ val <<= 4;
+ bit -= 4;
+ }
+ if (!(val & 0xc0000000u))
+ {
+ val <<= 2;
+ bit -= 2;
+ }
+ if (!(val & 0x80000000u))
+ {
+ bit -= 1;
+ }
- return bit;
+ return bit;
}
#define MMCSD_HOST_PLUGED 0
@@ -234,7 +234,6 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void);
void mmcsd_free_host(struct rt_mmcsd_host *host);
int rt_mmcsd_core_init(void);
-int rt_mmcsd_blk_init(void);
rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card);
void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card);
diff --git a/components/drivers/include/drivers/mmcsd_host.h b/components/drivers/include/drivers/mmcsd_host.h
index 1253062aef..c7f673aeb1 100644
--- a/components/drivers/include/drivers/mmcsd_host.h
+++ b/components/drivers/include/drivers/mmcsd_host.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2011-07-25 weety first version
+ * Date Author Notes
+ * 2011-07-25 weety first version
*/
#ifndef __HOST_H__
@@ -18,33 +18,33 @@ extern "C" {
#endif
struct rt_mmcsd_io_cfg {
- rt_uint32_t clock; /* clock rate */
- rt_uint16_t vdd;
+ rt_uint32_t clock; /* clock rate */
+ rt_uint16_t vdd;
/* vdd stores the bit number of the selected voltage range from below. */
- rt_uint8_t bus_mode; /* command output mode */
+ rt_uint8_t bus_mode; /* command output mode */
-#define MMCSD_BUSMODE_OPENDRAIN 1
-#define MMCSD_BUSMODE_PUSHPULL 2
+#define MMCSD_BUSMODE_OPENDRAIN 1
+#define MMCSD_BUSMODE_PUSHPULL 2
- rt_uint8_t chip_select; /* SPI chip select */
+ rt_uint8_t chip_select; /* SPI chip select */
-#define MMCSD_CS_IGNORE 0
-#define MMCSD_CS_HIGH 1
-#define MMCSD_CS_LOW 2
+#define MMCSD_CS_IGNORE 0
+#define MMCSD_CS_HIGH 1
+#define MMCSD_CS_LOW 2
- rt_uint8_t power_mode; /* power supply mode */
+ rt_uint8_t power_mode; /* power supply mode */
-#define MMCSD_POWER_OFF 0
-#define MMCSD_POWER_UP 1
-#define MMCSD_POWER_ON 2
+#define MMCSD_POWER_OFF 0
+#define MMCSD_POWER_UP 1
+#define MMCSD_POWER_ON 2
- rt_uint8_t bus_width; /* data bus width */
+ rt_uint8_t bus_width; /* data bus width */
-#define MMCSD_BUS_WIDTH_1 0
-#define MMCSD_BUS_WIDTH_4 2
-#define MMCSD_BUS_WIDTH_8 3
+#define MMCSD_BUS_WIDTH_1 0
+#define MMCSD_BUS_WIDTH_4 2
+#define MMCSD_BUS_WIDTH_8 3
};
@@ -52,71 +52,71 @@ struct rt_mmcsd_host;
struct rt_mmcsd_req;
struct rt_mmcsd_host_ops {
- void (*request)(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);
- void (*set_iocfg)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
- rt_int32_t (*get_card_status)(struct rt_mmcsd_host *host);
- void (*enable_sdio_irq)(struct rt_mmcsd_host *host, rt_int32_t en);
+ void (*request)(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);
+ void (*set_iocfg)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
+ rt_int32_t (*get_card_status)(struct rt_mmcsd_host *host);
+ void (*enable_sdio_irq)(struct rt_mmcsd_host *host, rt_int32_t en);
};
struct rt_mmcsd_host {
- struct rt_mmcsd_card *card;
- const struct rt_mmcsd_host_ops *ops;
- rt_uint32_t freq_min;
- rt_uint32_t freq_max;
- struct rt_mmcsd_io_cfg io_cfg;
- rt_uint32_t valid_ocr; /* current valid OCR */
-#define VDD_165_195 (1 << 7) /* VDD voltage 1.65 - 1.95 */
-#define VDD_20_21 (1 << 8) /* VDD voltage 2.0 ~ 2.1 */
-#define VDD_21_22 (1 << 9) /* VDD voltage 2.1 ~ 2.2 */
-#define VDD_22_23 (1 << 10) /* VDD voltage 2.2 ~ 2.3 */
-#define VDD_23_24 (1 << 11) /* VDD voltage 2.3 ~ 2.4 */
-#define VDD_24_25 (1 << 12) /* VDD voltage 2.4 ~ 2.5 */
-#define VDD_25_26 (1 << 13) /* VDD voltage 2.5 ~ 2.6 */
-#define VDD_26_27 (1 << 14) /* VDD voltage 2.6 ~ 2.7 */
-#define VDD_27_28 (1 << 15) /* VDD voltage 2.7 ~ 2.8 */
-#define VDD_28_29 (1 << 16) /* VDD voltage 2.8 ~ 2.9 */
-#define VDD_29_30 (1 << 17) /* VDD voltage 2.9 ~ 3.0 */
-#define VDD_30_31 (1 << 18) /* VDD voltage 3.0 ~ 3.1 */
-#define VDD_31_32 (1 << 19) /* VDD voltage 3.1 ~ 3.2 */
-#define VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */
-#define VDD_33_34 (1 << 21) /* VDD voltage 3.3 ~ 3.4 */
-#define VDD_34_35 (1 << 22) /* VDD voltage 3.4 ~ 3.5 */
-#define VDD_35_36 (1 << 23) /* VDD voltage 3.5 ~ 3.6 */
- rt_uint32_t flags; /* define device capabilities */
-#define MMCSD_BUSWIDTH_4 (1 << 0)
-#define MMCSD_BUSWIDTH_8 (1 << 1)
-#define MMCSD_MUTBLKWRITE (1 << 2)
-#define MMCSD_HOST_IS_SPI (1 << 3)
-#define controller_is_spi(host) (host->flags & MMCSD_HOST_IS_SPI)
-#define MMCSD_SUP_SDIO_IRQ (1 << 4) /* support signal pending SDIO IRQs */
-#define MMCSD_SUP_HIGHSPEED (1 << 5) /* support high speed */
+ struct rt_mmcsd_card *card;
+ const struct rt_mmcsd_host_ops *ops;
+ rt_uint32_t freq_min;
+ rt_uint32_t freq_max;
+ struct rt_mmcsd_io_cfg io_cfg;
+ rt_uint32_t valid_ocr; /* current valid OCR */
+#define VDD_165_195 (1 << 7) /* VDD voltage 1.65 - 1.95 */
+#define VDD_20_21 (1 << 8) /* VDD voltage 2.0 ~ 2.1 */
+#define VDD_21_22 (1 << 9) /* VDD voltage 2.1 ~ 2.2 */
+#define VDD_22_23 (1 << 10) /* VDD voltage 2.2 ~ 2.3 */
+#define VDD_23_24 (1 << 11) /* VDD voltage 2.3 ~ 2.4 */
+#define VDD_24_25 (1 << 12) /* VDD voltage 2.4 ~ 2.5 */
+#define VDD_25_26 (1 << 13) /* VDD voltage 2.5 ~ 2.6 */
+#define VDD_26_27 (1 << 14) /* VDD voltage 2.6 ~ 2.7 */
+#define VDD_27_28 (1 << 15) /* VDD voltage 2.7 ~ 2.8 */
+#define VDD_28_29 (1 << 16) /* VDD voltage 2.8 ~ 2.9 */
+#define VDD_29_30 (1 << 17) /* VDD voltage 2.9 ~ 3.0 */
+#define VDD_30_31 (1 << 18) /* VDD voltage 3.0 ~ 3.1 */
+#define VDD_31_32 (1 << 19) /* VDD voltage 3.1 ~ 3.2 */
+#define VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */
+#define VDD_33_34 (1 << 21) /* VDD voltage 3.3 ~ 3.4 */
+#define VDD_34_35 (1 << 22) /* VDD voltage 3.4 ~ 3.5 */
+#define VDD_35_36 (1 << 23) /* VDD voltage 3.5 ~ 3.6 */
+ rt_uint32_t flags; /* define device capabilities */
+#define MMCSD_BUSWIDTH_4 (1 << 0)
+#define MMCSD_BUSWIDTH_8 (1 << 1)
+#define MMCSD_MUTBLKWRITE (1 << 2)
+#define MMCSD_HOST_IS_SPI (1 << 3)
+#define controller_is_spi(host) (host->flags & MMCSD_HOST_IS_SPI)
+#define MMCSD_SUP_SDIO_IRQ (1 << 4) /* support signal pending SDIO IRQs */
+#define MMCSD_SUP_HIGHSPEED (1 << 5) /* support high speed */
- rt_uint32_t max_seg_size; /* maximum size of one dma segment */
- rt_uint32_t max_dma_segs; /* maximum number of dma segments in one request */
- rt_uint32_t max_blk_size; /* maximum block size */
- rt_uint32_t max_blk_count; /* maximum block count */
+ rt_uint32_t max_seg_size; /* maximum size of one dma segment */
+ rt_uint32_t max_dma_segs; /* maximum number of dma segments in one request */
+ rt_uint32_t max_blk_size; /* maximum block size */
+ rt_uint32_t max_blk_count; /* maximum block count */
- rt_uint32_t spi_use_crc;
- struct rt_mutex bus_lock;
- struct rt_semaphore sem_ack;
+ rt_uint32_t spi_use_crc;
+ struct rt_mutex bus_lock;
+ struct rt_semaphore sem_ack;
- rt_uint32_t sdio_irq_num;
- struct rt_semaphore *sdio_irq_sem;
- struct rt_thread *sdio_irq_thread;
+ rt_uint32_t sdio_irq_num;
+ struct rt_semaphore *sdio_irq_sem;
+ struct rt_thread *sdio_irq_thread;
- void *private_data;
+ void *private_data;
};
rt_inline void mmcsd_delay_ms(rt_uint32_t ms)
{
- if (ms < 1000 / RT_TICK_PER_SECOND)
- {
- rt_thread_delay(1);
- }
- else
- {
- rt_thread_delay(ms/(1000 / RT_TICK_PER_SECOND));
- }
+ if (ms < 1000 / RT_TICK_PER_SECOND)
+ {
+ rt_thread_delay(1);
+ }
+ else
+ {
+ rt_thread_delay(ms/(1000 / RT_TICK_PER_SECOND));
+ }
}
#ifdef __cplusplus
diff --git a/components/drivers/include/drivers/mtd_nand.h b/components/drivers/include/drivers/mtd_nand.h
index f7675aede6..a452da61dd 100644
--- a/components/drivers/include/drivers/mtd_nand.h
+++ b/components/drivers/include/drivers/mtd_nand.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/mtd_nor.h b/components/drivers/include/drivers/mtd_nor.h
index 32a952f374..5573c54920 100644
--- a/components/drivers/include/drivers/mtd_nor.h
+++ b/components/drivers/include/drivers/mtd_nor.h
@@ -1,11 +1,11 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
- * 2012-5-30 Bernard the first version
+ * 2012-5-30 Bernard the first version
*/
#ifndef __MTD_NOR_H__
@@ -14,54 +14,54 @@
#include <rtdevice.h>
struct rt_mtd_nor_driver_ops;
-#define RT_MTD_NOR_DEVICE(device) ((struct rt_mtd_nor_device*)(device))
+#define RT_MTD_NOR_DEVICE(device) ((struct rt_mtd_nor_device*)(device))
struct rt_mtd_nor_device
{
- struct rt_device parent;
+ struct rt_device parent;
- rt_uint32_t block_size; /* The Block size in the flash */
- rt_uint32_t block_start; /* The start of available block*/
- rt_uint32_t block_end; /* The end of available block */
+ rt_uint32_t block_size; /* The Block size in the flash */
+ rt_uint32_t block_start; /* The start of available block*/
+ rt_uint32_t block_end; /* The end of available block */
- /* operations interface */
- const struct rt_mtd_nor_driver_ops* ops;
+ /* operations interface */
+ const struct rt_mtd_nor_driver_ops* ops;
};
struct rt_mtd_nor_driver_ops
{
- rt_err_t (*read_id) (struct rt_mtd_nor_device* device);
+ rt_err_t (*read_id) (struct rt_mtd_nor_device* device);
- rt_size_t (*read) (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_uint32_t length);
- rt_size_t (*write) (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length);
+ rt_size_t (*read) (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_uint32_t length);
+ rt_size_t (*write) (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length);
- rt_err_t (*erase_block)(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint32_t length);
+ rt_err_t (*erase_block)(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint32_t length);
};
rt_err_t rt_mtd_nor_register_device(const char* name, struct rt_mtd_nor_device* device);
rt_inline rt_uint32_t rt_mtd_nor_read_id(struct rt_mtd_nor_device* device)
{
- return device->ops->read_id(device);
+ return device->ops->read_id(device);
}
rt_inline rt_size_t rt_mtd_nor_read(
- struct rt_mtd_nor_device* device,
- rt_off_t offset, rt_uint8_t* data, rt_uint32_t length)
+ struct rt_mtd_nor_device* device,
+ rt_off_t offset, rt_uint8_t* data, rt_uint32_t length)
{
- return device->ops->read(device, offset, data, length);
+ return device->ops->read(device, offset, data, length);
}
rt_inline rt_size_t rt_mtd_nor_write(
- struct rt_mtd_nor_device* device,
- rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length)
+ struct rt_mtd_nor_device* device,
+ rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length)
{
- return device->ops->write(device, offset, data, length);
+ return device->ops->write(device, offset, data, length);
}
rt_inline rt_err_t rt_mtd_nor_erase_block(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length)
{
- return device->ops->erase_block(device, offset, length);
+ return device->ops->erase_block(device, offset, length);
}
#endif
diff --git a/components/drivers/include/drivers/phy.h b/components/drivers/include/drivers/phy.h
index 2d1ad9f91f..e1783fe328 100644
--- a/components/drivers/include/drivers/phy.h
+++ b/components/drivers/include/drivers/phy.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/phy_mdio.h b/components/drivers/include/drivers/phy_mdio.h
index d978ec2984..fdef455db2 100644
--- a/components/drivers/include/drivers/phy_mdio.h
+++ b/components/drivers/include/drivers/phy_mdio.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/pin.h b/components/drivers/include/drivers/pin.h
index f5b2ded9f6..38e5abea2a 100644
--- a/components/drivers/include/drivers/pin.h
+++ b/components/drivers/include/drivers/pin.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -13,7 +13,6 @@
#define PIN_H__
#include <rtthread.h>
-#include <rtdevice.h>
#ifdef __cplusplus
extern "C" {
@@ -68,8 +67,6 @@ struct rt_pin_ops
void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_base_t mode);
void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_base_t value);
int (*pin_read)(struct rt_device *device, rt_base_t pin);
-
- /* TODO: add GPIO interrupt */
rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_int32_t pin,
rt_uint32_t mode, void (*hdr)(void *args), void *args);
rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_int32_t pin);
@@ -79,8 +76,6 @@ struct rt_pin_ops
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);
@@ -88,6 +83,8 @@ rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode,
void (*hdr)(void *args), void *args);
rt_err_t rt_pin_detach_irq(rt_int32_t pin);
rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);
+/* Get pin number by name,such as PA.0,P0.12 */
+rt_base_t rt_pin_get(const char *name);
#ifdef __cplusplus
}
diff --git a/components/drivers/include/drivers/pm.h b/components/drivers/include/drivers/pm.h
index f28283dcf8..d38c0a4e2a 100644
--- a/components/drivers/include/drivers/pm.h
+++ b/components/drivers/include/drivers/pm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -15,6 +15,7 @@
#ifndef __PM_H__
#define __PM_H__
+#include <stdint.h>
#include <rtthread.h>
#ifndef PM_HAS_CUSTOM_CONFIG
diff --git a/components/drivers/include/drivers/pulse_encoder.h b/components/drivers/include/drivers/pulse_encoder.h
index 0c7df04cd6..38ef7652b9 100644
--- a/components/drivers/include/drivers/pulse_encoder.h
+++ b/components/drivers/include/drivers/pulse_encoder.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/rt_drv_pwm.h b/components/drivers/include/drivers/rt_drv_pwm.h
index 7a8e17b916..72e34428e6 100644
--- a/components/drivers/include/drivers/rt_drv_pwm.h
+++ b/components/drivers/include/drivers/rt_drv_pwm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/rt_inputcapture.h b/components/drivers/include/drivers/rt_inputcapture.h
index 40cd55883d..813ed3157b 100644
--- a/components/drivers/include/drivers/rt_inputcapture.h
+++ b/components/drivers/include/drivers/rt_inputcapture.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/rtc.h b/components/drivers/include/drivers/rtc.h
index 1cd88a7be3..0bafbad7ad 100644
--- a/components/drivers/include/drivers/rtc.h
+++ b/components/drivers/include/drivers/rtc.h
@@ -1,20 +1,50 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-10-10 aozima first version.
+ * 2021-06-11 iysheng implement RTC framework V2.0
+ * 2021-07-30 Meco Man move rtc_core.h to rtc.h
*/
#ifndef __RTC_H__
#define __RTC_H__
+#include <rtdef.h>
+
+#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10 /**< get second time */
+#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11 /**< set second time */
+#define RT_DEVICE_CTRL_RTC_GET_TIME_US 0x12 /**< get microsecond time */
+#define RT_DEVICE_CTRL_RTC_SET_TIME_US 0x13 /**< set microsecond time */
+#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x14 /**< get alarm */
+#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x15 /**< set alarm */
+
+struct rt_rtc_ops
+{
+ rt_err_t (*init)(void);
+ rt_err_t (*get_secs)(void *arg);
+ rt_err_t (*set_secs)(void *arg);
+ rt_err_t (*get_alarm)(void *arg);
+ rt_err_t (*set_alarm)(void *arg);
+ rt_err_t (*get_usecs)(void *arg);
+ rt_err_t (*set_usecs)(void *arg);
+};
+
+typedef struct rt_rtc_device
+{
+ struct rt_device parent;
+ const struct rt_rtc_ops *ops;
+} rt_rtc_dev_t;
+
+rt_err_t rt_hw_rtc_register(rt_rtc_dev_t *rtc,
+ const char *name,
+ rt_uint32_t flag,
+ void *data);
+
rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day);
rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second);
-int rt_soft_rtc_init(void);
-int rt_rtc_ntp_sync_init(void);
-
#endif /* __RTC_H__ */
diff --git a/components/drivers/include/drivers/sd.h b/components/drivers/include/drivers/sd.h
index e096df9372..450f23e65b 100644
--- a/components/drivers/include/drivers/sd.h
+++ b/components/drivers/include/drivers/sd.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/drivers/sdio.h b/components/drivers/include/drivers/sdio.h
index e4bf4a048f..212d8cfb52 100644
--- a/components/drivers/include/drivers/sdio.h
+++ b/components/drivers/include/drivers/sdio.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -174,10 +174,10 @@ rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
rt_int32_t op_code,
rt_uint8_t *buf,
rt_uint32_t len);
-rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
+rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
rt_uint32_t reg,
rt_int32_t *err);
-rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
+rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
rt_uint32_t reg,
rt_uint8_t data);
rt_uint16_t sdio_io_readw(struct rt_sdio_function *func,
@@ -192,19 +192,19 @@ rt_uint32_t sdio_io_readl(struct rt_sdio_function *func,
rt_int32_t sdio_io_writel(struct rt_sdio_function *func,
rt_uint32_t data,
rt_uint32_t addr);
-rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len);
-rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len);
-rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len);
-rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len);
diff --git a/components/drivers/include/drivers/sdio_func_ids.h b/components/drivers/include/drivers/sdio_func_ids.h
index 79085a5933..76502ff6ea 100644
--- a/components/drivers/include/drivers/sdio_func_ids.h
+++ b/components/drivers/include/drivers/sdio_func_ids.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -7,7 +7,7 @@
* Date Author Notes
* 2012-02-26 weety first version
*/
-
+
#ifndef __SDIO_FUNC_IDS_H__
#define __SDIO_FUNC_IDS_H__
diff --git a/components/drivers/include/drivers/sensor.h b/components/drivers/include/drivers/sensor.h
new file mode 100644
index 0000000000..ede8d11c99
--- /dev/null
+++ b/components/drivers/include/drivers/sensor.h
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-01-31 flybreak first version
+ */
+
+#ifndef __SENSOR_H__
+#define __SENSOR_H__
+
+#include <rtthread.h>
+#include "pin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef RT_USING_RTC
+#define rt_sensor_get_ts() time(RT_NULL) /* API for the sensor to get the timestamp */
+#else
+#define rt_sensor_get_ts() rt_tick_get() /* API for the sensor to get the timestamp */
+#endif
+
+#define RT_PIN_NONE 0xFFFF /* RT PIN NONE */
+#define RT_DEVICE_FLAG_FIFO_RX 0x200 /* Flag to use when the sensor is open by fifo mode */
+
+#define RT_SENSOR_MODULE_MAX (3) /* The maximum number of members of a sensor module */
+
+/* Sensor types */
+
+#define RT_SENSOR_CLASS_NONE (0)
+#define RT_SENSOR_CLASS_ACCE (1) /* Accelerometer */
+#define RT_SENSOR_CLASS_GYRO (2) /* Gyroscope */
+#define RT_SENSOR_CLASS_MAG (3) /* Magnetometer */
+#define RT_SENSOR_CLASS_TEMP (4) /* Temperature */
+#define RT_SENSOR_CLASS_HUMI (5) /* Relative Humidity */
+#define RT_SENSOR_CLASS_BARO (6) /* Barometer */
+#define RT_SENSOR_CLASS_LIGHT (7) /* Ambient light */
+#define RT_SENSOR_CLASS_PROXIMITY (8) /* Proximity */
+#define RT_SENSOR_CLASS_HR (9) /* Heart Rate */
+#define RT_SENSOR_CLASS_TVOC (10) /* TVOC Level */
+#define RT_SENSOR_CLASS_NOISE (11) /* Noise Loudness */
+#define RT_SENSOR_CLASS_STEP (12) /* Step sensor */
+#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 */
+#define RT_SENSOR_CLASS_TOF (17) /* TOF sensor */
+#define RT_SENSOR_CLASS_SPO2 (18) /* SpO2 sensor */
+
+/* Sensor vendor types */
+
+#define RT_SENSOR_VENDOR_UNKNOWN (0)
+#define RT_SENSOR_VENDOR_STM (1) /* STMicroelectronics */
+#define RT_SENSOR_VENDOR_BOSCH (2) /* Bosch */
+#define RT_SENSOR_VENDOR_INVENSENSE (3) /* Invensense */
+#define RT_SENSOR_VENDOR_SEMTECH (4) /* Semtech */
+#define RT_SENSOR_VENDOR_GOERTEK (5) /* Goertek */
+#define RT_SENSOR_VENDOR_MIRAMEMS (6) /* MiraMEMS */
+#define RT_SENSOR_VENDOR_DALLAS (7) /* Dallas */
+#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 */
+
+#define RT_SENSOR_UNIT_NONE (0)
+#define RT_SENSOR_UNIT_MG (1) /* Accelerometer unit: mG */
+#define RT_SENSOR_UNIT_MDPS (2) /* Gyroscope unit: mdps */
+#define RT_SENSOR_UNIT_MGAUSS (3) /* Magnetometer unit: mGauss */
+#define RT_SENSOR_UNIT_LUX (4) /* Ambient light unit: lux */
+#define RT_SENSOR_UNIT_CM (5) /* Distance unit: cm */
+#define RT_SENSOR_UNIT_PA (6) /* Barometer unit: pa */
+#define RT_SENSOR_UNIT_PERMILLAGE (7) /* Relative Humidity unit: permillage */
+#define RT_SENSOR_UNIT_DCELSIUS (8) /* Temperature unit: dCelsius */
+#define RT_SENSOR_UNIT_HZ (9) /* Frequency unit: HZ */
+#define RT_SENSOR_UNIT_ONE (10) /* Dimensionless quantity unit: 1 */
+#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 */
+
+#define RT_SENSOR_INTF_I2C (1 << 0)
+#define RT_SENSOR_INTF_SPI (1 << 1)
+#define RT_SENSOR_INTF_UART (1 << 2)
+#define RT_SENSOR_INTF_ONEWIRE (1 << 3)
+
+/* Sensor power mode types */
+
+#define RT_SENSOR_POWER_NONE (0)
+#define RT_SENSOR_POWER_DOWN (1) /* power down mode */
+#define RT_SENSOR_POWER_NORMAL (2) /* normal-power mode */
+#define RT_SENSOR_POWER_LOW (3) /* low-power mode */
+#define RT_SENSOR_POWER_HIGH (4) /* high-power mode */
+
+/* Sensor work mode types */
+
+#define RT_SENSOR_MODE_NONE (0)
+#define RT_SENSOR_MODE_POLLING (1) /* One shot only read a data */
+#define RT_SENSOR_MODE_INT (2) /* TODO: One shot interrupt only read a data */
+#define RT_SENSOR_MODE_FIFO (3) /* TODO: One shot interrupt read all fifo data */
+
+/* Sensor control cmd types */
+
+#define RT_SENSOR_CTRL_GET_ID (0) /* Get device id */
+#define RT_SENSOR_CTRL_GET_INFO (1) /* Get sensor info */
+#define RT_SENSOR_CTRL_SET_RANGE (2) /* Set the measure range of sensor. unit is info of sensor */
+#define RT_SENSOR_CTRL_SET_ODR (3) /* Set output date rate. unit is HZ */
+#define RT_SENSOR_CTRL_SET_MODE (4) /* Set sensor's work mode. ex. RT_SENSOR_MODE_POLLING,RT_SENSOR_MODE_INT */
+#define RT_SENSOR_CTRL_SET_POWER (5) /* Set power mode. args type of sensor power mode. ex. RT_SENSOR_POWER_DOWN,RT_SENSOR_POWER_NORMAL */
+#define RT_SENSOR_CTRL_SELF_TEST (6) /* Take a self test */
+
+#define RT_SENSOR_CTRL_USER_CMD_START 0x100 /* User commands should be greater than 0x100 */
+
+struct rt_sensor_info
+{
+ rt_uint8_t type; /* The sensor type */
+ rt_uint8_t vendor; /* Vendor of sensors */
+ const char *model; /* model name of sensor */
+ rt_uint8_t unit; /* unit of measurement */
+ rt_uint8_t intf_type; /* Communication interface type */
+ rt_int32_t range_max; /* maximum range of this sensor's value. unit is 'unit' */
+ rt_int32_t range_min; /* minimum range of this sensor's value. unit is 'unit' */
+ rt_uint32_t period_min; /* Minimum measurement period,unit:ms. zero = not a constant rate */
+ rt_uint8_t fifo_max;
+};
+
+struct rt_sensor_intf
+{
+ char *dev_name; /* The name of the communication device */
+ rt_uint8_t type; /* Communication interface type */
+ void *user_data; /* Private data for the sensor. ex. i2c addr,spi cs,control I/O */
+};
+
+struct rt_sensor_config
+{
+ struct rt_sensor_intf intf; /* sensor interface config */
+ struct rt_device_pin_mode irq_pin; /* Interrupt pin, The purpose of this pin is to notification read data */
+ rt_uint8_t mode; /* sensor work mode */
+ rt_uint8_t power; /* sensor power mode */
+ rt_uint16_t odr; /* sensor out data rate */
+ rt_int32_t range; /* sensor range of measurement */
+};
+
+typedef struct rt_sensor_device *rt_sensor_t;
+
+struct rt_sensor_device
+{
+ struct rt_device parent; /* The standard device */
+
+ struct rt_sensor_info info; /* The sensor info data */
+ struct rt_sensor_config config; /* The sensor config data */
+
+ void *data_buf; /* The buf of the data received */
+ rt_size_t data_len; /* The size of the data received */
+
+ const struct rt_sensor_ops *ops; /* The sensor ops */
+
+ struct rt_sensor_module *module; /* The sensor module */
+
+ rt_err_t (*irq_handle)(rt_sensor_t sensor); /* Called when an interrupt is generated, registered by the driver */
+};
+
+struct rt_sensor_module
+{
+ rt_mutex_t lock; /* The module lock */
+
+ rt_sensor_t sen[RT_SENSOR_MODULE_MAX]; /* The module contains a list of sensors */
+ rt_uint8_t sen_num; /* Number of sensors contained in the module */
+};
+
+/* 3-axis Data Type */
+struct sensor_3_axis
+{
+ rt_int32_t x;
+ rt_int32_t y;
+ 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 */
+ rt_uint8_t type; /* The sensor type of the data */
+ union
+ {
+ 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) */
+ rt_int32_t light; /* Light. unit: lux */
+ rt_int32_t proximity; /* Distance. unit: centimeters */
+ rt_int32_t hr; /* Heart rate. unit: bpm */
+ rt_int32_t tvoc; /* TVOC. unit: permillage */
+ rt_int32_t noise; /* Noise Loudness. unit: HZ */
+ rt_uint32_t step; /* Step sensor. unit: 1 */
+ rt_int32_t force; /* Force sensor. unit: mN */
+ rt_uint32_t dust; /* Dust sensor. unit: ug/m3 */
+ rt_uint32_t eco2; /* eCO2 sensor. unit: ppm */
+ rt_uint32_t spo2; /* SpO2 sensor. unit: permillage */
+ } data;
+};
+
+struct rt_sensor_ops
+{
+ rt_size_t (*fetch_data)(struct rt_sensor_device *sensor, void *buf, rt_size_t len);
+ rt_err_t (*control)(struct rt_sensor_device *sensor, int cmd, void *arg);
+};
+
+int rt_hw_sensor_register(rt_sensor_t sensor,
+ const char *name,
+ rt_uint32_t flag,
+ void *data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SENSOR_H__ */
diff --git a/components/drivers/include/drivers/serial.h b/components/drivers/include/drivers/serial.h
index 45095af63f..f0d0edbfad 100644
--- a/components/drivers/include/drivers/serial.h
+++ b/components/drivers/include/drivers/serial.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -77,6 +77,9 @@
#define RT_SERIAL_TX_DATAQUEUE_SIZE 2048
#define RT_SERIAL_TX_DATAQUEUE_LWM 30
+#define RT_SERIAL_FLOWCONTROL_CTSRTS 1
+#define RT_SERIAL_FLOWCONTROL_NONE 0
+
/* Default config for serial_configure structure */
#define RT_SERIAL_CONFIG_DEFAULT \
{ \
@@ -87,6 +90,7 @@
BIT_ORDER_LSB, /* LSB first sent */ \
NRZ_NORMAL, /* Normal mode */ \
RT_SERIAL_RB_BUFSZ, /* Buffer size */ \
+ RT_SERIAL_FLOWCONTROL_NONE, /* Off flowcontrol */ \
0 \
}
@@ -100,11 +104,12 @@ struct serial_configure
rt_uint32_t bit_order :1;
rt_uint32_t invert :1;
rt_uint32_t bufsz :16;
- rt_uint32_t reserved :6;
+ rt_uint32_t flowcontrol :1;
+ rt_uint32_t reserved :5;
};
/*
- * Serial FIFO mode
+ * Serial FIFO mode
*/
struct rt_serial_rx_fifo
{
@@ -121,7 +126,7 @@ struct rt_serial_tx_fifo
struct rt_completion completion;
};
-/*
+/*
* Serial DMA mode
*/
struct rt_serial_rx_dma
diff --git a/components/drivers/include/drivers/serial_v2.h b/components/drivers/include/drivers/serial_v2.h
new file mode 100644
index 0000000000..3ba46bdcdd
--- /dev/null
+++ b/components/drivers/include/drivers/serial_v2.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-06-01 KyleChan first version
+ */
+
+#ifndef __SERIAL_V2_H__
+#define __SERIAL_V2_H__
+
+#include <rtthread.h>
+
+#define BAUD_RATE_2400 2400
+#define BAUD_RATE_4800 4800
+#define BAUD_RATE_9600 9600
+#define BAUD_RATE_19200 19200
+#define BAUD_RATE_38400 38400
+#define BAUD_RATE_57600 57600
+#define BAUD_RATE_115200 115200
+#define BAUD_RATE_230400 230400
+#define BAUD_RATE_460800 460800
+#define BAUD_RATE_921600 921600
+#define BAUD_RATE_2000000 2000000
+#define BAUD_RATE_3000000 3000000
+
+#define DATA_BITS_5 5
+#define DATA_BITS_6 6
+#define DATA_BITS_7 7
+#define DATA_BITS_8 8
+#define DATA_BITS_9 9
+
+#define STOP_BITS_1 0
+#define STOP_BITS_2 1
+#define STOP_BITS_3 2
+#define STOP_BITS_4 3
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#define PARITY_NONE 0
+#define PARITY_ODD 1
+#define PARITY_EVEN 2
+#endif
+
+#define BIT_ORDER_LSB 0
+#define BIT_ORDER_MSB 1
+
+#define NRZ_NORMAL 0 /* Non Return to Zero : normal mode */
+#define NRZ_INVERTED 1 /* Non Return to Zero : inverted mode */
+
+#define RT_DEVICE_FLAG_RX_BLOCKING 0x1000
+#define RT_DEVICE_FLAG_RX_NON_BLOCKING 0x2000
+
+#define RT_DEVICE_FLAG_TX_BLOCKING 0x4000
+#define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000
+
+#define RT_SERIAL_RX_BLOCKING RT_DEVICE_FLAG_RX_BLOCKING
+#define RT_SERIAL_RX_NON_BLOCKING RT_DEVICE_FLAG_RX_NON_BLOCKING
+#define RT_SERIAL_TX_BLOCKING RT_DEVICE_FLAG_TX_BLOCKING
+#define RT_SERIAL_TX_NON_BLOCKING RT_DEVICE_FLAG_TX_NON_BLOCKING
+
+#define RT_DEVICE_CHECK_OPTMODE 0x20
+
+#define RT_SERIAL_EVENT_RX_IND 0x01 /* Rx indication */
+#define RT_SERIAL_EVENT_TX_DONE 0x02 /* Tx complete */
+#define RT_SERIAL_EVENT_RX_DMADONE 0x03 /* Rx DMA transfer done */
+#define RT_SERIAL_EVENT_TX_DMADONE 0x04 /* Tx DMA transfer done */
+#define RT_SERIAL_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */
+
+#define RT_SERIAL_ERR_OVERRUN 0x01
+#define RT_SERIAL_ERR_FRAMING 0x02
+#define RT_SERIAL_ERR_PARITY 0x03
+
+#define RT_SERIAL_TX_DATAQUEUE_SIZE 2048
+#define RT_SERIAL_TX_DATAQUEUE_LWM 30
+
+#define RT_SERIAL_RX_MINBUFSZ 64
+#define RT_SERIAL_TX_MINBUFSZ 64
+
+#define RT_SERIAL_TX_BLOCKING_BUFFER 1
+#define RT_SERIAL_TX_BLOCKING_NO_BUFFER 0
+
+/* Default config for serial_configure structure */
+#define RT_SERIAL_CONFIG_DEFAULT \
+{ \
+ BAUD_RATE_115200, /* 115200 bits/s */ \
+ DATA_BITS_8, /* 8 databits */ \
+ STOP_BITS_1, /* 1 stopbit */ \
+ PARITY_NONE, /* No parity */ \
+ BIT_ORDER_LSB, /* LSB first sent */ \
+ NRZ_NORMAL, /* Normal mode */ \
+ RT_SERIAL_RX_MINBUFSZ, /* rxBuf size */ \
+ RT_SERIAL_TX_MINBUFSZ, /* txBuf size */ \
+ 0 \
+}
+
+struct serial_configure
+{
+ rt_uint32_t baud_rate;
+
+ rt_uint32_t data_bits :4;
+ rt_uint32_t stop_bits :2;
+ rt_uint32_t parity :2;
+ rt_uint32_t bit_order :1;
+ rt_uint32_t invert :1;
+ rt_uint32_t rx_bufsz :16;
+ rt_uint32_t tx_bufsz :16;
+ rt_uint32_t reserved :6;
+};
+
+/*
+ * Serial Receive FIFO mode
+ */
+struct rt_serial_rx_fifo
+{
+ struct rt_ringbuffer rb;
+
+ struct rt_completion rx_cpt;
+
+ rt_uint16_t rx_cpt_index;
+
+ /* software fifo */
+ rt_uint8_t buffer[];
+};
+
+/*
+ * Serial Transmit FIFO mode
+ */
+struct rt_serial_tx_fifo
+{
+ struct rt_ringbuffer rb;
+
+ rt_size_t put_size;
+
+ rt_bool_t activated;
+
+ struct rt_completion tx_cpt;
+
+ /* software fifo */
+ rt_uint8_t buffer[];
+};
+
+struct rt_serial_device
+{
+ struct rt_device parent;
+
+ const struct rt_uart_ops *ops;
+ struct serial_configure config;
+
+ void *serial_rx;
+ void *serial_tx;
+};
+
+/**
+ * uart operators
+ */
+struct rt_uart_ops
+{
+ rt_err_t (*configure)(struct rt_serial_device *serial,
+ struct serial_configure *cfg);
+
+ rt_err_t (*control)(struct rt_serial_device *serial,
+ int cmd,
+ void *arg);
+
+ int (*putc)(struct rt_serial_device *serial, char c);
+ int (*getc)(struct rt_serial_device *serial);
+
+ rt_size_t (*transmit)(struct rt_serial_device *serial,
+ rt_uint8_t *buf,
+ rt_size_t size,
+ rt_uint32_t tx_flag);
+};
+
+void rt_hw_serial_isr(struct rt_serial_device *serial, int event);
+
+rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
+ const char *name,
+ rt_uint32_t flag,
+ void *data);
+
+#endif
diff --git a/components/drivers/include/drivers/spi.h b/components/drivers/include/drivers/spi.h
index d92518cd94..018d12139b 100644
--- a/components/drivers/include/drivers/spi.h
+++ b/components/drivers/include/drivers/spi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -151,7 +151,7 @@ struct rt_qspi_configuration
};
struct rt_qspi_device
-{
+{
struct rt_spi_device parent;
struct rt_qspi_configuration config;
diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h
index 4d85a85e35..920a85e61b 100644
--- a/components/drivers/include/drivers/usb_common.h
+++ b/components/drivers/include/drivers/usb_common.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -112,7 +112,7 @@ extern "C" {
#define USB_STRING_CONFIG_INDEX 0x04
#define USB_STRING_INTERFACE_INDEX 0x05
#define USB_STRING_OS_INDEX 0x06
-#define USB_STRING_MAX USB_STRING_OS_INDEX
+#define USB_STRING_MAX 0xff
#define USB_STRING_OS "MSFT100A"
@@ -301,7 +301,7 @@ struct uconfig_descriptor
rt_uint8_t iConfiguration;
rt_uint8_t bmAttributes;
rt_uint8_t MaxPower;
- rt_uint8_t data[256];
+ rt_uint8_t data[2048];
};
typedef struct uconfig_descriptor* ucfg_desc_t;
@@ -427,14 +427,14 @@ struct usb_os_proerty
};
typedef struct usb_os_proerty * usb_os_proerty_t;
-// Value Description
-// 1 A NULL-terminated Unicode String (REG_SZ)
-// 2 A NULL-terminated Unicode String that includes environment variables (REG_EXPAND_SZ)
-// 3 Free-form binary (REG_BINARY)
-// 4 A little-endian 32-bit integer (REG_DWORD_LITTLE_ENDIAN)
-// 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)
+// Value Description
+// 1 A NULL-terminated Unicode String (REG_SZ)
+// 2 A NULL-terminated Unicode String that includes environment variables (REG_EXPAND_SZ)
+// 3 Free-form binary (REG_BINARY)
+// 4 A little-endian 32-bit integer (REG_DWORD_LITTLE_ENDIAN)
+// 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_PROPERTY_TYPE_REG_SZ 0x01UL
#define USB_OS_PROPERTY_TYPE_REG_EXPAND_SZ 0x02UL
#define USB_OS_PROPERTY_TYPE_REG_BINARY 0x03UL
diff --git a/components/drivers/include/drivers/usb_device.h b/components/drivers/include/drivers/usb_device.h
index 26f0c4cf4a..3ce051dfaa 100644
--- a/components/drivers/include/drivers/usb_device.h
+++ b/components/drivers/include/drivers/usb_device.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -34,6 +34,10 @@ extern "C" {
#define _PRODUCT_ID 0x0001
#endif
+#ifndef MAX_INTF_STR
+#define MAX_INTF_STR 20
+#endif
+
#define USB_BCD_DEVICE 0x0200 /* USB Specification Release Number in Binary-Coded Decimal */
#define USB_BCD_VERSION 0x0200 /* USB 2.0 */
#define EP0_IN_ADDR 0x80
@@ -62,12 +66,12 @@ struct ufunction;
struct udevice;
struct uendpoint;
-typedef enum
+typedef enum
{
/* request to read full count */
UIO_REQUEST_READ_FULL,
/* request to read any count */
- UIO_REQUEST_READ_BEST,
+ UIO_REQUEST_READ_BEST,
/* request to write full count */
UIO_REQUEST_WRITE,
}UIO_REQUEST_TYPE;
@@ -85,7 +89,7 @@ struct udcd_ops
rt_size_t (*ep_write)(rt_uint8_t address, void *buffer, rt_size_t size);
rt_err_t (*ep0_send_status)(void);
rt_err_t (*suspend)(void);
- rt_err_t (*wakeup)(void);
+ rt_err_t (*wakeup)(void);
};
struct ep_id
@@ -193,7 +197,7 @@ struct udevice
struct usb_qualifier_descriptor * dev_qualifier;
usb_os_comp_id_desc_t os_comp_id_desc;
const char** str;
-
+ const char *str_intf[MAX_INTF_STR];
udevice_state_t state;
rt_list_t cfg_list;
uconfig_t curr_cfg;
@@ -215,10 +219,10 @@ enum udev_msg_type
USB_MSG_SETUP_NOTIFY,
USB_MSG_DATA_NOTIFY,
USB_MSG_EP0_OUT,
- USB_MSG_EP_CLEAR_FEATURE,
+ USB_MSG_EP_CLEAR_FEATURE,
USB_MSG_SOF,
USB_MSG_RESET,
- USB_MSG_PLUG_IN,
+ USB_MSG_PLUG_IN,
/* we don't need to add a "PLUG_IN" event because after the cable is
* plugged in(before any SETUP) the classed have nothing to do. If the host
* is ready, it will send RESET and we will have USB_MSG_RESET. So, a RESET
@@ -260,6 +264,7 @@ rt_err_t rt_usbd_event_signal(struct udev_msg* msg);
rt_err_t rt_usbd_device_set_controller(udevice_t device, udcd_t dcd);
rt_err_t rt_usbd_device_set_descriptor(udevice_t device, udev_desc_t dev_desc);
rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring);
+rt_err_t rt_usbd_device_set_interface_string(udevice_t device, int index, const char* string);
rt_err_t rt_usbd_device_set_qualifier(udevice_t device, struct usb_qualifier_descriptor* qualifier);
rt_err_t rt_usbd_device_set_os_comp_id_desc(udevice_t device, usb_os_comp_id_desc_t os_comp_id_desc);
rt_err_t rt_usbd_device_add_config(udevice_t device, uconfig_t cfg);
@@ -279,7 +284,7 @@ uintf_t rt_usbd_find_interface(udevice_t device, rt_uint8_t value, ufunction_t *
uep_t rt_usbd_find_endpoint(udevice_t device, ufunction_t* pfunc, rt_uint8_t ep_addr);
rt_size_t rt_usbd_io_request(udevice_t device, uep_t ep, uio_request_t req);
rt_size_t rt_usbd_ep0_write(udevice_t device, void *buffer, rt_size_t size);
-rt_size_t rt_usbd_ep0_read(udevice_t device, void *buffer, rt_size_t size,
+rt_size_t rt_usbd_ep0_read(udevice_t device, void *buffer, rt_size_t size,
rt_err_t (*rx_ind)(udevice_t device, rt_size_t size));
int rt_usbd_vcom_class_register(void);
@@ -396,7 +401,7 @@ rt_inline rt_err_t dcd_ep0_send_status(udcd_t dcd)
}
rt_inline rt_err_t dcd_ep_set_stall(udcd_t dcd, rt_uint8_t address)
-{
+{
RT_ASSERT(dcd != RT_NULL);
RT_ASSERT(dcd->ops != RT_NULL);
RT_ASSERT(dcd->ops->ep_set_stall != RT_NULL);
diff --git a/components/drivers/include/drivers/usb_host.h b/components/drivers/include/drivers/usb_host.h
index f8e4b52f8b..95dd1ff066 100644
--- a/components/drivers/include/drivers/usb_host.h
+++ b/components/drivers/include/drivers/usb_host.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -45,10 +45,10 @@ struct uclass_driver
rt_list_t list;
int class_code;
int subclass_code;
-
+
rt_err_t (*enable)(void* arg);
rt_err_t (*disable)(void* arg);
-
+
void* user_data;
};
typedef struct uclass_driver* ucd_t;
@@ -57,9 +57,9 @@ struct uprotocal
{
rt_list_t list;
int pro_id;
-
+
rt_err_t (*init)(void* arg);
- rt_err_t (*callback)(void* arg);
+ rt_err_t (*callback)(void* arg);
};
typedef struct uprotocal* uprotocal_t;
@@ -78,13 +78,13 @@ struct uinstance
rt_uint8_t status;
rt_uint8_t type;
rt_uint8_t index;
- rt_uint8_t address;
+ rt_uint8_t address;
rt_uint8_t speed;
- rt_uint8_t max_packet_size;
+ rt_uint8_t max_packet_size;
rt_uint8_t port;
struct uhub* parent_hub;
- struct uhintf* intf[USB_MAX_INTERFACE];
+ struct uhintf* intf[USB_MAX_INTERFACE];
};
typedef struct uinstance* uinst_t;
@@ -114,14 +114,14 @@ struct uhub
struct uhub_descriptor hub_desc;
rt_uint8_t num_ports;
rt_uint32_t port_status[USB_HUB_PORT_NUM];
- struct uinstance* child[USB_HUB_PORT_NUM];
+ struct uinstance* child[USB_HUB_PORT_NUM];
rt_bool_t is_roothub;
- rt_uint8_t buffer[8];
+ rt_uint8_t buffer[8];
struct uinstance* self;
struct uhcd *hcd;
-};
+};
typedef struct uhub* uhub_t;
struct uhcd_ops
@@ -129,7 +129,7 @@ struct uhcd_ops
rt_err_t (*reset_port) (rt_uint8_t port);
int (*pipe_xfer) (upipe_t pipe, rt_uint8_t token, void* buffer, int nbytes, int timeout);
rt_err_t (*open_pipe) (upipe_t pipe);
- rt_err_t (*close_pipe) (upipe_t pipe);
+ rt_err_t (*close_pipe) (upipe_t pipe);
};
typedef struct uhcd_ops* uhcd_ops_t;
struct uhcd
@@ -151,11 +151,11 @@ typedef enum uhost_msg_type uhost_msg_type;
struct uhost_msg
{
- uhost_msg_type type;
+ uhost_msg_type type;
union
{
struct uhub* hub;
- struct
+ struct
{
func_callback function;
void *context;
@@ -195,14 +195,14 @@ ucd_t rt_usbh_class_driver_storage(void);
/* usb hub interface */
-rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer,
+rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer,
rt_size_t size);
rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint32_t* buffer);
-rt_err_t rt_usbh_hub_get_port_status(uhub_t uhub, rt_uint16_t port,
+rt_err_t rt_usbh_hub_get_port_status(uhub_t uhub, rt_uint16_t port,
rt_uint32_t* buffer);
-rt_err_t rt_usbh_hub_clear_port_feature(uhub_t uhub, rt_uint16_t port,
+rt_err_t rt_usbh_hub_clear_port_feature(uhub_t uhub, rt_uint16_t port,
rt_uint16_t feature);
-rt_err_t rt_usbh_hub_set_port_feature(uhub_t uhub, rt_uint16_t port,
+rt_err_t rt_usbh_hub_set_port_feature(uhub_t uhub, rt_uint16_t port,
rt_uint16_t feature);
rt_err_t rt_usbh_hub_reset_port(uhub_t uhub, rt_uint16_t port);
rt_err_t rt_usbh_event_signal(uhcd_t uhcd, struct uhost_msg* msg);
diff --git a/components/drivers/include/drivers/watchdog.h b/components/drivers/include/drivers/watchdog.h
index f80ded58aa..9489ac2810 100644
--- a/components/drivers/include/drivers/watchdog.h
+++ b/components/drivers/include/drivers/watchdog.h
@@ -1,6 +1,6 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
diff --git a/components/drivers/include/drivers/wlan.h b/components/drivers/include/drivers/wlan.h
index 724e61da78..b5b4f73586 100644
--- a/components/drivers/include/drivers/wlan.h
+++ b/components/drivers/include/drivers/wlan.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/ipc/completion.h b/components/drivers/include/ipc/completion.h
index acfcaa3995..087a9be813 100644
--- a/components/drivers/include/ipc/completion.h
+++ b/components/drivers/include/ipc/completion.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/ipc/dataqueue.h b/components/drivers/include/ipc/dataqueue.h
index 76203c404d..5dd94e55c0 100644
--- a/components/drivers/include/ipc/dataqueue.h
+++ b/components/drivers/include/ipc/dataqueue.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/ipc/pipe.h b/components/drivers/include/ipc/pipe.h
index 93ba95cd2c..a45e8ae002 100644
--- a/components/drivers/include/ipc/pipe.h
+++ b/components/drivers/include/ipc/pipe.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/ipc/poll.h b/components/drivers/include/ipc/poll.h
index 8c68a96af8..1574215c77 100644
--- a/components/drivers/include/ipc/poll.h
+++ b/components/drivers/include/ipc/poll.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/include/ipc/ringblk_buf.h b/components/drivers/include/ipc/ringblk_buf.h
index 94fc2cfff3..df05659f3e 100644
--- a/components/drivers/include/ipc/ringblk_buf.h
+++ b/components/drivers/include/ipc/ringblk_buf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -76,9 +76,12 @@ typedef struct rt_rbb *rt_rbb_t;
/* rbb (ring block buffer) API */
void rt_rbb_init(rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t block_set, rt_size_t blk_max_num);
+rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb);
+
+#ifdef RT_USING_HEAP
rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num);
void rt_rbb_destroy(rt_rbb_t rbb);
-rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb);
+#endif
/* rbb block API */
rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size);
diff --git a/components/drivers/include/ipc/ringbuffer.h b/components/drivers/include/ipc/ringbuffer.h
index 2afd2ca213..7da50225b3 100644
--- a/components/drivers/include/ipc/ringbuffer.h
+++ b/components/drivers/include/ipc/ringbuffer.h
@@ -1,10 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
+ * 2021-08-14 Jackistang add comments for function interface.
*/
#ifndef RINGBUFFER_H__
#define RINGBUFFER_H__
@@ -80,6 +81,13 @@ struct rt_ringbuffer* rt_ringbuffer_create(rt_uint16_t length);
void rt_ringbuffer_destroy(struct rt_ringbuffer *rb);
#endif
+/**
+ * @brief Get the buffer size of the ring buffer object.
+ *
+ * @param rb A pointer to the ring buffer object.
+ *
+ * @return Buffer size.
+ */
rt_inline rt_uint16_t rt_ringbuffer_get_size(struct rt_ringbuffer *rb)
{
RT_ASSERT(rb != RT_NULL);
diff --git a/components/drivers/include/ipc/waitqueue.h b/components/drivers/include/ipc/waitqueue.h
index e26ec1e896..fbf5f93142 100644
--- a/components/drivers/include/ipc/waitqueue.h
+++ b/components/drivers/include/ipc/waitqueue.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
- * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon
+ * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon
* to blocked thread.
*/
diff --git a/components/drivers/include/ipc/workqueue.h b/components/drivers/include/ipc/workqueue.h
index 23e256c420..776709a8ab 100644
--- a/components/drivers/include/ipc/workqueue.h
+++ b/components/drivers/include/ipc/workqueue.h
@@ -1,10 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
+ * 2021-08-01 Meco Man remove rt_delayed_work_init() and rt_delayed_work structure
+ * 2021-08-14 Jackistang add comments for rt_work_init()
*/
#ifndef WORKQUEUE_H__
#define WORKQUEUE_H__
@@ -29,6 +31,7 @@ enum
struct rt_workqueue
{
rt_list_t work_list;
+ rt_list_t delayed_list;
struct rt_work *work_current; /* current work */
struct rt_semaphore sem;
@@ -47,11 +50,6 @@ struct rt_work
struct rt_workqueue *workqueue;
};
-struct rt_delayed_work
-{
- struct rt_work work;
-};
-
#ifdef RT_USING_HEAP
/**
* WorkQueue for DeviceDriver
@@ -62,12 +60,21 @@ rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time);
rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
+rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
+rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work);
#ifdef RT_USING_SYSTEM_WORKQUEUE
rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time);
rt_err_t rt_work_cancel(struct rt_work *work);
-#endif
+#endif /* RT_USING_SYSTEM_WORKQUEUE */
+/**
+ * @brief Initialize a work item, binding with a callback function.
+ *
+ * @param work A pointer to the work item object.
+ * @param work_func A callback function that will be called when this work item is executed.
+ * @param work_data A user data passed to the callback function as the second parameter.
+ */
rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data),
void *work_data)
{
@@ -79,10 +86,6 @@ rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_wo
work->type = 0;
}
-void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct rt_work *work,
- void *work_data), void *work_data);
-
-int rt_work_sys_workqueue_init(void);
-#endif
+#endif /* RT_USING_HEAP */
#endif
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index f0fa2f5b4a..07a2be361e 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -57,7 +57,11 @@ extern "C" {
#endif /* RT_USING_USB_HOST */
#ifdef RT_USING_SERIAL
+#ifdef RT_USING_SERIAL_V2
+#include "drivers/serial_v2.h"
+#else
#include "drivers/serial.h"
+#endif
#endif /* RT_USING_SERIAL */
#ifdef RT_USING_I2C
@@ -78,70 +82,76 @@ extern "C" {
#include "drivers/mmcsd_core.h"
#include "drivers/sd.h"
#include "drivers/sdio.h"
-#endif
+#endif /* RT_USING_SDIO */
+
#ifdef RT_USING_WDT
#include "drivers/watchdog.h"
-#endif
+#endif /* RT_USING_WDT */
#ifdef RT_USING_PIN
#include "drivers/pin.h"
-#endif
+#endif /* RT_USING_PIN */
+
+#ifdef RT_USING_SENSOR
+#include "drivers/sensor.h"
+#endif /* RT_USING_SENSOR */
#ifdef RT_USING_CAN
#include "drivers/can.h"
-#endif
+#endif /* RT_USING_CAN */
#ifdef RT_USING_HWTIMER
#include "drivers/hwtimer.h"
-#endif
+#endif /* RT_USING_HWTIMER */
#ifdef RT_USING_AUDIO
#include "drivers/audio.h"
-#endif
+#endif /* RT_USING_AUDIO */
#ifdef RT_USING_CPUTIME
#include "drivers/cputime.h"
-#endif
+#endif /* RT_USING_CPUTIME */
#ifdef RT_USING_ADC
#include "drivers/adc.h"
-#endif
+#endif /* RT_USING_ADC */
#ifdef RT_USING_DAC
#include "drivers/dac.h"
-#endif
+#endif /* RT_USING_DAC */
#ifdef RT_USING_PWM
#include "drivers/rt_drv_pwm.h"
-#endif
+#endif /* RT_USING_PWM */
#ifdef RT_USING_PM
#include "drivers/pm.h"
-#endif
+#endif /* RT_USING_PM */
#ifdef RT_USING_WIFI
#include "drivers/wlan.h"
-#endif
+#endif /* RT_USING_WIFI */
#ifdef MTD_USING_NOR
#include "drivers/mtdnor.h"
-#endif
+#endif /* MTD_USING_NOR */
+
#ifdef MTD_USING_NAND
#include "drivers/mtdnand.h"
-#endif
+#endif /* MTD_USING_NAND */
#ifdef RT_USING_HWCRYPTO
#include "drivers/crypto.h"
-#endif
+#endif /* RT_USING_HWCRYPTO */
#ifdef RT_USING_PULSE_ENCODER
#include "drivers/pulse_encoder.h"
-#endif
+#endif /* RT_USING_PULSE_ENCODER */
#ifdef RT_USING_INPUT_CAPTURE
#include "drivers/rt_inputcapture.h"
-#endif
+#endif /* RT_USING_INPUT_CAPTURE */
#ifdef __cplusplus
}
diff --git a/components/drivers/misc/adc.c b/components/drivers/misc/adc.c
index 2d26beb243..a73fcc54e3 100644
--- a/components/drivers/misc/adc.c
+++ b/components/drivers/misc/adc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -144,7 +144,7 @@ rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel)
return result;
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
static int adc(int argc, char **argv)
{
@@ -232,4 +232,4 @@ static int adc(int argc, char **argv)
}
MSH_CMD_EXPORT(adc, adc function);
-#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */
diff --git a/components/drivers/misc/dac.c b/components/drivers/misc/dac.c
index 336c78d018..45b90d2106 100644
--- a/components/drivers/misc/dac.c
+++ b/components/drivers/misc/dac.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -141,14 +141,14 @@ rt_err_t rt_dac_disabled(rt_dac_device_t dev, rt_uint32_t channel)
return result;
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
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"))
@@ -228,4 +228,4 @@ static int dac(int argc, char **argv)
}
MSH_CMD_EXPORT(dac, dac function);
-#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */
diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c
index 6f27fe516d..666d221fa6 100644
--- a/components/drivers/misc/pin.c
+++ b/components/drivers/misc/pin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -47,7 +47,7 @@ static rt_size_t _pin_write(rt_device_t dev, rt_off_t pos, const void *buffer, r
return size;
}
-static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args)
+static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args)
{
struct rt_device_pin_mode *mode;
struct rt_device_pin *pin = (struct rt_device_pin *)dev;
@@ -111,6 +111,7 @@ rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode,
}
return -RT_ENOSYS;
}
+
rt_err_t rt_pin_detach_irq(rt_int32_t pin)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
@@ -146,7 +147,7 @@ void rt_pin_write(rt_base_t pin, rt_base_t value)
}
FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_write, pinWrite, write value to hardware pin);
-int rt_pin_read(rt_base_t pin)
+int rt_pin_read(rt_base_t pin)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
return _hw_pin.ops->pin_read(&_hw_pin.parent, pin);
@@ -157,7 +158,7 @@ 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;
@@ -166,4 +167,3 @@ rt_base_t rt_pin_get(const char *name)
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/misc/pulse_encoder.c b/components/drivers/misc/pulse_encoder.c
index 3145c24675..5afb12664a 100644
--- a/components/drivers/misc/pulse_encoder.c
+++ b/components/drivers/misc/pulse_encoder.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/misc/rt_drv_pwm.c b/components/drivers/misc/rt_drv_pwm.c
index 572580c45c..04895868e2 100644
--- a/components/drivers/misc/rt_drv_pwm.c
+++ b/components/drivers/misc/rt_drv_pwm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -198,7 +198,7 @@ rt_err_t rt_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *c
FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_enable, pwm_enable, enable pwm by channel.);
FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_set, pwm_set, set pwm.);
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
static int pwm_enable(int argc, char **argv)
{
int result = 0;
@@ -323,5 +323,5 @@ _exit:
}
MSH_CMD_EXPORT(pwm_get, pwm_get <pwm_dev> <channel>);
-#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */
#endif /* RT_USING_FINSH */
diff --git a/components/drivers/misc/rt_inputcapture.c b/components/drivers/misc/rt_inputcapture.c
index d1886186d7..134bbcee96 100644
--- a/components/drivers/misc/rt_inputcapture.c
+++ b/components/drivers/misc/rt_inputcapture.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/mtd/mtd_nand.c b/components/drivers/mtd/mtd_nand.c
index ae5aa9c172..f516f9b147 100644
--- a/components/drivers/mtd/mtd_nand.c
+++ b/components/drivers/mtd/mtd_nand.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -278,7 +278,7 @@ int mtd_nand_erase_all(const char *name)
return 0;
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
static void mtd_nand(int argc, char **argv)
{
/* If the number of arguments less than 2 */
@@ -346,16 +346,16 @@ help:
}
}
MSH_CMD_EXPORT(mtd_nand, MTD nand device test function);
-#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */
-#ifndef FINSH_USING_MSH_ONLY
+#ifndef RT_USING_FINSH_ONLY
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nandid, nand_id, read ID - nandid(name));
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_read, nand_read, read page in nand - nand_read(name, block, page));
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_readoob, nand_readoob, read spare data in nand - nand_readoob(name, block, page));
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_write, nand_write, write dump data to nand - nand_write(name, block, page));
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_erase, nand_erase, nand_erase(name, block));
FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_erase_all, nand_erase_all, erase all of nand device - nand_erase_all(name, block));
-#endif /* FINSH_USING_MSH_ONLY */
+#endif /* RT_USING_FINSH_ONLY */
#endif /* defined(RT_MTD_NAND_DEBUG) && defined(RT_USING_FINSH) */
diff --git a/components/drivers/mtd/mtd_nor.c b/components/drivers/mtd/mtd_nor.c
index b941f9236d..fd5ceb0d9f 100644
--- a/components/drivers/mtd/mtd_nor.c
+++ b/components/drivers/mtd/mtd_nor.c
@@ -1,6 +1,6 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
@@ -52,7 +52,7 @@ static rt_err_t _mtd_control(rt_device_t dev, int cmd, void *args)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops mtd_nor_ops =
+const static struct rt_device_ops mtd_nor_ops =
{
_mtd_init,
_mtd_open,
diff --git a/components/drivers/phy/phy.c b/components/drivers/phy/phy.c
index 3ed4a1a265..87152a306e 100644
--- a/components/drivers/phy/phy.c
+++ b/components/drivers/phy/phy.c
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,7 +8,7 @@
* Date Author Notes
* 2020-09-27 wangqiang first version
*/
-
+#include <stddef.h>
#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
@@ -34,9 +34,9 @@ static rt_size_t phy_device_write(rt_device_t dev, rt_off_t pos, const void *buf
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops phy_ops =
+const static struct rt_device_ops phy_ops =
{
- RT_NULL,
+ RT_NULL,
RT_NULL,
RT_NULL,
phy_device_read,
diff --git a/components/drivers/pm/pm.c b/components/drivers/pm/pm.c
index 743a184555..cf488a9ce1 100644
--- a/components/drivers/pm/pm.c
+++ b/components/drivers/pm/pm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -54,7 +54,7 @@ static int _pm_device_suspend(rt_uint8_t mode)
{
ret = _pm.device_pm[index].ops->suspend(_pm.device_pm[index].device, mode);
if(ret != RT_EOK)
- break;
+ break;
}
}
@@ -836,12 +836,10 @@ rt_uint32_t rt_pm_module_get_status(void)
rt_uint32_t req_status = 0x00;
pm = &_pm;
- for (index = 0; index < 32; index ++)
+ for (index = 0; index < PM_MODULE_MAX_ID; index ++)
{
if (pm->module_status[index].req_status == 0x01)
req_status |= 1<<index;
- if (index >= PM_MODULE_MAX_ID)
- break;
}
return req_status;
diff --git a/components/drivers/rtc/README.md b/components/drivers/rtc/README.md
index 23010cf4b7..dff71f9d67 100644
--- a/components/drivers/rtc/README.md
+++ b/components/drivers/rtc/README.md
@@ -55,26 +55,11 @@ msh />date 2018 02 16 01 15 30 # 设置当前时间为 2018-02-16 01:15:30
msh />
```
-### 2.4 启用 NTP 时间自动同步
-
-如果 RT-Thread 已接入互联网,可启用 NTP 时间自动同步功能,定期同步本地时间。
-
-在 menuconfig 中启用 `RTC_SYNC_USING_NTP` 配置。启用该功能后,会自动开启 [netutils package](https://github.com/RT-Thread-packages/netutils) 的 NTP 功能。同时务必确保 RT-Thread 网络访问正常。
-
-启用该配置后,还有两个配置是用户可选配置:
-
-- `RTC_NTP_FIRST_SYNC_DELAY`: 首次执行 NTP 时间同步的延时。延时的目的在于,给网络连接预留一定的时间,尽量提高第一次执行 NTP 时间同步时的成功率。默认时间为 30S;
-- `RTC_NTP_SYNC_PERIOD`: NTP 自动同步周期,单位为秒,默认一小时(即 3600S)同步一次。
-
-> 注意:如果没有使用组件自动初始化功能,则需手动调用 `int rt_rtc_ntp_sync_init(void)` ,完成该功能初始化。
-
-### 2.5 启用 Soft RTC (软件模拟 RTC)
+### 2.4 启用 Soft RTC (软件模拟 RTC)
这个模式非常适用于对时间精度要求不高,没有硬件 RTC 的产品。
-#### 2.5.1 使用方法
+#### 2.4.1 使用方法
在 menuconfig 中启用 `RT_USING_SOFT_RTC` 配置。
-> 注意:如果没有使用组件自动初始化功能,则需手动调用 `int rt_soft_rtc_init(void)` ,完成该功能初始化。
-
diff --git a/components/drivers/rtc/SConscript b/components/drivers/rtc/SConscript
index e1f8f433c1..6ec8bcb3c5 100644
--- a/components/drivers/rtc/SConscript
+++ b/components/drivers/rtc/SConscript
@@ -3,21 +3,15 @@ from building import *
cwd = GetCurrentDir()
src = []
-rtc = ['rtc.c']
-
-rtc_alarm = ['alarm.c']
-
-soft_rtc = ['soft_rtc.c']
-
CPPPATH = [cwd + '/../include']
group = []
if GetDepend(['RT_USING_RTC']):
- src = src + rtc
+ src = src + ['rtc.c']
if GetDepend(['RT_USING_ALARM']):
- src = src + rtc_alarm
+ src = src + ['alarm.c']
if GetDepend(['RT_USING_SOFT_RTC']):
- src = src + soft_rtc
+ src = src + ['soft_rtc.c']
group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_RTC'], CPPPATH = CPPPATH)
diff --git a/components/drivers/rtc/alarm.c b/components/drivers/rtc/alarm.c
index d8e4e468a7..2bcc51f2ee 100644
--- a/components/drivers/rtc/alarm.c
+++ b/components/drivers/rtc/alarm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -777,7 +777,7 @@ void rt_alarm_dump(void)
rt_kprintf("+----+---------------------+------+------+----+\n");
}
-FINSH_FUNCTION_EXPORT_ALIAS(rt_alarm_dump, __cmd_alarm_dump, dump alarm info);
+MSH_CMD_EXPORT_ALIAS(rt_alarm_dump, rt_alarm_dump, dump alarm info);
/** \brief initialize alarm service system
*
diff --git a/components/drivers/rtc/rtc.c b/components/drivers/rtc/rtc.c
index ef688ac3cd..bc75c83e7d 100644
--- a/components/drivers/rtc/rtc.c
+++ b/components/drivers/rtc/rtc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -9,25 +9,130 @@
* 2012-04-12 aozima optimization: find rtc device only first.
* 2012-04-16 aozima add scheduler lock for set_date and set_time.
* 2018-02-16 armink add auto sync time by NTP
+ * 2021-05-09 Meco Man remove NTP
+ * 2021-06-11 iysheng implement RTC framework V2.0
+ * 2021-07-30 Meco Man move rtc_core.c to rtc.c
*/
-#include <sys/time.h>
+#include <time.h>
#include <string.h>
+#include <stdlib.h>
#include <rtthread.h>
+#include <drivers/rtc.h>
#ifdef RT_USING_RTC
-/* Using NTP auto sync RTC time */
-#ifdef RTC_SYNC_USING_NTP
-/* NTP first sync delay time for network connect, unit: second */
-#ifndef RTC_NTP_FIRST_SYNC_DELAY
-#define RTC_NTP_FIRST_SYNC_DELAY (30)
-#endif
-/* NTP sync period, unit: second */
-#ifndef RTC_NTP_SYNC_PERIOD
-#define RTC_NTP_SYNC_PERIOD (1L*60L*60L)
-#endif
-#endif /* RTC_SYNC_USING_NTP */
+/*
+ * This function initializes rtc_core
+ */
+static rt_err_t rt_rtc_init(struct rt_device *dev)
+{
+ rt_rtc_dev_t *rtc_core;
+
+ RT_ASSERT(dev != RT_NULL);
+ rtc_core = (rt_rtc_dev_t *)dev;
+ if (rtc_core->ops->init)
+ {
+ return (rtc_core->ops->init());
+ }
+
+ return -RT_ENOSYS;
+}
+
+static rt_err_t rt_rtc_open(struct rt_device *dev, rt_uint16_t oflag)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_rtc_close(struct rt_device *dev)
+{
+ /* Add close member function in rt_rtc_ops when need,
+ * then call that function here.
+ * */
+ return RT_EOK;
+}
+
+static rt_err_t rt_rtc_control(struct rt_device *dev, int cmd, void *args)
+{
+#define TRY_DO_RTC_FUNC(rt_rtc_dev, func_name, args) \
+ rt_rtc_dev->ops->func_name ? rt_rtc_dev->ops->func_name(args) : -RT_EINVAL;
+
+ rt_rtc_dev_t *rtc_device;
+ rt_err_t ret = -RT_EINVAL;
+
+ RT_ASSERT(dev != RT_NULL);
+ rtc_device = (rt_rtc_dev_t *)dev;
+
+ switch (cmd)
+ {
+ case RT_DEVICE_CTRL_RTC_GET_TIME:
+ ret = TRY_DO_RTC_FUNC(rtc_device, get_secs, args);
+ break;
+ case RT_DEVICE_CTRL_RTC_SET_TIME:
+ ret = TRY_DO_RTC_FUNC(rtc_device, set_secs, args);
+ break;
+ case RT_DEVICE_CTRL_RTC_GET_TIME_US:
+ ret = TRY_DO_RTC_FUNC(rtc_device, get_usecs, args);
+ break;
+ case RT_DEVICE_CTRL_RTC_SET_TIME_US:
+ ret = TRY_DO_RTC_FUNC(rtc_device, set_usecs, args);
+ break;
+ case RT_DEVICE_CTRL_RTC_GET_ALARM:
+ ret = TRY_DO_RTC_FUNC(rtc_device, get_alarm, args);
+ break;
+ case RT_DEVICE_CTRL_RTC_SET_ALARM:
+ ret = TRY_DO_RTC_FUNC(rtc_device, set_alarm, args);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+#undef TRY_DO_RTC_FUNC
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops rtc_core_ops =
+{
+ rt_rtc_init,
+ rt_rtc_open,
+ rt_rtc_close,
+ RT_NULL,
+ RT_NULL,
+ rt_rtc_control,
+};
+#endif /* RT_USING_DEVICE_OPS */
+
+rt_err_t rt_hw_rtc_register(rt_rtc_dev_t *rtc,
+ const char *name,
+ rt_uint32_t flag,
+ void *data)
+{
+ struct rt_device *device;
+ RT_ASSERT(rtc != RT_NULL);
+
+ device = &(rtc->parent);
+
+ device->type = RT_Device_Class_RTC;
+ device->rx_indicate = RT_NULL;
+ device->tx_complete = RT_NULL;
+
+#ifdef RT_USING_DEVICE_OPS
+ device->ops = &rtc_core_ops;
+#else
+ device->init = rt_rtc_init;
+ device->open = rt_rtc_open;
+ device->close = rt_rtc_close;
+ device->read = RT_NULL;
+ device->write = RT_NULL;
+ device->control = rt_rtc_control;
+#endif /* RT_USING_DEVICE_OPS */
+ device->user_data = data;
+
+ /* register a character device */
+ return rt_device_register(device, name, flag);
+}
/**
* Set system date(time not modify, local timezone).
@@ -37,12 +142,10 @@
* @param rt_uint32_t day e.g: 31.
*
* @return rt_err_t if set success, return RT_EOK.
- *
*/
rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
{
time_t now;
- struct tm *p_tm;
struct tm tm_new;
rt_device_t device;
rt_err_t ret = -RT_ERROR;
@@ -50,14 +153,8 @@ rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
/* get current time */
now = time(RT_NULL);
- /* lock scheduler. */
- rt_enter_critical();
/* converts calendar time into local time. */
- p_tm = localtime(&now);
- /* copy the statically located variable */
- rt_memcpy(&tm_new, p_tm, sizeof(struct tm));
- /* unlock scheduler. */
- rt_exit_critical();
+ localtime_r(&now, &tm_new);
/* update date. */
tm_new.tm_year = year - 1900;
@@ -87,12 +184,10 @@ rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
* @param rt_uint32_t second e.g: 0~59.
*
* @return rt_err_t if set success, return RT_EOK.
- *
*/
rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
{
time_t now;
- struct tm *p_tm;
struct tm tm_new;
rt_device_t device;
rt_err_t ret = -RT_ERROR;
@@ -100,14 +195,8 @@ rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
/* get current time */
now = time(RT_NULL);
- /* lock scheduler. */
- rt_enter_critical();
/* converts calendar time into local time. */
- p_tm = localtime(&now);
- /* copy the statically located variable */
- rt_memcpy(&tm_new, p_tm, sizeof(struct tm));
- /* unlock scheduler. */
- rt_exit_critical();
+ localtime_r(&now, &tm_new);
/* update time. */
tm_new.tm_hour = hour;
@@ -129,71 +218,12 @@ rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
return ret;
}
-#ifdef RTC_SYNC_USING_NTP
-static void ntp_sync_thread_enrty(void *param)
-{
- extern time_t ntp_sync_to_rtc(const char *host_name);
- /* first sync delay for network connect */
- rt_thread_delay(RTC_NTP_FIRST_SYNC_DELAY * RT_TICK_PER_SECOND);
-
- while (1)
- {
- ntp_sync_to_rtc(NULL);
- rt_thread_delay(RTC_NTP_SYNC_PERIOD * RT_TICK_PER_SECOND);
- }
-}
-
-int rt_rtc_ntp_sync_init(void)
-{
- static rt_bool_t init_ok = RT_FALSE;
- rt_thread_t thread;
-
- if (init_ok)
- {
- return 0;
- }
-
- thread = rt_thread_create("ntp_sync", ntp_sync_thread_enrty, RT_NULL, 1536, 26, 2);
- if (thread)
- {
- rt_thread_startup(thread);
- }
- else
- {
- return -RT_ENOMEM;
- }
-
- init_ok = RT_TRUE;
-
- return RT_EOK;
-}
-INIT_COMPONENT_EXPORT(rt_rtc_ntp_sync_init);
-#endif /* RTC_SYNC_USING_NTP */
-
#ifdef RT_USING_FINSH
#include <finsh.h>
-#include <rtdevice.h>
-
-/**
- * show date and time (local timezone)
- */
-void list_date(void)
-{
- time_t now;
-
- now = time(RT_NULL);
- rt_kprintf("%.*s\n", 25, ctime(&now));
-}
-FINSH_FUNCTION_EXPORT(list_date, show date and time (local timezone))
-FINSH_FUNCTION_EXPORT(set_date, set date(local timezone) e.g: set_date(2010,2,28))
-FINSH_FUNCTION_EXPORT(set_time, set time(local timezone) e.g: set_time(23,59,59))
-
-
-#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
/**
* get date and time or set (local timezone) [year month day hour min sec]
*/
-static void date(uint8_t argc, char **argv)
+static void date(int argc, char **argv)
{
if (argc == 1)
{
@@ -205,8 +235,9 @@ static void date(uint8_t argc, char **argv)
else if (argc >= 7)
{
/* set time and date */
- uint16_t year;
- uint8_t month, day, hour, min, sec;
+ rt_uint16_t year;
+ rt_uint8_t month, day, hour, min, sec;
+
year = atoi(argv[1]);
month = atoi(argv[2]);
day = atoi(argv[3]);
@@ -252,9 +283,7 @@ static void date(uint8_t argc, char **argv)
rt_kprintf("e.g: date 2018 01 01 23 59 59 or date\n");
}
}
-MSH_CMD_EXPORT(list_date, show date and time (local timezone))
MSH_CMD_EXPORT(date, get date and time or set (local timezone) [year month day hour min sec])
-
-#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
#endif /* RT_USING_FINSH */
+
#endif /* RT_USING_RTC */
diff --git a/components/drivers/rtc/soft_rtc.c b/components/drivers/rtc/soft_rtc.c
index 240301f683..255579f35e 100644
--- a/components/drivers/rtc/soft_rtc.c
+++ b/components/drivers/rtc/soft_rtc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -93,7 +93,7 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops soft_rtc_ops =
+const static struct rt_device_ops soft_rtc_ops =
{
RT_NULL,
RT_NULL,
@@ -104,7 +104,7 @@ const static struct rt_device_ops soft_rtc_ops =
};
#endif
-int rt_soft_rtc_init(void)
+static int rt_soft_rtc_init(void)
{
static rt_bool_t init_ok = RT_FALSE;
struct tm time_new = SOFT_RTC_TIME_DEFAULT;
diff --git a/components/drivers/sdio/block_dev.c b/components/drivers/sdio/block_dev.c
index 602acb9aa7..2acbc44fa3 100644
--- a/components/drivers/sdio/block_dev.c
+++ b/components/drivers/sdio/block_dev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -76,7 +76,7 @@ rt_int32_t mmcsd_num_wr_blocks(struct rt_mmcsd_card *card)
timeout_us += data.timeout_clks * 1000 /
(card->host->io_cfg.clock / 1000);
- if (timeout_us > 100000)
+ if (timeout_us > 100000)
{
data.timeout_ns = 100000000;
data.timeout_clks = 0;
@@ -119,9 +119,9 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
req.cmd = &cmd;
req.data = &data;
-
+
cmd.arg = sector;
- if (!(card->flags & CARD_FLAG_SDHC))
+ if (!(card->flags & CARD_FLAG_SDHC))
{
cmd.arg <<= 9;
}
@@ -130,7 +130,7 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
data.blksize = SECTOR_SIZE;
data.blks = blks;
- if (blks > 1)
+ if (blks > 1)
{
if (!controller_is_spi(card->host) || !dir)
{
@@ -149,7 +149,7 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
w_cmd = WRITE_BLOCK;
}
- if (!dir)
+ if (!dir)
{
cmd.cmd_code = r_cmd;
data.flags |= DATA_DIR_READ;
@@ -164,9 +164,9 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
data.buf = buf;
mmcsd_send_request(host, &req);
- if (!controller_is_spi(card->host) && dir != 0)
+ if (!controller_is_spi(card->host) && dir != 0)
{
- do
+ do
{
rt_int32_t err;
@@ -174,7 +174,7 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
cmd.arg = card->rca << 16;
cmd.flags = RESP_R1 | CMD_AC;
err = mmcsd_send_cmd(card->host, &cmd, 5);
- if (err)
+ if (err)
{
LOG_E("error %d requesting status", err);
break;
@@ -190,7 +190,7 @@ static rt_err_t rt_mmcsd_req_blk(struct rt_mmcsd_card *card,
mmcsd_host_unlock(host);
- if (cmd.err || data.err || stop.err)
+ if (cmd.err || data.err || stop.err)
{
LOG_E("mmcsd request blocks error");
LOG_E("%d,%d,%d, 0x%08x,0x%08x",
@@ -264,7 +264,7 @@ static rt_size_t rt_mmcsd_read(rt_device_t dev,
rt_sem_release(part->lock);
/* the length of reading must align to SECTOR SIZE */
- if (err)
+ if (err)
{
rt_set_errno(-EIO);
return 0;
@@ -305,7 +305,7 @@ static rt_size_t rt_mmcsd_write(rt_device_t dev,
rt_sem_release(part->lock);
/* the length of reading must align to SECTOR SIZE */
- if (err)
+ if (err)
{
rt_set_errno(-EIO);
@@ -330,7 +330,7 @@ static rt_int32_t mmcsd_set_blksize(struct rt_mmcsd_card *card)
err = mmcsd_send_cmd(card->host, &cmd, 5);
mmcsd_host_unlock(card->host);
- if (err)
+ if (err)
{
LOG_E("MMCSD: unable to set block size to %d: %d", cmd.arg, err);
@@ -341,7 +341,7 @@ static rt_int32_t mmcsd_set_blksize(struct rt_mmcsd_card *card)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops mmcsd_blk_ops =
+const static struct rt_device_ops mmcsd_blk_ops =
{
rt_mmcsd_init,
rt_mmcsd_open,
@@ -362,7 +362,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
struct mmcsd_blk_device *blk_dev = RT_NULL;
err = mmcsd_set_blksize(card);
- if(err)
+ if(err)
{
return err;
}
@@ -384,15 +384,15 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
for (i = 0; i < RT_MMCSD_MAX_PARTITION; i++)
{
blk_dev = rt_calloc(1, sizeof(struct mmcsd_blk_device));
- if (!blk_dev)
+ if (!blk_dev)
{
LOG_E("mmcsd:malloc memory failed!");
break;
}
- blk_dev->max_req_size = BLK_MIN((card->host->max_dma_segs *
- card->host->max_seg_size) >> 9,
- (card->host->max_blk_count *
+ blk_dev->max_req_size = BLK_MIN((card->host->max_dma_segs *
+ card->host->max_seg_size) >> 9,
+ (card->host->max_blk_count *
card->host->max_blk_size) >> 9);
/* get the first partition */
@@ -402,7 +402,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
rt_snprintf(dname, 4, "sd%d", i);
rt_snprintf(sname, 8, "sem_sd%d", i);
blk_dev->part.lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO);
-
+
/* register mmcsd device */
blk_dev->dev.type = RT_Device_Class_Block;
#ifdef RT_USING_DEVICE_OPS
@@ -418,11 +418,11 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
blk_dev->dev.user_data = blk_dev;
blk_dev->card = card;
-
+
blk_dev->geometry.bytes_per_sector = 1<<9;
blk_dev->geometry.block_size = card->card_blksize;
blk_dev->geometry.sector_count = blk_dev->part.size;
-
+
rt_device_register(&blk_dev->dev, dname,
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);
rt_list_insert_after(&blk_devices, &blk_dev->list);
@@ -435,7 +435,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
blk_dev->part.offset = 0;
blk_dev->part.size = 0;
blk_dev->part.lock = rt_sem_create("sem_sd0", 1, RT_IPC_FLAG_FIFO);
-
+
/* register mmcsd device */
blk_dev->dev.type = RT_Device_Class_Block;
#ifdef RT_USING_DEVICE_OPS
@@ -454,9 +454,9 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
blk_dev->geometry.bytes_per_sector = 1<<9;
blk_dev->geometry.block_size = card->card_blksize;
- blk_dev->geometry.sector_count =
+ blk_dev->geometry.sector_count =
card->card_capacity * (1024 / 512);
-
+
rt_device_register(&blk_dev->dev, "sd0",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);
rt_list_insert_after(&blk_devices, &blk_dev->list);
@@ -472,9 +472,9 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
#ifdef RT_USING_DFS_MNTTABLE
if (blk_dev)
{
- LOG_I("try to mount file system!");
- /* try to mount file system on this block device */
- dfs_mount_device(&(blk_dev->dev));
+ LOG_I("try to mount file system!");
+ /* try to mount file system on this block device */
+ dfs_mount_device(&(blk_dev->dev));
}
#endif
}
@@ -484,10 +484,10 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
LOG_E("read mmcsd first sector failed");
err = -RT_ERROR;
}
-
+
/* release sector buffer */
rt_free(sector);
-
+
return err;
}
@@ -499,15 +499,15 @@ void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card)
for (l = (&blk_devices)->next, n = l->next; l != &blk_devices; l = n)
{
blk_dev = (struct mmcsd_blk_device *)rt_list_entry(l, struct mmcsd_blk_device, list);
- if (blk_dev->card == card)
+ if (blk_dev->card == card)
{
- /* unmount file system */
- const char * mounted_path = dfs_filesystem_get_mounted_path(&(blk_dev->dev));
- if (mounted_path)
- {
+ /* unmount file system */
+ const char * mounted_path = dfs_filesystem_get_mounted_path(&(blk_dev->dev));
+ if (mounted_path)
+ {
dfs_unmount(mounted_path);
LOG_D("unmount file system %s for device %s.\r\n", mounted_path, blk_dev->dev.parent.name);
- }
+ }
rt_sem_delete(blk_dev->part.lock);
rt_device_unregister(&blk_dev->dev);
rt_list_remove(&blk_dev->list);
@@ -515,15 +515,3 @@ void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card)
}
}
}
-
-/*
- * This function will initialize block device on the mmc/sd.
- *
- * @deprecated since 2.1.0, this function does not need to be invoked
- * in the system initialization.
- */
-int rt_mmcsd_blk_init(void)
-{
- /* nothing */
- return 0;
-}
diff --git a/components/drivers/sdio/mmc.c b/components/drivers/sdio/mmc.c
index c1c56d37fd..bebfa39ea2 100644
--- a/components/drivers/sdio/mmc.c
+++ b/components/drivers/sdio/mmc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -45,9 +45,9 @@ static const rt_uint8_t tacc_value[] =
rt_inline rt_uint32_t GET_BITS(rt_uint32_t *resp,
rt_uint32_t start,
rt_uint32_t size)
-{
+{
const rt_int32_t __size = size;
- const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
+ const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
const rt_int32_t __off = 3 - ((start) / 32);
const rt_int32_t __shft = (start) & 31;
rt_uint32_t __res;
@@ -67,7 +67,7 @@ static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
rt_uint32_t a, b;
struct rt_mmcsd_csd *csd = &card->csd;
rt_uint32_t *resp = card->resp_csd;
-
+
/*
* We only understand CSD structure v1.1 and v1.2.
* v1.2 has extra information in bits 15, 11 and 10.
@@ -76,10 +76,10 @@ static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
csd->csd_structure = GET_BITS(resp, 126, 2);
if (csd->csd_structure == 0) {
LOG_E("unrecognised CSD structure version %d!", csd->csd_structure);
-
+
return -RT_ERROR;
}
-
+
csd->taac = GET_BITS(resp, 112, 8);
csd->nsac = GET_BITS(resp, 104, 8);
csd->tran_speed = GET_BITS(resp, 96, 8);
@@ -95,7 +95,7 @@ static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
csd->wr_blk_len = GET_BITS(resp, 22, 4);
csd->wr_blk_partial = GET_BITS(resp, 21, 1);
csd->csd_crc = GET_BITS(resp, 1, 7);
-
+
card->card_blksize = 1 << csd->rd_blk_len;
card->tacc_clks = csd->nsac * 100;
card->tacc_ns = (tacc_uint[csd->taac&0x07] * tacc_value[(csd->taac&0x78)>>3] + 9) / 10;
@@ -106,7 +106,7 @@ static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
card->erase_size = (a + 1) * (b + 1);
card->erase_size <<= csd->wr_blk_len - 9;
}
-
+
return 0;
}
@@ -119,12 +119,12 @@ static int mmc_get_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t **new_ext_csd)
struct rt_mmcsd_req req;
struct rt_mmcsd_cmd cmd;
struct rt_mmcsd_data data;
-
+
*new_ext_csd = RT_NULL;
-
- if (GET_BITS(card->resp_cid, 122, 4) < 4)
+
+ if (GET_BITS(card->resp_csd, 122, 4) < 4)
return 0;
-
+
/*
* As the ext_csd is so large and mostly unused, we don't store the
* raw block in mmc_card.
@@ -134,29 +134,29 @@ static int mmc_get_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t **new_ext_csd)
LOG_E("alloc memory failed when get ext csd!");
return -RT_ENOMEM;
}
-
+
rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
-
+
req.cmd = &cmd;
req.data = &data;
-
+
cmd.cmd_code = SEND_EXT_CSD;
cmd.arg = 0;
-
+
/* NOTE HACK: the RESP_SPI_R1 is always correct here, but we
* rely on callers to never use this with "native" calls for reading
* CSD or CID. Native versions of those commands use the R2 type,
* not R1 plus a data block.
*/
cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
-
+
data.blksize = 512;
data.blks = 1;
data.flags = DATA_DIR_READ;
data.buf = ext_csd;
-
+
/*
* Some cards require longer data read timeout than indicated in CSD.
* Address this by setting the read timeout to a "reasonably high"
@@ -165,14 +165,14 @@ static int mmc_get_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t **new_ext_csd)
*/
data.timeout_ns = 300000000;
data.timeout_clks = 0;
-
+
mmcsd_send_request(card->host, &req);
-
+
if (cmd.err)
return cmd.err;
if (data.err)
return data.err;
-
+
*new_ext_csd = ext_csd;
return 0;
}
@@ -192,13 +192,13 @@ static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
card->flags |= CARD_FLAG_HIGHSPEED;
card->hs_max_data_rate = 52000000;
-
+
card_capacity = *((rt_uint32_t *)&ext_csd[EXT_CSD_SEC_CNT]);
card_capacity *= card->card_blksize;
card_capacity >>= 10; /* unit:KB */
card->card_capacity = card_capacity;
LOG_I("emmc card capacity %d KB.", card->card_capacity);
-
+
return 0;
}
@@ -211,41 +211,41 @@ static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
*
* Modifies the EXT_CSD register for selected card.
*/
-static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
+static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
rt_uint8_t index, rt_uint8_t value)
{
int err;
struct rt_mmcsd_host *host = card->host;
struct rt_mmcsd_cmd cmd = {0};
-
+
cmd.cmd_code = SWITCH;
cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
(index << 16) | (value << 8) | set;
cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_AC;
-
+
err = mmcsd_send_cmd(host, &cmd, 3);
if (err)
return err;
-
+
return 0;
}
-static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
+static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
rt_uint8_t *ext_csd, rt_uint32_t bus_width)
{
rt_uint8_t *bw_ext_csd;
int err;
-
+
if (bus_width == MMCSD_BUS_WIDTH_1)
return 0;
-
+
err = mmc_get_ext_csd(card, &bw_ext_csd);
-
+
if (err || bw_ext_csd == RT_NULL) {
err = -RT_ERROR;
goto out;
}
-
+
/* only compare read only fields */
err = !((ext_csd[EXT_CSD_PARTITION_SUPPORT] == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
(ext_csd[EXT_CSD_ERASED_MEM_CONT] == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
@@ -273,10 +273,10 @@ static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
(ext_csd[EXT_CSD_PWR_CL_DDR_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
(ext_csd[EXT_CSD_PWR_CL_DDR_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
(ext_csd[EXT_CSD_PWR_CL_DDR_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
-
+
if (err)
err = -RT_ERROR;
-
+
out:
rt_free(bw_ext_csd);
return err;
@@ -300,12 +300,12 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
MMCSD_BUS_WIDTH_1
};
struct rt_mmcsd_host *host = card->host;
- unsigned idx, bus_width = 0;
+ unsigned idx, trys, bus_width = 0;
int err = 0;
-
- if (GET_BITS(card->resp_cid, 122, 4) < 4)
+
+ if (GET_BITS(card->resp_csd, 122, 4) < 4)
return 0;
-
+
/*
* Unlike SD, MMC cards dont have a configuration register to notify
* supported bus width. So bus test command should be run to identify
@@ -323,22 +323,25 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
* set by drivers.
*/
if ((!(host->flags & MMCSD_BUSWIDTH_8) &&
- ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_8) ||
+ ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_8) ||
(!(host->flags & MMCSD_BUSWIDTH_4) &&
- (ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_4 ||
- ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_8)))
- continue;
+ (ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_4 ||
+ ext_csd_bits[idx] == EXT_CSD_BUS_WIDTH_8)))
+ continue;
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_BUS_WIDTH,
ext_csd_bits[idx]);
if (err)
continue;
-
- bus_width = bus_widths[idx];
- mmcsd_set_bus_width(host, bus_width);
- mmcsd_delay_ms(20); //delay 10ms
- err = mmc_compare_ext_csds(card, ext_csd, bus_width);
+
+ for(trys = 0; trys < 5; trys++){
+ mmcsd_set_bus_width(host, bus_width);
+ mmcsd_delay_ms(10);
+ err = mmc_compare_ext_csds(card, ext_csd, bus_width);
+ if(!err)
+ break;
+ }
if (!err) {
err = bus_width;
break;
@@ -358,10 +361,10 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
}
}
}
-
+
return err;
}
-rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
+rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
rt_uint32_t ocr, rt_uint32_t *rocr)
{
struct rt_mmcsd_cmd cmd;
@@ -369,20 +372,20 @@ rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
rt_err_t err = RT_EOK;
rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
-
+
cmd.cmd_code = SEND_OP_COND;
cmd.arg = controller_is_spi(host) ? 0 : ocr;
cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
-
+
for (i = 100; i; i--) {
err = mmcsd_send_cmd(host, &cmd, 3);
if (err)
break;
-
+
/* if we're just probing, do a single pass */
if (ocr == 0)
break;
-
+
/* otherwise wait until reset completes */
if (controller_is_spi(host)) {
if (!(cmd.resp[0] & R1_SPI_IDLE))
@@ -391,15 +394,15 @@ rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
if (cmd.resp[0] & CARD_BUSY)
break;
}
-
+
err = -RT_ETIMEOUT;
-
+
mmcsd_delay_ms(10); //delay 10ms
}
-
+
if (rocr && !controller_is_spi(host))
*rocr = cmd.resp[0];
-
+
return err;
}
@@ -407,17 +410,17 @@ static rt_err_t mmc_set_card_addr(struct rt_mmcsd_host *host, rt_uint32_t rca)
{
rt_err_t err;
struct rt_mmcsd_cmd cmd;
-
+
rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
-
+
cmd.cmd_code = SET_RELATIVE_ADDR;
cmd.arg = rca << 16;
cmd.flags = RESP_R1 | CMD_AC;
-
+
err = mmcsd_send_cmd(host, &cmd, 3);
if (err)
return err;
-
+
return 0;
}
@@ -432,19 +435,19 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
struct rt_mmcsd_card *card = RT_NULL;
mmcsd_go_idle(host);
-
+
/* The extra bit indicates that we support high capacity */
err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
if (err)
goto err;
-
- if (controller_is_spi(host))
+
+ if (controller_is_spi(host))
{
err = mmcsd_spi_use_crc(host, 1);
if (err)
goto err1;
}
-
+
if (controller_is_spi(host))
err = mmcsd_get_cid(host, resp);
else
@@ -453,7 +456,7 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
goto err;
card = rt_malloc(sizeof(struct rt_mmcsd_card));
- if (!card)
+ if (!card)
{
LOG_E("malloc card failed!");
err = -RT_ENOMEM;
@@ -469,7 +472,7 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
/*
* For native busses: get card RCA and quit open drain mode.
*/
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmc_set_card_addr(host, card->rca);
if (err)
@@ -486,24 +489,24 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
if (err)
goto err1;
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmcsd_select_card(card);
if (err)
goto err1;
}
-
+
/*
* Fetch and process extended CSD.
*/
-
+
err = mmc_get_ext_csd(card, &ext_csd);
if (err)
goto err1;
err = mmc_parse_ext_csd(card, ext_csd);
if (err)
goto err1;
-
+
/* If doing byte addressing, check if required to do sector
* addressing. Handle the case of <2GB cards needing sector
* addressing. See section 8.1 JEDEC Standard JED84-A441;
@@ -511,9 +514,9 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
*/
if (!(card->flags & CARD_FLAG_SDHC) && (rocr & (1<<30)))
card->flags |= CARD_FLAG_SDHC;
-
+
/* set bus speed */
- if (card->flags & CARD_FLAG_HIGHSPEED)
+ if (card->flags & CARD_FLAG_HIGHSPEED)
max_data_rate = card->hs_max_data_rate;
else
max_data_rate = card->max_data_rate;
@@ -522,7 +525,7 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
/*switch bus width*/
mmc_select_bus_width(card, ext_csd);
-
+
host->card = card;
rt_free(ext_csd);
diff --git a/components/drivers/sdio/mmcsd_core.c b/components/drivers/sdio/mmcsd_core.c
index 99bc6ce744..e3bf97069c 100644
--- a/components/drivers/sdio/mmcsd_core.c
+++ b/components/drivers/sdio/mmcsd_core.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -63,7 +63,7 @@ void mmcsd_send_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
req->cmd->err = 0;
req->cmd->mrq = req;
if (req->data)
- {
+ {
req->cmd->data = req->data;
req->data->err = 0;
req->data->mrq = req;
@@ -72,12 +72,12 @@ void mmcsd_send_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
req->data->stop = req->stop;
req->stop->err = 0;
req->stop->mrq = req;
- }
+ }
}
host->ops->request(host, req);
rt_sem_take(&host->sem_ack, RT_WAITING_FOREVER);
-
+
} while(req->cmd->err && (req->cmd->retries > 0));
@@ -122,7 +122,7 @@ rt_int32_t mmcsd_go_idle(struct rt_mmcsd_host *host)
mmcsd_delay_ms(1);
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
mmcsd_set_chip_select(host, MMCSD_CS_IGNORE);
mmcsd_delay_ms(1);
@@ -179,7 +179,7 @@ rt_int32_t mmcsd_get_cid(struct rt_mmcsd_host *host, rt_uint32_t *cid)
struct rt_mmcsd_data data;
rt_uint32_t *buf = RT_NULL;
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
if (!host->card)
return -RT_ERROR;
@@ -198,7 +198,7 @@ rt_int32_t mmcsd_get_cid(struct rt_mmcsd_host *host, rt_uint32_t *cid)
}
buf = (rt_uint32_t *)rt_malloc(16);
- if (!buf)
+ if (!buf)
{
LOG_E("allocate memory failed!");
@@ -274,7 +274,7 @@ rt_int32_t mmcsd_get_csd(struct rt_mmcsd_card *card, rt_uint32_t *csd)
}
buf = (rt_uint32_t*)rt_malloc(16);
- if (!buf)
+ if (!buf)
{
LOG_E("allocate memory failed!");
@@ -336,12 +336,12 @@ static rt_int32_t _mmcsd_select_card(struct rt_mmcsd_host *host,
cmd.cmd_code = SELECT_CARD;
- if (card)
+ if (card)
{
cmd.arg = card->rca << 16;
cmd.flags = RESP_R1 | CMD_AC;
- }
- else
+ }
+ else
{
cmd.arg = 0;
cmd.flags = RESP_NONE | CMD_AC;
@@ -442,7 +442,7 @@ void mmcsd_set_data_timeout(struct rt_mmcsd_data *data,
{
rt_uint32_t mult;
- if (card->card_type == CARD_TYPE_SDIO)
+ if (card->card_type == CARD_TYPE_SDIO)
{
data->timeout_ns = 1000000000; /* SDIO card 1s */
data->timeout_clks = 0;
@@ -468,7 +468,7 @@ void mmcsd_set_data_timeout(struct rt_mmcsd_data *data,
/*
* SD cards also have an upper limit on the timeout.
*/
- if (card->card_type == CARD_TYPE_SD)
+ if (card->card_type == CARD_TYPE_SD)
{
rt_uint32_t timeout_us, limit_us;
@@ -488,21 +488,21 @@ void mmcsd_set_data_timeout(struct rt_mmcsd_data *data,
/*
* SDHC cards always use these fixed values.
*/
- if (timeout_us > limit_us || card->flags & CARD_FLAG_SDHC)
+ if (timeout_us > limit_us || card->flags & CARD_FLAG_SDHC)
{
data->timeout_ns = limit_us * 1000; /* SDHC card fixed 250ms */
data->timeout_clks = 0;
}
}
- if (controller_is_spi(card->host))
+ if (controller_is_spi(card->host))
{
- if (data->flags & DATA_DIR_WRITE)
+ if (data->flags & DATA_DIR_WRITE)
{
if (data->timeout_ns < 1000000000)
data->timeout_ns = 1000000000; /* 1s */
- }
- else
+ }
+ else
{
if (data->timeout_ns < 100000000)
data->timeout_ns = 100000000; /* 100ms */
@@ -522,7 +522,7 @@ rt_uint32_t mmcsd_select_voltage(struct rt_mmcsd_host *host, rt_uint32_t ocr)
ocr &= host->valid_ocr;
bit = __rt_ffs(ocr);
- if (bit)
+ if (bit)
{
bit -= 1;
@@ -530,8 +530,8 @@ rt_uint32_t mmcsd_select_voltage(struct rt_mmcsd_host *host, rt_uint32_t ocr)
host->io_cfg.vdd = bit;
mmcsd_set_iocfg(host);
- }
- else
+ }
+ else
{
LOG_W("host doesn't support card's voltages!");
ocr = 0;
@@ -549,7 +549,7 @@ static void mmcsd_power_up(struct rt_mmcsd_host *host)
{
host->io_cfg.chip_select = MMCSD_CS_HIGH;
host->io_cfg.bus_mode = MMCSD_BUSMODE_PUSHPULL;
- }
+ }
else
{
host->io_cfg.chip_select = MMCSD_CS_IGNORE;
@@ -580,7 +580,7 @@ static void mmcsd_power_off(struct rt_mmcsd_host *host)
{
host->io_cfg.clock = 0;
host->io_cfg.vdd = 0;
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
host->io_cfg.bus_mode = MMCSD_BUSMODE_OPENDRAIN;
host->io_cfg.chip_select = MMCSD_CS_IGNORE;
@@ -619,7 +619,7 @@ void mmcsd_detect(void *param)
rt_uint32_t ocr;
rt_int32_t err;
- while (1)
+ while (1)
{
if (rt_mb_recv(&mmcsd_detect_mb, (rt_ubase_t *)&host, RT_WAITING_FOREVER) == RT_EOK)
{
@@ -644,7 +644,7 @@ void mmcsd_detect(void *param)
* detect SD card
*/
err = mmcsd_send_app_op_cond(host, 0, &ocr);
- if (!err)
+ if (!err)
{
if (init_sd(host, ocr))
mmcsd_power_off(host);
@@ -652,12 +652,12 @@ void mmcsd_detect(void *param)
rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
continue;
}
-
+
/*
* detect mmc card
*/
err = mmc_send_op_cond(host, 0, &ocr);
- if (!err)
+ if (!err)
{
if (init_mmc(host, ocr))
mmcsd_power_off(host);
@@ -669,21 +669,21 @@ void mmcsd_detect(void *param)
}
else
{
- /* card removed */
- mmcsd_host_lock(host);
- if (host->card->sdio_function_num != 0)
- {
- LOG_W("unsupport sdio card plug out!");
- }
- else
- {
- rt_mmcsd_blk_remove(host->card);
- rt_free(host->card);
+ /* card removed */
+ mmcsd_host_lock(host);
+ if (host->card->sdio_function_num != 0)
+ {
+ LOG_W("unsupport sdio card plug out!");
+ }
+ else
+ {
+ rt_mmcsd_blk_remove(host->card);
+ rt_free(host->card);
- host->card = RT_NULL;
- }
- mmcsd_host_unlock(host);
- rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
+ host->card = RT_NULL;
+ }
+ mmcsd_host_unlock(host);
+ rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
}
}
}
@@ -694,7 +694,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void)
struct rt_mmcsd_host *host;
host = rt_malloc(sizeof(struct rt_mmcsd_host));
- if (!host)
+ if (!host)
{
LOG_E("alloc host failed");
@@ -736,16 +736,16 @@ int rt_mmcsd_core_init(void)
&mmcsd_hotpluge_mb_pool[0], sizeof(mmcsd_hotpluge_mb_pool) / sizeof(mmcsd_hotpluge_mb_pool[0]),
RT_IPC_FLAG_FIFO);
RT_ASSERT(ret == RT_EOK);
- ret = rt_thread_init(&mmcsd_detect_thread, "mmcsd_detect", mmcsd_detect, RT_NULL,
+ ret = rt_thread_init(&mmcsd_detect_thread, "mmcsd_detect", mmcsd_detect, RT_NULL,
&mmcsd_stack[0], RT_MMCSD_STACK_SIZE, RT_MMCSD_THREAD_PREORITY, 20);
- if (ret == RT_EOK)
+ if (ret == RT_EOK)
{
rt_thread_startup(&mmcsd_detect_thread);
}
rt_sdio_init();
- return 0;
+ return 0;
}
INIT_PREV_EXPORT(rt_mmcsd_core_init);
diff --git a/components/drivers/sdio/sd.c b/components/drivers/sdio/sd.c
index f7e4e46720..d739ee4eaf 100644
--- a/components/drivers/sdio/sd.c
+++ b/components/drivers/sdio/sd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -45,9 +45,9 @@ static const rt_uint8_t tacc_value[] =
rt_inline rt_uint32_t GET_BITS(rt_uint32_t *resp,
rt_uint32_t start,
rt_uint32_t size)
-{
+{
const rt_int32_t __size = size;
- const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
+ const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
const rt_int32_t __off = 3 - ((start) / 32);
const rt_int32_t __shft = (start) & 31;
rt_uint32_t __res;
@@ -97,7 +97,7 @@ static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
case 1:
card->flags |= CARD_FLAG_SDHC;
- /*This field is fixed to 0Eh, which indicates 1 ms.
+ /*This field is fixed to 0Eh, which indicates 1 ms.
The host should not use TAAC, NSAC, and R2W_FACTOR
to calculate timeout and should uses fixed timeout
values for read and write operations*/
@@ -157,13 +157,13 @@ static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
rt_uint8_t *buf;
buf = (rt_uint8_t*)rt_malloc(64);
- if (!buf)
+ if (!buf)
{
LOG_E("alloc memory failed!");
return -RT_ENOMEM;
}
-
+
if (card->card_type != CARD_TYPE_SD)
goto err;
if (card->scr.sd_version < SCR_SPEC_VER_1)
@@ -191,7 +191,7 @@ static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
mmcsd_send_request(host, &req);
- if (cmd.err || data.err)
+ if (cmd.err || data.err)
{
goto err1;
}
@@ -221,12 +221,12 @@ static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
mmcsd_send_request(host, &req);
- if (cmd.err || data.err)
+ if (cmd.err || data.err)
{
goto err1;
}
- if ((buf[16] & 0xF) != 1)
+ if ((buf[16] & 0xF) != 1)
{
LOG_I("switching card to high speed failed!");
goto err;
@@ -255,12 +255,12 @@ static rt_err_t mmcsd_app_cmd(struct rt_mmcsd_host *host,
cmd.cmd_code = APP_CMD;
- if (card)
+ if (card)
{
cmd.arg = card->rca << 16;
cmd.flags = RESP_R1 | CMD_AC;
- }
- else
+ }
+ else
{
cmd.arg = 0;
cmd.flags = RESP_R1 | CMD_BCR;
@@ -285,7 +285,7 @@ rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host,
{
struct rt_mmcsd_req req;
- rt_uint32_t i;
+ rt_uint32_t i;
rt_err_t err;
err = -RT_ERROR;
@@ -294,15 +294,15 @@ rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host,
* We have to resend MMC_APP_CMD for each attempt so
* we cannot use the retries field in mmc_command.
*/
- for (i = 0;i <= retry;i++)
+ for (i = 0;i <= retry;i++)
{
rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
err = mmcsd_app_cmd(host, card);
- if (err)
+ if (err)
{
/* no point in retrying; no APP commands allowed */
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
break;
@@ -324,7 +324,7 @@ rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host,
break;
/* no point in retrying illegal APP commands */
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
break;
@@ -344,7 +344,7 @@ rt_err_t mmcsd_app_set_bus_width(struct rt_mmcsd_card *card, rt_int32_t width)
cmd.cmd_code = SD_APP_SET_BUS_WIDTH;
cmd.flags = RESP_R1 | CMD_AC;
- switch (width)
+ switch (width)
{
case MMCSD_BUS_WIDTH_1:
cmd.arg = MMCSD_BUS_WIDTH_1;
@@ -380,7 +380,7 @@ rt_err_t mmcsd_send_app_op_cond(struct rt_mmcsd_host *host,
cmd.arg = ocr;
cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
- for (i = 100; i; i--)
+ for (i = 100; i; i--)
{
err = mmcsd_send_app_cmd(host, RT_NULL, &cmd, 3);
if (err)
@@ -391,12 +391,12 @@ rt_err_t mmcsd_send_app_op_cond(struct rt_mmcsd_host *host,
break;
/* otherwise wait until reset completes */
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
if (!(cmd.resp[0] & R1_SPI_IDLE))
break;
- }
- else
+ }
+ else
{
if (cmd.resp[0] & CARD_BUSY)
break;
@@ -544,7 +544,7 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
goto err;
card = rt_malloc(sizeof(struct rt_mmcsd_card));
- if (!card)
+ if (!card)
{
LOG_E("malloc card failed!");
err = -RT_ENOMEM;
@@ -559,7 +559,7 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
/*
* For native busses: get card RCA and quit open drain mode.
*/
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmcsd_get_card_addr(host, &card->rca);
if (err)
@@ -576,7 +576,7 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
if (err)
goto err1;
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmcsd_select_card(card);
if (err)
@@ -589,7 +589,7 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
mmcsd_parse_scr(card);
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
err = mmcsd_spi_use_crc(host, 1);
if (err)
@@ -606,12 +606,12 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
/* set bus speed */
max_data_rate = (unsigned int)-1;
- if (card->flags & CARD_FLAG_HIGHSPEED)
+ if (card->flags & CARD_FLAG_HIGHSPEED)
{
if (max_data_rate > card->hs_max_data_rate)
max_data_rate = card->hs_max_data_rate;
- }
- else if (max_data_rate > card->max_data_rate)
+ }
+ else if (max_data_rate > card->max_data_rate)
{
max_data_rate = card->max_data_rate;
}
@@ -620,7 +620,7 @@ static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
/*switch bus width*/
if ((host->flags & MMCSD_BUSWIDTH_4) &&
- (card->scr.sd_bus_widths & SD_SCR_BUS_WIDTH_4))
+ (card->scr.sd_bus_widths & SD_SCR_BUS_WIDTH_4))
{
err = mmcsd_app_set_bus_width(card, MMCSD_BUS_WIDTH_4);
if (err)
diff --git a/components/drivers/sdio/sdio.c b/components/drivers/sdio/sdio.c
index f0d5863a06..1263f205b5 100644
--- a/components/drivers/sdio/sdio.c
+++ b/components/drivers/sdio/sdio.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -73,7 +73,7 @@ rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host,
cmd.arg = ocr;
cmd.flags = RESP_SPI_R4 | RESP_R4 | CMD_BCR;
- for (i = 100; i; i--)
+ for (i = 100; i; i--)
{
err = mmcsd_send_cmd(host, &cmd, 0);
if (err)
@@ -84,7 +84,7 @@ rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host,
break;
/* otherwise wait until reset completes */
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
/*
* Both R1_SPI_IDLE and MMC_CARD_BUSY indicate
@@ -94,8 +94,8 @@ rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host,
*/
if (cmd.resp[1] & CARD_BUSY)
break;
- }
- else
+ }
+ else
{
if (cmd.resp[0] & CARD_BUSY)
break;
@@ -143,7 +143,7 @@ rt_int32_t sdio_io_rw_direct(struct rt_mmcsd_card *card,
if (err)
return err;
- if (!controller_is_spi(card->host))
+ if (!controller_is_spi(card->host))
{
if (cmd.resp[0] & R5_ERROR)
return -RT_EIO;
@@ -153,7 +153,7 @@ rt_int32_t sdio_io_rw_direct(struct rt_mmcsd_card *card,
return -RT_ERROR;
}
- if (!rw || raw)
+ if (!rw || raw)
{
if (controller_is_spi(card->host))
*pdata = (cmd.resp[0] >> 8) & 0xFF;
@@ -218,7 +218,7 @@ rt_int32_t sdio_io_rw_extended(struct rt_mmcsd_card *card,
if (data.err)
return data.err;
- if (!controller_is_spi(card->host))
+ if (!controller_is_spi(card->host))
{
if (cmd.resp[0] & R5_ERROR)
return -RT_EIO;
@@ -270,7 +270,7 @@ rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
blks = max_blks;
len = blks * func->cur_blk_size;
- ret = sdio_io_rw_extended(func->card, rw, func->num,
+ ret = sdio_io_rw_extended(func->card, rw, func->num,
addr, op_code, buf, blks, func->cur_blk_size);
if (ret)
return ret;
@@ -286,7 +286,7 @@ rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
{
len = MIN(left_size, sdio_max_block_size(func));
- ret = sdio_io_rw_extended(func->card, rw, func->num,
+ ret = sdio_io_rw_extended(func->card, rw, func->num,
addr, op_code, buf, 1, len);
if (ret)
return ret;
@@ -300,7 +300,7 @@ rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
return 0;
}
-rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
+rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
rt_uint32_t reg,
rt_int32_t *err)
{
@@ -317,7 +317,7 @@ rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
return data;
}
-rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
+rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
rt_uint32_t reg,
rt_uint8_t data)
{
@@ -335,7 +335,7 @@ rt_uint16_t sdio_io_readw(struct rt_sdio_function *func,
*err = 0;
ret = sdio_io_rw_extended_block(func, 0, addr, 1, (rt_uint8_t *)&dmabuf, 2);
- if (ret)
+ if (ret)
{
if (err)
*err = ret;
@@ -364,7 +364,7 @@ rt_uint32_t sdio_io_readl(struct rt_sdio_function *func,
*err = 0;
ret = sdio_io_rw_extended_block(func, 0, addr, 1, (rt_uint8_t *)&dmabuf, 4);
- if (ret)
+ if (ret)
{
if (err)
*err = ret;
@@ -382,7 +382,7 @@ rt_int32_t sdio_io_writel(struct rt_sdio_function *func,
return sdio_io_rw_extended_block(func, 1, addr, 1, (rt_uint8_t *)&dmabuf, 4);
}
-rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len)
@@ -390,7 +390,7 @@ rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
return sdio_io_rw_extended_block(func, 0, addr, 0, buf, len);
}
-rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len)
@@ -398,7 +398,7 @@ rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
return sdio_io_rw_extended_block(func, 1, addr, 0, buf, len);
}
-rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len)
@@ -406,7 +406,7 @@ rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
return sdio_io_rw_extended_block(func, 0, addr, 1, buf, len);
}
-rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
+rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
rt_uint32_t addr,
rt_uint8_t *buf,
rt_uint32_t len)
@@ -428,7 +428,7 @@ static rt_int32_t sdio_read_cccr(struct rt_mmcsd_card *card)
cccr_version = data & 0x0f;
- if (cccr_version > SDIO_CCCR_REV_3_00)
+ if (cccr_version > SDIO_CCCR_REV_3_00)
{
LOG_E("unrecognised CCCR structure version %d", cccr_version);
@@ -450,7 +450,7 @@ static rt_int32_t sdio_read_cccr(struct rt_mmcsd_card *card)
if (data & SDIO_CCCR_CAP_4BLS)
card->cccr.bus_width = 1;
- if (cccr_version >= SDIO_CCCR_REV_1_10)
+ if (cccr_version >= SDIO_CCCR_REV_1_10)
{
data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_POWER_CTRL, &ret);
if (ret)
@@ -460,7 +460,7 @@ static rt_int32_t sdio_read_cccr(struct rt_mmcsd_card *card)
card->cccr.power_ctrl = 1;
}
- if (cccr_version >= SDIO_CCCR_REV_1_20)
+ if (cccr_version >= SDIO_CCCR_REV_1_20)
{
data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, &ret);
if (ret)
@@ -531,7 +531,7 @@ static rt_int32_t sdio_read_cis(struct rt_sdio_function *func)
for (i = 0; i < 3; i++)
{
- data = sdio_io_readb(func0,
+ data = sdio_io_readb(func0,
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_CIS + i, &ret);
if (ret)
return ret;
@@ -560,13 +560,13 @@ static rt_int32_t sdio_read_cis(struct rt_sdio_function *func)
return -RT_ENOMEM;
curr->data = (rt_uint8_t *)curr + sizeof(struct rt_sdio_function_tuple);
- for (i = 0; i < tpl_link; i++)
+ for (i = 0; i < tpl_link; i++)
{
curr->data[i] = sdio_io_readb(func0, cisptr + i, &ret);
if (ret)
break;
}
- if (ret)
+ if (ret)
{
rt_free(curr);
break;
@@ -618,7 +618,7 @@ static rt_int32_t sdio_read_cis(struct rt_sdio_function *func)
LOG_D("CISTPL_VERS_1 too short");
}
break;
- default:
+ default:
/* this tuple is unknown to the core */
curr->next = RT_NULL;
curr->code = tpl_code;
@@ -651,7 +651,7 @@ void sdio_free_cis(struct rt_sdio_function *func)
tuple = func->tuples;
- while (tuple && ((tuple != card->sdio_function[0]->tuples) || (!func->num)))
+ while (tuple && ((tuple != card->sdio_function[0]->tuples) || (!func->num)))
{
tmp = tuple;
tuple = tuple->next;
@@ -667,16 +667,16 @@ static rt_int32_t sdio_read_fbr(struct rt_sdio_function *func)
rt_uint8_t data;
struct rt_sdio_function *func0 = func->card->sdio_function[0];
- data = sdio_io_readb(func0,
+ data = sdio_io_readb(func0,
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_FUNC_IF, &ret);
if (ret)
goto err;
data &= 0x0f;
- if (data == 0x0f)
+ if (data == 0x0f)
{
- data = sdio_io_readb(func0,
+ data = sdio_io_readb(func0,
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_IF_EXT, &ret);
if (ret)
goto err;
@@ -835,7 +835,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
if (err)
goto err;
- if (controller_is_spi(host))
+ if (controller_is_spi(host))
{
err = mmcsd_spi_use_crc(host, host->spi_use_crc);
if (err)
@@ -845,7 +845,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
function_num = (cmd5_resp & 0x70000000) >> 28;
card = rt_malloc(sizeof(struct rt_mmcsd_card));
- if (!card)
+ if (!card)
{
LOG_E("malloc card failed");
err = -RT_ENOMEM;
@@ -869,7 +869,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
card->sdio_function[0]->card = card;
card->sdio_function[0]->num = 0;
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmcsd_get_card_addr(host, &card->rca);
if (err)
@@ -878,7 +878,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
}
- if (!controller_is_spi(host))
+ if (!controller_is_spi(host))
{
err = mmcsd_select_card(card);
if (err)
@@ -897,7 +897,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
if (err)
goto err2;
- if (card->flags & CARD_FLAG_HIGHSPEED)
+ if (card->flags & CARD_FLAG_HIGHSPEED)
{
mmcsd_set_clock(host, card->host->freq_max > 50000000 ? 50000000 : card->host->freq_max);
}
@@ -910,7 +910,7 @@ static rt_int32_t sdio_init_card(struct rt_mmcsd_host *host, rt_uint32_t ocr)
if (err)
goto err2;
- for (i = 1; i < function_num + 1; i++)
+ for (i = 1; i < function_num + 1; i++)
{
err = sdio_initialize_function(card, i);
if (err)
@@ -954,7 +954,7 @@ err1:
}
err:
LOG_E("error %d while initialising SDIO card", err);
-
+
return err;
}
@@ -965,13 +965,13 @@ rt_int32_t init_sdio(struct rt_mmcsd_host *host, rt_uint32_t ocr)
RT_ASSERT(host != RT_NULL);
- if (ocr & 0x7F)
+ if (ocr & 0x7F)
{
LOG_W("Card ocr below the defined voltage rang.");
ocr &= ~0x7F;
}
- if (ocr & VDD_165_195)
+ if (ocr & VDD_165_195)
{
LOG_W("Can't support the low voltage SDIO card.");
ocr &= ~VDD_165_195;
@@ -979,7 +979,7 @@ rt_int32_t init_sdio(struct rt_mmcsd_host *host, rt_uint32_t ocr)
current_ocr = mmcsd_select_voltage(host, ocr);
- if (!current_ocr)
+ if (!current_ocr)
{
err = -RT_ERROR;
goto err;
@@ -1011,35 +1011,35 @@ static void sdio_irq_thread(void *param)
card = host->card;
RT_ASSERT(card != RT_NULL);
- while (1)
+ while (1)
{
if (rt_sem_take(host->sdio_irq_sem, RT_WAITING_FOREVER) == RT_EOK)
{
mmcsd_host_lock(host);
- pending = sdio_io_readb(host->card->sdio_function[0],
+ pending = sdio_io_readb(host->card->sdio_function[0],
SDIO_REG_CCCR_INT_PEND, &ret);
- if (ret)
+ if (ret)
{
mmcsd_dbg("error %d reading SDIO_REG_CCCR_INT_PEND\n", ret);
goto out;
}
- for (i = 1; i <= 7; i++)
+ for (i = 1; i <= 7; i++)
{
- if (pending & (1 << i))
+ if (pending & (1 << i))
{
struct rt_sdio_function *func = card->sdio_function[i];
- if (!func)
+ if (!func)
{
mmcsd_dbg("pending IRQ for "
"non-existant function %d\n", func->num);
goto out;
- }
- else if (func->irq_handler)
+ }
+ else if (func->irq_handler)
{
func->irq_handler(func);
- }
- else
+ }
+ else
{
mmcsd_dbg("pending IRQ with no register handler\n");
goto out;
@@ -1067,9 +1067,9 @@ static rt_int32_t sdio_irq_thread_create(struct rt_mmcsd_card *card)
host->sdio_irq_sem = rt_sem_create("sdio_irq", 0, RT_IPC_FLAG_FIFO);
RT_ASSERT(host->sdio_irq_sem != RT_NULL);
- host->sdio_irq_thread = rt_thread_create("sdio_irq", sdio_irq_thread, host,
+ host->sdio_irq_thread = rt_thread_create("sdio_irq", sdio_irq_thread, host,
RT_SDIO_STACK_SIZE, RT_SDIO_THREAD_PRIORITY, 20);
- if (host->sdio_irq_thread != RT_NULL)
+ if (host->sdio_irq_thread != RT_NULL)
{
rt_thread_startup(host->sdio_irq_thread);
}
@@ -1085,7 +1085,7 @@ static rt_int32_t sdio_irq_thread_delete(struct rt_mmcsd_card *card)
RT_ASSERT(host->sdio_irq_num > 0);
host->sdio_irq_num--;
- if (!host->sdio_irq_num)
+ if (!host->sdio_irq_num)
{
if (host->flags & MMCSD_SUP_SDIO_IRQ)
host->ops->enable_sdio_irq(host, 0);
@@ -1112,7 +1112,7 @@ rt_int32_t sdio_attach_irq(struct rt_sdio_function *func,
mmcsd_dbg("SDIO: enabling IRQ for function %d\n", func->num);
- if (func->irq_handler)
+ if (func->irq_handler)
{
mmcsd_dbg("SDIO: IRQ for already in use.\n");
@@ -1153,7 +1153,7 @@ rt_int32_t sdio_detach_irq(struct rt_sdio_function *func)
mmcsd_dbg("SDIO: disabling IRQ for function %d\n", func->num);
- if (func->irq_handler)
+ if (func->irq_handler)
{
func->irq_handler = RT_NULL;
sdio_irq_thread_delete(func->card);
@@ -1210,7 +1210,7 @@ rt_int32_t sdio_enable_func(struct rt_sdio_function *func)
timeout = rt_tick_get() + func->enable_timeout_val * RT_TICK_PER_SECOND / 1000;
- while (1)
+ while (1)
{
reg = sdio_io_readb(func0, SDIO_REG_CCCR_IO_RDY, &ret);
if (ret)
@@ -1282,17 +1282,17 @@ rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
if (blksize > func->card->host->max_blk_size)
return -RT_ERROR;
- if (blksize == 0)
+ if (blksize == 0)
{
blksize = MIN(func->max_blk_size, func->card->host->max_blk_size);
blksize = MIN(blksize, 512u);
}
- ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE,
+ ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE,
blksize & 0xff);
if (ret)
return ret;
- ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE + 1,
+ ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE + 1,
(blksize >> 8) & 0xff);
if (ret)
return ret;
@@ -1305,14 +1305,14 @@ rt_inline rt_int32_t sdio_match_card(struct rt_mmcsd_card *card,
const struct rt_sdio_device_id *id)
{
rt_uint8_t num = 1;
-
- if ((id->manufacturer != SDIO_ANY_MAN_ID) &&
+
+ if ((id->manufacturer != SDIO_ANY_MAN_ID) &&
(id->manufacturer != card->cis.manufacturer))
return 0;
-
+
while (num <= card->sdio_function_num)
{
- if ((id->product != SDIO_ANY_PROD_ID) &&
+ if ((id->product != SDIO_ANY_PROD_ID) &&
(id->product == card->sdio_function[num]->product))
return 1;
num++;
diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c
index 660b86f85b..8d43a7a905 100644
--- a/components/drivers/sensors/sensor.c
+++ b/components/drivers/sensors/sensor.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -36,7 +36,8 @@ static char *const sensor_name_str[] =
"dust_", /* Dust sensor */
"eco2_", /* eCO2 sensor */
"gnss_", /* GPS/GNSS sensor */
- "tof_" /* TOF sensor */
+ "tof_", /* TOF sensor */
+ "spo2_" /* SpO2 sensor */
};
/* Sensor interrupt correlation function */
@@ -121,12 +122,30 @@ static rt_err_t rt_sensor_irq_init(rt_sensor_t sensor)
return 0;
}
+// local rt_sensor_ops
+
+static rt_size_t local_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len)
+{
+ LOG_D("Undefined fetch_data");
+ return 0;
+}
+static rt_err_t local_control(struct rt_sensor_device *sensor, int cmd, void *arg)
+{
+ LOG_D("Undefined control");
+ return RT_ERROR;
+}
+static struct rt_sensor_ops local_ops = {
+ .fetch_data = local_fetch_data,
+ .control = local_control
+};
+
/* RT-Thread Device Interface */
static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag)
{
rt_sensor_t sensor = (rt_sensor_t)dev;
RT_ASSERT(dev != RT_NULL);
rt_err_t res = RT_EOK;
+ rt_err_t (*local_ctrl)(struct rt_sensor_device *sensor, int cmd, void *arg) = local_control;
if (sensor->module)
{
@@ -144,37 +163,36 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag)
goto __exit;
}
}
+ if (sensor->ops->control != RT_NULL)
+ {
+ local_ctrl = sensor->ops->control;
+ }
+ sensor->config.mode = RT_SENSOR_MODE_POLLING;
if (oflag & RT_DEVICE_FLAG_RDONLY && dev->flag & RT_DEVICE_FLAG_RDONLY)
{
- if (sensor->ops->control != RT_NULL)
- {
- /* If polling mode is supported, configure it to polling mode */
- sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_POLLING);
- }
- sensor->config.mode = RT_SENSOR_MODE_POLLING;
+ /* If polling mode is supported, configure it to polling mode */
+ local_ctrl(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_POLLING);
}
else if (oflag & RT_DEVICE_FLAG_INT_RX && dev->flag & RT_DEVICE_FLAG_INT_RX)
{
- if (sensor->ops->control != RT_NULL)
+ /* If interrupt mode is supported, configure it to interrupt mode */
+ if (local_ctrl(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_INT) == RT_EOK)
{
- /* If interrupt mode is supported, configure it to interrupt mode */
- sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_INT);
+ /* Initialization sensor interrupt */
+ rt_sensor_irq_init(sensor);
+ sensor->config.mode = RT_SENSOR_MODE_INT;
}
- /* Initialization sensor interrupt */
- rt_sensor_irq_init(sensor);
- sensor->config.mode = RT_SENSOR_MODE_INT;
}
else if (oflag & RT_DEVICE_FLAG_FIFO_RX && dev->flag & RT_DEVICE_FLAG_FIFO_RX)
{
- if (sensor->ops->control != RT_NULL)
+ /* If fifo mode is supported, configure it to fifo mode */
+ if (local_ctrl(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_FIFO) == RT_EOK)
{
- /* If fifo mode is supported, configure it to fifo mode */
- sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_FIFO);
+ /* Initialization sensor interrupt */
+ rt_sensor_irq_init(sensor);
+ sensor->config.mode = RT_SENSOR_MODE_FIFO;
}
- /* Initialization sensor interrupt */
- rt_sensor_irq_init(sensor);
- sensor->config.mode = RT_SENSOR_MODE_FIFO;
}
else
{
@@ -183,7 +201,7 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag)
}
/* Configure power mode to normal mode */
- if (sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_POWER, (void *)RT_SENSOR_POWER_NORMAL) == RT_EOK)
+ if (local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER, (void *)RT_SENSOR_POWER_NORMAL) == RT_EOK)
{
sensor->config.power = RT_SENSOR_POWER_NORMAL;
}
@@ -202,6 +220,7 @@ static rt_err_t rt_sensor_close(rt_device_t dev)
{
rt_sensor_t sensor = (rt_sensor_t)dev;
int i;
+ rt_err_t (*local_ctrl)(struct rt_sensor_device * sensor, int cmd, void *arg) = local_control;
RT_ASSERT(dev != RT_NULL);
@@ -209,9 +228,13 @@ static rt_err_t rt_sensor_close(rt_device_t dev)
{
rt_mutex_take(sensor->module->lock, RT_WAITING_FOREVER);
}
+ if (sensor->ops->control != RT_NULL)
+ {
+ local_ctrl = sensor->ops->control;
+ }
/* Configure power mode to power down mode */
- if (sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_POWER, (void *)RT_SENSOR_POWER_DOWN) == RT_EOK)
+ if (local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER, (void *)RT_SENSOR_POWER_DOWN) == RT_EOK)
{
sensor->config.power = RT_SENSOR_POWER_DOWN;
}
@@ -234,10 +257,13 @@ static rt_err_t rt_sensor_close(rt_device_t dev)
}
}
}
- /* Sensor disable interrupt */
- if (sensor->config.irq_pin.pin != RT_PIN_NONE)
+ if (sensor->config.mode != RT_SENSOR_MODE_POLLING)
{
- rt_pin_irq_enable(sensor->config.irq_pin.pin, RT_FALSE);
+ /* Sensor disable interrupt */
+ if (sensor->config.irq_pin.pin != RT_PIN_NONE)
+ {
+ rt_pin_irq_enable(sensor->config.irq_pin.pin, RT_FALSE);
+ }
}
__exit:
@@ -282,7 +308,10 @@ static rt_size_t rt_sensor_read(rt_device_t dev, rt_off_t pos, void *buf, rt_siz
else
{
/* If the buffer is empty read the data */
- result = sensor->ops->fetch_data(sensor, buf, len);
+ if (sensor->ops->fetch_data != RT_NULL)
+ {
+ result = sensor->ops->fetch_data(sensor, buf, len);
+ }
}
if (sensor->module)
@@ -298,18 +327,23 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args)
rt_sensor_t sensor = (rt_sensor_t)dev;
rt_err_t result = RT_EOK;
RT_ASSERT(dev != RT_NULL);
+ rt_err_t (*local_ctrl)(struct rt_sensor_device * sensor, int cmd, void *arg) = local_control;
if (sensor->module)
{
rt_mutex_take(sensor->module->lock, RT_WAITING_FOREVER);
}
+ if (sensor->ops->control != RT_NULL)
+ {
+ local_ctrl = sensor->ops->control;
+ }
switch (cmd)
{
case RT_SENSOR_CTRL_GET_ID:
if (args)
{
- result = sensor->ops->control(sensor, RT_SENSOR_CTRL_GET_ID, args);
+ result = local_ctrl(sensor, RT_SENSOR_CTRL_GET_ID, args);
}
break;
case RT_SENSOR_CTRL_GET_INFO:
@@ -319,19 +353,17 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args)
}
break;
case RT_SENSOR_CTRL_SET_RANGE:
-
/* Configuration measurement range */
- result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_RANGE, args);
+ result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_RANGE, args);
if (result == RT_EOK)
{
sensor->config.range = (rt_int32_t)args;
LOG_D("set range %d", sensor->config.range);
- }
+ }
break;
case RT_SENSOR_CTRL_SET_ODR:
-
/* Configuration data output rate */
- result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_ODR, args);
+ result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_ODR, args);
if (result == RT_EOK)
{
sensor->config.odr = (rt_uint32_t)args & 0xFFFF;
@@ -339,9 +371,8 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args)
}
break;
case RT_SENSOR_CTRL_SET_POWER:
-
/* Configuration sensor power mode */
- result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_POWER, args);
+ result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER, args);
if (result == RT_EOK)
{
sensor->config.power = (rt_uint32_t)args & 0xFF;
@@ -349,16 +380,15 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args)
}
break;
case RT_SENSOR_CTRL_SELF_TEST:
-
/* Device self-test */
- result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SELF_TEST, args);
+ result = local_ctrl(sensor, RT_SENSOR_CTRL_SELF_TEST, args);
break;
default:
if (cmd > RT_SENSOR_CTRL_USER_CMD_START)
{
/* Custom commands */
- result = sensor->ops->control(sensor, cmd, args);
+ result = local_ctrl(sensor, cmd, args);
}
else
{
@@ -387,6 +417,7 @@ const static struct rt_device_ops rt_sensor_ops =
};
#endif
+
/*
* sensor register
*/
@@ -401,6 +432,11 @@ int rt_hw_sensor_register(rt_sensor_t sensor,
char *sensor_name = RT_NULL, *device_name = RT_NULL;
+ if (sensor->ops == RT_NULL)
+ {
+ sensor->ops = &local_ops;
+ }
+
/* Add a type name for the sensor device */
sensor_name = sensor_name_str[sensor->info.type];
device_name = (char *)rt_calloc(1, rt_strlen(sensor_name) + 1 + rt_strlen(name));
@@ -444,12 +480,12 @@ int rt_hw_sensor_register(rt_sensor_t sensor,
result = rt_device_register(device, device_name, flag | RT_DEVICE_FLAG_STANDALONE);
if (result != RT_EOK)
{
+ LOG_E("rt_sensor[%s] register err code: %d", device_name, result);
rt_free(device_name);
- LOG_E("rt_sensor register err code: %d", result);
return result;
}
rt_free(device_name);
- LOG_I("rt_sensor init success");
+ LOG_I("rt_sensor[%s] init success", device_name);
return RT_EOK;
}
diff --git a/components/drivers/sensors/sensor.h b/components/drivers/sensors/sensor.h
index b180e36a73..761ee49b4c 100755
--- a/components/drivers/sensors/sensor.h
+++ b/components/drivers/sensors/sensor.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,231 +8,7 @@
* 2019-01-31 flybreak first version
*/
-#ifndef __SENSOR_H__
-#define __SENSOR_H__
#include <rtthread.h>
#include <rtdevice.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef RT_USING_RTC
-#define rt_sensor_get_ts() time(RT_NULL) /* API for the sensor to get the timestamp */
-#else
-#define rt_sensor_get_ts() rt_tick_get() /* API for the sensor to get the timestamp */
-#endif
-
-#define RT_PIN_NONE 0xFFFF /* RT PIN NONE */
-#define RT_DEVICE_FLAG_FIFO_RX 0x200 /* Flag to use when the sensor is open by fifo mode */
-
-#define RT_SENSOR_MODULE_MAX (3) /* The maximum number of members of a sensor module */
-
-/* Sensor types */
-
-#define RT_SENSOR_CLASS_NONE (0)
-#define RT_SENSOR_CLASS_ACCE (1) /* Accelerometer */
-#define RT_SENSOR_CLASS_GYRO (2) /* Gyroscope */
-#define RT_SENSOR_CLASS_MAG (3) /* Magnetometer */
-#define RT_SENSOR_CLASS_TEMP (4) /* Temperature */
-#define RT_SENSOR_CLASS_HUMI (5) /* Relative Humidity */
-#define RT_SENSOR_CLASS_BARO (6) /* Barometer */
-#define RT_SENSOR_CLASS_LIGHT (7) /* Ambient light */
-#define RT_SENSOR_CLASS_PROXIMITY (8) /* Proximity */
-#define RT_SENSOR_CLASS_HR (9) /* Heart Rate */
-#define RT_SENSOR_CLASS_TVOC (10) /* TVOC Level */
-#define RT_SENSOR_CLASS_NOISE (11) /* Noise Loudness */
-#define RT_SENSOR_CLASS_STEP (12) /* Step sensor */
-#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 */
-#define RT_SENSOR_CLASS_TOF (17) /* TOF sensor */
-
-/* Sensor vendor types */
-
-#define RT_SENSOR_VENDOR_UNKNOWN (0)
-#define RT_SENSOR_VENDOR_STM (1) /* STMicroelectronics */
-#define RT_SENSOR_VENDOR_BOSCH (2) /* Bosch */
-#define RT_SENSOR_VENDOR_INVENSENSE (3) /* Invensense */
-#define RT_SENSOR_VENDOR_SEMTECH (4) /* Semtech */
-#define RT_SENSOR_VENDOR_GOERTEK (5) /* Goertek */
-#define RT_SENSOR_VENDOR_MIRAMEMS (6) /* MiraMEMS */
-#define RT_SENSOR_VENDOR_DALLAS (7) /* Dallas */
-#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 */
-
-#define RT_SENSOR_UNIT_NONE (0)
-#define RT_SENSOR_UNIT_MG (1) /* Accelerometer unit: mG */
-#define RT_SENSOR_UNIT_MDPS (2) /* Gyroscope unit: mdps */
-#define RT_SENSOR_UNIT_MGAUSS (3) /* Magnetometer unit: mGauss */
-#define RT_SENSOR_UNIT_LUX (4) /* Ambient light unit: lux */
-#define RT_SENSOR_UNIT_CM (5) /* Distance unit: cm */
-#define RT_SENSOR_UNIT_PA (6) /* Barometer unit: pa */
-#define RT_SENSOR_UNIT_PERMILLAGE (7) /* Relative Humidity unit: permillage */
-#define RT_SENSOR_UNIT_DCELSIUS (8) /* Temperature unit: dCelsius */
-#define RT_SENSOR_UNIT_HZ (9) /* Frequency unit: HZ */
-#define RT_SENSOR_UNIT_ONE (10) /* Dimensionless quantity unit: 1 */
-#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 */
-
-#define RT_SENSOR_INTF_I2C (1 << 0)
-#define RT_SENSOR_INTF_SPI (1 << 1)
-#define RT_SENSOR_INTF_UART (1 << 2)
-#define RT_SENSOR_INTF_ONEWIRE (1 << 3)
-
-/* Sensor power mode types */
-
-#define RT_SENSOR_POWER_NONE (0)
-#define RT_SENSOR_POWER_DOWN (1) /* power down mode */
-#define RT_SENSOR_POWER_NORMAL (2) /* normal-power mode */
-#define RT_SENSOR_POWER_LOW (3) /* low-power mode */
-#define RT_SENSOR_POWER_HIGH (4) /* high-power mode */
-
-/* Sensor work mode types */
-
-#define RT_SENSOR_MODE_NONE (0)
-#define RT_SENSOR_MODE_POLLING (1) /* One shot only read a data */
-#define RT_SENSOR_MODE_INT (2) /* TODO: One shot interrupt only read a data */
-#define RT_SENSOR_MODE_FIFO (3) /* TODO: One shot interrupt read all fifo data */
-
-/* Sensor control cmd types */
-
-#define RT_SENSOR_CTRL_GET_ID (0) /* Get device id */
-#define RT_SENSOR_CTRL_GET_INFO (1) /* Get sensor info */
-#define RT_SENSOR_CTRL_SET_RANGE (2) /* Set the measure range of sensor. unit is info of sensor */
-#define RT_SENSOR_CTRL_SET_ODR (3) /* Set output date rate. unit is HZ */
-#define RT_SENSOR_CTRL_SET_MODE (4) /* Set sensor's work mode. ex. RT_SENSOR_MODE_POLLING,RT_SENSOR_MODE_INT */
-#define RT_SENSOR_CTRL_SET_POWER (5) /* Set power mode. args type of sensor power mode. ex. RT_SENSOR_POWER_DOWN,RT_SENSOR_POWER_NORMAL */
-#define RT_SENSOR_CTRL_SELF_TEST (6) /* Take a self test */
-
-#define RT_SENSOR_CTRL_USER_CMD_START 0x100 /* User commands should be greater than 0x100 */
-
-struct rt_sensor_info
-{
- rt_uint8_t type; /* The sensor type */
- rt_uint8_t vendor; /* Vendor of sensors */
- const char *model; /* model name of sensor */
- rt_uint8_t unit; /* unit of measurement */
- rt_uint8_t intf_type; /* Communication interface type */
- rt_int32_t range_max; /* maximum range of this sensor's value. unit is 'unit' */
- rt_int32_t range_min; /* minimum range of this sensor's value. unit is 'unit' */
- rt_uint32_t period_min; /* Minimum measurement period,unit:ms. zero = not a constant rate */
- rt_uint8_t fifo_max;
-};
-
-struct rt_sensor_intf
-{
- char *dev_name; /* The name of the communication device */
- rt_uint8_t type; /* Communication interface type */
- void *user_data; /* Private data for the sensor. ex. i2c addr,spi cs,control I/O */
-};
-
-struct rt_sensor_config
-{
- struct rt_sensor_intf intf; /* sensor interface config */
- struct rt_device_pin_mode irq_pin; /* Interrupt pin, The purpose of this pin is to notification read data */
- rt_uint8_t mode; /* sensor work mode */
- rt_uint8_t power; /* sensor power mode */
- rt_uint16_t odr; /* sensor out data rate */
- rt_int32_t range; /* sensor range of measurement */
-};
-
-typedef struct rt_sensor_device *rt_sensor_t;
-
-struct rt_sensor_device
-{
- struct rt_device parent; /* The standard device */
-
- struct rt_sensor_info info; /* The sensor info data */
- struct rt_sensor_config config; /* The sensor config data */
-
- void *data_buf; /* The buf of the data received */
- rt_size_t data_len; /* The size of the data received */
-
- const struct rt_sensor_ops *ops; /* The sensor ops */
-
- struct rt_sensor_module *module; /* The sensor module */
-
- rt_err_t (*irq_handle)(rt_sensor_t sensor); /* Called when an interrupt is generated, registered by the driver */
-};
-
-struct rt_sensor_module
-{
- rt_mutex_t lock; /* The module lock */
-
- rt_sensor_t sen[RT_SENSOR_MODULE_MAX]; /* The module contains a list of sensors */
- rt_uint8_t sen_num; /* Number of sensors contained in the module */
-};
-
-/* 3-axis Data Type */
-struct sensor_3_axis
-{
- rt_int32_t x;
- rt_int32_t y;
- 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 */
- rt_uint8_t type; /* The sensor type of the data */
- union
- {
- 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) */
- rt_int32_t light; /* Light. unit: lux */
- rt_int32_t proximity; /* Distance. unit: centimeters */
- rt_int32_t hr; /* Heart rate. unit: bpm */
- rt_int32_t tvoc; /* TVOC. unit: permillage */
- rt_int32_t noise; /* Noise Loudness. unit: HZ */
- rt_uint32_t step; /* Step sensor. unit: 1 */
- rt_int32_t force; /* Force sensor. unit: mN */
- rt_uint32_t dust; /* Dust sensor. unit: ug/m3 */
- rt_uint32_t eco2; /* eCO2 sensor. unit: ppm */
- } data;
-};
-
-struct rt_sensor_ops
-{
- rt_size_t (*fetch_data)(struct rt_sensor_device *sensor, void *buf, rt_size_t len);
- rt_err_t (*control)(struct rt_sensor_device *sensor, int cmd, void *arg);
-};
-
-int rt_hw_sensor_register(rt_sensor_t sensor,
- const char *name,
- rt_uint32_t flag,
- void *data);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __SENSOR_H__ */
diff --git a/components/drivers/sensors/sensor_cmd.c b/components/drivers/sensors/sensor_cmd.c
index cbf7d233c6..14e53b1c22 100755
--- a/components/drivers/sensors/sensor_cmd.c
+++ b/components/drivers/sensors/sensor_cmd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -92,7 +92,7 @@ static void sensor_fifo_rx_entry(void *parameter)
struct rt_sensor_data *data = RT_NULL;
struct rt_sensor_info info;
rt_size_t res, i;
-
+
rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
data = (struct rt_sensor_data *)rt_malloc(sizeof(struct rt_sensor_data) * info.fifo_max);
@@ -126,7 +126,7 @@ static void sensor_fifo(int argc, char **argv)
return;
}
sensor = (rt_sensor_t)dev;
-
+
if (rt_device_open(dev, RT_DEVICE_FLAG_FIFO_RX) != RT_EOK)
{
LOG_E("open device failed!");
@@ -155,7 +155,7 @@ static void sensor_fifo(int argc, char **argv)
rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
MSH_CMD_EXPORT(sensor_fifo, Sensor fifo mode test function);
#endif
@@ -219,7 +219,7 @@ static void sensor_int(int argc, char **argv)
}
rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
MSH_CMD_EXPORT(sensor_int, Sensor interrupt mode test function);
#endif
@@ -231,6 +231,7 @@ static void sensor_polling(int argc, char **argv)
struct rt_sensor_data data;
rt_size_t res, i;
rt_int32_t delay;
+ rt_err_t result;
dev = rt_device_find(argv[1]);
if (dev == RT_NULL)
@@ -244,9 +245,10 @@ static void sensor_polling(int argc, char **argv)
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)
+ result = rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
+ if (result != RT_EOK)
{
- LOG_E("open device failed!");
+ LOG_E("open device failed! error code : %d", result);
return;
}
rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
@@ -266,7 +268,7 @@ static void sensor_polling(int argc, char **argv)
}
rt_device_close(dev);
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
MSH_CMD_EXPORT(sensor_polling, Sensor polling mode test function);
#endif
@@ -451,7 +453,7 @@ static void sensor(int argc, char **argv)
dev = rt_device_find(argv[2]);
if (dev == RT_NULL)
{
- LOG_E("Can't find device:%s", argv[1]);
+ LOG_E("Can't find device:%s", argv[2]);
return;
}
if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
@@ -494,6 +496,6 @@ static void sensor(int argc, char **argv)
LOG_W("Unknown command, please enter 'sensor' get help information!");
}
}
-#ifdef FINSH_USING_MSH
+#ifdef RT_USING_FINSH
MSH_CMD_EXPORT(sensor, sensor test function);
#endif
diff --git a/components/drivers/serial/SConscript b/components/drivers/serial/SConscript
index a6eb115919..81d791803a 100644
--- a/components/drivers/serial/SConscript
+++ b/components/drivers/serial/SConscript
@@ -1,8 +1,14 @@
from building import *
-cwd = GetCurrentDir()
-src = Glob('*.c')
+cwd = GetCurrentDir()
CPPPATH = [cwd + '/../include']
-group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SERIAL'], CPPPATH = CPPPATH)
+group = []
+if GetDepend(['RT_USING_SERIAL']):
+ if GetDepend(['RT_USING_SERIAL_V2']):
+ src = Glob('serial_v2.c')
+ group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SERIAL_V2'], CPPPATH = CPPPATH)
+ else:
+ src = Glob('serial.c')
+ group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SERIAL'], CPPPATH = CPPPATH)
Return('group')
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c
index 5743155e37..289d523bd2 100644
--- a/components/drivers/serial/serial.c
+++ b/components/drivers/serial/serial.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -24,7 +24,8 @@
* 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
- * 2020-12-14 Meco Man add function of setting window's size(TIOCSWINSZ)
+ * 2020-12-14 Meco Man implement function of setting window's size(TIOCSWINSZ)
+ * 2021-08-22 Meco Man implement function of getting window's size(TIOCGWINSZ)
*/
#include <rthw.h>
@@ -37,7 +38,8 @@
#ifdef RT_USING_POSIX
#include <dfs_posix.h>
-#include <dfs_poll.h>
+#include <poll.h>
+#include <sys/ioctl.h>
#ifdef RT_USING_POSIX_TERMIOS
#include <posix_termios.h>
@@ -460,7 +462,7 @@ static void rt_dma_recv_update_put_index(struct rt_serial_device *serial, rt_siz
rx_fifo->is_full = RT_TRUE;
}
}
-
+
if(rx_fifo->is_full == RT_TRUE)
{
_serial_check_buffer_size();
@@ -615,7 +617,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
/* initialize the Rx/Tx structure according to open flag */
if (serial->serial_rx == RT_NULL)
- {
+ {
if (oflag & RT_DEVICE_FLAG_INT_RX)
{
struct rt_serial_rx_fifo* rx_fifo;
@@ -634,7 +636,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
/* configure low level device */
serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX);
}
-#ifdef RT_SERIAL_USING_DMA
+#ifdef RT_SERIAL_USING_DMA
else if (oflag & RT_DEVICE_FLAG_DMA_RX)
{
if (serial->config.bufsz == 0) {
@@ -675,7 +677,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
#ifdef RT_SERIAL_USING_DMA
else if (oflag & RT_DEVICE_FLAG_DMA_RX)
dev->open_flag |= RT_DEVICE_FLAG_DMA_RX;
-#endif /* RT_SERIAL_USING_DMA */
+#endif /* RT_SERIAL_USING_DMA */
}
if (serial->serial_tx == RT_NULL)
@@ -723,7 +725,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
#ifdef RT_SERIAL_USING_DMA
else if (oflag & RT_DEVICE_FLAG_DMA_TX)
dev->open_flag |= RT_DEVICE_FLAG_DMA_TX;
-#endif /* RT_SERIAL_USING_DMA */
+#endif /* RT_SERIAL_USING_DMA */
}
/* set stream flag */
@@ -746,19 +748,24 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
{
struct rt_serial_rx_fifo* rx_fifo;
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_RX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
+
rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_free(rx_fifo);
serial->serial_rx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_RX);
}
#ifdef RT_SERIAL_USING_DMA
else if (dev->open_flag & RT_DEVICE_FLAG_DMA_RX)
{
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_DMA_RX;
+
if (serial->config.bufsz == 0)
{
struct rt_serial_rx_dma* rx_dma;
@@ -778,32 +785,34 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
rt_free(rx_fifo);
}
serial->serial_rx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_DMA_RX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX);
}
#endif /* RT_SERIAL_USING_DMA */
-
+
if (dev->open_flag & RT_DEVICE_FLAG_INT_TX)
{
struct rt_serial_tx_fifo* tx_fifo;
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
+
tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_free(tx_fifo);
serial->serial_tx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
/* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
}
#ifdef RT_SERIAL_USING_DMA
else if (dev->open_flag & RT_DEVICE_FLAG_DMA_TX)
{
struct rt_serial_tx_dma* tx_dma;
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_TX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_DMA_TX;
+
tx_dma = (struct rt_serial_tx_dma*)serial->serial_tx;
RT_ASSERT(tx_dma != RT_NULL);
@@ -811,16 +820,13 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
rt_free(tx_dma);
serial->serial_tx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_DMA_TX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_TX);
}
+#endif /* RT_SERIAL_USING_DMA */
serial->ops->control(serial, RT_DEVICE_CTRL_CLOSE, RT_NULL);
dev->flag &= ~RT_DEVICE_FLAG_ACTIVATED;
-#endif /* RT_SERIAL_USING_DMA */
return RT_EOK;
}
@@ -845,7 +851,7 @@ static rt_size_t rt_serial_read(struct rt_device *dev,
{
return _serial_dma_rx(serial, (rt_uint8_t *)buffer, size);
}
-#endif /* RT_SERIAL_USING_DMA */
+#endif /* RT_SERIAL_USING_DMA */
return _serial_poll_rx(serial, (rt_uint8_t *)buffer, size);
}
@@ -866,7 +872,7 @@ static rt_size_t rt_serial_write(struct rt_device *dev,
{
return _serial_int_tx(serial, (const rt_uint8_t *)buffer, size);
}
-#ifdef RT_SERIAL_USING_DMA
+#ifdef RT_SERIAL_USING_DMA
else if (dev->open_flag & RT_DEVICE_FLAG_DMA_TX)
{
return _serial_dma_tx(serial, (const rt_uint8_t *)buffer, size);
@@ -950,9 +956,7 @@ static void _tc_flush(struct rt_serial_device *serial, int queue)
{
RT_ASSERT(RT_NULL != rx_fifo);
level = rt_hw_interrupt_disable();
- rt_memset(rx_fifo->buffer, 0, serial->config.bufsz);
- rx_fifo->put_index = 0;
- rx_fifo->get_index = 0;
+ rx_fifo->get_index = rx_fifo->put_index;
rx_fifo->is_full = RT_FALSE;
rt_hw_interrupt_enable(level);
}
@@ -1108,17 +1112,97 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
break;
case TCXONC:
break;
+#endif /*RT_USING_POSIX_TERMIOS*/
case TIOCSWINSZ:
{
struct winsize* p_winsize;
p_winsize = (struct winsize*)args;
- rt_enter_critical();
rt_kprintf("\x1b[8;%d;%dt", p_winsize->ws_col, p_winsize->ws_row);
- rt_exit_critical();
}
break;
-#endif /*RT_USING_POSIX_TERMIOS*/
+ case TIOCGWINSZ:
+ {
+ struct winsize* p_winsize;
+ p_winsize = (struct winsize*)args;
+
+ if(rt_thread_self() != rt_thread_find("tshell"))
+ {
+ /* only can be used in tshell thread; otherwise, return default size */
+ p_winsize->ws_col = 80;
+ p_winsize->ws_row = 24;
+ }
+ else
+ {
+ #define _TIO_BUFLEN 20
+ char _tio_buf[_TIO_BUFLEN];
+ unsigned char cnt1, cnt2, cnt3, i;
+ char row_s[4], col_s[4];
+ char *p;
+
+ rt_memset(_tio_buf, 0, _TIO_BUFLEN);
+
+ /* send the command to terminal for getting the window size of the terminal */
+ rt_kprintf("\033[18t");
+
+ /* waiting for the response from the terminal */
+ i = 0;
+ while(i < _TIO_BUFLEN)
+ {
+ _tio_buf[i] = getchar();
+ if(_tio_buf[i] != 't')
+ {
+ i ++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ if(i == _TIO_BUFLEN)
+ {
+ /* buffer overloaded, and return default size */
+ p_winsize->ws_col = 80;
+ p_winsize->ws_row = 24;
+ break;
+ }
+
+ /* interpreting data eg: "\033[8;1;15t" which means row is 1 and col is 15 (unit: size of ONE character) */
+ rt_memset(row_s,0,4);
+ rt_memset(col_s,0,4);
+ cnt1 = 0;
+ while(_tio_buf[cnt1] != ';' && cnt1 < _TIO_BUFLEN)
+ {
+ cnt1++;
+ }
+ cnt2 = ++cnt1;
+ while(_tio_buf[cnt2] != ';' && cnt2 < _TIO_BUFLEN)
+ {
+ cnt2++;
+ }
+ p = row_s;
+ while(cnt1 < cnt2)
+ {
+ *p++ = _tio_buf[cnt1++];
+ }
+ p = col_s;
+ cnt2++;
+ cnt3 = rt_strlen(_tio_buf) - 1;
+ while(cnt2 < cnt3)
+ {
+ *p++ = _tio_buf[cnt2++];
+ }
+
+ /* load the window size date */
+ p_winsize->ws_col = atoi(col_s);
+ p_winsize->ws_row = atoi(row_s);
+ #undef _TIO_BUFLEN
+ }
+
+ p_winsize->ws_xpixel = 0;/* unused */
+ p_winsize->ws_ypixel = 0;/* unused */
+ }
+ break;
case FIONREAD:
{
rt_size_t recved = 0;
@@ -1142,7 +1226,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops serial_ops =
+const static struct rt_device_ops serial_ops =
{
rt_serial_init,
rt_serial_open,
diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c
new file mode 100644
index 0000000000..390dd31748
--- /dev/null
+++ b/components/drivers/serial/serial_v2.c
@@ -0,0 +1,1268 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-06-01 KyleChan first version
+ */
+
+#include <rthw.h>
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#define DBG_TAG "UART"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+#ifdef RT_USING_POSIX
+#include <dfs_posix.h>
+#include <poll.h>
+#include <sys/ioctl.h>
+
+#ifdef getc
+#undef getc
+#endif
+
+#ifdef putc
+#undef putc
+#endif
+
+static rt_err_t serial_fops_rx_ind(rt_device_t dev, rt_size_t size)
+{
+ rt_wqueue_wakeup(&(dev->wait_queue), (void*)POLLIN);
+
+ return RT_EOK;
+}
+
+/* fops for serial */
+static int serial_fops_open(struct dfs_fd *fd)
+{
+ rt_err_t ret = 0;
+ rt_uint16_t flags = 0;
+ rt_device_t device;
+
+ device = (rt_device_t)fd->data;
+ RT_ASSERT(device != RT_NULL);
+
+ switch (fd->flags & O_ACCMODE)
+ {
+ case O_RDONLY:
+ LOG_D("fops open: O_RDONLY!");
+ flags = RT_DEVICE_FLAG_RDONLY;
+ break;
+ case O_WRONLY:
+ LOG_D("fops open: O_WRONLY!");
+ flags = RT_DEVICE_FLAG_WRONLY;
+ break;
+ case O_RDWR:
+ LOG_D("fops open: O_RDWR!");
+ flags = RT_DEVICE_FLAG_RDWR;
+ break;
+ default:
+ LOG_E("fops open: unknown mode - %d!", fd->flags & O_ACCMODE);
+ break;
+ }
+
+ if ((fd->flags & O_ACCMODE) != O_WRONLY)
+ rt_device_set_rx_indicate(device, serial_fops_rx_ind);
+ ret = rt_device_open(device, flags);
+ if (ret == RT_EOK) return 0;
+
+ return ret;
+}
+
+static int serial_fops_close(struct dfs_fd *fd)
+{
+ rt_device_t device;
+
+ device = (rt_device_t)fd->data;
+
+ rt_device_set_rx_indicate(device, RT_NULL);
+ rt_device_close(device);
+
+ return 0;
+}
+
+static int serial_fops_ioctl(struct dfs_fd *fd, int cmd, void *args)
+{
+ rt_device_t device;
+
+ device = (rt_device_t)fd->data;
+ switch (cmd)
+ {
+ case FIONREAD:
+ break;
+ case FIONWRITE:
+ break;
+ }
+
+ return rt_device_control(device, cmd, args);
+}
+
+static int serial_fops_read(struct dfs_fd *fd, void *buf, size_t count)
+{
+ int size = 0;
+ rt_device_t device;
+
+ device = (rt_device_t)fd->data;
+
+ do
+ {
+ size = rt_device_read(device, -1, buf, count);
+ if (size <= 0)
+ {
+ if (fd->flags & O_NONBLOCK)
+ {
+ size = -EAGAIN;
+ break;
+ }
+
+ rt_wqueue_wait(&(device->wait_queue), 0, RT_WAITING_FOREVER);
+ }
+ }while (size <= 0);
+
+ return size;
+}
+
+static int serial_fops_write(struct dfs_fd *fd, const void *buf, size_t count)
+{
+ rt_device_t device;
+
+ device = (rt_device_t)fd->data;
+ return rt_device_write(device, -1, buf, count);
+}
+
+static int serial_fops_poll(struct dfs_fd *fd, struct rt_pollreq *req)
+{
+ int mask = 0;
+ int flags = 0;
+ rt_device_t device;
+ struct rt_serial_device *serial;
+
+ device = (rt_device_t)fd->data;
+ RT_ASSERT(device != RT_NULL);
+
+ serial = (struct rt_serial_device *)device;
+
+ /* only support POLLIN */
+ flags = fd->flags & O_ACCMODE;
+ if (flags == O_RDONLY || flags == O_RDWR)
+ {
+ rt_base_t level;
+ struct rt_serial_rx_fifo* rx_fifo;
+
+ rt_poll_add(&(device->wait_queue), req);
+
+ rx_fifo = (struct rt_serial_rx_fifo*) serial->serial_rx;
+
+ level = rt_hw_interrupt_disable();
+
+ if (rt_ringbuffer_data_len(&rx_fifo->rb))
+ mask |= POLLIN;
+ rt_hw_interrupt_enable(level);
+ }
+ // mask|=POLLOUT;
+ return mask;
+}
+
+const static struct dfs_file_ops _serial_fops =
+{
+ serial_fops_open,
+ serial_fops_close,
+ serial_fops_ioctl,
+ serial_fops_read,
+ serial_fops_write,
+ RT_NULL, /* flush */
+ RT_NULL, /* lseek */
+ RT_NULL, /* getdents */
+ serial_fops_poll,
+};
+#endif
+
+static rt_size_t rt_serial_get_linear_buffer(struct rt_ringbuffer *rb,
+ rt_uint8_t **ptr)
+{
+ rt_size_t size;
+
+ RT_ASSERT(rb != RT_NULL);
+
+ *ptr = RT_NULL;
+
+ /* whether has enough data */
+ size = rt_ringbuffer_data_len(rb);
+
+ /* no data */
+ if (size == 0)
+ return 0;
+
+ *ptr = &rb->buffer_ptr[rb->read_index];
+
+ if(rb->buffer_size - rb->read_index > size)
+ {
+ return size;
+ }
+
+ return rb->buffer_size - rb->read_index;
+}
+
+static rt_size_t rt_serial_update_read_index(struct rt_ringbuffer *rb,
+ rt_uint16_t read_index)
+{
+ rt_size_t size;
+
+ RT_ASSERT(rb != RT_NULL);
+
+ /* whether has enough data */
+ size = rt_ringbuffer_data_len(rb);
+
+ /* no data */
+ if (size == 0)
+ return 0;
+
+ /* less data */
+ if(size < read_index)
+ read_index = size;
+
+ if(rb->buffer_size - rb->read_index > read_index)
+ {
+ rb->read_index += read_index;
+ return read_index;
+ }
+
+ read_index = rb->buffer_size - rb->read_index;
+
+ /* we are going into the other side of the mirror */
+ rb->read_mirror = ~rb->read_mirror;
+ rb->read_index = 0;
+
+ return read_index;
+}
+
+static rt_size_t rt_serial_update_write_index(struct rt_ringbuffer *rb,
+ rt_uint16_t write_index)
+{
+ rt_uint16_t size;
+ RT_ASSERT(rb != RT_NULL);
+
+ /* whether has enough space */
+ size = rt_ringbuffer_space_len(rb);
+
+ /* no space */
+ if (size == 0)
+ return 0;
+
+ /* drop some data */
+ if (size < write_index)
+ write_index = size;
+
+ if (rb->buffer_size - rb->write_index > write_index)
+ {
+ /* this should not cause overflow because there is enough space for
+ * length of data in current mirror */
+ rb->write_index += write_index;
+ return write_index;
+ }
+
+ /* we are going into the other side of the mirror */
+ rb->write_mirror = ~rb->write_mirror;
+ rb->write_index = write_index - (rb->buffer_size - rb->write_index);
+
+ return write_index;
+}
+
+
+/**
+ * @brief Serial polling receive data routine, This function will receive data
+ * in a continuous loop by one by one byte.
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Receive data buffer.
+ * @param size Receive data buffer length.
+ * @return Return the final length of data received.
+ */
+rt_size_t _serial_poll_rx(struct rt_device *dev,
+ rt_off_t pos,
+ void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ rt_size_t getc_size;
+ int getc_element; /* Gets one byte of data received */
+ rt_uint8_t *getc_buffer; /* Pointer to the receive data buffer */
+
+ RT_ASSERT(dev != RT_NULL);
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT(serial != RT_NULL);
+ getc_buffer = (rt_uint8_t *)buffer;
+ getc_size = size;
+
+ while(size)
+ {
+ getc_element = serial->ops->getc(serial);
+ if (getc_element == -1) break;
+
+ *getc_buffer = getc_element;
+
+ ++ getc_buffer;
+ -- size;
+
+ if (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)
+ {
+ /* If open_flag satisfies RT_DEVICE_FLAG_STREAM
+ * and the received character is '\n', exit the loop directly */
+ if (getc_element == '\n') break;
+ }
+ }
+
+ return getc_size - size;
+}
+
+/**
+ * @brief Serial polling transmit data routines, This function will transmit
+ * data in a continuous loop by one by one byte.
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Transmit data buffer.
+ * @param size Transmit data buffer length.
+ * @return Return the final length of data received.
+ */
+rt_size_t _serial_poll_tx(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ rt_size_t putc_size;
+ rt_uint8_t *putc_buffer; /* Pointer to the transmit data buffer */
+ RT_ASSERT(dev != RT_NULL);
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT(serial != RT_NULL);
+
+ putc_buffer = (rt_uint8_t *)buffer;
+ putc_size = size;
+
+ while (size)
+ {
+ if (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)
+ {
+ /* If open_flag satisfies RT_DEVICE_FLAG_STREAM and the received character is '\n',
+ * inserts '\r' character before '\n' character for the effect of carriage return newline */
+ if (*putc_buffer == '\n')
+ serial->ops->putc(serial, '\r');
+ }
+ serial->ops->putc(serial, *putc_buffer);
+
+ ++ putc_buffer;
+ -- size;
+ }
+
+ return putc_size - size;
+}
+
+/**
+ * @brief Serial receive data routines, This function will receive
+ * data by using fifo
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Receive data buffer.
+ * @param size Receive data buffer length.
+ * @return Return the final length of data received.
+ */
+static rt_size_t _serial_fifo_rx(struct rt_device *dev,
+ rt_off_t pos,
+ void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_rx_fifo *rx_fifo;
+ rt_base_t level;
+ rt_size_t recv_len; /* The length of data from the ringbuffer */
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+
+ RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
+
+ rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
+
+ if (dev->open_flag & RT_SERIAL_RX_BLOCKING)
+ {
+ if (size > serial->config.rx_bufsz)
+ {
+ LOG_W("(%s) serial device received data:[%d] larger than "
+ "rx_bufsz:[%d], please increase the BSP_UARTx_RX_BUFSIZE option",
+ dev->parent.name, size, serial->config.rx_bufsz);
+
+ return 0;
+ }
+ /* Get the length of the data from the ringbuffer */
+ recv_len = rt_ringbuffer_data_len(&(rx_fifo->rb));
+
+ if (recv_len < size)
+ {
+ /* When recv_len is less than size, rx_cpt_index is updated to the size
+ * and rt_current_thread is suspend until rx_cpt_index is equal to 0 */
+ rx_fifo->rx_cpt_index = size;
+ rt_completion_wait(&(rx_fifo->rx_cpt), RT_WAITING_FOREVER);
+ }
+ }
+
+ /* This part of the code is open_flag as RT_SERIAL_RX_NON_BLOCKING */
+
+ level = rt_hw_interrupt_disable();
+ /* When open_flag is RT_SERIAL_RX_NON_BLOCKING,
+ * the data is retrieved directly from the ringbuffer and returned */
+ recv_len = rt_ringbuffer_get(&(rx_fifo->rb), buffer, size);
+
+ rt_hw_interrupt_enable(level);
+
+ return recv_len;
+}
+
+/**
+ * @brief Serial transmit data routines, This function will transmit
+ * data by using blocking_nbuf.
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Transmit data buffer.
+ * @param size Transmit data buffer length.
+ * @return Return the final length of data transmit.
+ */
+static rt_size_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
+ tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ /* When serial transmit in tx_blocking mode,
+ * if the activated mode is RT_TRUE, it will return directly */
+ if (tx_fifo->activated == RT_TRUE) return 0;
+
+ tx_fifo->activated = RT_TRUE;
+ /* Call the transmit interface for transmission */
+ serial->ops->transmit(serial,
+ (rt_uint8_t *)buffer,
+ size,
+ RT_SERIAL_TX_BLOCKING);
+ /* Waiting for the transmission to complete */
+ rt_completion_wait(&(tx_fifo->tx_cpt), RT_WAITING_FOREVER);
+
+ return size;
+}
+
+/**
+ * @brief Serial transmit data routines, This function will transmit
+ * data by using blocking_buf.
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Transmit data buffer.
+ * @param size Transmit data buffer length.
+ * @return Return the final length of data transmit.
+ */
+static rt_size_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
+ tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
+ RT_ASSERT(tx_fifo != RT_NULL);
+ /* When serial transmit in tx_blocking mode,
+ * if the activated mode is RT_TRUE, it will return directly */
+ if (tx_fifo->activated == RT_TRUE) return 0;
+
+ tx_fifo->activated = RT_TRUE;
+ rt_size_t length = size;
+ rt_size_t offset = 0;
+
+ while (size)
+ {
+ /* Copy one piece of data into the ringbuffer at a time
+ * until the length of the data is equal to size */
+ tx_fifo->put_size = rt_ringbuffer_put(&(tx_fifo->rb),
+ (rt_uint8_t *)buffer + offset,
+ size);
+
+ offset += tx_fifo->put_size;
+ size -= tx_fifo->put_size;
+ /* Call the transmit interface for transmission */
+ serial->ops->transmit(serial,
+ (rt_uint8_t *)buffer + offset,
+ tx_fifo->put_size,
+ RT_SERIAL_TX_BLOCKING);
+ /* Waiting for the transmission to complete */
+ rt_completion_wait(&(tx_fifo->tx_cpt), RT_WAITING_FOREVER);
+ }
+
+ return length;
+}
+
+/**
+ * @brief Serial transmit data routines, This function will transmit
+ * data by using nonblocking.
+ * @param dev The pointer of device driver structure
+ * @param pos Empty parameter.
+ * @param buffer Transmit data buffer.
+ * @param size Transmit data buffer length.
+ * @return Return the final length of data transmit.
+ */
+static rt_size_t _serial_fifo_tx_nonblocking(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo;
+ rt_base_t level;
+ rt_size_t length;
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
+ tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
+
+ level = rt_hw_interrupt_disable();
+
+ if (tx_fifo->activated == RT_FALSE)
+ {
+ /* When serial transmit in tx_non_blocking mode, if the activated mode is RT_FALSE,
+ * start copying data into the ringbuffer */
+ tx_fifo->activated = RT_TRUE;
+ /* Copying data into the ringbuffer */
+ length = rt_ringbuffer_put(&(tx_fifo->rb), buffer, size);
+
+ rt_hw_interrupt_enable(level);
+
+ rt_uint8_t *put_ptr = RT_NULL;
+ /* Get the linear length buffer from rinbuffer */
+ tx_fifo->put_size = rt_serial_get_linear_buffer(&(tx_fifo->rb), &put_ptr);
+ /* Call the transmit interface for transmission */
+ serial->ops->transmit(serial,
+ put_ptr,
+ tx_fifo->put_size,
+ RT_SERIAL_TX_NON_BLOCKING);
+ /* In tx_nonblocking mode, there is no need to call rt_completion_wait() APIs to wait
+ * for the rt_current_thread to resume */
+ return length;
+ }
+
+ /* If the activated mode is RT_FALSE, it means that serial device is transmitting,
+ * where only the data in the ringbuffer and there is no need to call the transmit() API.
+ * Note that this part of the code requires disable interrupts
+ * to prevent multi thread reentrant */
+
+ /* Copying data into the ringbuffer */
+ length = rt_ringbuffer_put(&(tx_fifo->rb), buffer, size);
+
+ rt_hw_interrupt_enable(level);
+
+ return length;
+}
+
+
+/**
+ * @brief Enable serial transmit mode.
+ * @param dev The pointer of device driver structure
+ * @param rx_oflag The flag of that the serial port opens.
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
+ rt_uint16_t tx_oflag)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ if (serial->config.tx_bufsz == 0)
+ {
+ /* Cannot use RT_SERIAL_TX_NON_BLOCKING when tx_bufsz is 0 */
+ if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING)
+ {
+ LOG_E("(%s) serial device with misconfigure: tx_bufsz = 0",
+ dev->parent.name);
+ return -RT_EINVAL;
+ }
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->write = _serial_poll_tx;
+#endif
+
+ dev->open_flag |= RT_SERIAL_TX_BLOCKING;
+ return RT_EOK;
+ }
+ /* Limits the minimum value of tx_bufsz */
+ if (serial->config.tx_bufsz < RT_SERIAL_TX_MINBUFSZ)
+ serial->config.tx_bufsz = RT_SERIAL_TX_MINBUFSZ;
+
+ if (tx_oflag == RT_SERIAL_TX_BLOCKING)
+ {
+ /* When using RT_SERIAL_TX_BLOCKING, it is necessary to determine
+ * whether serial device needs to use buffer */
+ rt_err_t optmode; /* The operating mode used by serial device */
+ /* Call the Control() API to get the operating mode */
+ optmode = serial->ops->control(serial,
+ RT_DEVICE_CHECK_OPTMODE,
+ (void *)RT_DEVICE_FLAG_TX_BLOCKING);
+ if (optmode == RT_SERIAL_TX_BLOCKING_BUFFER)
+ {
+ /* If use RT_SERIAL_TX_BLOCKING_BUFFER, the ringbuffer is initialized */
+ tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc
+ (sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ rt_ringbuffer_init(&(tx_fifo->rb),
+ tx_fifo->buffer,
+ serial->config.tx_bufsz);
+ serial->serial_tx = tx_fifo;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->write = _serial_fifo_tx_blocking_buf;
+#endif
+ }
+ else
+ {
+ /* If not use RT_SERIAL_TX_BLOCKING_BUFFER,
+ * the control() API is called to configure the serial device */
+ tx_fifo = (struct rt_serial_tx_fifo*) rt_malloc
+ (sizeof(struct rt_serial_tx_fifo));
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ serial->serial_tx = tx_fifo;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->write = _serial_fifo_tx_blocking_nbuf;
+#endif
+
+ /* Call the control() API to configure the serial device by RT_SERIAL_TX_BLOCKING*/
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CONFIG,
+ (void *)RT_SERIAL_TX_BLOCKING);
+ }
+
+ tx_fifo->activated = RT_FALSE;
+ tx_fifo->put_size = 0;
+ rt_completion_init(&(tx_fifo->tx_cpt));
+ dev->open_flag |= RT_SERIAL_TX_BLOCKING;
+
+ return RT_EOK;
+ }
+ /* When using RT_SERIAL_TX_NON_BLOCKING, ringbuffer needs to be initialized,
+ * and initialize the tx_fifo->activated value is RT_FALSE.
+ */
+ tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc
+ (sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ tx_fifo->activated = RT_FALSE;
+ tx_fifo->put_size = 0;
+ rt_ringbuffer_init(&(tx_fifo->rb),
+ tx_fifo->buffer,
+ serial->config.tx_bufsz);
+ serial->serial_tx = tx_fifo;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->write = _serial_fifo_tx_nonblocking;
+#endif
+
+ dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING;
+ /* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CONFIG,
+ (void *)RT_SERIAL_TX_NON_BLOCKING);
+
+ return RT_EOK;
+}
+
+
+/**
+ * @brief Enable serial receive mode.
+ * @param dev The pointer of device driver structure
+ * @param rx_oflag The flag of that the serial port opens.
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
+ rt_uint16_t rx_oflag)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ if (serial->config.rx_bufsz == 0)
+ {
+ /* Cannot use RT_SERIAL_RX_NON_BLOCKING when rx_bufsz is 0 */
+ if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
+ {
+ LOG_E("(%s) serial device with misconfigure: rx_bufsz = 0",
+ dev->parent.name);
+ return -RT_EINVAL;
+ }
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->read = _serial_poll_rx;
+#endif
+
+ dev->open_flag |= RT_SERIAL_RX_BLOCKING;
+ return RT_EOK;
+ }
+ /* Limits the minimum value of rx_bufsz */
+ if (serial->config.rx_bufsz < RT_SERIAL_RX_MINBUFSZ)
+ serial->config.rx_bufsz = RT_SERIAL_RX_MINBUFSZ;
+
+ rx_fifo = (struct rt_serial_rx_fifo *) rt_malloc
+ (sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz);
+
+ RT_ASSERT(rx_fifo != RT_NULL);
+ rt_ringbuffer_init(&(rx_fifo->rb), rx_fifo->buffer, serial->config.rx_bufsz);
+
+ serial->serial_rx = rx_fifo;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->read = _serial_fifo_rx;
+#endif
+
+ if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
+ {
+ dev->open_flag |= RT_SERIAL_RX_NON_BLOCKING;
+ /* Call the control() API to configure the serial device by RT_SERIAL_RX_NON_BLOCKING*/
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CONFIG,
+ (void *) RT_SERIAL_RX_NON_BLOCKING);
+
+ return RT_EOK;
+ }
+ /* When using RT_SERIAL_RX_BLOCKING, rt_completion_init() and rx_cpt_index are initialized */
+ rx_fifo->rx_cpt_index = 0;
+ rt_completion_init(&(rx_fifo->rx_cpt));
+ dev->open_flag |= RT_SERIAL_RX_BLOCKING;
+ /* Call the control() API to configure the serial device by RT_SERIAL_RX_BLOCKING*/
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CONFIG,
+ (void *) RT_SERIAL_RX_BLOCKING);
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Disable serial receive mode.
+ * @param dev The pointer of device driver structure
+ * @param rx_oflag The flag of that the serial port opens.
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_rx_disable(struct rt_device *dev,
+ rt_uint16_t rx_oflag)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_rx_fifo *rx_fifo;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->read = RT_NULL;
+#endif
+
+ if (serial->serial_rx == RT_NULL) return RT_EOK;
+
+ do
+ {
+ if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
+ {
+ dev->open_flag &= ~ RT_SERIAL_RX_NON_BLOCKING;
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CLR_INT,
+ (void *)RT_SERIAL_RX_NON_BLOCKING);
+ break;
+ }
+
+ dev->open_flag &= ~ RT_SERIAL_RX_BLOCKING;
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CLR_INT,
+ (void *)RT_SERIAL_RX_BLOCKING);
+ } while (0);
+
+ rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
+ RT_ASSERT(rx_fifo != RT_NULL);
+ rt_free(rx_fifo);
+ serial->serial_rx = RT_NULL;
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Disable serial tranmit mode.
+ * @param dev The pointer of device driver structure
+ * @param rx_oflag The flag of that the serial port opens.
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_tx_disable(struct rt_device *dev,
+ rt_uint16_t tx_oflag)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+#ifndef RT_USING_DEVICE_OPS
+ dev->write = RT_NULL;
+#endif
+
+ if (serial->serial_tx == RT_NULL) return RT_EOK;
+
+ tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ do
+ {
+ if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING)
+ {
+ dev->open_flag &= ~ RT_SERIAL_TX_NON_BLOCKING;
+
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CLR_INT,
+ (void *)RT_SERIAL_TX_NON_BLOCKING);
+ break;
+ }
+
+ rt_completion_done(&(tx_fifo->tx_cpt));
+ dev->open_flag &= ~ RT_SERIAL_TX_BLOCKING;
+ serial->ops->control(serial,
+ RT_DEVICE_CTRL_CLR_INT,
+ (void *)RT_SERIAL_TX_BLOCKING);
+ } while (0);
+
+ rt_free(tx_fifo);
+ serial->serial_tx = RT_NULL;
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Initialize the serial device.
+ * @param dev The pointer of device driver structure
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_init(struct rt_device *dev)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_serial_device *serial;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ /* initialize rx/tx */
+ serial->serial_rx = RT_NULL;
+ serial->serial_tx = RT_NULL;
+
+ /* apply configuration */
+ if (serial->ops->configure)
+ result = serial->ops->configure(serial, &serial->config);
+
+ return result;
+}
+
+/**
+ * @brief Open the serial device.
+ * @param dev The pointer of device driver structure
+ * @param oflag The flag of that the serial port opens.
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
+{
+ struct rt_serial_device *serial;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ /* Check that the device has been turned on */
+ if ((dev->open_flag) & (15 << 12))
+ {
+ LOG_D("(%s) serial device has already been opened, it will run in its original configuration", dev->parent.name);
+ return RT_EOK;
+ }
+
+ LOG_D("open serial device: 0x%08x with open flag: 0x%04x",
+ dev, oflag);
+
+ /* By default, the receive mode of a serial devide is RT_SERIAL_RX_NON_BLOCKING */
+ if ((oflag & RT_SERIAL_RX_BLOCKING) == RT_SERIAL_RX_BLOCKING)
+ dev->open_flag |= RT_SERIAL_RX_BLOCKING;
+ else
+ dev->open_flag |= RT_SERIAL_RX_NON_BLOCKING;
+
+ /* By default, the transmit mode of a serial devide is RT_SERIAL_TX_BLOCKING */
+ if ((oflag & RT_SERIAL_TX_NON_BLOCKING) == RT_SERIAL_TX_NON_BLOCKING)
+ dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING;
+ else
+ dev->open_flag |= RT_SERIAL_TX_BLOCKING;
+
+ /* set steam flag */
+ if ((oflag & RT_DEVICE_FLAG_STREAM) ||
+ (dev->open_flag & RT_DEVICE_FLAG_STREAM))
+ dev->open_flag |= RT_DEVICE_FLAG_STREAM;
+
+ /* initialize the Rx structure according to open flag */
+ if (serial->serial_rx == RT_NULL)
+ rt_serial_rx_enable(dev, dev->open_flag &
+ (RT_SERIAL_RX_BLOCKING | RT_SERIAL_RX_NON_BLOCKING));
+
+ /* initialize the Tx structure according to open flag */
+ if (serial->serial_tx == RT_NULL)
+ rt_serial_tx_enable(dev, dev->open_flag &
+ (RT_SERIAL_TX_BLOCKING | RT_SERIAL_TX_NON_BLOCKING));
+
+ return RT_EOK;
+}
+
+
+/**
+ * @brief Close the serial device.
+ * @param dev The pointer of device driver structure
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_close(struct rt_device *dev)
+{
+ struct rt_serial_device *serial;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ /* this device has more reference count */
+ if (dev->ref_count > 1) return -RT_ERROR;
+ /* Disable serial receive mode. */
+ rt_serial_rx_disable(dev, dev->open_flag &
+ (RT_SERIAL_RX_BLOCKING | RT_SERIAL_RX_NON_BLOCKING));
+ /* Disable serial tranmit mode. */
+ rt_serial_tx_disable(dev, dev->open_flag &
+ (RT_SERIAL_TX_BLOCKING | RT_SERIAL_TX_NON_BLOCKING));
+
+ /* Clear the callback function */
+ serial->parent.rx_indicate = RT_NULL;
+ serial->parent.tx_complete = RT_NULL;
+
+ /* Call the control() API to close the serial device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLOSE, RT_NULL);
+ dev->flag &= ~RT_DEVICE_FLAG_ACTIVATED;
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Control the serial device.
+ * @param dev The pointer of device driver structure
+ * @param cmd The command value that controls the serial device
+ * @param args The parameter value that controls the serial device
+ * @return Return the status of the operation.
+ */
+static rt_err_t rt_serial_control(struct rt_device *dev,
+ int cmd,
+ void *args)
+{
+ rt_err_t ret = RT_EOK;
+ struct rt_serial_device *serial;
+
+ RT_ASSERT(dev != RT_NULL);
+ serial = (struct rt_serial_device *)dev;
+
+ switch (cmd)
+ {
+ case RT_DEVICE_CTRL_SUSPEND:
+ /* suspend device */
+ dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
+ break;
+
+ case RT_DEVICE_CTRL_RESUME:
+ /* resume device */
+ dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
+ break;
+
+ case RT_DEVICE_CTRL_CONFIG:
+ if (args != RT_NULL)
+ {
+ struct serial_configure *pconfig = (struct serial_configure *) args;
+ if (serial->parent.ref_count)
+ {
+ /*can not change buffer size*/
+ return -RT_EBUSY;
+ }
+ /* set serial configure */
+ serial->config = *pconfig;
+ serial->ops->configure(serial,
+ (struct serial_configure *) args);
+ }
+
+ break;
+
+ default :
+ /* control device */
+ ret = serial->ops->control(serial, cmd, args);
+ break;
+ }
+
+ return ret;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+static rt_size_t rt_serial_read(struct rt_device *dev,
+ rt_off_t pos,
+ void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+
+ if (serial->config.rx_bufsz)
+ {
+ return _serial_fifo_rx(dev, pos, buffer, size);
+ }
+
+ return _serial_poll_rx(dev, pos, buffer, size);
+}
+
+
+static rt_size_t rt_serial_write(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ struct rt_serial_device *serial;
+ struct rt_serial_tx_fifo *tx_fifo;
+
+ RT_ASSERT(dev != RT_NULL);
+ if (size == 0) return 0;
+
+ serial = (struct rt_serial_device *)dev;
+ RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
+ tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
+
+ if (serial->config.tx_bufsz == 0)
+ {
+ return _serial_poll_tx(dev, pos, buffer, size);
+ }
+
+ if (dev->open_flag | RT_SERIAL_TX_BLOCKING)
+ {
+ if ((tx_fifo->rb.buffer_ptr) == RT_NULL)
+ {
+ return _serial_fifo_tx_blocking_nbuf(dev, pos, buffer, size);
+ }
+
+ return _serial_fifo_tx_blocking_buf(dev, pos, buffer, size);
+ }
+
+ return _serial_fifo_tx_nonblocking(dev, pos, buffer, size);
+}
+
+const static struct rt_device_ops serial_ops =
+{
+ rt_serial_init,
+ rt_serial_open,
+ rt_serial_close,
+ rt_serial_read,
+ rt_serial_write,
+ rt_serial_control
+};
+#endif
+
+/**
+ * @brief Register the serial device.
+ * @param serial RT-thread serial device.
+ * @param name The device driver's name
+ * @param flag The capabilities flag of device.
+ * @param data The device driver's data.
+ * @return Return the status of the operation.
+ */
+rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
+ const char *name,
+ rt_uint32_t flag,
+ void *data)
+{
+ rt_err_t ret;
+ struct rt_device *device;
+ RT_ASSERT(serial != RT_NULL);
+
+ device = &(serial->parent);
+
+ device->type = RT_Device_Class_Char;
+ device->rx_indicate = RT_NULL;
+ device->tx_complete = RT_NULL;
+
+#ifdef RT_USING_DEVICE_OPS
+ device->ops = &serial_ops;
+#else
+ device->init = rt_serial_init;
+ device->open = rt_serial_open;
+ device->close = rt_serial_close;
+ device->read = RT_NULL;
+ device->write = RT_NULL;
+ device->control = rt_serial_control;
+#endif
+ device->user_data = data;
+
+ /* register a character device */
+ ret = rt_device_register(device, name, flag);
+
+#if defined(RT_USING_POSIX)
+ /* set fops */
+ device->fops = &_serial_fops;
+#endif
+ return ret;
+}
+
+/**
+ * @brief ISR for serial interrupt
+ * @param serial RT-thread serial device.
+ * @param event ISR event type.
+ */
+void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
+{
+ RT_ASSERT(serial != RT_NULL);
+
+ switch (event & 0xff)
+ {
+ /* Interrupt receive event */
+ case RT_SERIAL_EVENT_RX_IND:
+ case RT_SERIAL_EVENT_RX_DMADONE:
+ {
+ struct rt_serial_rx_fifo *rx_fifo;
+ rt_size_t rx_length = 0;
+ rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
+ RT_ASSERT(rx_fifo != RT_NULL);
+
+ /* If the event is RT_SERIAL_EVENT_RX_IND, rx_length is equal to 0 */
+ rx_length = (event & (~0xff)) >> 8;
+
+ if (rx_length)
+ rt_serial_update_write_index(&(rx_fifo->rb), rx_length);
+
+ /* Get the length of the data from the ringbuffer */
+ rx_length = rt_ringbuffer_data_len(&rx_fifo->rb);
+ if (rx_length == 0) break;
+
+ if (serial->parent.open_flag & RT_SERIAL_RX_BLOCKING)
+ {
+ if (rx_fifo->rx_cpt_index && rx_length >= rx_fifo->rx_cpt_index )
+ {
+ rx_fifo->rx_cpt_index = 0;
+ rt_completion_done(&(rx_fifo->rx_cpt));
+ }
+ }
+ /* Trigger the receiving completion callback */
+ if (serial->parent.rx_indicate != RT_NULL)
+ serial->parent.rx_indicate(&(serial->parent), rx_length);
+ break;
+ }
+
+ /* Interrupt transmit event */
+ case RT_SERIAL_EVENT_TX_DONE:
+ {
+ struct rt_serial_tx_fifo *tx_fifo;
+ rt_size_t tx_length = 0;
+ tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ /* Get the length of the data from the ringbuffer */
+ tx_length = rt_ringbuffer_data_len(&tx_fifo->rb);
+ /* If there is no data in tx_ringbuffer,
+ * then the transmit completion callback is triggered*/
+ if (tx_length == 0)
+ {
+ tx_fifo->activated = RT_FALSE;
+ /* Trigger the transmit completion callback */
+ if (serial->parent.tx_complete != RT_NULL)
+ serial->parent.tx_complete(&serial->parent, RT_NULL);
+
+ if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING)
+ rt_completion_done(&(tx_fifo->tx_cpt));
+
+ break;
+ }
+
+ /* Call the transmit interface for transmission again */
+ /* Note that in interrupt mode, tx_fifo->buffer and tx_length
+ * are inactive parameters */
+ serial->ops->transmit(serial,
+ tx_fifo->buffer,
+ tx_length,
+ serial->parent.open_flag & ( \
+ RT_SERIAL_TX_BLOCKING | \
+ RT_SERIAL_TX_NON_BLOCKING));
+ break;
+ }
+
+ case RT_SERIAL_EVENT_TX_DMADONE:
+ {
+ struct rt_serial_tx_fifo *tx_fifo;
+ tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
+ RT_ASSERT(tx_fifo != RT_NULL);
+
+ tx_fifo->activated = RT_FALSE;
+
+ /* Trigger the transmit completion callback */
+ if (serial->parent.tx_complete != RT_NULL)
+ serial->parent.tx_complete(&serial->parent, RT_NULL);
+
+ if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING)
+ {
+ rt_completion_done(&(tx_fifo->tx_cpt));
+ break;
+ }
+
+ rt_serial_update_read_index(&tx_fifo->rb, tx_fifo->put_size);
+ /* Get the length of the data from the ringbuffer.
+ * If there is some data in tx_ringbuffer,
+ * then call the transmit interface for transmission again */
+ if (rt_ringbuffer_data_len(&tx_fifo->rb))
+ {
+ tx_fifo->activated = RT_TRUE;
+
+ rt_uint8_t *put_ptr = RT_NULL;
+ /* Get the linear length buffer from rinbuffer */
+ tx_fifo->put_size = rt_serial_get_linear_buffer(&(tx_fifo->rb), &put_ptr);
+ /* Call the transmit interface for transmission again */
+ serial->ops->transmit(serial,
+ put_ptr,
+ tx_fifo->put_size,
+ RT_SERIAL_TX_NON_BLOCKING);
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+}
diff --git a/components/drivers/spi/SConscript b/components/drivers/spi/SConscript
index e19f30861f..d6cb93f7f1 100644
--- a/components/drivers/spi/SConscript
+++ b/components/drivers/spi/SConscript
@@ -28,7 +28,10 @@ if GetDepend('RT_USING_SFUD'):
if rtconfig.CROSS_TOOL == 'gcc':
LOCAL_CCFLAGS += ' -std=c99'
elif rtconfig.CROSS_TOOL == 'keil':
- LOCAL_CCFLAGS += ' --c99'
+ if rtconfig.PLATFORM == 'armcc':
+ LOCAL_CCFLAGS += ' --c99'
+ elif rtconfig.PLATFORM == 'armclang':
+ LOCAL_CCFLAGS += ' -std=c99'
src += src_device
diff --git a/components/drivers/spi/enc28j60.c b/components/drivers/spi/enc28j60.c
index a8bfe3a159..f99719245b 100644
--- a/components/drivers/spi/enc28j60.c
+++ b/components/drivers/spi/enc28j60.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -747,7 +747,7 @@ static struct pbuf *enc28j60_rx(rt_device_t dev)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops enc28j60_ops =
+const static struct rt_device_ops enc28j60_ops =
{
enc28j60_init,
enc28j60_open,
diff --git a/components/drivers/spi/enc28j60.h b/components/drivers/spi/enc28j60.h
index adff774748..471b71ec2d 100644
--- a/components/drivers/spi/enc28j60.h
+++ b/components/drivers/spi/enc28j60.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/spi/qspi_core.c b/components/drivers/spi/qspi_core.c
index c9ff6a9637..ca2cba0aba 100644
--- a/components/drivers/spi/qspi_core.c
+++ b/components/drivers/spi/qspi_core.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -14,7 +14,7 @@ rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configu
{
RT_ASSERT(device != RT_NULL);
RT_ASSERT(cfg != RT_NULL);
-
+
struct rt_qspi_device *qspi_device = (struct rt_qspi_device *)device;
rt_err_t result = RT_EOK;
@@ -35,14 +35,14 @@ rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configu
rt_err_t rt_qspi_bus_register(struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops)
{
rt_err_t result = RT_EOK;
-
+
result = rt_spi_bus_register(bus, name, ops);
if(result == RT_EOK)
{
/* set SPI bus to qspi modes */
bus->mode = RT_SPI_BUS_MODE_QSPI;
}
-
+
return result;
}
@@ -243,7 +243,7 @@ rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_si
message.qspi_data_lines = 0;
}
-
+
/* set send buf and send size */
message.parent.send_buf = ptr + count;
message.parent.recv_buf = RT_NULL;
diff --git a/components/drivers/spi/sfud/inc/sfud_def.h b/components/drivers/spi/sfud/inc/sfud_def.h
index fe7876618b..c06f9b1295 100644
--- a/components/drivers/spi/sfud/inc/sfud_def.h
+++ b/components/drivers/spi/sfud/inc/sfud_def.h
@@ -118,11 +118,11 @@ if (!(EXPR)) \
#define SFUD_CMD_READ_DATA 0x03
#endif
-#ifndef SFUD_CMD_DUAL_OUTPUT_READ_DATA
+#ifndef SFUD_CMD_DUAL_OUTPUT_READ_DATA
#define SFUD_CMD_DUAL_OUTPUT_READ_DATA 0x3B
#endif
-#ifndef SFUD_CMD_DUAL_IO_READ_DATA
+#ifndef SFUD_CMD_DUAL_IO_READ_DATA
#define SFUD_CMD_DUAL_IO_READ_DATA 0xBB
#endif
diff --git a/components/drivers/spi/sfud/src/sfud.c b/components/drivers/spi/sfud/src/sfud.c
index e5b03131ff..4078179262 100644
--- a/components/drivers/spi/sfud/src/sfud.c
+++ b/components/drivers/spi/sfud/src/sfud.c
@@ -218,7 +218,7 @@ sfud_err sfud_qspi_fast_read_enable(sfud_flash *flash, uint8_t data_line_width)
break;
case 2:
if (read_mode & DUAL_IO) {
- qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_IO_READ_DATA, 1, 2, 8, 2);
+ qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_IO_READ_DATA, 1, 2, 4, 2);
} else if (read_mode & DUAL_OUTPUT) {
qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_OUTPUT_READ_DATA, 1, 1, 8, 2);
} else {
diff --git a/components/drivers/spi/sfud/src/sfud_sfdp.c b/components/drivers/spi/sfud/src/sfud_sfdp.c
index 0c81e073e6..5d95fa2b79 100644
--- a/components/drivers/spi/sfud/src/sfud_sfdp.c
+++ b/components/drivers/spi/sfud/src/sfud_sfdp.c
@@ -223,7 +223,7 @@ static bool read_basic_table(sfud_flash *flash, sfdp_para_header *basic_header)
return false;
}
/* get write granularity */
- //TODO ĿǰΪ 1.0 ���ṩ�ķ�ʽ������֧�� V1.5 �����ϵķ�ʽ��ȡ page size
+ //TODO 目前为 1.0 所提供的方式,后期支持 V1.5 及以上的方式读取 page size
switch ((table[0] & (0x01 << 2)) >> 2) {
case 0:
sfdp->write_gran = 1;
diff --git a/components/drivers/spi/spi_core.c b/components/drivers/spi/spi_core.c
index 64b0d2e496..7b6b7a0763 100644
--- a/components/drivers/spi/spi_core.c
+++ b/components/drivers/spi/spi_core.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/spi/spi_dev.c b/components/drivers/spi/spi_dev.c
index e334e7aeb5..264f5d1856 100644
--- a/components/drivers/spi/spi_dev.c
+++ b/components/drivers/spi/spi_dev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -48,7 +48,7 @@ static rt_err_t _spi_bus_device_control(rt_device_t dev,
{
case 0: /* set device */
break;
- case 1:
+ case 1:
break;
}
@@ -56,7 +56,7 @@ static rt_err_t _spi_bus_device_control(rt_device_t dev,
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops spi_bus_ops =
+const static struct rt_device_ops spi_bus_ops =
{
RT_NULL,
RT_NULL,
@@ -129,7 +129,7 @@ static rt_err_t _spidev_device_control(rt_device_t dev,
{
case 0: /* set device */
break;
- case 1:
+ case 1:
break;
}
@@ -137,7 +137,7 @@ static rt_err_t _spidev_device_control(rt_device_t dev,
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops spi_device_ops =
+const static struct rt_device_ops spi_device_ops =
{
RT_NULL,
RT_NULL,
diff --git a/components/drivers/spi/spi_flash.h b/components/drivers/spi/spi_flash.h
index 82b1ab2ecd..9083a40a1c 100644
--- a/components/drivers/spi/spi_flash.h
+++ b/components/drivers/spi/spi_flash.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -28,10 +28,10 @@ typedef struct spi_flash_device *rt_spi_flash_device_t;
#ifdef RT_USING_MTD_NOR
struct spi_flash_mtd
{
- struct rt_mtd_nor_device mtd_device;
- struct rt_spi_device * rt_spi_device;
- struct rt_mutex lock;
- void * user_data;
+ struct rt_mtd_nor_device mtd_device;
+ struct rt_spi_device * rt_spi_device;
+ struct rt_mutex lock;
+ void * user_data;
};
#endif
diff --git a/components/drivers/spi/spi_flash_sfud.c b/components/drivers/spi/spi_flash_sfud.c
index 2333c9ccb3..bcc49e8df4 100644
--- a/components/drivers/spi/spi_flash_sfud.c
+++ b/components/drivers/spi/spi_flash_sfud.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -9,6 +9,7 @@
*/
#include <stdint.h>
+#include <string.h>
#include <rtdevice.h>
#include "spi_flash.h"
#include "spi_flash_sfud.h"
@@ -508,7 +509,7 @@ __error:
return RT_NULL;
}
-#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
+#if defined(RT_USING_FINSH)
#include <finsh.h>
@@ -773,6 +774,6 @@ static void sf(uint8_t argc, char **argv) {
}
}
MSH_CMD_EXPORT(sf, SPI Flash operate.);
-#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
+#endif /* defined(RT_USING_FINSH) */
#endif /* RT_USING_SFUD */
diff --git a/components/drivers/spi/spi_flash_sfud.h b/components/drivers/spi/spi_flash_sfud.h
index 932b7f879c..0d5a751d0c 100644
--- a/components/drivers/spi/spi_flash_sfud.h
+++ b/components/drivers/spi/spi_flash_sfud.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/spi/spi_msd.c b/components/drivers/spi/spi_msd.c
index 191933e421..875ae3c486 100644
--- a/components/drivers/spi/spi_msd.c
+++ b/components/drivers/spi/spi_msd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -435,7 +435,7 @@ static rt_err_t _write_block(struct rt_spi_device *device, const void *buffer, u
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops msd_ops =
+const static struct rt_device_ops msd_ops =
{
rt_msd_init,
rt_msd_open,
@@ -445,7 +445,7 @@ const static struct rt_device_ops msd_ops =
rt_msd_control
};
-const static struct rt_device_ops msd_sdhc_ops =
+const static struct rt_device_ops msd_sdhc_ops =
{
rt_msd_init,
rt_msd_open,
diff --git a/components/drivers/spi/spi_msd.h b/components/drivers/spi/spi_msd.h
index 6370170923..e9febca781 100644
--- a/components/drivers/spi/spi_msd.h
+++ b/components/drivers/spi/spi_msd.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -93,12 +93,12 @@
*/
typedef enum
{
- MSD_CARD_TYPE_UNKNOWN = 0, /**< unknown */
- MSD_CARD_TYPE_MMC, /**< MultiMedia Card */
- MSD_CARD_TYPE_SD_V1_X, /**< Ver 1.X Standard Capacity SD Memory Card */
- MSD_CARD_TYPE_SD_V2_X, /**< Ver 2.00 or later Standard Capacity SD Memory Card */
- MSD_CARD_TYPE_SD_SDHC, /**< High Capacity SD Memory Card */
- MSD_CARD_TYPE_SD_SDXC, /**< later Extended Capacity SD Memory Card */
+ MSD_CARD_TYPE_UNKNOWN = 0, /**< unknown */
+ MSD_CARD_TYPE_MMC, /**< MultiMedia Card */
+ MSD_CARD_TYPE_SD_V1_X, /**< Ver 1.X Standard Capacity SD Memory Card */
+ MSD_CARD_TYPE_SD_V2_X, /**< Ver 2.00 or later Standard Capacity SD Memory Card */
+ MSD_CARD_TYPE_SD_SDHC, /**< High Capacity SD Memory Card */
+ MSD_CARD_TYPE_SD_SDXC, /**< later Extended Capacity SD Memory Card */
}msd_card_type;
typedef enum
diff --git a/components/drivers/spi/spi_wifi_rw009.c b/components/drivers/spi/spi_wifi_rw009.c
index 4ddd18ca12..84da212077 100644
--- a/components/drivers/spi/spi_wifi_rw009.c
+++ b/components/drivers/spi/spi_wifi_rw009.c
@@ -1,6 +1,6 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
diff --git a/components/drivers/spi/spi_wifi_rw009.h b/components/drivers/spi/spi_wifi_rw009.h
index 049b0a8486..a0d8ec437d 100644
--- a/components/drivers/spi/spi_wifi_rw009.h
+++ b/components/drivers/spi/spi_wifi_rw009.h
@@ -1,6 +1,6 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
diff --git a/components/drivers/src/completion.c b/components/drivers/src/completion.c
index 9e461e49ce..f13718f9b3 100644
--- a/components/drivers/src/completion.c
+++ b/components/drivers/src/completion.c
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-09-30 Bernard first version.
+ * 2021-08-18 chenyingchun add comments
*/
#include <rthw.h>
@@ -15,6 +16,11 @@
#define RT_COMPLETED 1
#define RT_UNCOMPLETED 0
+/**
+ * @brief This function will initialize a completion object.
+ *
+ * @param completion is a pointer to a completion object.
+ */
void rt_completion_init(struct rt_completion *completion)
{
rt_base_t level;
@@ -27,6 +33,22 @@ void rt_completion_init(struct rt_completion *completion)
}
RTM_EXPORT(rt_completion_init);
+/**
+ * @brief This function will wait for a completion, if the completion is unavailable, the thread shall wait for
+ * the completion up to a specified time.
+ *
+ * @param completion is a pointer to a completion object.
+ *
+ * @param timeout is a timeout period (unit: OS ticks). If the completion is unavailable, the thread will wait for
+ * the completion done up to the amount of time specified by the argument.
+ * NOTE: Generally, we use the macro RT_WAITING_FOREVER to set this parameter, which means that when the
+ * completion is unavailable, the thread will be waitting forever.
+ *
+ * @return Return the operation status. ONLY when the return value is RT_EOK, the operation is successful.
+ * If the return value is any other values, it means that the completion wait failed.
+ *
+ * @warning This function can ONLY be called in the thread context. It MUST NOT be called in interrupt context.
+ */
rt_err_t rt_completion_wait(struct rt_completion *completion,
rt_int32_t timeout)
{
@@ -94,6 +116,11 @@ __exit:
}
RTM_EXPORT(rt_completion_wait);
+/**
+ * @brief This function indicates a completion has done.
+ *
+ * @param completion is a pointer to a completion object.
+ */
void rt_completion_done(struct rt_completion *completion)
{
rt_base_t level;
diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c
index 1651417bb9..f32efa1849 100644
--- a/components/drivers/src/dataqueue.c
+++ b/components/drivers/src/dataqueue.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -62,7 +62,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
rt_ubase_t level;
rt_thread_t thread;
rt_err_t result;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -85,7 +85,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
/* reset thread error number */
thread->error = RT_EOK;
-
+
/* suspend thread on the push list */
rt_thread_suspend(thread);
rt_list_insert_before(&(queue->suspended_push_list), &(thread->tlist));
@@ -155,13 +155,13 @@ RTM_EXPORT(rt_data_queue_push);
rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
const void** data_ptr,
- rt_size_t *size,
+ rt_size_t *size,
rt_int32_t timeout)
{
rt_ubase_t level;
rt_thread_t thread;
rt_err_t result;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
RT_ASSERT(data_ptr != RT_NULL);
@@ -185,7 +185,7 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
/* reset thread error number */
thread->error = RT_EOK;
-
+
/* suspend thread on the pop list */
rt_thread_suspend(thread);
rt_list_insert_before(&(queue->suspended_pop_list), &(thread->tlist));
@@ -269,11 +269,11 @@ rt_err_t rt_data_queue_peek(struct rt_data_queue *queue,
rt_size_t *size)
{
rt_ubase_t level;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
- if (queue->is_empty)
+ if (queue->is_empty)
{
return -RT_EEMPTY;
}
@@ -293,7 +293,7 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
{
rt_ubase_t level;
struct rt_thread *thread;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -303,9 +303,9 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
queue->put_index = 0;
queue->is_empty = 1;
queue->is_full = 0;
-
+
rt_hw_interrupt_enable(level);
-
+
rt_enter_critical();
/* wakeup all suspend threads */
@@ -375,7 +375,7 @@ rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue)
level = rt_hw_interrupt_disable();
queue->magic = 0;
rt_hw_interrupt_enable(level);
-
+
rt_free(queue->queue);
return RT_EOK;
@@ -386,7 +386,7 @@ rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue)
{
rt_ubase_t level;
rt_int16_t len;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -405,7 +405,7 @@ rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue)
{
len = queue->size + queue->put_index - queue->get_index;
}
-
+
rt_hw_interrupt_enable(level);
return len;
diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c
index bd392cba2b..af90f13c6f 100644
--- a/components/drivers/src/pipe.c
+++ b/components/drivers/src/pipe.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -11,11 +11,13 @@
#include <rthw.h>
#include <rtdevice.h>
#include <stdint.h>
+#include <sys/errno.h>
-#if defined(RT_USING_POSIX)
+#ifdef RT_USING_POSIX
#include <dfs_file.h>
#include <dfs_posix.h>
-#include <dfs_poll.h>
+#include <poll.h>
+#include <sys/ioctl.h>
static int pipe_fops_open(struct dfs_fd *fd)
{
@@ -320,7 +322,7 @@ static const struct dfs_file_ops pipe_fops =
};
#endif /* end of RT_USING_POSIX */
-rt_err_t rt_pipe_open (rt_device_t device, rt_uint16_t oflag)
+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;
@@ -330,7 +332,7 @@ rt_err_t rt_pipe_open (rt_device_t device, rt_uint16_t oflag)
ret = -RT_EINVAL;
goto __exit;
}
-
+
rt_mutex_take(&(pipe->lock), RT_WAITING_FOREVER);
if (pipe->fifo == RT_NULL)
@@ -348,7 +350,7 @@ __exit:
return ret;
}
-rt_err_t rt_pipe_close (rt_device_t device)
+rt_err_t rt_pipe_close(rt_device_t device)
{
rt_pipe_t *pipe = (rt_pipe_t *)device;
@@ -366,7 +368,7 @@ rt_err_t rt_pipe_close (rt_device_t device)
return RT_EOK;
}
-rt_size_t rt_pipe_read (rt_device_t device, rt_off_t pos, void *buffer, rt_size_t count)
+rt_size_t rt_pipe_read(rt_device_t device, rt_off_t pos, void *buffer, rt_size_t count)
{
uint8_t *pbuf;
rt_size_t read_bytes = 0;
@@ -374,7 +376,7 @@ rt_size_t rt_pipe_read (rt_device_t device, rt_off_t pos, void *buffer, rt_siz
if (device == RT_NULL)
{
- rt_set_errno(-EINVAL);
+ rt_set_errno(EINVAL);
return 0;
}
if (count == 0) return 0;
@@ -394,7 +396,7 @@ rt_size_t rt_pipe_read (rt_device_t device, rt_off_t pos, void *buffer, rt_siz
return read_bytes;
}
-rt_size_t rt_pipe_write (rt_device_t device, rt_off_t pos, const void *buffer, rt_size_t count)
+rt_size_t rt_pipe_write(rt_device_t device, rt_off_t pos, const void *buffer, rt_size_t count)
{
uint8_t *pbuf;
rt_size_t write_bytes = 0;
@@ -402,7 +404,7 @@ rt_size_t rt_pipe_write (rt_device_t device, rt_off_t pos, const void *buffer,
if (device == RT_NULL)
{
- rt_set_errno(-EINVAL);
+ rt_set_errno(EINVAL);
return 0;
}
if (count == 0) return 0;
@@ -428,7 +430,7 @@ rt_err_t rt_pipe_control(rt_device_t dev, int cmd, void *args)
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops pipe_ops =
+const static struct rt_device_ops pipe_ops =
{
RT_NULL,
rt_pipe_open,
@@ -507,7 +509,7 @@ int rt_pipe_delete(const char *name)
rt_device_unregister(device);
/* close fifo ringbuffer */
- if (pipe->fifo)
+ if (pipe->fifo)
{
rt_ringbuffer_destroy(pipe->fifo);
pipe->fifo = RT_NULL;
@@ -516,12 +518,12 @@ int rt_pipe_delete(const char *name)
}
else
{
- result = -ENODEV;
+ result = -RT_EINVAL;
}
}
else
{
- result = -ENODEV;
+ result = -RT_EINVAL;
}
return result;
@@ -531,8 +533,8 @@ int rt_pipe_delete(const char *name)
int pipe(int fildes[2])
{
rt_pipe_t *pipe;
- char dname[8];
- char dev_name[32];
+ char dname[RT_NAME_MAX];
+ char dev_name[RT_NAME_MAX * 4];
static int pipeno = 0;
rt_snprintf(dname, sizeof(dname), "pipe%d", pipeno++);
@@ -564,7 +566,7 @@ int pipe(int fildes[2])
int mkfifo(const char *path, mode_t mode)
{
rt_pipe_t *pipe;
-
+
pipe = rt_pipe_create(path, PIPE_BUFSZ);
if (pipe == RT_NULL)
{
diff --git a/components/drivers/src/ringblk_buf.c b/components/drivers/src/ringblk_buf.c
index 7d83149c5e..b966da3d36 100644
--- a/components/drivers/src/ringblk_buf.c
+++ b/components/drivers/src/ringblk_buf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -44,32 +44,34 @@ void rt_rbb_init(rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t
}
RTM_EXPORT(rt_rbb_init);
+#ifdef RT_USING_HEAP
+
/**
* ring block buffer object create
*
* @param buf_size buffer size
* @param blk_max_num max block number
*
- * @return != NULL: ring block buffer object
- * NULL: create failed
+ * @return != RT_NULL: ring block buffer object
+ * RT_NULL: create failed
*/
rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num)
{
- rt_rbb_t rbb = NULL;
+ rt_rbb_t rbb = RT_NULL;
rt_uint8_t *buf;
rt_rbb_blk_t blk_set;
rbb = (rt_rbb_t)rt_malloc(sizeof(struct rt_rbb));
if (!rbb)
{
- return NULL;
+ return RT_NULL;
}
buf = (rt_uint8_t *)rt_malloc(buf_size);
if (!buf)
{
rt_free(rbb);
- return NULL;
+ return RT_NULL;
}
blk_set = (rt_rbb_blk_t)rt_malloc(sizeof(struct rt_rbb_blk) * blk_max_num);
@@ -77,7 +79,7 @@ rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num)
{
rt_free(buf);
rt_free(rbb);
- return NULL;
+ return RT_NULL;
}
rt_rbb_init(rbb, buf, buf_size, blk_set, blk_max_num);
@@ -102,6 +104,8 @@ void rt_rbb_destroy(rt_rbb_t rbb)
}
RTM_EXPORT(rt_rbb_destroy);
+#endif
+
static rt_rbb_blk_t find_empty_blk_in_set(rt_rbb_t rbb)
{
rt_size_t i;
@@ -116,7 +120,7 @@ static rt_rbb_blk_t find_empty_blk_in_set(rt_rbb_t rbb)
}
}
- return NULL;
+ return RT_NULL;
}
/**
@@ -127,14 +131,14 @@ static rt_rbb_blk_t find_empty_blk_in_set(rt_rbb_t rbb)
*
* @note When your application need align access, please make the blk_szie is aligned.
*
- * @return != NULL: allocated block
- * NULL: allocate failed
+ * @return != RT_NULL: allocated block
+ * RT_NULL: allocate failed
*/
rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size)
{
rt_base_t level;
rt_size_t empty1 = 0, empty2 = 0;
- rt_rbb_blk_t head, tail, new_rbb = NULL;
+ rt_rbb_blk_t head, tail, new_rbb = RT_NULL;
RT_ASSERT(rbb);
RT_ASSERT(blk_size < (1L << 24));
@@ -178,7 +182,7 @@ rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size)
else
{
/* no space */
- new_rbb = NULL;
+ new_rbb = RT_NULL;
}
}
else
@@ -202,7 +206,7 @@ rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size)
else
{
/* no space */
- new_rbb = NULL;
+ new_rbb = RT_NULL;
}
}
}
@@ -217,7 +221,7 @@ rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size)
}
else
{
- new_rbb = NULL;
+ new_rbb = RT_NULL;
}
rt_hw_interrupt_enable(level);
@@ -245,13 +249,13 @@ RTM_EXPORT(rt_rbb_blk_put);
*
* @param rbb ring block buffer object
*
- * @return != NULL: block
- * NULL: get failed
+ * @return != RT_NULL: block
+ * RT_NULL: get failed
*/
rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb)
{
rt_base_t level;
- rt_rbb_blk_t block = NULL;
+ rt_rbb_blk_t block = RT_NULL;
rt_slist_t *node;
RT_ASSERT(rbb);
@@ -271,7 +275,7 @@ rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb)
}
}
/* not found */
- block = NULL;
+ block = RT_NULL;
__exit:
@@ -364,7 +368,7 @@ rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_bl
rt_base_t level;
rt_size_t data_total_size = 0;
rt_slist_t *node;
- rt_rbb_blk_t last_block = NULL, block;
+ rt_rbb_blk_t last_block = RT_NULL, block;
RT_ASSERT(rbb);
RT_ASSERT(blk_queue);
@@ -388,7 +392,7 @@ rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_bl
else
{
/* the first block must be put status */
- last_block = NULL;
+ last_block = RT_NULL;
continue;
}
}
@@ -493,7 +497,7 @@ rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb)
rt_base_t level;
rt_size_t data_len = 0;
rt_slist_t *node;
- rt_rbb_blk_t last_block = NULL, block;
+ rt_rbb_blk_t last_block = RT_NULL, block;
RT_ASSERT(rbb);
@@ -510,7 +514,7 @@ rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb)
if (last_block->status != RT_RBB_BLK_PUT)
{
/* the first block must be put status */
- last_block = NULL;
+ last_block = RT_NULL;
continue;
}
}
diff --git a/components/drivers/src/ringbuffer.c b/components/drivers/src/ringbuffer.c
index 88afd19506..3e76b1774a 100644
--- a/components/drivers/src/ringbuffer.c
+++ b/components/drivers/src/ringbuffer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,6 +8,8 @@
* 2012-09-30 Bernard first version.
* 2013-05-08 Grissiom reimplement
* 2016-08-18 heyuanjie add interface
+ * 2021-07-20 arminker fix write_index bug in function rt_ringbuffer_put_force
+ * 2021-08-14 Jackistang add comments for function interface.
*/
#include <rtthread.h>
@@ -26,6 +28,13 @@ rt_inline enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer *rb
return RT_RINGBUFFER_HALFFULL;
}
+/**
+ * @brief Initialize the ring buffer object.
+ *
+ * @param rb A pointer to the ring buffer object.
+ * @param pool A pointer to the buffer.
+ * @param size The size of the buffer in bytes.
+ */
void rt_ringbuffer_init(struct rt_ringbuffer *rb,
rt_uint8_t *pool,
rt_int16_t size)
@@ -44,7 +53,13 @@ void rt_ringbuffer_init(struct rt_ringbuffer *rb,
RTM_EXPORT(rt_ringbuffer_init);
/**
- * put a block of data into ring buffer
+ * @brief Put a block of data into the ring buffer. If the capacity of ring buffer is insufficient, it will discard out-of-range data.
+ *
+ * @param rb A pointer to the ring buffer object.
+ * @param ptr A pointer to the data buffer.
+ * @param length The size of data in bytes.
+ *
+ * @return Return the data size we put into the ring buffer.
*/
rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,
const rt_uint8_t *ptr,
@@ -91,9 +106,13 @@ rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,
RTM_EXPORT(rt_ringbuffer_put);
/**
- * put a block of data into ring buffer
+ * @brief Put a block of data into the ring buffer. If the capacity of ring buffer is insufficient, it will overwrite the existing data in the ring buffer.
*
- * When the buffer is full, it will discard the old data.
+ * @param rb A pointer to the ring buffer object.
+ * @param ptr A pointer to the data buffer.
+ * @param length The size of data in bytes.
+ *
+ * @return Return the data size we put into the ring buffer.
*/
rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
const rt_uint8_t *ptr,
@@ -138,7 +157,8 @@ rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
if (length > space_length)
{
- rb->read_mirror = ~rb->read_mirror;
+ if (rb->write_index <= rb->read_index)
+ rb->read_mirror = ~rb->read_mirror;
rb->read_index = rb->write_index;
}
@@ -147,7 +167,13 @@ rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
RTM_EXPORT(rt_ringbuffer_put_force);
/**
- * get data from ring buffer
+ * @brief Get data from the ring buffer.
+ *
+ * @param rb A pointer to the ring buffer.
+ * @param ptr A pointer to the data buffer.
+ * @param length The size of the data we want to read from the ring buffer.
+ *
+ * @return Return the data size we read from the ring buffer.
*/
rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb,
rt_uint8_t *ptr,
@@ -194,7 +220,14 @@ rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb,
RTM_EXPORT(rt_ringbuffer_get);
/**
- * peak data from ring buffer
+ * @brief Get the first readable byte of the ring buffer.
+ *
+ * @param rb A pointer to the ringbuffer.
+ * @param ptr When this function return, *ptr is a pointer to the first readable byte of the ring buffer.
+ *
+ * @note It is recommended to read only one byte, otherwise it may cause buffer overflow.
+ *
+ * @return Return the size of the ring buffer.
*/
rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr)
{
@@ -228,7 +261,12 @@ rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr)
RTM_EXPORT(rt_ringbuffer_peak);
/**
- * put a character into ring buffer
+ * @brief Put a byte into the ring buffer. If ring buffer is full, this operation will fail.
+ *
+ * @param rb A pointer to the ring buffer object.
+ * @param ch A byte put into the ring buffer.
+ *
+ * @return Return the data size we put into the ring buffer. The ring buffer is full if returns 0. Otherwise, it will return 1.
*/
rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)
{
@@ -256,9 +294,12 @@ rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)
RTM_EXPORT(rt_ringbuffer_putchar);
/**
- * put a character into ring buffer
+ * @brief Put a byte into the ring buffer. If ring buffer is full, it will discard an old data and put into a new data.
+ *
+ * @param rb A pointer to the ring buffer object.
+ * @param ch A byte put into the ring buffer.
*
- * When the buffer is full, it will discard one old data.
+ * @return Return the data size we put into the ring buffer. Always return 1.
*/
rt_size_t rt_ringbuffer_putchar_force(struct rt_ringbuffer *rb, const rt_uint8_t ch)
{
@@ -293,7 +334,13 @@ rt_size_t rt_ringbuffer_putchar_force(struct rt_ringbuffer *rb, const rt_uint8_t
RTM_EXPORT(rt_ringbuffer_putchar_force);
/**
- * get a character from a ringbuffer
+ * @brief Get a byte from the ring buffer.
+ *
+ * @param rb The pointer to the ring buffer object.
+ * @param ch A pointer to the buffer, used to store one byte.
+ *
+ * @return 0 The ring buffer is empty.
+ * @return 1 Success
*/
rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)
{
@@ -303,7 +350,7 @@ rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)
if (!rt_ringbuffer_data_len(rb))
return 0;
- /* put character */
+ /* put byte */
*ch = rb->buffer_ptr[rb->read_index];
if (rb->read_index == rb->buffer_size-1)
@@ -320,8 +367,12 @@ rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)
}
RTM_EXPORT(rt_ringbuffer_getchar);
-/**
- * get the size of data in rb
+/**
+ * @brief Get the size of data in the ring buffer in bytes.
+ *
+ * @param rb The pointer to the ring buffer object.
+ *
+ * @return Return the size of data in the ring buffer in bytes.
*/
rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb)
{
@@ -333,16 +384,22 @@ rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb)
return rb->buffer_size;
case RT_RINGBUFFER_HALFFULL:
default:
- if (rb->write_index > rb->read_index)
- return rb->write_index - rb->read_index;
+ {
+ rt_size_t wi = rb->write_index, ri = rb->read_index;
+
+ if (wi > ri)
+ return wi - ri;
else
- return rb->buffer_size - (rb->read_index - rb->write_index);
- };
+ return rb->buffer_size - (ri - wi);
+ }
+ }
}
RTM_EXPORT(rt_ringbuffer_data_len);
-/**
- * empty the rb
+/**
+ * @brief Reset the ring buffer object, and clear all contents in the buffer.
+ *
+ * @param rb A pointer to the ring buffer object.
*/
void rt_ringbuffer_reset(struct rt_ringbuffer *rb)
{
@@ -357,12 +414,19 @@ RTM_EXPORT(rt_ringbuffer_reset);
#ifdef RT_USING_HEAP
-struct rt_ringbuffer* rt_ringbuffer_create(rt_uint16_t size)
+/**
+ * @brief Create a ring buffer object with a given size.
+ *
+ * @param size The size of the buffer in bytes.
+ *
+ * @return Return a pointer to ring buffer object. When the return value is RT_NULL, it means this creation failed.
+ */
+struct rt_ringbuffer *rt_ringbuffer_create(rt_uint16_t size)
{
struct rt_ringbuffer *rb;
rt_uint8_t *pool;
- RT_ASSERT(size > 0);
+ RT_ASSERT(size > 0);
size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE);
@@ -384,6 +448,11 @@ exit:
}
RTM_EXPORT(rt_ringbuffer_create);
+/**
+ * @brief Destroy the ring buffer object, which is created by rt_ringbuffer_create() .
+ *
+ * @param rb A pointer to the ring buffer object.
+ */
void rt_ringbuffer_destroy(struct rt_ringbuffer *rb)
{
RT_ASSERT(rb != RT_NULL);
diff --git a/components/drivers/src/waitqueue.c b/components/drivers/src/waitqueue.c
index 02240edbdf..7fe75a51ba 100644
--- a/components/drivers/src/waitqueue.c
+++ b/components/drivers/src/waitqueue.c
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
- * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon
+ * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon
* to blocked thread.
*/
@@ -121,7 +121,7 @@ int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec)
level = rt_hw_interrupt_disable();
__exit_wakeup:
- queue->flag = 0;
+ queue->flag = RT_WQ_FLAG_CLEAN;
rt_hw_interrupt_enable(level);
rt_wqueue_remove(&__wait);
diff --git a/components/drivers/src/workqueue.c b/components/drivers/src/workqueue.c
index 2b5630d8d0..b5d803472b 100644
--- a/components/drivers/src/workqueue.c
+++ b/components/drivers/src/workqueue.c
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
- * 2017-02-27 bernard fix the re-work issue.
+ * 2017-02-27 Bernard fix the re-work issue.
+ * 2021-08-01 Meco Man remove rt_delayed_work_init()
+ * 2021-08-14 Jackistang add comments for function interface.
*/
#include <rthw.h>
@@ -58,15 +60,17 @@ static void _workqueue_thread_entry(void *parameter)
while (1)
{
+ level = rt_hw_interrupt_disable();
if (rt_list_isempty(&(queue->work_list)))
{
/* no software timer exist, suspend self. */
rt_thread_suspend(rt_thread_self());
+ rt_hw_interrupt_enable(level);
rt_schedule();
+ continue;
}
/* we have work to do with. */
- level = rt_hw_interrupt_disable();
work = rt_list_entry(queue->work_list.next, struct rt_work, list);
rt_list_remove(&(work->list));
queue->work_current = work;
@@ -76,177 +80,145 @@ static void _workqueue_thread_entry(void *parameter)
/* do work */
work->work_func(work, work->work_data);
- level = rt_hw_interrupt_disable();
/* clean current work */
queue->work_current = RT_NULL;
- rt_hw_interrupt_enable(level);
/* ack work completion */
_workqueue_work_completion(queue);
}
}
-static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work)
+static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue,
+ struct rt_work *work, rt_tick_t ticks)
{
rt_base_t level;
+ rt_err_t err;
level = rt_hw_interrupt_disable();
- if (work->flags & RT_WORK_STATE_PENDING)
- {
- rt_hw_interrupt_enable(level);
- return -RT_EBUSY;
- }
-
- if (queue->work_current == work)
- {
- rt_hw_interrupt_enable(level);
- return -RT_EBUSY;
- }
-
- /* NOTE: the work MUST be initialized firstly */
+ /* remove list */
rt_list_remove(&(work->list));
-
- rt_list_insert_after(queue->work_list.prev, &(work->list));
- work->flags |= RT_WORK_STATE_PENDING;
-
- /* whether the workqueue is doing work */
- if (queue->work_current == RT_NULL)
+ work->flags &= ~RT_WORK_STATE_PENDING;
+ /* */
+ if (ticks == 0)
{
- rt_hw_interrupt_enable(level);
- /* resume work thread */
- rt_thread_resume(queue->work_thread);
- rt_schedule();
+ if (queue->work_current != work)
+ {
+ rt_list_insert_after(queue->work_list.prev, &(work->list));
+ work->flags |= RT_WORK_STATE_PENDING;
+ work->workqueue = queue;
+ err = RT_EOK;
+ }
+ else
+ {
+ err = -RT_EBUSY;
+ }
+
+ /* whether the workqueue is doing work */
+ if (queue->work_current == RT_NULL &&
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
+ {
+ /* resume work thread */
+ rt_thread_resume(queue->work_thread);
+ rt_hw_interrupt_enable(level);
+ rt_schedule();
+ }
+ else
+ {
+ rt_hw_interrupt_enable(level);
+ }
+ return err;
}
- else
+ else if (ticks < RT_TICK_MAX / 2)
{
+ /* Timer started */
+ if (work->flags & RT_WORK_STATE_SUBMITTING)
+ {
+ rt_timer_stop(&work->timer);
+ rt_timer_control(&work->timer, RT_TIMER_CTRL_SET_TIME, &ticks);
+ }
+ else
+ {
+ rt_timer_init(&(work->timer), "work", _delayed_work_timeout_handler,
+ work, ticks, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);
+ work->flags |= RT_WORK_STATE_SUBMITTING;
+ }
+ work->workqueue = queue;
+ /* insert delay work list */
+ rt_list_insert_after(queue->delayed_list.prev, &(work->list));
rt_hw_interrupt_enable(level);
+ rt_timer_start(&(work->timer));
+ return RT_EOK;
}
-
- return RT_EOK;
+ rt_hw_interrupt_enable(level);
+ return -RT_ERROR;
}
static rt_err_t _workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work)
{
rt_base_t level;
+ rt_err_t err;
level = rt_hw_interrupt_disable();
- if (queue->work_current == work)
- {
- rt_hw_interrupt_enable(level);
- return -RT_EBUSY;
- }
rt_list_remove(&(work->list));
work->flags &= ~RT_WORK_STATE_PENDING;
- rt_hw_interrupt_enable(level);
-
- return RT_EOK;
-}
-
-static rt_err_t _workqueue_cancel_delayed_work(struct rt_work *work)
-{
- rt_base_t level;
- int ret = RT_EOK;
-
- if (!work->workqueue)
- {
- ret = -EINVAL;
- goto __exit;
- }
-
- if (work->flags & RT_WORK_STATE_PENDING)
- {
- /* Remove from the queue if already submitted */
- ret = _workqueue_cancel_work(work->workqueue, work);
- if (ret)
- {
- goto __exit;
- }
- }
- else
+ /* Timer started */
+ if (work->flags & RT_WORK_STATE_SUBMITTING)
{
- if (work->flags & RT_WORK_STATE_SUBMITTING)
- {
- level = rt_hw_interrupt_disable();
- rt_timer_stop(&(work->timer));
- rt_timer_detach(&(work->timer));
- work->flags &= ~RT_WORK_STATE_SUBMITTING;
- rt_hw_interrupt_enable(level);
- }
+ rt_timer_stop(&(work->timer));
+ rt_timer_detach(&(work->timer));
+ work->flags &= ~RT_WORK_STATE_SUBMITTING;
}
-
- level = rt_hw_interrupt_disable();
- /* Detach from workqueue */
+ err = queue->work_current != work ? RT_EOK : -RT_EBUSY;
work->workqueue = RT_NULL;
- work->flags &= ~(RT_WORK_STATE_PENDING);
rt_hw_interrupt_enable(level);
-
-__exit:
- return ret;
+ return err;
}
-static rt_err_t _workqueue_submit_delayed_work(struct rt_workqueue *queue,
- struct rt_work *work, rt_tick_t ticks)
+static void _delayed_work_timeout_handler(void *parameter)
{
+ struct rt_work *work;
+ struct rt_workqueue *queue;
rt_base_t level;
- rt_err_t ret = RT_EOK;
- /* Work cannot be active in multiple queues */
- if (work->workqueue && work->workqueue != queue)
- {
- ret = -RT_EINVAL;
- goto __exit;
- }
+ work = (struct rt_work *)parameter;
+ queue = work->workqueue;
+ RT_ASSERT(queue != RT_NULL);
- /* Cancel if work has been submitted */
- if (work->workqueue == queue)
+ level = rt_hw_interrupt_disable();
+ rt_timer_detach(&(work->timer));
+ work->flags &= ~RT_WORK_STATE_SUBMITTING;
+ /* remove delay list */
+ rt_list_remove(&(work->list));
+ /* insert work queue */
+ if (queue->work_current != work)
{
- ret = _workqueue_cancel_delayed_work(work);
- if (ret < 0)
- {
- goto __exit;
- }
+ rt_list_insert_after(queue->work_list.prev, &(work->list));
+ work->flags |= RT_WORK_STATE_PENDING;
}
-
- level = rt_hw_interrupt_disable();
- /* Attach workqueue so the timeout callback can submit it */
- work->workqueue = queue;
- rt_hw_interrupt_enable(level);
-
- if (!ticks)
+ /* whether the workqueue is doing work */
+ if (queue->work_current == RT_NULL &&
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
- /* Submit work if no ticks is 0 */
- ret = _workqueue_submit_work(work->workqueue, work);
+ /* resume work thread */
+ rt_thread_resume(queue->work_thread);
+ rt_hw_interrupt_enable(level);
+ rt_schedule();
}
else
{
- level = rt_hw_interrupt_disable();
- /* Add timeout */
- work->flags |= RT_WORK_STATE_SUBMITTING;
- rt_timer_init(&(work->timer), "work", _delayed_work_timeout_handler, work, ticks,
- RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);
rt_hw_interrupt_enable(level);
- rt_timer_start(&(work->timer));
}
-
-__exit:
- return ret;
-}
-
-static void _delayed_work_timeout_handler(void *parameter)
-{
- struct rt_work *delayed_work;
- rt_base_t level;
-
- delayed_work = (struct rt_work *)parameter;
- level = rt_hw_interrupt_disable();
- rt_timer_stop(&(delayed_work->timer));
- rt_timer_detach(&(delayed_work->timer));
- delayed_work->flags &= ~RT_WORK_STATE_SUBMITTING;
- delayed_work->type &= ~RT_WORK_TYPE_DELAYED;
- rt_hw_interrupt_enable(level);
- _workqueue_submit_work(delayed_work->workqueue, delayed_work);
}
+/**
+ * @brief Create a work queue with a thread inside.
+ *
+ * @param name The name of the work queue thread.
+ * @param stack_size The stack size of the work queue thread.
+ * @param priority The priority of the work queue thread.
+ *
+ * @return Return A pointer to the workqueue object. It will return RT_NULL if failed.
+ */
struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority)
{
struct rt_workqueue *queue = RT_NULL;
@@ -256,6 +228,7 @@ struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_siz
{
/* initialize work list */
rt_list_init(&(queue->work_list));
+ rt_list_init(&(queue->delayed_list));
queue->work_current = RT_NULL;
rt_sem_init(&(queue->sem), "wqueue", 0, RT_IPC_FLAG_FIFO);
@@ -273,44 +246,69 @@ struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_siz
return queue;
}
+/**
+ * @brief Destroy a work queue.
+ *
+ * @param queue A pointer to the workqueue object.
+ *
+ * @return RT_EOK Success.
+ */
rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue)
{
RT_ASSERT(queue != RT_NULL);
+ rt_workqueue_cancel_all_work(queue);
rt_thread_delete(queue->work_thread);
+ rt_sem_detach(&(queue->sem));
RT_KERNEL_FREE(queue);
return RT_EOK;
}
+/**
+ * @brief Submit a work item to the work queue without delay.
+ *
+ * @param queue A pointer to the workqueue object.
+ * @param work A pointer to the work item object.
+ *
+ * @return RT_EOK Success.
+ * @return -RT_EBUSY This work item is executing.
+ */
rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work)
{
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(work != RT_NULL);
- return _workqueue_submit_work(queue, work);
+ return _workqueue_submit_work(queue, work, 0);
}
+/**
+ * @brief Submit a work item to the work queue with a delay.
+ *
+ * @param queue A pointer to the workqueue object.
+ * @param work A pointer to the work item object.
+ * @param time The delay time (unit: OS ticks) for the work item to be submitted to the work queue.
+ *
+ * @return RT_EOK Success.
+ * @return -RT_EBUSY This work item is executing.
+ * @return -RT_ERROR The time parameter is invalid.
+ */
rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time)
{
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(work != RT_NULL);
- if (time > 0)
- {
- work->type |= RT_WORK_TYPE_DELAYED;
- }
-
- if (work->type & RT_WORK_TYPE_DELAYED)
- {
- return _workqueue_submit_delayed_work(queue, work, time);
- }
- else
- {
- return _workqueue_submit_work(queue, work);
- }
+ return _workqueue_submit_work(queue, work, time);
}
+/**
+ * @brief Submit a work item to the work queue without delay. This work item will be executed after the current work item.
+ *
+ * @param queue A pointer to the workqueue object.
+ * @param work A pointer to the work item object.
+ *
+ * @return RT_EOK Success.
+ */
rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work)
{
rt_base_t level;
@@ -318,51 +316,55 @@ rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *
RT_ASSERT(work != RT_NULL);
level = rt_hw_interrupt_disable();
- if (queue->work_current == work)
- {
- rt_hw_interrupt_enable(level);
- return -RT_EBUSY;
- }
-
/* NOTE: the work MUST be initialized firstly */
rt_list_remove(&(work->list));
-
- rt_list_insert_after(queue->work_list.prev, &(work->list));
- if (queue->work_current == RT_NULL)
+ rt_list_insert_after(&queue->work_list, &(work->list));
+ /* whether the workqueue is doing work */
+ if (queue->work_current == RT_NULL &&
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
- rt_hw_interrupt_enable(level);
/* resume work thread */
rt_thread_resume(queue->work_thread);
+ rt_hw_interrupt_enable(level);
rt_schedule();
}
- else rt_hw_interrupt_enable(level);
+ else
+ {
+ rt_hw_interrupt_enable(level);
+ }
return RT_EOK;
}
+/**
+ * @brief Cancel a work item in the work queue.
+ *
+ * @param queue A pointer to the workqueue object.
+ * @param work A pointer to the work item object.
+ *
+ * @return RT_EOK Success.
+ * @return -RT_EBUSY This work item is executing.
+ */
rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work)
{
- RT_ASSERT(queue != RT_NULL);
RT_ASSERT(work != RT_NULL);
-
- if (work->type & RT_WORK_TYPE_DELAYED)
- {
- return _workqueue_cancel_delayed_work(work);
- }
- else
- {
- return _workqueue_cancel_work(queue, work);
- }
+ RT_ASSERT(queue != RT_NULL);
+ return _workqueue_cancel_work(queue, work);
}
+/**
+ * @brief Cancel a work item in the work queue. If the work item is executing, this function will block until it is done.
+ *
+ * @param queue A pointer to the workqueue object.
+ * @param work A pointer to the work item object.
+ *
+ * @return RT_EOK Success.
+ */
rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work)
{
- rt_base_t level;
-
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(work != RT_NULL);
- level = rt_hw_interrupt_disable();
if (queue->work_current == work) /* it's current work in the queue */
{
/* wait for work completion */
@@ -370,60 +372,85 @@ rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_wor
}
else
{
- rt_list_remove(&(work->list));
+ _workqueue_cancel_work(queue, work);
}
- work->flags &= ~RT_WORK_STATE_PENDING;
- rt_hw_interrupt_enable(level);
return RT_EOK;
}
+/**
+ * @brief This function will cancel all work items in work queue.
+ *
+ * @param queue A pointer to the workqueue object.
+ *
+ * @return RT_EOK Success.
+ */
rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue)
{
- struct rt_list_node *node, *next;
+ struct rt_work *work;
+
RT_ASSERT(queue != RT_NULL);
+ /* cancel work */
rt_enter_critical();
- for (node = queue->work_list.next; node != &(queue->work_list); node = next)
+ while (rt_list_isempty(&queue->work_list) == RT_FALSE)
+ {
+ work = rt_list_first_entry(&queue->work_list, struct rt_work, list);
+ _workqueue_cancel_work(queue, work);
+ }
+ /* cancel delay work */
+ while (rt_list_isempty(&queue->delayed_list) == RT_FALSE)
{
- next = node->next;
- rt_list_remove(node);
+ work = rt_list_first_entry(&queue->delayed_list, struct rt_work, list);
+ _workqueue_cancel_work(queue, work);
}
rt_exit_critical();
return RT_EOK;
}
-void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct rt_work *work,
- void *work_data), void *work_data)
-{
- rt_work_init(&work->work, work_func, work_data);
-}
-
#ifdef RT_USING_SYSTEM_WORKQUEUE
static struct rt_workqueue *sys_workq;
+/**
+ * @brief Submit a work item to the system work queue with a delay.
+ *
+ * @param work A pointer to the work item object.
+ * @param time The delay time (unit: OS ticks) for the work item to be submitted to the work queue.
+ *
+ * @return RT_EOK Success.
+ * @return -RT_EBUSY This work item is executing.
+ * @return -RT_ERROR The time parameter is invalid.
+ */
rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time)
{
return rt_workqueue_submit_work(sys_workq, work, time);
}
+/**
+ * @brief Cancel a work item in the system work queue.
+ *
+ * @param work A pointer to the work item object.
+ *
+ * @return RT_EOK Success.
+ * @return -RT_EBUSY This work item is executing.
+ */
rt_err_t rt_work_cancel(struct rt_work *work)
{
return rt_workqueue_cancel_work(sys_workq, work);
}
-int rt_work_sys_workqueue_init(void)
+static int rt_work_sys_workqueue_init(void)
{
if (sys_workq != RT_NULL)
- return 0;
+ return RT_EOK;
sys_workq = rt_workqueue_create("sys_work", RT_SYSTEM_WORKQUEUE_STACKSIZE,
RT_SYSTEM_WORKQUEUE_PRIORITY);
+ RT_ASSERT(sys_workq != RT_NULL);
return RT_EOK;
}
-
INIT_PREV_EXPORT(rt_work_sys_workqueue_init);
-#endif
-#endif
+#endif /* RT_USING_SYSTEM_WORKQUEUE */
+#endif /* RT_USING_HEAP */
diff --git a/components/drivers/touch/touch.c b/components/drivers/touch/touch.c
index e9595e9f8f..1a747d8669 100644
--- a/components/drivers/touch/touch.c
+++ b/components/drivers/touch/touch.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -77,6 +77,8 @@ static void rt_touch_irq_enable(rt_touch_t touch)
{
rt_pin_irq_enable(touch->config.irq_pin.pin, RT_TRUE);
}
+#else
+ touch->ops->touch_control(touch, RT_TOUCH_CTRL_ENABLE_INT, RT_NULL);
#endif
}
@@ -88,6 +90,8 @@ static void rt_touch_irq_disable(rt_touch_t touch)
{
rt_pin_irq_enable(touch->config.irq_pin.pin, RT_FALSE);
}
+#else
+ touch->ops->touch_control(touch, RT_TOUCH_CTRL_DISABLE_INT, RT_NULL);
#endif
}
@@ -144,28 +148,6 @@ static rt_err_t rt_touch_control(rt_device_t dev, int cmd, void *args)
switch (cmd)
{
- case RT_TOUCH_CTRL_GET_ID:
- if (args)
- {
- result = touch->ops->touch_control(touch, RT_TOUCH_CTRL_GET_ID, args);
- }
- else
- {
- result = -RT_ERROR;
- }
-
- break;
- case RT_TOUCH_CTRL_GET_INFO:
- if (args)
- {
- result = touch->ops->touch_control(touch, RT_TOUCH_CTRL_GET_INFO, args);
- }
- else
- {
- result = -RT_ERROR;
- }
-
- break;
case RT_TOUCH_CTRL_SET_MODE:
result = touch->ops->touch_control(touch, RT_TOUCH_CTRL_SET_MODE, args);
@@ -206,8 +188,11 @@ static rt_err_t rt_touch_control(rt_device_t dev, int cmd, void *args)
case RT_TOUCH_CTRL_ENABLE_INT:
rt_touch_irq_enable(touch);
break;
+
+ case RT_TOUCH_CTRL_GET_ID:
+ case RT_TOUCH_CTRL_GET_INFO:
default:
- return -RT_ERROR;
+ return touch->ops->touch_control(touch, cmd, args);
}
return result;
diff --git a/components/drivers/touch/touch.h b/components/drivers/touch/touch.h
index be12c24206..3d2e885e13 100644
--- a/components/drivers/touch/touch.h
+++ b/components/drivers/touch/touch.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/usb/usbdevice/class/audio.h b/components/drivers/usb/usbdevice/class/audio.h
deleted file mode 100644
index 4bb8994b47..0000000000
--- a/components/drivers/usb/usbdevice/class/audio.h
+++ /dev/null
@@ -1,676 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-/*
- * <linux/usb/audio.h> -- USB Audio definitions.
- *
- * Copyright (C) 2006 Thumtronics Pty Ltd.
- * Developed for Thumtronics by Grey Innovation
- * Ben Williamson <[email protected]>
- *
- * This software is distributed under the terms of the GNU General Public
- * License ("GPL") version 2, as published by the Free Software Foundation.
- *
- * This file holds USB constants and structures defined
- * by the USB Device Class Definition for Audio Devices.
- * Comments below reference relevant sections of that document:
- *
- * http://www.usb.org/developers/devclass_docs/audio10.pdf
- *
- * Types and defines in this file are either specific to version 1.0 of
- * this standard or common for newer versions.
- */
-
-#ifndef _UAPI__LINUX_USB_AUDIO_H
-#define _UAPI__LINUX_USB_AUDIO_H
-
-//#include <linux/types.h>
-#include <rtthread.h>
-
-typedef int8_t __s8;
-typedef uint8_t __u8;
-typedef int16_t __s16;
-typedef uint16_t __u16;
-typedef int32_t __s32;
-typedef uint32_t __u32;
-typedef int64_t __s64;
-typedef uint64_t __u64;
-
-#define UAC_USE_FEATURE_UNIT 0 /* Feature unit does not support */
-
-/*
- * Below are truly Linux-specific types that should never collide with
- * any application/library that wants linux/types.h.
- */
-
-#ifdef __CHECKER__
-#define __bitwise__ __attribute__((bitwise))
-#else
-#define __bitwise__
-#endif
-#ifdef __CHECK_ENDIAN__
-#define __bitwise __bitwise__
-#else
-#define __bitwise
-#endif
-
-typedef __u16 __bitwise __le16;
-typedef __u16 __bitwise __be16;
-typedef __u32 __bitwise __le32;
-typedef __u32 __bitwise __be32;
-typedef __u64 __bitwise __le64;
-typedef __u64 __bitwise __be64;
-
-typedef __u16 __bitwise __sum16;
-typedef __u32 __bitwise __wsum;
-
-/* bInterfaceProtocol values to denote the version of the standard used */
-#define UAC_VERSION_1 0x00
-#define UAC_VERSION_2 0x20
-#define UAC_VERSION_3 0x30
-
-/* A.2 Audio Interface Subclass Codes */
-#define USB_SUBCLASS_AUDIOCONTROL 0x01
-#define USB_SUBCLASS_AUDIOSTREAMING 0x02
-#define USB_SUBCLASS_MIDISTREAMING 0x03
-
-/* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */
-#define UAC_HEADER 0x01
-#define UAC_INPUT_TERMINAL 0x02
-#define UAC_OUTPUT_TERMINAL 0x03
-#define UAC_MIXER_UNIT 0x04
-#define UAC_SELECTOR_UNIT 0x05
-#define UAC_FEATURE_UNIT 0x06
-#define UAC1_PROCESSING_UNIT 0x07
-#define UAC1_EXTENSION_UNIT 0x08
-
-/* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */
-#define UAC_AS_GENERAL 0x01
-#define UAC_FORMAT_TYPE 0x02
-#define UAC_FORMAT_SPECIFIC 0x03
-
-/* A.7 Processing Unit Process Types */
-#define UAC_PROCESS_UNDEFINED 0x00
-#define UAC_PROCESS_UP_DOWNMIX 0x01
-#define UAC_PROCESS_DOLBY_PROLOGIC 0x02
-#define UAC_PROCESS_STEREO_EXTENDER 0x03
-#define UAC_PROCESS_REVERB 0x04
-#define UAC_PROCESS_CHORUS 0x05
-#define UAC_PROCESS_DYN_RANGE_COMP 0x06
-
-/* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */
-#define UAC_EP_GENERAL 0x01
-
-/* A.9 Audio Class-Specific Request Codes */
-#define UAC_SET_ 0x00
-#define UAC_GET_ 0x80
-
-#define UAC__CUR 0x1
-#define UAC__MIN 0x2
-#define UAC__MAX 0x3
-#define UAC__RES 0x4
-#define UAC__MEM 0x5
-
-#define UAC_SET_CUR (UAC_SET_ | UAC__CUR)
-#define UAC_GET_CUR (UAC_GET_ | UAC__CUR)
-#define UAC_SET_MIN (UAC_SET_ | UAC__MIN)
-#define UAC_GET_MIN (UAC_GET_ | UAC__MIN)
-#define UAC_SET_MAX (UAC_SET_ | UAC__MAX)
-#define UAC_GET_MAX (UAC_GET_ | UAC__MAX)
-#define UAC_SET_RES (UAC_SET_ | UAC__RES)
-#define UAC_GET_RES (UAC_GET_ | UAC__RES)
-#define UAC_SET_MEM (UAC_SET_ | UAC__MEM)
-#define UAC_GET_MEM (UAC_GET_ | UAC__MEM)
-
-#define UAC_GET_STAT 0xff
-
-/* A.10 Control Selector Codes */
-
-/* A.10.1 Terminal Control Selectors */
-#define UAC_TERM_COPY_PROTECT 0x01
-
-/* A.10.2 Feature Unit Control Selectors */
-#define UAC_FU_MUTE 0x01
-#define UAC_FU_VOLUME 0x02
-#define UAC_FU_BASS 0x03
-#define UAC_FU_MID 0x04
-#define UAC_FU_TREBLE 0x05
-#define UAC_FU_GRAPHIC_EQUALIZER 0x06
-#define UAC_FU_AUTOMATIC_GAIN 0x07
-#define UAC_FU_DELAY 0x08
-#define UAC_FU_BASS_BOOST 0x09
-#define UAC_FU_LOUDNESS 0x0a
-
-#define UAC_CONTROL_BIT(CS) (1 << ((CS) - 1))
-
-/* A.10.3.1 Up/Down-mix Processing Unit Controls Selectors */
-#define UAC_UD_ENABLE 0x01
-#define UAC_UD_MODE_SELECT 0x02
-
-/* A.10.3.2 Dolby Prologic (tm) Processing Unit Controls Selectors */
-#define UAC_DP_ENABLE 0x01
-#define UAC_DP_MODE_SELECT 0x02
-
-/* A.10.3.3 3D Stereo Extender Processing Unit Control Selectors */
-#define UAC_3D_ENABLE 0x01
-#define UAC_3D_SPACE 0x02
-
-/* A.10.3.4 Reverberation Processing Unit Control Selectors */
-#define UAC_REVERB_ENABLE 0x01
-#define UAC_REVERB_LEVEL 0x02
-#define UAC_REVERB_TIME 0x03
-#define UAC_REVERB_FEEDBACK 0x04
-
-/* A.10.3.5 Chorus Processing Unit Control Selectors */
-#define UAC_CHORUS_ENABLE 0x01
-#define UAC_CHORUS_LEVEL 0x02
-#define UAC_CHORUS_RATE 0x03
-#define UAC_CHORUS_DEPTH 0x04
-
-/* A.10.3.6 Dynamic Range Compressor Unit Control Selectors */
-#define UAC_DCR_ENABLE 0x01
-#define UAC_DCR_RATE 0x02
-#define UAC_DCR_MAXAMPL 0x03
-#define UAC_DCR_THRESHOLD 0x04
-#define UAC_DCR_ATTACK_TIME 0x05
-#define UAC_DCR_RELEASE_TIME 0x06
-
-/* A.10.4 Extension Unit Control Selectors */
-#define UAC_XU_ENABLE 0x01
-
-/* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */
-#define UAC_MS_HEADER 0x01
-#define UAC_MIDI_IN_JACK 0x02
-#define UAC_MIDI_OUT_JACK 0x03
-
-/* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */
-#define UAC_MS_GENERAL 0x01
-
-/* Terminals - 2.1 USB Terminal Types */
-#define UAC_TERMINAL_UNDEFINED 0x100
-#define UAC_TERMINAL_STREAMING 0x101
-#define UAC_TERMINAL_VENDOR_SPEC 0x1FF
-
-/* Terminal Control Selectors */
-/* 4.3.2 Class-Specific AC Interface Descriptor */
-struct uac1_ac_header_descriptor {
- __u8 bLength; /* 8 + n */
- __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
- __u8 bDescriptorSubtype; /* UAC_MS_HEADER */
- __le16 bcdADC; /* 0x0100 */
- __le16 wTotalLength; /* includes Unit and Terminal desc. */
- __u8 bInCollection; /* n */
- __u8 baInterfaceNr[]; /* [n] */
-} __attribute__ ((packed));
-
-#define UAC_DT_AC_HEADER_SIZE(n) (8 + (n))
-
-/* As above, but more useful for defining your own descriptors: */
-#define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \
-struct uac1_ac_header_descriptor_##n { \
- __u8 bLength; \
- __u8 bDescriptorType; \
- __u8 bDescriptorSubtype; \
- __le16 bcdADC; \
- __le16 wTotalLength; \
- __u8 bInCollection; \
- __u8 baInterfaceNr[n]; \
-} __attribute__ ((packed))
-
-/* 4.3.2.1 Input Terminal Descriptor */
-struct uac_input_terminal_descriptor {
- __u8 bLength; /* in bytes: 12 */
- __u8 bDescriptorType; /* CS_INTERFACE descriptor type */
- __u8 bDescriptorSubtype; /* INPUT_TERMINAL descriptor subtype */
- __u8 bTerminalID; /* Constant uniquely terminal ID */
- __le16 wTerminalType; /* USB Audio Terminal Types */
- __u8 bAssocTerminal; /* ID of the Output Terminal associated */
- __u8 bNrChannels; /* Number of logical output channels */
- __le16 wChannelConfig;
- __u8 iChannelNames;
- __u8 iTerminal;
-} __attribute__ ((packed));
-
-#define UAC_DT_INPUT_TERMINAL_SIZE 12
-
-/* Terminals - 2.2 Input Terminal Types */
-#define UAC_INPUT_TERMINAL_UNDEFINED 0x200
-#define UAC_INPUT_TERMINAL_MICROPHONE 0x201
-#define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE 0x202
-#define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE 0x203
-#define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE 0x204
-#define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205
-#define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206
-
-/* Terminals - control selectors */
-
-#define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01
-
-/* 4.3.2.2 Output Terminal Descriptor */
-struct uac1_output_terminal_descriptor {
- __u8 bLength; /* in bytes: 9 */
- __u8 bDescriptorType; /* CS_INTERFACE descriptor type */
- __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */
- __u8 bTerminalID; /* Constant uniquely terminal ID */
- __le16 wTerminalType; /* USB Audio Terminal Types */
- __u8 bAssocTerminal; /* ID of the Input Terminal associated */
- __u8 bSourceID; /* ID of the connected Unit or Terminal*/
- __u8 iTerminal;
-} __attribute__ ((packed));
-
-#define UAC_DT_OUTPUT_TERMINAL_SIZE 9
-
-/* Terminals - 2.3 Output Terminal Types */
-#define UAC_OUTPUT_TERMINAL_UNDEFINED 0x300
-#define UAC_OUTPUT_TERMINAL_SPEAKER 0x301
-#define UAC_OUTPUT_TERMINAL_HEADPHONES 0x302
-#define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO 0x303
-#define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER 0x304
-#define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER 0x305
-#define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER 0x306
-#define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER 0x307
-
-/* Terminals - 2.4 Bi-directional Terminal Types */
-#define UAC_BIDIR_TERMINAL_UNDEFINED 0x400
-#define UAC_BIDIR_TERMINAL_HANDSET 0x401
-#define UAC_BIDIR_TERMINAL_HEADSET 0x402
-#define UAC_BIDIR_TERMINAL_SPEAKER_PHONE 0x403
-#define UAC_BIDIR_TERMINAL_ECHO_SUPPRESSING 0x404
-#define UAC_BIDIR_TERMINAL_ECHO_CANCELING 0x405
-
-/* Set bControlSize = 2 as default setting */
-#define UAC_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 2)
-
-/* As above, but more useful for defining your own descriptors: */
-#define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) \
-struct uac_feature_unit_descriptor_##ch { \
- __u8 bLength; \
- __u8 bDescriptorType; \
- __u8 bDescriptorSubtype; \
- __u8 bUnitID; \
- __u8 bSourceID; \
- __u8 bControlSize; \
- __le16 bmaControls[ch + 1]; \
- __u8 iFeature; \
-} __attribute__ ((packed))
-
-/* 4.3.2.3 Mixer Unit Descriptor */
-struct uac_mixer_unit_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bUnitID;
- __u8 bNrInPins;
- __u8 baSourceID[];
-} __attribute__ ((packed));
-
-static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
-{
- return desc->baSourceID[desc->bNrInPins];
-}
-
-static inline __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc,
- int protocol)
-{
- if (protocol == UAC_VERSION_1)
- return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
- desc->baSourceID[desc->bNrInPins + 1];
- else
- return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
- (desc->baSourceID[desc->bNrInPins + 3] << 16) |
- (desc->baSourceID[desc->bNrInPins + 2] << 8) |
- (desc->baSourceID[desc->bNrInPins + 1]);
-}
-
-static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc,
- int protocol)
-{
- return (protocol == UAC_VERSION_1) ?
- desc->baSourceID[desc->bNrInPins + 3] :
- desc->baSourceID[desc->bNrInPins + 5];
-}
-
-static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc,
- int protocol)
-{
- switch (protocol) {
- case UAC_VERSION_1:
- return &desc->baSourceID[desc->bNrInPins + 4];
- case UAC_VERSION_2:
- return &desc->baSourceID[desc->bNrInPins + 6];
- case UAC_VERSION_3:
- return &desc->baSourceID[desc->bNrInPins + 2];
- default:
- return NULL;
- }
-}
-
-static inline __u16 uac3_mixer_unit_wClusterDescrID(struct uac_mixer_unit_descriptor *desc)
-{
- return (desc->baSourceID[desc->bNrInPins + 1] << 8) |
- desc->baSourceID[desc->bNrInPins];
-}
-
-static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
-{
- __u8 *raw = (__u8 *) desc;
- return raw[desc->bLength - 1];
-}
-
-/* 4.3.2.4 Selector Unit Descriptor */
-struct uac_selector_unit_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bUintID;
- __u8 bNrInPins;
- __u8 baSourceID[];
-} __attribute__ ((packed));
-
-static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
-{
- __u8 *raw = (__u8 *) desc;
- return raw[desc->bLength - 1];
-}
-#if UAC_USE_FEATURE_UNIT
-/* 4.3.2.5 Feature Unit Descriptor */
-struct uac_feature_unit_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bUnitID;
- __u8 bSourceID;
- __u8 bControlSize;
- __u8 bmaControls[0]; /* variable length */
-} __attribute__((packed));
-
-static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
-{
- __u8 *raw = (__u8 *) desc;
- return raw[desc->bLength - 1];
-}
-#endif
-/* 4.3.2.6 Processing Unit Descriptors */
-struct uac_processing_unit_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bUnitID;
- __le16 wProcessType;
- __u8 bNrInPins;
- __u8 baSourceID[];
-} __attribute__ ((packed));
-
-static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
-{
- return desc->baSourceID[desc->bNrInPins];
-}
-
-static inline __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- if (protocol == UAC_VERSION_1)
- return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
- desc->baSourceID[desc->bNrInPins + 1];
- else
- return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
- (desc->baSourceID[desc->bNrInPins + 3] << 16) |
- (desc->baSourceID[desc->bNrInPins + 2] << 8) |
- (desc->baSourceID[desc->bNrInPins + 1]);
-}
-
-static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- return (protocol == UAC_VERSION_1) ?
- desc->baSourceID[desc->bNrInPins + 3] :
- desc->baSourceID[desc->bNrInPins + 5];
-}
-
-static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- switch (protocol) {
- case UAC_VERSION_1:
- return desc->baSourceID[desc->bNrInPins + 4];
- case UAC_VERSION_2:
- return 2; /* in UAC2, this value is constant */
- case UAC_VERSION_3:
- return 4; /* in UAC3, this value is constant */
- default:
- return 1;
- }
-}
-
-static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- switch (protocol) {
- case UAC_VERSION_1:
- return &desc->baSourceID[desc->bNrInPins + 5];
- case UAC_VERSION_2:
- return &desc->baSourceID[desc->bNrInPins + 6];
- case UAC_VERSION_3:
- return &desc->baSourceID[desc->bNrInPins + 2];
- default:
- return NULL;
- }
-}
-
-static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- __u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
-
- switch (protocol) {
- case UAC_VERSION_1:
- case UAC_VERSION_2:
- default:
- return *(uac_processing_unit_bmControls(desc, protocol)
- + control_size);
- case UAC_VERSION_3:
- return 0; /* UAC3 does not have this field */
- }
-}
-
-static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- __u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
-
- switch (protocol) {
- case UAC_VERSION_1:
- case UAC_VERSION_2:
- default:
- return uac_processing_unit_bmControls(desc, protocol)
- + control_size + 1;
- case UAC_VERSION_3:
- return uac_processing_unit_bmControls(desc, protocol)
- + control_size;
- }
-}
-
-/*
- * Extension Unit (XU) has almost compatible layout with Processing Unit, but
- * on UAC2, it has a different bmControls size (bControlSize); it's 1 byte for
- * XU while 2 bytes for PU. The last iExtension field is a one-byte index as
- * well as iProcessing field of PU.
- */
-static inline __u8 uac_extension_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- switch (protocol) {
- case UAC_VERSION_1:
- return desc->baSourceID[desc->bNrInPins + 4];
- case UAC_VERSION_2:
- return 1; /* in UAC2, this value is constant */
- case UAC_VERSION_3:
- return 4; /* in UAC3, this value is constant */
- default:
- return 1;
- }
-}
-
-static inline __u8 uac_extension_unit_iExtension(struct uac_processing_unit_descriptor *desc,
- int protocol)
-{
- __u8 control_size = uac_extension_unit_bControlSize(desc, protocol);
-
- switch (protocol) {
- case UAC_VERSION_1:
- case UAC_VERSION_2:
- default:
- return *(uac_processing_unit_bmControls(desc, protocol)
- + control_size);
- case UAC_VERSION_3:
- return 0; /* UAC3 does not have this field */
- }
-}
-
-/* 4.5.2 Class-Specific AS Interface Descriptor */
-struct uac1_as_header_descriptor {
- __u8 bLength; /* in bytes: 7 */
- __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
- __u8 bDescriptorSubtype; /* AS_GENERAL */
- __u8 bTerminalLink; /* Terminal ID of connected Terminal */
- __u8 bDelay; /* Delay introduced by the data path */
- __le16 wFormatTag; /* The Audio Data Format */
-} __attribute__ ((packed));
-
-#define UAC_DT_AS_HEADER_SIZE 7
-
-/* Formats - A.1.1 Audio Data Format Type I Codes */
-#define UAC_FORMAT_TYPE_I_UNDEFINED 0x0
-#define UAC_FORMAT_TYPE_I_PCM 0x1
-#define UAC_FORMAT_TYPE_I_PCM8 0x2
-#define UAC_FORMAT_TYPE_I_IEEE_FLOAT 0x3
-#define UAC_FORMAT_TYPE_I_ALAW 0x4
-#define UAC_FORMAT_TYPE_I_MULAW 0x5
-
-struct uac_format_type_i_continuous_descriptor {
- __u8 bLength; /* in bytes: 8 + (ns * 3) */
- __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
- __u8 bDescriptorSubtype; /* FORMAT_TYPE */
- __u8 bFormatType; /* FORMAT_TYPE_1 */
- __u8 bNrChannels; /* physical channels in the stream */
- __u8 bSubframeSize; /* */
- __u8 bBitResolution;
- __u8 bSamFreqType;
- __u8 tLowerSamFreq[3];
- __u8 tUpperSamFreq[3];
-} __attribute__ ((packed));
-
-#define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE 14
-
-struct uac_format_type_i_discrete_descriptor {
- __u8 bLength; /* in bytes: 8 + (ns * 3) */
- __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
- __u8 bDescriptorSubtype; /* FORMAT_TYPE */
- __u8 bFormatType; /* FORMAT_TYPE_1 */
- __u8 bNrChannels; /* physical channels in the stream */
- __u8 bSubframeSize; /* */
- __u8 bBitResolution;
- __u8 bSamFreqType;
- __u8 tSamFreq[][3];
-} __attribute__ ((packed));
-
-#define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) \
-struct uac_format_type_i_discrete_descriptor_##n { \
- __u8 bLength; \
- __u8 bDescriptorType; \
- __u8 bDescriptorSubtype; \
- __u8 bFormatType; \
- __u8 bNrChannels; \
- __u8 bSubframeSize; \
- __u8 bBitResolution; \
- __u8 bSamFreqType; \
- __u8 tSamFreq[n][3]; \
-} __attribute__ ((packed))
-
-#define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3))
-
-struct uac_format_type_i_ext_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bFormatType;
- __u8 bSubslotSize;
- __u8 bBitResolution;
- __u8 bHeaderLength;
- __u8 bControlSize;
- __u8 bSideBandProtocol;
-} __attribute__((packed));
-
-/* Formats - Audio Data Format Type I Codes */
-
-#define UAC_FORMAT_TYPE_II_MPEG 0x1001
-#define UAC_FORMAT_TYPE_II_AC3 0x1002
-
-struct uac_format_type_ii_discrete_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bFormatType;
- __le16 wMaxBitRate;
- __le16 wSamplesPerFrame;
- __u8 bSamFreqType;
- __u8 tSamFreq[][3];
-} __attribute__((packed));
-
-struct uac_format_type_ii_ext_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubtype;
- __u8 bFormatType;
- __le16 wMaxBitRate;
- __le16 wSamplesPerFrame;
- __u8 bHeaderLength;
- __u8 bSideBandProtocol;
-} __attribute__((packed));
-
-/* type III */
-#define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001
-#define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002
-#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003
-#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004
-#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005
-#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006
-
-/* Formats - A.2 Format Type Codes */
-#define UAC_FORMAT_TYPE_UNDEFINED 0x0
-#define UAC_FORMAT_TYPE_I 0x1
-#define UAC_FORMAT_TYPE_II 0x2
-#define UAC_FORMAT_TYPE_III 0x3
-#define UAC_EXT_FORMAT_TYPE_I 0x81
-#define UAC_EXT_FORMAT_TYPE_II 0x82
-#define UAC_EXT_FORMAT_TYPE_III 0x83
-
-struct uac_iso_endpoint_descriptor {
- __u8 bLength; /* in bytes: 7 */
- __u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */
- __u8 bDescriptorSubtype; /* EP_GENERAL */
- __u8 bmAttributes;
- __u8 bLockDelayUnits;
- __le16 wLockDelay;
-} __attribute__((packed));
-#define UAC_ISO_ENDPOINT_DESC_SIZE 7
-
-#define UAC_EP_CS_ATTR_SAMPLE_RATE 0x01
-#define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02
-#define UAC_EP_CS_ATTR_FILL_MAX 0x80
-
-/* status word format (3.7.1.1) */
-
-#define UAC1_STATUS_TYPE_ORIG_MASK 0x0f
-#define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF 0x0
-#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF 0x1
-#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP 0x2
-
-#define UAC1_STATUS_TYPE_IRQ_PENDING (1 << 7)
-#define UAC1_STATUS_TYPE_MEM_CHANGED (1 << 6)
-
-struct uac1_status_word {
- __u8 bStatusType;
- __u8 bOriginator;
-} __attribute__((packed));
-
-
-#endif /* _UAPI__LINUX_USB_AUDIO_H */
diff --git a/components/drivers/usb/usbdevice/class/audio_mic.c b/components/drivers/usb/usbdevice/class/audio_mic.c
index 23ade2d9b6..81170b8a72 100644
--- a/components/drivers/usb/usbdevice/class/audio_mic.c
+++ b/components/drivers/usb/usbdevice/class/audio_mic.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -11,7 +11,8 @@
#include <rthw.h>
#include <rtdevice.h>
#include "drivers/usb_device.h"
-#include "audio.h"
+
+#include "uaudioreg.h"
#define DBG_TAG "usbd.audio.mic"
#define DBG_LVL DBG_INFO
@@ -35,6 +36,7 @@
#define EVENT_RECORD_STOP (1 << 1)
#define EVENT_RECORD_DATA (1 << 2)
+#define MIC_INTF_STR_INDEX 8
/*
* uac mic descriptor define
*/
@@ -45,9 +47,6 @@
#define UAC_MAX_PACKET_SIZE 64
#define UAC_EP_MAX_PACKET_SIZE 32
#define UAC_CHANNEL_NUM RECORD_CHANNEL
-#define UAC_INTR_NUM 1
-#define UAC_CH_NUM 1
-#define UAC_FORMAT_NUM 1
struct uac_ac_descriptor
{
@@ -55,21 +54,21 @@ struct uac_ac_descriptor
struct uiad_descriptor iad_desc;
#endif
struct uinterface_descriptor intf_desc;
- DECLARE_UAC_AC_HEADER_DESCRIPTOR(UAC_INTR_NUM) hdr_desc;
- struct uac_input_terminal_descriptor it_desc;
- struct uac1_output_terminal_descriptor ot_desc;
+ struct usb_audio_control_descriptor hdr_desc;
+ struct usb_audio_input_terminal it_desc;
+ struct usb_audio_output_terminal ot_desc;
#if UAC_USE_FEATURE_UNIT
- DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(UAC_CH_NUM) feature_unit_desc;
+ struct usb_audio_feature_unit feature_unit_desc;
#endif
};
struct uac_as_descriptor
{
struct uinterface_descriptor intf_desc;
- struct uac1_as_header_descriptor hdr_desc;
- DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(UAC_FORMAT_NUM) format_type_desc;
+ struct usb_audio_streaming_interface_descriptor hdr_desc;
+ struct usb_audio_streaming_type1_descriptor format_type_desc;
struct uendpoint_descriptor ep_desc;
- struct uac_iso_endpoint_descriptor as_ep_desc;
+ struct usb_audio_streaming_endpoint_descriptor as_ep_desc;
};
/*
@@ -128,7 +127,7 @@ const static char *_ustring[] =
{
"Language",
"RT-Thread Team.",
- "Microphone",
+ "RT-Thread Audio Microphone",
"32021919830108",
"Configuration",
"Interface",
@@ -160,13 +159,17 @@ static struct uac_ac_descriptor ac_desc =
USB_CLASS_AUDIO,
USB_SUBCLASS_AUDIOCONTROL,
0x00,
+#ifdef RT_USB_DEVICE_COMPOSITE
+ MIC_INTF_STR_INDEX,
+#else
0x00,
+#endif
},
/* Header Descriptor */
{
- UAC_DT_AC_HEADER_SIZE(UAC_INTR_NUM),
+ sizeof(struct usb_audio_control_descriptor),
UAC_CS_INTERFACE,
- UAC_HEADER,
+ UDESCSUB_AC_HEADER,
0x0100, /* Version: 1.00 */
0x001E, /* Total length: 30 */
0x01, /* Total number of interfaces: 1 */
@@ -174,9 +177,9 @@ static struct uac_ac_descriptor ac_desc =
},
/* Input Terminal Descriptor */
{
- UAC_DT_INPUT_TERMINAL_SIZE,
+ sizeof(struct usb_audio_input_terminal),
UAC_CS_INTERFACE,
- UAC_INPUT_TERMINAL,
+ UDESCSUB_AC_INPUT,
0x01, /* Terminal ID: 1 */
0x0201, /* Terminal Type: Microphone (0x0201) */
0x00, /* Assoc Terminal: 0 */
@@ -187,9 +190,9 @@ static struct uac_ac_descriptor ac_desc =
},
/* Output Terminal Descriptor */
{
- UAC_DT_OUTPUT_TERMINAL_SIZE,
+ sizeof(struct usb_audio_output_terminal),
UAC_CS_INTERFACE,
- UAC_OUTPUT_TERMINAL,
+ UDESCSUB_AC_OUTPUT,
0x02, /* Terminal ID: 2 */
0x0101, /* Terminal Type: USB Streaming (0x0101) */
0x00, /* Assoc Terminal: 0 */
@@ -199,11 +202,12 @@ static struct uac_ac_descriptor ac_desc =
#if UAC_USE_FEATURE_UNIT
/* Feature unit Descriptor */
{
- UAC_DT_FEATURE_UNIT_SIZE(UAC_CH_NUM),
+ sizeof(struct usb_audio_feature_unit),
UAC_CS_INTERFACE,
- UAC_FEATURE_UNIT,
+ UDESCSUB_AC_FEATURE,
0x02,
- 0x0101,
+ 0x01,
+ 0x01,
0x00,
0x01,
},
@@ -241,19 +245,19 @@ static struct uac_as_descriptor as_desc =
},
/* General AS Descriptor */
{
- UAC_DT_AS_HEADER_SIZE,
+ sizeof(struct usb_audio_streaming_interface_descriptor),
UAC_CS_INTERFACE,
- UAC_AS_GENERAL,
+ AS_GENERAL,
0x02, /* Terminal ID: 2 */
0x01, /* Interface delay in frames: 1 */
- UAC_FORMAT_TYPE_I_PCM,
+ UA_FMT_PCM,
},
/* Format type i Descriptor */
{
- UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(UAC_FORMAT_NUM),
+ sizeof(struct usb_audio_streaming_type1_descriptor),
UAC_CS_INTERFACE,
- UAC_FORMAT_TYPE,
- UAC_FORMAT_TYPE_I,
+ FORMAT_TYPE,
+ FORMAT_TYPE_I,
UAC_CHANNEL_NUM,
2, /* Subframe Size: 2 */
RESOLUTION_BITS,
@@ -271,9 +275,9 @@ static struct uac_as_descriptor as_desc =
},
/* AS Endpoint Descriptor */
{
- UAC_ISO_ENDPOINT_DESC_SIZE,
+ sizeof(struct usb_audio_streaming_endpoint_descriptor),
UAC_CS_ENDPOINT,
- UAC_MS_GENERAL,
+ AS_GENERAL,
},
};
@@ -471,9 +475,9 @@ static rt_err_t _uac_descriptor_config(struct uac_ac_descriptor *ac,
static rt_err_t _uac_samplerate_config(struct uac_as_descriptor *as, rt_uint32_t samplerate)
{
- as->format_type_desc.tSamFreq[0][2] = samplerate >> 16 & 0xff;
- as->format_type_desc.tSamFreq[0][1] = samplerate >> 8 & 0xff;
- as->format_type_desc.tSamFreq[0][0] = samplerate & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 2] = samplerate >> 16 & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 1] = samplerate >> 8 & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 0] = samplerate & 0xff;
return RT_EOK;
}
@@ -495,9 +499,12 @@ ufunction_t rt_usbd_function_uac_mic_create(udevice_t device)
/* parameter check */
RT_ASSERT(device != RT_NULL);
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, MIC_INTF_STR_INDEX, _ustring[2]);
+#else
/* set usb device string description */
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a uac function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
//not support HS
diff --git a/components/drivers/usb/usbdevice/class/audio_speaker.c b/components/drivers/usb/usbdevice/class/audio_speaker.c
index e9a3ffaf40..6148478c02 100644
--- a/components/drivers/usb/usbdevice/class/audio_speaker.c
+++ b/components/drivers/usb/usbdevice/class/audio_speaker.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2019, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -11,7 +11,9 @@
#include <rthw.h>
#include <rtdevice.h>
#include "drivers/usb_device.h"
-#include "audio.h"
+
+#define AUFMT_MAX_FREQUENCIES 1
+#include "uaudioreg.h"
#define DBG_TAG "usbd.audio.speaker"
#define DBG_LVL DBG_INFO
@@ -35,6 +37,7 @@
#define EVENT_AUDIO_STOP (1 << 1)
#define EVENT_AUDIO_DATA (1 << 2)
+#define SPK_INTF_STR_INDEX 9
/*
* uac speaker descriptor define
*/
@@ -45,9 +48,6 @@
#define UAC_MAX_PACKET_SIZE 64
#define UAC_EP_MAX_PACKET_SIZE 32
#define UAC_CHANNEL_NUM AUDIO_CHANNEL
-#define UAC_INTR_NUM 1
-#define UAC_CH_NUM 1
-#define UAC_FORMAT_NUM 1
struct uac_ac_descriptor
{
@@ -55,21 +55,21 @@ struct uac_ac_descriptor
struct uiad_descriptor iad_desc;
#endif
struct uinterface_descriptor intf_desc;
- DECLARE_UAC_AC_HEADER_DESCRIPTOR(UAC_INTR_NUM) hdr_desc;
- struct uac_input_terminal_descriptor it_desc;
- struct uac1_output_terminal_descriptor ot_desc;
+ struct usb_audio_control_descriptor hdr_desc;
+ struct usb_audio_input_terminal it_desc;
+ struct usb_audio_output_terminal ot_desc;
#if UAC_USE_FEATURE_UNIT
- DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(UAC_CH_NUM) feature_unit_desc;
+ struct usb_audio_feature_unit feature_unit_desc;
#endif
};
struct uac_as_descriptor
{
struct uinterface_descriptor intf_desc;
- struct uac1_as_header_descriptor hdr_desc;
- DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(UAC_FORMAT_NUM) format_type_desc;
+ struct usb_audio_streaming_interface_descriptor hdr_desc;
+ struct usb_audio_streaming_type1_descriptor format_type_desc;
struct uendpoint_descriptor ep_desc;
- struct uac_iso_endpoint_descriptor as_ep_desc;
+ struct usb_audio_streaming_endpoint_descriptor as_ep_desc;
};
/*
@@ -128,7 +128,7 @@ const static char *_ustring[] =
{
"Language",
"RT-Thread Team.",
- "RT-Thread Speaker",
+ "RT-Thread Audio Speaker",
"32021919830108",
"Configuration",
"Interface",
@@ -160,13 +160,17 @@ static struct uac_ac_descriptor ac_desc =
USB_CLASS_AUDIO,
USB_SUBCLASS_AUDIOCONTROL,
0x00,
+#ifdef RT_USB_DEVICE_COMPOSITE
+ SPK_INTF_STR_INDEX,
+#else
0x00,
+#endif
},
/* Header Descriptor */
{
- UAC_DT_AC_HEADER_SIZE(UAC_INTR_NUM),
+ sizeof(struct usb_audio_control_descriptor),
UAC_CS_INTERFACE,
- UAC_HEADER,
+ UDESCSUB_AC_HEADER,
0x0100, /* Version: 1.00 */
0x0027, /* Total length: 39 */
0x01, /* Total number of interfaces: 1 */
@@ -174,9 +178,9 @@ static struct uac_ac_descriptor ac_desc =
},
/* Input Terminal Descriptor */
{
- UAC_DT_INPUT_TERMINAL_SIZE,
+ sizeof(struct usb_audio_input_terminal),
UAC_CS_INTERFACE,
- UAC_INPUT_TERMINAL,
+ UDESCSUB_AC_INPUT,
0x01, /* Terminal ID: 1 */
0x0101, /* Terminal Type: USB Streaming (0x0101) */
0x00, /* Assoc Terminal: 0 */
@@ -187,9 +191,9 @@ static struct uac_ac_descriptor ac_desc =
},
/* Output Terminal Descriptor */
{
- UAC_DT_OUTPUT_TERMINAL_SIZE,
+ sizeof(struct usb_audio_output_terminal),
UAC_CS_INTERFACE,
- UAC_OUTPUT_TERMINAL,
+ UDESCSUB_AC_OUTPUT,
0x02, /* Terminal ID: 2 */
0x0302, /* Terminal Type: Headphones (0x0302) */
0x00, /* Assoc Terminal: 0 */
@@ -241,19 +245,19 @@ static struct uac_as_descriptor as_desc =
},
/* General AS Descriptor */
{
- UAC_DT_AS_HEADER_SIZE,
+ sizeof(struct usb_audio_streaming_interface_descriptor),
UAC_CS_INTERFACE,
- UAC_AS_GENERAL,
+ AS_GENERAL,
0x01, /* Terminal ID: 1 */
0x01, /* Interface delay in frames: 1 */
- UAC_FORMAT_TYPE_I_PCM,
+ UA_FMT_PCM,
},
/* Format type i Descriptor */
{
- UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(UAC_FORMAT_NUM),
+ sizeof(struct usb_audio_streaming_type1_descriptor),
UAC_CS_INTERFACE,
- UAC_FORMAT_TYPE,
- UAC_FORMAT_TYPE_I,
+ FORMAT_TYPE,
+ FORMAT_TYPE_I,
UAC_CHANNEL_NUM,
2, /* Subframe Size: 2 */
RESOLUTION_BITS,
@@ -271,9 +275,9 @@ static struct uac_as_descriptor as_desc =
},
/* AS Endpoint Descriptor */
{
- UAC_ISO_ENDPOINT_DESC_SIZE,
+ sizeof(struct usb_audio_streaming_endpoint_descriptor),
UAC_CS_ENDPOINT,
- UAC_MS_GENERAL,
+ AS_GENERAL,
},
};
@@ -472,9 +476,9 @@ static rt_err_t _uac_descriptor_config(struct uac_ac_descriptor *ac,
static rt_err_t _uac_samplerate_config(struct uac_as_descriptor *as, rt_uint32_t samplerate)
{
- as->format_type_desc.tSamFreq[0][2] = samplerate >> 16 & 0xff;
- as->format_type_desc.tSamFreq[0][1] = samplerate >> 8 & 0xff;
- as->format_type_desc.tSamFreq[0][0] = samplerate & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 2] = samplerate >> 16 & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 1] = samplerate >> 8 & 0xff;
+ as->format_type_desc.tSamFreq[0 * 3 + 0] = samplerate & 0xff;
return RT_EOK;
}
@@ -496,9 +500,12 @@ ufunction_t rt_usbd_function_uac_speaker_create(udevice_t device)
/* parameter check */
RT_ASSERT(device != RT_NULL);
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, SPK_INTF_STR_INDEX, _ustring[2]);
+#else
/* set usb device string description */
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a uac function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
//not support HS
diff --git a/components/drivers/usb/usbdevice/class/cdc.h b/components/drivers/usb/usbdevice/class/cdc.h
index 4e07f16266..a4616a956b 100644
--- a/components/drivers/usb/usbdevice/class/cdc.h
+++ b/components/drivers/usb/usbdevice/class/cdc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,7 +8,7 @@
* 2012-10-03 Yi Qiu first version
* 2012-12-12 heyuanjie87 add CDC endpoints collection
*/
-
+
#ifndef __CDC_H__
#define __CDC_H__
@@ -96,7 +96,7 @@ struct ucdc_header_descriptor
rt_uint8_t length;
rt_uint8_t type;
rt_uint8_t subtype;
- rt_uint16_t bcd;
+ rt_uint16_t bcd;
};
typedef struct ucdc_header_descriptor* ucdc_hdr_desc_t;
@@ -114,7 +114,7 @@ struct ucdc_call_mgmt_descriptor
rt_uint8_t length;
rt_uint8_t type;
rt_uint8_t subtype;
- rt_uint8_t capabilties;
+ rt_uint8_t capabilties;
rt_uint8_t data_interface;
};
typedef struct ucdc_call_mgmt_descriptor* ucdc_call_mgmt_desc_t;
@@ -136,9 +136,9 @@ struct ucdc_comm_descriptor
#endif
struct uinterface_descriptor intf_desc;
struct ucdc_header_descriptor hdr_desc;
- struct ucdc_call_mgmt_descriptor call_mgmt_desc;
- struct ucdc_acm_descriptor acm_desc;
- struct ucdc_union_descriptor union_desc;
+ struct ucdc_call_mgmt_descriptor call_mgmt_desc;
+ struct ucdc_acm_descriptor acm_desc;
+ struct ucdc_union_descriptor union_desc;
struct uendpoint_descriptor ep_desc;
};
typedef struct ucdc_comm_descriptor* ucdc_comm_desc_t;
@@ -170,7 +170,7 @@ typedef struct ucdc_eth_descriptor* ucdc_eth_desc_t;
struct ucdc_data_descriptor
{
struct uinterface_descriptor intf_desc;
- struct uendpoint_descriptor ep_out_desc;
+ struct uendpoint_descriptor ep_out_desc;
struct uendpoint_descriptor ep_in_desc;
};
typedef struct ucdc_data_descriptor* ucdc_data_desc_t;
diff --git a/components/drivers/usb/usbdevice/class/cdc_vcom.c b/components/drivers/usb/usbdevice/class/cdc_vcom.c
index f9ea466bd5..3564330578 100644
--- a/components/drivers/usb/usbdevice/class/cdc_vcom.c
+++ b/components/drivers/usb/usbdevice/class/cdc_vcom.c
@@ -1,12 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-10-02 Yi Qiu first version
- * 2012-12-12 heyuanjie87 change endpoints and function handler
+ * 2012-12-12 heyuanjie87 change endpoints and function handler
* 2013-06-25 heyuanjie87 remove SOF mechinism
* 2013-07-20 Yi Qiu do more test
* 2016-02-01 Urey Fix some error
@@ -20,6 +20,7 @@
#ifdef RT_USB_DEVICE_CDC
+#define VCOM_INTF_STR_INDEX 5
#ifdef RT_VCOM_TX_TIMEOUT
#define VCOM_TX_TIMEOUT RT_VCOM_TX_TIMEOUT
#else /*!RT_VCOM_TX_TIMEOUT*/
@@ -146,23 +147,27 @@ const static struct ucdc_comm_descriptor _comm_desc =
USB_DESC_LENGTH_INTERFACE,
USB_DESC_TYPE_INTERFACE,
USB_DYNAMIC,
- 0x00,
+ 0x00,
0x01,
USB_CDC_CLASS_COMM,
USB_CDC_SUBCLASS_ACM,
USB_CDC_PROTOCOL_V25TER,
- 0x00,
+#ifdef RT_USB_DEVICE_COMPOSITE
+ VCOM_INTF_STR_INDEX,
+#else
+ 0,
+#endif
},
- /* Header Functional Descriptor */
+ /* Header Functional Descriptor */
{
- 0x05,
+ 0x05,
USB_CDC_CS_INTERFACE,
USB_CDC_SCS_HEADER,
0x0110,
},
- /* Call Management Functional Descriptor */
+ /* Call Management Functional Descriptor */
{
- 0x05,
+ 0x05,
USB_CDC_CS_INTERFACE,
USB_CDC_SCS_CALL_MGMT,
0x00,
@@ -175,7 +180,7 @@ const static struct ucdc_comm_descriptor _comm_desc =
USB_CDC_SCS_ACM,
0x02,
},
- /* Union Functional Descriptor */
+ /* Union Functional Descriptor */
{
0x05,
USB_CDC_CS_INTERFACE,
@@ -183,7 +188,7 @@ const static struct ucdc_comm_descriptor _comm_desc =
USB_DYNAMIC,
USB_DYNAMIC,
},
- /* Endpoint Descriptor */
+ /* Endpoint Descriptor */
{
USB_DESC_LENGTH_ENDPOINT,
USB_DESC_TYPE_ENDPOINT,
@@ -204,27 +209,27 @@ const static struct ucdc_data_descriptor _data_desc =
USB_DESC_TYPE_INTERFACE,
USB_DYNAMIC,
0x00,
- 0x02,
+ 0x02,
USB_CDC_CLASS_DATA,
- 0x00,
- 0x00,
- 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
},
/* endpoint, bulk out */
{
- USB_DESC_LENGTH_ENDPOINT,
+ USB_DESC_LENGTH_ENDPOINT,
USB_DESC_TYPE_ENDPOINT,
USB_DYNAMIC | USB_DIR_OUT,
- USB_EP_ATTR_BULK,
+ USB_EP_ATTR_BULK,
USB_CDC_BUFSIZE,
- 0x00,
+ 0x00,
},
/* endpoint, bulk in */
{
USB_DESC_LENGTH_ENDPOINT,
USB_DESC_TYPE_ENDPOINT,
USB_DYNAMIC | USB_DIR_IN,
- USB_EP_ATTR_BULK,
+ USB_EP_ATTR_BULK,
USB_CDC_BUFSIZE,
0x00,
},
@@ -253,11 +258,11 @@ static void _vcom_reset_state(ufunction_t func)
{
struct vcom* data;
int lvl;
-
+
RT_ASSERT(func != RT_NULL)
data = (struct vcom*)func->user_data;
-
+
lvl = rt_hw_interrupt_disable();
data->connected = RT_FALSE;
data->in_sending = RT_FALSE;
@@ -299,9 +304,9 @@ static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
return RT_EOK;
}
-
+
rt_completion_done(&data->wait);
-
+
return RT_EOK;
}
@@ -396,7 +401,7 @@ static rt_err_t _cdc_set_line_coding_callback(udevice_t device, rt_size_t size)
RT_DEBUG_LOG(RT_DEBUG_USB, ("_cdc_set_line_coding_callback\n"));
dcd_ep0_send_status(device->dcd);
-
+
return RT_EOK;
}
@@ -438,7 +443,7 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
RT_ASSERT(setup != RT_NULL);
data = (struct vcom*)func->user_data;
-
+
switch(setup->bRequest)
{
case CDC_SEND_ENCAPSULATED_COMMAND:
@@ -488,17 +493,17 @@ static rt_err_t _function_enable(ufunction_t func)
RT_DEBUG_LOG(RT_DEBUG_USB, ("cdc function enable\n"));
_vcom_reset_state(func);
-
+
data = (struct vcom*)func->user_data;
data->ep_out->buffer = rt_malloc(CDC_RX_BUFSIZE);
RT_ASSERT(data->ep_out->buffer != RT_NULL);
data->ep_out->request.buffer = data->ep_out->buffer;
data->ep_out->request.size = EP_MAXPACKET(data->ep_out);
-
+
data->ep_out->request.req_type = UIO_REQUEST_READ_BEST;
rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
-
+
return RT_EOK;
}
@@ -523,7 +528,7 @@ static rt_err_t _function_disable(ufunction_t func)
if(data->ep_out->buffer != RT_NULL)
{
rt_free(data->ep_out->buffer);
- data->ep_out->buffer = RT_NULL;
+ data->ep_out->buffer = RT_NULL;
}
return RT_EOK;
@@ -544,7 +549,7 @@ static struct ufunction_ops ops =
*
* @return RT_EOK on successful.
*/
-static rt_err_t _cdc_descriptor_config(ucdc_comm_desc_t comm,
+static rt_err_t _cdc_descriptor_config(ucdc_comm_desc_t comm,
rt_uint8_t cintf_nr, ucdc_data_desc_t data, rt_uint8_t dintf_nr)
{
comm->call_mgmt_desc.data_interface = dintf_nr;
@@ -582,21 +587,24 @@ ufunction_t rt_usbd_function_cdc_create(udevice_t device)
rt_memset(serno, 0, _SER_NO_LEN + 1);
rt_memcpy(serno, _SER_NO, rt_strlen(_SER_NO));
}
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, VCOM_INTF_STR_INDEX, _ustring[2]);
+#else
/* set usb device string description */
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a cdc function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
-
+
/* support HS */
rt_usbd_device_set_qualifier(device, &dev_qualifier);
-
+
/* allocate memory for cdc vcom data */
data = (struct vcom*)rt_malloc(sizeof(struct vcom));
RT_ASSERT(data != RT_NULL);
rt_memset(data, 0, sizeof(struct vcom));
func->user_data = (void*)data;
-
+
/* initilize vcom */
rt_usb_vcom_init(func);
@@ -646,7 +654,7 @@ ufunction_t rt_usbd_function_cdc_create(udevice_t device)
/* add the cdc data interface to cdc function */
rt_usbd_function_add_interface(func, intf_data);
-
+
return func;
}
@@ -682,7 +690,7 @@ static int _vcom_getc(struct rt_serial_device *serial)
rt_uint32_t level;
struct ufunction *func;
struct vcom *data;
-
+
func = (struct ufunction*)serial->parent.user_data;
data = (struct vcom*)func->user_data;
@@ -918,7 +926,7 @@ static void rt_usb_vcom_init(struct ufunction *func)
rt_err_t result = RT_EOK;
struct serial_configure config;
struct vcom *data = (struct vcom*)func->user_data;
-
+
/* initialize ring buffer */
rt_ringbuffer_init(&data->rx_ringbuffer, data->rx_rbp, CDC_RX_BUFSIZE);
rt_ringbuffer_init(&data->tx_ringbuffer, data->tx_rbp, CDC_TX_BUFSIZE);
@@ -952,9 +960,9 @@ static void rt_usb_vcom_init(struct ufunction *func)
vcom_thread_stack, VCOM_TASK_STK_SIZE,
16, 20);
result = rt_thread_startup(&vcom_thread);
- RT_ASSERT(result == RT_EOK);
+ RT_ASSERT(result == RT_EOK);
}
-struct udclass vcom_class =
+struct udclass vcom_class =
{
.rt_usbd_function_create = rt_usbd_function_cdc_create
};
diff --git a/components/drivers/usb/usbdevice/class/ecm.c b/components/drivers/usb/usbdevice/class/ecm.c
index 36557dad74..d6d98478f8 100644
--- a/components/drivers/usb/usbdevice/class/ecm.c
+++ b/components/drivers/usb/usbdevice/class/ecm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -24,6 +24,7 @@
#define USB_ETH_MTU 1514
#endif
#define MAX_ADDR_LEN 6
+#define ECM_INTF_STR_INDEX 10
struct rt_ecm_eth
{
@@ -44,9 +45,9 @@ struct rt_ecm_eth
ALIGN(4)
char rx_buffer[USB_ETH_MTU];
char tx_buffer[USB_ETH_MTU];
-
+
struct rt_semaphore tx_buffer_free;
-
+
};
typedef struct rt_ecm_eth * rt_ecm_eth_t;
@@ -96,7 +97,11 @@ const static struct ucdc_eth_descriptor _comm_desc =
USB_CDC_CLASS_COMM,
USB_CDC_SUBCLASS_ETH,
USB_CDC_PROTOCOL_NONE,
+#ifdef RT_USB_DEVICE_COMPOSITE
+ ECM_INTF_STR_INDEX,
+#else
0x00,
+#endif
},
/* Header Functional Descriptor */
{
@@ -207,7 +212,7 @@ static rt_err_t _cdc_send_notifi(ufunction_t func,ucdc_notification_code_t notif
_notifi.bNotificatinCode = notifi;
_notifi.wValue = wValue;
_notifi.wLength = wLength;
-
+
eps->ep_cmd->request.buffer = (void *)&_notifi;
eps->ep_cmd->request.size = 8;
eps->ep_cmd->request.req_type = UIO_REQUEST_WRITE;
@@ -220,7 +225,7 @@ static rt_err_t _ecm_set_eth_packet_filter(ufunction_t func, ureq_t setup)
{
rt_ecm_eth_t _ecm_eth = (rt_ecm_eth_t)func->user_data;
dcd_ep0_send_status(func->device->dcd);
-
+
/* send link up. */
eth_device_linkchange(&_ecm_eth->parent, RT_TRUE);
_cdc_send_notifi(func, UCDC_NOTIFI_NETWORK_CONNECTION, 1, 0);
@@ -292,7 +297,7 @@ static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
ecm_device->rx_size = ecm_device->rx_offset;
ecm_device->rx_offset = 0;
eth_device_ready(&ecm_device->parent);
-
+
}else
{
ecm_device->eps.ep_out->request.buffer = ecm_device->eps.ep_out->buffer;
@@ -427,7 +432,7 @@ rt_err_t rt_ecm_eth_tx(rt_device_t dev, struct pbuf* p)
rt_sem_release(&ecm_eth_dev->tx_buffer_free);
return result;
}
-
+
pbuffer = (char *)&ecm_eth_dev->tx_buffer;
for (q = p; q != NULL; q = q->next)
{
@@ -480,7 +485,7 @@ static rt_err_t _function_enable(ufunction_t func)
/* reset eth rx tx */
ecm_device->rx_size = 0;
ecm_device->rx_offset = 0;
-
+
eps->ep_out->request.buffer = (void *)eps->ep_out->buffer;
eps->ep_out->request.size = EP_MAXPACKET(eps->ep_out);
eps->ep_out->request.req_type = UIO_REQUEST_READ_BEST;
@@ -555,13 +560,16 @@ ufunction_t rt_usbd_function_ecm_create(udevice_t device)
ualtsetting_t comm_setting, data_setting;
ucdc_data_desc_t data_desc;
ucdc_eth_desc_t comm_desc;
-
+
/* parameter check */
RT_ASSERT(device != RT_NULL);
/* set usb device string description */
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, ECM_INTF_STR_INDEX, _ustring[2]);
+#else
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a cdc class */
cdc = rt_usbd_function_new(device, &_dev_desc, &ops);
rt_usbd_device_set_qualifier(device, &dev_qualifier);
@@ -600,7 +608,7 @@ ufunction_t rt_usbd_function_ecm_create(udevice_t device)
rt_usbd_set_altsetting(intf_comm, 0);
/* add the communication interface to the cdc class */
rt_usbd_function_add_interface(cdc, intf_comm);
-
+
/* create a bulk in and a bulk out endpoint */
data_desc = (ucdc_data_desc_t)data_setting->desc;
eps->ep_out = rt_usbd_endpoint_new(&data_desc->ep_out_desc, _ep_out_handler);
@@ -648,14 +656,14 @@ ufunction_t rt_usbd_function_ecm_create(udevice_t device)
_ecm_eth->parent.eth_tx = rt_ecm_eth_tx;
/* register eth device */
eth_device_init(&_ecm_eth->parent, "u0");
-
+
/* send link up. */
eth_device_linkchange(&_ecm_eth->parent, RT_FALSE);
-
+
return cdc;
}
-struct udclass ecm_class =
+struct udclass ecm_class =
{
.rt_usbd_function_create = rt_usbd_function_ecm_create
};
diff --git a/components/drivers/usb/usbdevice/class/hid.c b/components/drivers/usb/usbdevice/class/hid.c
index 52e50296a4..ddd4cb93a8 100644
--- a/components/drivers/usb/usbdevice/class/hid.c
+++ b/components/drivers/usb/usbdevice/class/hid.c
@@ -1,9 +1,9 @@
/*
* File : hid.c
- * COPYRIGHT (C) 2008 - 2018, RT-Thread Development Team
+ * COPYRIGHT (C) 2006 - 2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
- *
+ *
* Change Logs:
* Date Author Notes
* 2017-03-13 Urey the first version
@@ -17,7 +17,7 @@
#include "hid.h"
#ifdef RT_USB_DEVICE_HID
-
+#define HID_INTF_STR_INDEX 7
struct hid_s
{
struct rt_device parent;
@@ -318,8 +318,12 @@ const static struct uhid_comm_descriptor _hid_comm_desc =
#else
USB_HID_PROTOCOL_MOUSE, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
#endif
- 0, /* iInterface: Index of string descriptor */
- },
+#ifdef RT_USB_DEVICE_COMPOSITE
+ HID_INTF_STR_INDEX, /* iInterface: Index of string descriptor */
+#else
+ 0,
+#endif
+ },
/* HID Descriptor */
{
@@ -621,12 +625,12 @@ static void hid_thread_entry(void* parameter)
struct hid_report report;
struct hid_s *hiddev;
hiddev = (struct hid_s *)parameter;
- while(1)
- {
- if(rt_mq_recv(&hiddev->hid_mq, &report, sizeof(report),RT_WAITING_FOREVER) != RT_EOK )
+ while(1)
+ {
+ if(rt_mq_recv(&hiddev->hid_mq, &report, sizeof(report),RT_WAITING_FOREVER) != RT_EOK )
continue;
- HID_Report_Received(&report);
- }
+ HID_Report_Received(&report);
+ }
}
#ifdef RT_USING_DEVICE_OPS
@@ -658,7 +662,7 @@ static void rt_usb_hid_init(struct ufunction *func)
rt_device_register(&hiddev->parent, "hidd", RT_DEVICE_FLAG_RDWR);
rt_mq_init(&hiddev->hid_mq, "hiddmq", hid_mq_pool, sizeof(struct hid_report),
sizeof(hid_mq_pool), RT_IPC_FLAG_FIFO);
-
+
rt_thread_init(&hid_thread, "hidd", hid_thread_entry, hiddev,
hid_thread_stack, sizeof(hid_thread_stack), RT_USBD_THREAD_PRIO, 20);
rt_thread_startup(&hid_thread);
@@ -685,11 +689,14 @@ ufunction_t rt_usbd_function_hid_create(udevice_t device)
RT_ASSERT(device != RT_NULL);
/* set usb device string description */
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, HID_INTF_STR_INDEX, _ustring[2]);
+#else
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a cdc function */
func = rt_usbd_function_new(device, &_dev_desc, &ops);
-
+
/* For high speed mode supporting */
rt_usbd_device_set_qualifier(device, &dev_qualifier);
@@ -730,7 +737,7 @@ ufunction_t rt_usbd_function_hid_create(udevice_t device)
rt_usb_hid_init(func);
return func;
}
-struct udclass hid_class =
+struct udclass hid_class =
{
.rt_usbd_function_create = rt_usbd_function_hid_create
};
diff --git a/components/drivers/usb/usbdevice/class/hid.h b/components/drivers/usb/usbdevice/class/hid.h
index 4d0f314a11..2b6a4ad90a 100644
--- a/components/drivers/usb/usbdevice/class/hid.h
+++ b/components/drivers/usb/usbdevice/class/hid.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c
index 6991d97eae..97a189834b 100644
--- a/components/drivers/usb/usbdevice/class/mstorage.c
+++ b/components/drivers/usb/usbdevice/class/mstorage.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -7,7 +7,7 @@
* Date Author Notes
* 2012-10-01 Yi Qiu first version
* 2012-11-25 Heyuanjie87 reduce the memory consumption
- * 2012-12-09 Heyuanjie87 change function and endpoint handler
+ * 2012-12-09 Heyuanjie87 change function and endpoint handler
* 2013-07-25 Yi Qiu update for USB CV test
*/
@@ -18,16 +18,16 @@
#ifdef RT_USING_DFS_MNTTABLE
#include "dfs_fs.h"
#endif
-
#ifdef RT_USB_DEVICE_MSTORAGE
+#define MSTRORAGE_INTF_STR_INDEX 11
enum STAT
{
STAT_CBW,
- STAT_CMD,
+ STAT_CMD,
STAT_CSW,
STAT_RECEIVE,
- STAT_SEND,
+ STAT_SEND,
};
typedef enum
@@ -49,7 +49,7 @@ typedef rt_size_t (*cbw_handler)(ufunction_t func, ustorage_cbw_t cbw);
struct scsi_cmd
{
rt_uint16_t cmd;
- cbw_handler handler;
+ cbw_handler handler;
rt_size_t cmd_len;
CB_SIZE_TYPE type;
rt_size_t data_size;
@@ -57,10 +57,10 @@ struct scsi_cmd
};
struct mstorage
-{
+{
struct ustorage_csw csw_response;
uep_t ep_in;
- uep_t ep_out;
+ uep_t ep_out;
int status;
rt_uint32_t cb_data_size;
rt_device_t disk;
@@ -68,7 +68,7 @@ struct mstorage
rt_int32_t count;
rt_int32_t size;
struct scsi_cmd* processing;
- struct rt_device_blk_geometry geometry;
+ struct rt_device_blk_geometry geometry;
};
ALIGN(4)
@@ -131,7 +131,11 @@ const static struct umass_descriptor _mass_desc =
USB_CLASS_MASS_STORAGE, //bInterfaceClass;
0x06, //bInterfaceSubClass;
0x50, //bInterfaceProtocol;
+#ifdef RT_USB_DEVICE_COMPOSITE
+ MSTRORAGE_INTF_STR_INDEX,
+#else
0x00, //iInterface;
+#endif
},
{
@@ -183,9 +187,9 @@ static struct scsi_cmd cmd_data[] =
{SCSI_REQUEST_SENSE, _request_sense, 6, COUNT, 0, DIR_IN},
{SCSI_INQUIRY_CMD, _inquiry_cmd, 6, COUNT, 0, DIR_IN},
{SCSI_ALLOW_REMOVAL, _allow_removal, 6, FIXED, 0, DIR_NONE},
- {SCSI_MODE_SENSE_6, _mode_sense_6, 6, COUNT, 0, DIR_IN},
- {SCSI_START_STOP, _start_stop, 6, FIXED, 0, DIR_NONE},
- {SCSI_READ_CAPACITIES, _read_capacities, 10, COUNT, 0, DIR_NONE},
+ {SCSI_MODE_SENSE_6, _mode_sense_6, 6, COUNT, 0, DIR_IN},
+ {SCSI_START_STOP, _start_stop, 6, FIXED, 0, DIR_NONE},
+ {SCSI_READ_CAPACITIES, _read_capacities, 10, COUNT, 0, DIR_NONE},
{SCSI_READ_CAPACITY, _read_capacity, 10, FIXED, 8, DIR_IN},
{SCSI_READ_10, _read_10, 10, BLOCK_COUNT, 0, DIR_IN},
{SCSI_WRITE_10, _write_10, 10, BLOCK_COUNT, 0, DIR_OUT},
@@ -200,9 +204,9 @@ static void _send_status(ufunction_t func)
RT_DEBUG_LOG(RT_DEBUG_USB, ("_send_status\n"));
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
data->ep_in->request.buffer = (rt_uint8_t*)&data->csw_response;
- data->ep_in->request.size = SIZEOF_CSW;
+ data->ep_in->request.size = SIZEOF_CSW;
data->ep_in->request.req_type = UIO_REQUEST_WRITE;
rt_usbd_io_request(func->device, data->ep_in, &data->ep_in->request);
data->status = STAT_CSW;
@@ -213,13 +217,13 @@ static rt_size_t _test_unit_ready(ufunction_t func, ustorage_cbw_t cbw)
struct mstorage *data;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_test_unit_ready\n"));
data = (struct mstorage*)func->user_data;
data->csw_response.status = 0;
-
+
return 0;
}
@@ -228,7 +232,7 @@ static rt_size_t _allow_removal(ufunction_t func, ustorage_cbw_t cbw)
struct mstorage *data;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_allow_removal\n"));
@@ -241,7 +245,7 @@ static rt_size_t _allow_removal(ufunction_t func, ustorage_cbw_t cbw)
/**
* This function will handle inquiry command request.
*
- * @param func the usb function object.
+ * @param func the usb function object.
* @param cbw the command block wrapper.
*
* @return RT_EOK on successful.
@@ -253,12 +257,12 @@ static rt_size_t _inquiry_cmd(ufunction_t func, ustorage_cbw_t cbw)
rt_uint8_t *buf;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_inquiry_cmd\n"));
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
buf = data->ep_in->buffer;
*(rt_uint32_t*)&buf[0] = 0x0 | (0x80 << 8);
@@ -281,7 +285,7 @@ static rt_size_t _inquiry_cmd(ufunction_t func, ustorage_cbw_t cbw)
/**
* This function will handle sense request.
*
- * @param func the usb function object.
+ * @param func the usb function object.
* @param cbw the command block wrapper.
*
* @return RT_EOK on successful.
@@ -292,12 +296,12 @@ static rt_size_t _request_sense(ufunction_t func, ustorage_cbw_t cbw)
struct request_sense_data *buf;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_request_sense\n"));
-
- data = (struct mstorage*)func->user_data;
+
+ data = (struct mstorage*)func->user_data;
buf = (struct request_sense_data *)data->ep_in->buffer;
buf->ErrorCode = 0x70;
@@ -325,7 +329,7 @@ static rt_size_t _request_sense(ufunction_t func, ustorage_cbw_t cbw)
* This function will handle mode_sense_6 request.
*
* @param func the usb function object.
- * @param cbw the command block wrapper.
+ * @param cbw the command block wrapper.
*
* @return RT_EOK on successful.
*/
@@ -335,12 +339,12 @@ static rt_size_t _mode_sense_6(ufunction_t func, ustorage_cbw_t cbw)
rt_uint8_t *buf;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_mode_sense_6\n"));
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
buf = data->ep_in->buffer;
buf[0] = 3;
buf[1] = 0;
@@ -360,7 +364,7 @@ static rt_size_t _mode_sense_6(ufunction_t func, ustorage_cbw_t cbw)
/**
* This function will handle read_capacities request.
*
- * @param func the usb function object.
+ * @param func the usb function object.
* @param cbw the command block wrapper.
*
* @return RT_EOK on successful.
@@ -372,12 +376,12 @@ static rt_size_t _read_capacities(ufunction_t func, ustorage_cbw_t cbw)
rt_uint32_t sector_count, sector_size;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_read_capacities\n"));
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
buf = data->ep_in->buffer;
sector_count = data->geometry.sector_count;
sector_size = data->geometry.bytes_per_sector;
@@ -405,7 +409,7 @@ static rt_size_t _read_capacities(ufunction_t func, ustorage_cbw_t cbw)
/**
* This function will handle read_capacity request.
*
- * @param func the usb function object.
+ * @param func the usb function object.
* @param cbw the command block wapper.
*
* @return RT_EOK on successful.
@@ -418,13 +422,13 @@ static rt_size_t _read_capacity(ufunction_t func, ustorage_cbw_t cbw)
rt_uint32_t sector_count, sector_size;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_read_capacity\n"));
- data = (struct mstorage*)func->user_data;
- buf = data->ep_in->buffer;
+ data = (struct mstorage*)func->user_data;
+ buf = data->ep_in->buffer;
sector_count = data->geometry.sector_count - 1; /* Last Logical Block Address */
sector_size = data->geometry.bytes_per_sector;
@@ -459,19 +463,19 @@ static rt_size_t _read_10(ufunction_t func, ustorage_cbw_t cbw)
{
struct mstorage *data;
rt_size_t size;
-
+
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
data->block = cbw->cb[2]<<24 | cbw->cb[3]<<16 | cbw->cb[4]<<8 |
cbw->cb[5]<<0;
data->count = cbw->cb[7]<<8 | cbw->cb[8]<<0;
RT_ASSERT(data->count < data->geometry.sector_count);
- data->csw_response.data_reside = data->cb_data_size;
+ data->csw_response.data_reside = data->cb_data_size;
size = rt_device_read(data->disk, data->block, data->ep_in->buffer, 1);
if(size == 0)
{
@@ -479,11 +483,11 @@ static rt_size_t _read_10(ufunction_t func, ustorage_cbw_t cbw)
}
data->ep_in->request.buffer = data->ep_in->buffer;
- data->ep_in->request.size = data->geometry.bytes_per_sector;
- data->ep_in->request.req_type = UIO_REQUEST_WRITE;
+ data->ep_in->request.size = data->geometry.bytes_per_sector;
+ data->ep_in->request.req_type = UIO_REQUEST_WRITE;
rt_usbd_io_request(func->device, data->ep_in, &data->ep_in->request);
data->status = STAT_SEND;
-
+
return data->geometry.bytes_per_sector;
}
@@ -503,7 +507,7 @@ static rt_size_t _write_10(ufunction_t func, ustorage_cbw_t cbw)
RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
data->block = cbw->cb[2]<<24 | cbw->cb[3]<<16 | cbw->cb[4]<<8 |
cbw->cb[5]<<0;
@@ -515,13 +519,13 @@ static rt_size_t _write_10(ufunction_t func, ustorage_cbw_t cbw)
data->count, data->block, data->geometry.sector_count));
data->csw_response.data_reside = data->cb_data_size;
-
+
data->ep_out->request.buffer = data->ep_out->buffer;
- data->ep_out->request.size = data->geometry.bytes_per_sector;
+ data->ep_out->request.size = data->geometry.bytes_per_sector;
data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
data->status = STAT_RECEIVE;
-
+
return data->geometry.bytes_per_sector;
}
@@ -537,42 +541,42 @@ static rt_size_t _verify_10(ufunction_t func, ustorage_cbw_t cbw)
struct mstorage *data;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_verify_10\n"));
data = (struct mstorage*)func->user_data;
data->csw_response.status = 0;
-
+
return 0;
}
-static rt_size_t _start_stop(ufunction_t func,
+static rt_size_t _start_stop(ufunction_t func,
ustorage_cbw_t cbw)
{
struct mstorage *data;
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_start_stop\n"));
data = (struct mstorage*)func->user_data;
data->csw_response.status = 0;
-
+
return 0;
}
static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
{
struct mstorage *data;
-
+
RT_ASSERT(func != RT_NULL);
RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_ep_in_handler\n"));
-
- data = (struct mstorage*)func->user_data;
+
+ data = (struct mstorage*)func->user_data;
switch(data->status)
{
@@ -580,15 +584,15 @@ static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
if(data->ep_in->request.size != SIZEOF_CSW)
{
rt_kprintf("Size of csw command error\n");
- rt_usbd_ep_set_stall(func->device, data->ep_in);
+ rt_usbd_ep_set_stall(func->device, data->ep_in);
}
else
{
RT_DEBUG_LOG(RT_DEBUG_USB, ("return to cbw status\n"));
data->ep_out->request.buffer = data->ep_out->buffer;
data->ep_out->request.size = SIZEOF_CBW;
- data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
- rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
+ data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
+ rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
data->status = STAT_CBW;
}
break;
@@ -601,47 +605,47 @@ static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
{
data->csw_response.data_reside -= data->ep_in->request.size;
if(data->csw_response.data_reside != 0)
- {
- RT_DEBUG_LOG(RT_DEBUG_USB, ("data_reside %d, request %d\n",
+ {
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("data_reside %d, request %d\n",
data->csw_response.data_reside, data->ep_in->request.size));
if(data->processing->dir == DIR_OUT)
{
rt_usbd_ep_set_stall(func->device, data->ep_out);
}
else
- {
+ {
//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);
+ //rt_usbd_ep_set_stall(func->device, data->ep_in);
}
data->csw_response.data_reside = 0;
}
}
_send_status(func);
break;
- case STAT_SEND:
+ case STAT_SEND:
data->csw_response.data_reside -= data->ep_in->request.size;
- data->count--;
- data->block++;
+ data->count--;
+ data->block++;
if(data->count > 0 && data->csw_response.data_reside > 0)
{
if(rt_device_read(data->disk, data->block, data->ep_in->buffer, 1) == 0)
{
rt_kprintf("disk read error\n");
rt_usbd_ep_set_stall(func->device, data->ep_in);
- return -RT_ERROR;
+ return -RT_ERROR;
}
data->ep_in->request.buffer = data->ep_in->buffer;
- data->ep_in->request.size = data->geometry.bytes_per_sector;
- data->ep_in->request.req_type = UIO_REQUEST_WRITE;
- rt_usbd_io_request(func->device, data->ep_in, &data->ep_in->request);
+ data->ep_in->request.size = data->geometry.bytes_per_sector;
+ data->ep_in->request.req_type = UIO_REQUEST_WRITE;
+ rt_usbd_io_request(func->device, data->ep_in, &data->ep_in->request);
}
else
{
- _send_status(func);
- }
+ _send_status(func);
+ }
break;
}
@@ -671,7 +675,7 @@ static struct scsi_cmd* _find_cbw_command(rt_uint16_t cmd)
{
if(cmd_data[i].cmd == cmd)
return &cmd_data[i];
- }
+ }
return RT_NULL;
}
@@ -685,7 +689,7 @@ static void _cb_len_calc(ufunction_t func, struct scsi_cmd* cmd,
RT_ASSERT(cmd != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
if(cmd->cmd_len == 6)
{
switch(cmd->type)
@@ -699,9 +703,9 @@ static void _cb_len_calc(ufunction_t func, struct scsi_cmd* cmd,
case FIXED:
data->cb_data_size = cmd->data_size;
break;
- default:
+ default:
break;
- }
+ }
}
else if(cmd->cmd_len == 10)
{
@@ -711,32 +715,32 @@ static void _cb_len_calc(ufunction_t func, struct scsi_cmd* cmd,
data->cb_data_size = cbw->cb[7]<<8 | cbw->cb[8];
break;
case BLOCK_COUNT:
- data->cb_data_size = (cbw->cb[7]<<8 | cbw->cb[8]) *
+ data->cb_data_size = (cbw->cb[7]<<8 | cbw->cb[8]) *
data->geometry.bytes_per_sector;
break;
case FIXED:
data->cb_data_size = cmd->data_size;
break;
- default:
+ default:
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];
+ data->cb_data_size = cbw->cb[4];
break;
- default:
+ default:
break;
}
}
else
{
- rt_kprintf("cmd_len error %d\n", cmd->cmd_len);
+ rt_kprintf("cmd_len error %d\n", cmd->cmd_len);
}
}
@@ -749,7 +753,7 @@ static rt_bool_t _cbw_verify(ufunction_t func, struct scsi_cmd* cmd,
RT_ASSERT(cbw != RT_NULL);
RT_ASSERT(func != RT_NULL);
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
if(cmd->cmd_len != cbw->cb_len)
{
rt_kprintf("cb_len error\n");
@@ -780,7 +784,7 @@ static rt_bool_t _cbw_verify(ufunction_t func, struct scsi_cmd* cmd,
rt_kprintf("xfer_len > data_size\n");
return RT_FALSE;
}
-
+
if(cbw->xfer_len < data->cb_data_size)
{
rt_kprintf("xfer_len < data_size\n");
@@ -788,18 +792,18 @@ static rt_bool_t _cbw_verify(ufunction_t func, struct scsi_cmd* cmd,
data->csw_response.status = 1;
}
- return RT_TRUE;
+ return RT_TRUE;
}
static rt_size_t _cbw_handler(ufunction_t func, struct scsi_cmd* cmd,
ustorage_cbw_t cbw)
-{
+{
struct mstorage *data;
RT_ASSERT(func != RT_NULL);
RT_ASSERT(cbw != RT_NULL);
RT_ASSERT(cmd->handler != RT_NULL);
-
+
data = (struct mstorage*)func->user_data;
data->processing = cmd;
return cmd->handler(func, cbw);
@@ -819,21 +823,21 @@ static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
struct scsi_cmd* cmd;
rt_size_t len;
struct ustorage_cbw* cbw;
-
+
RT_ASSERT(func != RT_NULL);
RT_ASSERT(func->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_ep_out_handler %d\n", size));
-
+
data = (struct mstorage*)func->user_data;
- cbw = (struct ustorage_cbw*)data->ep_out->buffer;
+ cbw = (struct ustorage_cbw*)data->ep_out->buffer;
if(data->status == STAT_CBW)
{
/* dump cbw information */
if(cbw->signature != CBW_SIGNATURE || size != SIZEOF_CBW)
{
goto exit;
- }
+ }
data->csw_response.signature = CSW_SIGNATURE;
data->csw_response.tag = cbw->tag;
@@ -841,33 +845,33 @@ static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
data->csw_response.status = 0;
RT_DEBUG_LOG(RT_DEBUG_USB, ("ep_out reside %d\n", data->csw_response.data_reside));
-
+
cmd = _find_cbw_command(cbw->cb[0]);
if(cmd == RT_NULL)
{
rt_kprintf("can't find cbw command\n");
goto exit;
- }
+ }
_cb_len_calc(func, cmd, cbw);
if(!_cbw_verify(func, cmd, cbw))
{
goto exit;
}
-
+
len = _cbw_handler(func, cmd, cbw);
if(len == 0)
{
_send_status(func);
- }
-
- return RT_EOK;
+ }
+
+ return RT_EOK;
}
else if(data->status == STAT_RECEIVE)
{
RT_DEBUG_LOG(RT_DEBUG_USB, ("\nwrite size %d block 0x%x oount 0x%x\n",
size, data->block, data->size));
-
+
data->size -= size;
data->csw_response.data_reside -= size;
@@ -876,10 +880,10 @@ static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
if(data->csw_response.data_reside != 0)
{
data->ep_out->request.buffer = data->ep_out->buffer;
- data->ep_out->request.size = data->geometry.bytes_per_sector;
- data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
+ data->ep_out->request.size = data->geometry.bytes_per_sector;
+ data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
- data->block ++;
+ data->block ++;
}
else
{
@@ -904,7 +908,7 @@ exit:
}
data->csw_response.status = 1;
_send_status(func);
-
+
return -RT_ERROR;
}
@@ -919,21 +923,21 @@ exit:
static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
{
rt_uint8_t lun = 0;
-
+
RT_ASSERT(func != RT_NULL);
- RT_ASSERT(func->device != RT_NULL);
+ RT_ASSERT(func->device != RT_NULL);
RT_ASSERT(setup != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("mstorage_interface_handler\n"));
switch(setup->bRequest)
{
- case USBREQ_GET_MAX_LUN:
-
+ case USBREQ_GET_MAX_LUN:
+
RT_DEBUG_LOG(RT_DEBUG_USB, ("USBREQ_GET_MAX_LUN\n"));
-
+
if(setup->wValue || setup->wLength != 1)
- {
+ {
rt_usbd_ep0_set_stall(func->device);
}
else
@@ -944,14 +948,14 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
case USBREQ_MASS_STORAGE_RESET:
RT_DEBUG_LOG(RT_DEBUG_USB, ("USBREQ_MASS_STORAGE_RESET\n"));
-
+
if(setup->wValue || setup->wLength != 0)
{
rt_usbd_ep0_set_stall(func->device);
}
else
- {
- dcd_ep0_send_status(func->device->dcd);
+ {
+ dcd_ep0_send_status(func->device->dcd);
}
break;
default:
@@ -992,14 +996,14 @@ static rt_err_t _function_enable(ufunction_t func)
rt_kprintf("disk open error\n");
return -RT_ERROR;
}
-
- if(rt_device_control(data->disk, RT_DEVICE_CTRL_BLK_GETGEOME,
+
+ if(rt_device_control(data->disk, RT_DEVICE_CTRL_BLK_GETGEOME,
(void*)&data->geometry) != RT_EOK)
{
rt_kprintf("get disk info error\n");
return -RT_ERROR;
}
-
+
data->ep_in->buffer = (rt_uint8_t*)rt_malloc(data->geometry.bytes_per_sector);
if(data->ep_in->buffer == RT_NULL)
{
@@ -1012,14 +1016,14 @@ static rt_err_t _function_enable(ufunction_t func)
rt_free(data->ep_in->buffer);
rt_kprintf("no memory\n");
return -RT_ENOMEM;
- }
-
+ }
+
/* prepare to read CBW request */
data->ep_out->request.buffer = data->ep_out->buffer;
- data->ep_out->request.size = SIZEOF_CBW;
- data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
+ data->ep_out->request.size = SIZEOF_CBW;
+ data->ep_out->request.req_type = UIO_REQUEST_READ_FULL;
rt_usbd_io_request(func->device, data->ep_out, &data->ep_out->request);
-
+
return RT_EOK;
}
@@ -1037,11 +1041,11 @@ static rt_err_t _function_disable(ufunction_t func)
RT_DEBUG_LOG(RT_DEBUG_USB, ("Mass storage function disabled\n"));
- data = (struct mstorage*)func->user_data;
+ data = (struct mstorage*)func->user_data;
if(data->ep_in->buffer != RT_NULL)
{
rt_free(data->ep_in->buffer);
- data->ep_in->buffer = RT_NULL;
+ data->ep_in->buffer = RT_NULL;
}
if(data->ep_out->buffer != RT_NULL)
@@ -1057,9 +1061,9 @@ static rt_err_t _function_disable(ufunction_t func)
#endif
data->disk = RT_NULL;
}
-
+
data->status = STAT_CBW;
-
+
return RT_EOK;
}
@@ -1097,12 +1101,16 @@ ufunction_t rt_usbd_function_mstorage_create(udevice_t device)
RT_ASSERT(device != RT_NULL);
/* set usb device string description */
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, MSTRORAGE_INTF_STR_INDEX, _ustring[2]);
+#else
rt_usbd_device_set_string(device, _ustring);
-
+#endif
+
/* create a mass storage function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
device->dev_qualifier = &dev_qualifier;
-
+
/* allocate memory for mass storage function data */
data = (struct mstorage*)rt_malloc(sizeof(struct mstorage));
rt_memset(data, 0, sizeof(struct mstorage));
@@ -1113,7 +1121,7 @@ ufunction_t rt_usbd_function_mstorage_create(udevice_t device)
/* create an alternate setting object */
setting = rt_usbd_altsetting_new(sizeof(struct umass_descriptor));
-
+
/* config desc in alternate setting */
rt_usbd_altsetting_config_descriptor(setting, &_mass_desc, (rt_off_t)&((umass_desc_t)0)->intf_desc);
@@ -1138,7 +1146,7 @@ ufunction_t rt_usbd_function_mstorage_create(udevice_t device)
return func;
}
-struct udclass msc_class =
+struct udclass msc_class =
{
.rt_usbd_function_create = rt_usbd_function_mstorage_create
};
diff --git a/components/drivers/usb/usbdevice/class/mstorage.h b/components/drivers/usb/usbdevice/class/mstorage.h
index 254038195b..6c81809ef2 100644
--- a/components/drivers/usb/usbdevice/class/mstorage.h
+++ b/components/drivers/usb/usbdevice/class/mstorage.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,7 +8,7 @@
* 2012-10-01 Yi Qiu first version
* 2012-12-12 heyuanjie87 add MASS endpoints collection
*/
-
+
#ifndef __MSTORAGE_H__
#define __MSTORAGE_H__
@@ -23,7 +23,7 @@ struct umass_descriptor
#endif
struct uinterface_descriptor intf_desc;
struct uendpoint_descriptor ep_out_desc;
- struct uendpoint_descriptor ep_in_desc;
+ struct uendpoint_descriptor ep_in_desc;
};
typedef struct umass_descriptor* umass_desc_t;
diff --git a/components/drivers/usb/usbdevice/class/ndis.h b/components/drivers/usb/usbdevice/class/ndis.h
index 6d6943366e..b83f3c78ec 100644
--- a/components/drivers/usb/usbdevice/class/ndis.h
+++ b/components/drivers/usb/usbdevice/class/ndis.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -7,14 +7,14 @@
* Date Author Notes
*/
/*
- * ndis.h
- *
+ * ndis.h
+ *
* Modified by Colin O'Flynn <[email protected]>
* ntddndis.h modified by Benedikt Spranger <[email protected]>
- *
- * Thanks to the cygwin development team,
+ *
+ * Thanks to the cygwin development team,
* espacially to Casper S. Hornstrup <[email protected]>
- *
+ *
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
@@ -30,7 +30,7 @@
#ifndef __NDIS_H__
#define __NDIS_H__
-#define NDIS_STATUS_MULTICAST_FULL 0xC0010009
+#define NDIS_STATUS_MULTICAST_FULL 0xC0010009
#define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A
#define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B
@@ -42,21 +42,21 @@
#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
#define OID_PNP_ENABLE_WAKE_UP 0xFD010106
-enum NDIS_DEVICE_POWER_STATE
+enum NDIS_DEVICE_POWER_STATE
{
- NdisDeviceStateUnspecified = 0,
- NdisDeviceStateD0,
- NdisDeviceStateD1,
- NdisDeviceStateD2,
- NdisDeviceStateD3,
- NdisDeviceStateMaximum
+ NdisDeviceStateUnspecified = 0,
+ NdisDeviceStateD0,
+ NdisDeviceStateD1,
+ NdisDeviceStateD2,
+ NdisDeviceStateD3,
+ NdisDeviceStateMaximum
};
struct NDIS_PM_WAKE_UP_CAPABILITIES
{
- enum NDIS_DEVICE_POWER_STATE MinMagicPacketWakeUp;
- enum NDIS_DEVICE_POWER_STATE MinPatternWakeUp;
- enum NDIS_DEVICE_POWER_STATE MinLinkChangeWakeUp;
+ enum NDIS_DEVICE_POWER_STATE MinMagicPacketWakeUp;
+ enum NDIS_DEVICE_POWER_STATE MinPatternWakeUp;
+ enum NDIS_DEVICE_POWER_STATE MinLinkChangeWakeUp;
};
/* NDIS_PNP_CAPABILITIES.Flags constants */
@@ -194,36 +194,36 @@ struct NDIS_PM_WAKE_UP_CAPABILITIES
#define NDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS 0x00800000
#define NDIS_MINIPORT_64BITS_DMA 0x01000000
-#define NDIS_MEDIUM_802_3 0x00000000
-#define NDIS_MEDIUM_802_5 0x00000001
-#define NDIS_MEDIUM_FDDI 0x00000002
-#define NDIS_MEDIUM_WAN 0x00000003
-#define NDIS_MEDIUM_LOCAL_TALK 0x00000004
-#define NDIS_MEDIUM_DIX 0x00000005
+#define NDIS_MEDIUM_802_3 0x00000000
+#define NDIS_MEDIUM_802_5 0x00000001
+#define NDIS_MEDIUM_FDDI 0x00000002
+#define NDIS_MEDIUM_WAN 0x00000003
+#define NDIS_MEDIUM_LOCAL_TALK 0x00000004
+#define NDIS_MEDIUM_DIX 0x00000005
#define NDIS_MEDIUM_ARCENT_RAW 0x00000006
#define NDIS_MEDIUM_ARCENT_878_2 0x00000007
-#define NDIS_MEDIUM_ATM 0x00000008
+#define NDIS_MEDIUM_ATM 0x00000008
#define NDIS_MEDIUM_WIRELESS_LAN 0x00000009
-#define NDIS_MEDIUM_IRDA 0x0000000A
-#define NDIS_MEDIUM_BPC 0x0000000B
-#define NDIS_MEDIUM_CO_WAN 0x0000000C
-#define NDIS_MEDIUM_1394 0x0000000D
+#define NDIS_MEDIUM_IRDA 0x0000000A
+#define NDIS_MEDIUM_BPC 0x0000000B
+#define NDIS_MEDIUM_CO_WAN 0x0000000C
+#define NDIS_MEDIUM_1394 0x0000000D
-#define NDIS_PACKET_TYPE_DIRECTED 0x00000001
-#define NDIS_PACKET_TYPE_MULTICAST 0x00000002
-#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004
-#define NDIS_PACKET_TYPE_BROADCAST 0x00000008
-#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010
-#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020
-#define NDIS_PACKET_TYPE_SMT 0x00000040
-#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080
-#define NDIS_PACKET_TYPE_GROUP 0x00000100
-#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200
-#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400
-#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800
+#define NDIS_PACKET_TYPE_DIRECTED 0x00000001
+#define NDIS_PACKET_TYPE_MULTICAST 0x00000002
+#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004
+#define NDIS_PACKET_TYPE_BROADCAST 0x00000008
+#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010
+#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020
+#define NDIS_PACKET_TYPE_SMT 0x00000040
+#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080
+#define NDIS_PACKET_TYPE_GROUP 0x00000100
+#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200
+#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400
+#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800
-#define NDIS_MEDIA_STATE_CONNECTED 0x00000000
-#define NDIS_MEDIA_STATE_DISCONNECTED 0x00000001
+#define NDIS_MEDIA_STATE_CONNECTED 0x00000000
+#define NDIS_MEDIA_STATE_DISCONNECTED 0x00000001
#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001
#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002
diff --git a/components/drivers/usb/usbdevice/class/rndis.c b/components/drivers/usb/usbdevice/class/rndis.c
index 93e0ba6ae2..ee25ec1ddf 100644
--- a/components/drivers/usb/usbdevice/class/rndis.c
+++ b/components/drivers/usb/usbdevice/class/rndis.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -28,7 +28,7 @@
#define DBG_SECTION_NAME "RNDIS"
#include <rtdbg.h>
-
+#define RNDIS_INTF_STR_INDEX 12
/* RT-Thread LWIP ethernet interface */
#include <netif/ethernetif.h>
@@ -123,7 +123,11 @@ const static struct ucdc_comm_descriptor _comm_desc =
USB_CDC_CLASS_COMM,
USB_CDC_SUBCLASS_ACM,
USB_CDC_PROTOCOL_VENDOR,
+#ifdef RT_USB_DEVICE_COMPOSITE
+ RNDIS_INTF_STR_INDEX,
+#else
0x00,
+#endif
},
/* Header Functional Descriptor */
{
@@ -215,7 +219,7 @@ const static char* _ustring[] =
};
ALIGN(4)
-struct usb_os_function_comp_id_descriptor rndis_func_comp_id_desc =
+struct usb_os_function_comp_id_descriptor rndis_func_comp_id_desc =
{
.bFirstInterfaceNumber = USB_DYNAMIC,
.reserved1 = 0x01,
@@ -347,7 +351,7 @@ static rt_err_t _rndis_init_response(ufunction_t func, rndis_init_msg_t msg)
rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
rt_hw_interrupt_enable(level);
}
-
+
return RT_EOK;
}
@@ -764,7 +768,7 @@ static rt_err_t send_encapsulated_command_done(udevice_t device, rt_size_t size)
}
//#error here have bug ep 0x82 send failed
static rt_err_t _rndis_send_encapsulated_command(ufunction_t func, ureq_t setup)
-{
+{
RT_ASSERT(setup->wLength <= sizeof(rndis_message_buffer));
function = func;
rt_usbd_ep0_read(func->device,rndis_message_buffer,setup->wLength,send_encapsulated_command_done);
@@ -808,7 +812,7 @@ static rt_err_t _rndis_get_encapsulated_response(ufunction_t func, ureq_t setup)
data[1] = 0;
((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.buffer = ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->buffer;
((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.size = 8;
- ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.req_type = UIO_REQUEST_WRITE;
+ ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.req_type = UIO_REQUEST_WRITE;
rt_usbd_io_request(func->device, ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd, &((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request);
}
else
@@ -983,7 +987,7 @@ static rt_err_t _function_enable(ufunction_t func)
((rt_rndis_eth_t)func->user_data)->need_notify = RT_TRUE;
rt_hw_interrupt_enable(level);
}
-
+
return RT_EOK;
}
@@ -1022,7 +1026,7 @@ static rt_err_t _function_disable(ufunction_t func)
rt_hw_interrupt_enable(level);
}
-
+
/* link down. */
eth_device_linkchange(&((rt_rndis_eth_t)func->user_data)->parent, RT_FALSE);
@@ -1318,12 +1322,15 @@ ufunction_t rt_usbd_function_rndis_create(udevice_t device)
RT_ASSERT(device != RT_NULL);
/* set usb device string description */
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, RNDIS_INTF_STR_INDEX, _ustring[2]);
+#else
rt_usbd_device_set_string(device, _ustring);
-
+#endif
/* create a cdc class */
cdc = rt_usbd_function_new(device, &_dev_desc, &ops);
rt_usbd_device_set_qualifier(device, &dev_qualifier);
- _rndis= rt_malloc(sizeof(struct rt_rndis_eth));
+ _rndis= rt_malloc(sizeof(struct rt_rndis_eth));
rt_memset(_rndis, 0, sizeof(struct rt_rndis_eth));
cdc->user_data = _rndis;
@@ -1357,7 +1364,7 @@ ufunction_t rt_usbd_function_rndis_create(udevice_t device)
rt_usbd_set_altsetting(intf_comm, 0);
/* add the communication interface to the cdc class */
rt_usbd_function_add_interface(cdc, intf_comm);
-
+
/* create a bulk in and a bulk out endpoint */
data_desc = (ucdc_data_desc_t)data_setting->desc;
eps->ep_out = rt_usbd_endpoint_new(&data_desc->ep_out_desc, _ep_out_handler);
@@ -1434,7 +1441,7 @@ ufunction_t rt_usbd_function_rndis_create(udevice_t device)
return cdc;
}
-struct udclass rndis_class =
+struct udclass rndis_class =
{
.rt_usbd_function_create = rt_usbd_function_rndis_create
};
diff --git a/components/drivers/usb/usbdevice/class/rndis.h b/components/drivers/usb/usbdevice/class/rndis.h
index fcdd249984..f25ae4931c 100644
--- a/components/drivers/usb/usbdevice/class/rndis.h
+++ b/components/drivers/usb/usbdevice/class/rndis.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -13,43 +13,43 @@
#include <rtthread.h>
-#define USB_ETH_MTU 1500+14
+#define USB_ETH_MTU 1500+14
#define RNDIS_MESSAGE_BUFFER_SIZE 128
#define RESPONSE_AVAILABLE 0x00000001
/* Remote NDIS version numbers */
-#define RNDIS_MAJOR_VERSION 1
+#define RNDIS_MAJOR_VERSION 1
#define RNDIS_MINOR_VERSION 0
/* common status values */
-#define RNDIS_STATUS_SUCCESS 0X00000000
-#define RNDIS_STATUS_FAILURE 0XC0000001
-#define RNDIS_STATUS_INVALID_DATA 0XC0010015
-#define RNDIS_STATUS_NOT_SUPPORTED 0XC00000BB
-#define RNDIS_STATUS_MEDIA_CONNECT 0X4001000B
-#define RNDIS_STATUS_MEDIA_DISCONNECT 0X4001000C
+#define RNDIS_STATUS_SUCCESS 0X00000000
+#define RNDIS_STATUS_FAILURE 0XC0000001
+#define RNDIS_STATUS_INVALID_DATA 0XC0010015
+#define RNDIS_STATUS_NOT_SUPPORTED 0XC00000BB
+#define RNDIS_STATUS_MEDIA_CONNECT 0X4001000B
+#define RNDIS_STATUS_MEDIA_DISCONNECT 0X4001000C
/* Remote NDIS message types */
-#define REMOTE_NDIS_PACKET_MSG 0x00000001
-#define REMOTE_NDIS_INITIALIZE_MSG 0X00000002
-#define REMOTE_NDIS_HALT_MSG 0X00000003
-#define REMOTE_NDIS_QUERY_MSG 0X00000004
-#define REMOTE_NDIS_SET_MSG 0X00000005
-#define REMOTE_NDIS_RESET_MSG 0X00000006
+#define REMOTE_NDIS_PACKET_MSG 0x00000001
+#define REMOTE_NDIS_INITIALIZE_MSG 0X00000002
+#define REMOTE_NDIS_HALT_MSG 0X00000003
+#define REMOTE_NDIS_QUERY_MSG 0X00000004
+#define REMOTE_NDIS_SET_MSG 0X00000005
+#define REMOTE_NDIS_RESET_MSG 0X00000006
#define REMOTE_NDIS_INDICATE_STATUS_MSG 0X00000007
-#define REMOTE_NDIS_KEEPALIVE_MSG 0X00000008
-#define REMOTE_NDIS_INITIALIZE_CMPLT 0X80000002
-#define REMOTE_NDIS_QUERY_CMPLT 0X80000004
-#define REMOTE_NDIS_SET_CMPLT 0X80000005
-#define REMOTE_NDIS_RESET_CMPLT 0X80000006
-#define REMOTE_NDIS_KEEPALIVE_CMPLT 0X80000008
+#define REMOTE_NDIS_KEEPALIVE_MSG 0X00000008
+#define REMOTE_NDIS_INITIALIZE_CMPLT 0X80000002
+#define REMOTE_NDIS_QUERY_CMPLT 0X80000004
+#define REMOTE_NDIS_SET_CMPLT 0X80000005
+#define REMOTE_NDIS_RESET_CMPLT 0X80000006
+#define REMOTE_NDIS_KEEPALIVE_CMPLT 0X80000008
/* device flags */
-#define RNDIS_DF_CONNECTIONLESS 0x00000001
-#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002
+#define RNDIS_DF_CONNECTIONLESS 0x00000001
+#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002
/* mediums */
-#define RNDIS_MEDIUM_802_3 0x00000000
+#define RNDIS_MEDIUM_802_3 0x00000000
struct ucls_rndis
{
@@ -64,24 +64,24 @@ struct ucls_rndis
/* Remote NDIS generic message type */
struct rndis_gen_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
};
typedef struct rndis_gen_msg* rndis_gen_msg_t;
struct rndis_packet_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t DataOffset;
- rt_uint32_t DataLength;
- rt_uint32_t OOBDataOffset;
- rt_uint32_t OOBDataLength;
- rt_uint32_t NumOOBDataElements;
- rt_uint32_t PerPacketInfoOffset;
- rt_uint32_t PerPacketInfoLength;
- rt_uint32_t VcHandle;
- rt_uint32_t Reserved;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t DataOffset;
+ rt_uint32_t DataLength;
+ rt_uint32_t OOBDataOffset;
+ rt_uint32_t OOBDataLength;
+ rt_uint32_t NumOOBDataElements;
+ rt_uint32_t PerPacketInfoOffset;
+ rt_uint32_t PerPacketInfoLength;
+ rt_uint32_t VcHandle;
+ rt_uint32_t Reserved;
};
typedef struct rndis_packet_msg* rndis_packet_msg_t;
@@ -89,132 +89,132 @@ typedef struct rndis_packet_msg* rndis_packet_msg_t;
struct rndis_init_msg
{
rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t MajorVersion;
- rt_uint32_t MinorVersion;
- rt_uint32_t MaxTransferSize;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t MajorVersion;
+ rt_uint32_t MinorVersion;
+ rt_uint32_t MaxTransferSize;
};
typedef struct rndis_init_msg* rndis_init_msg_t;
/* Response */
struct rndis_init_cmplt
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Status;
- rt_uint32_t MajorVersion;
- rt_uint32_t MinorVersion;
- rt_uint32_t DeviceFlags;
- rt_uint32_t Medium;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Status;
+ rt_uint32_t MajorVersion;
+ rt_uint32_t MinorVersion;
+ rt_uint32_t DeviceFlags;
+ rt_uint32_t Medium;
rt_uint32_t MaxPacketsPerTransfer;
- rt_uint32_t MaxTransferSize;
+ rt_uint32_t MaxTransferSize;
rt_uint32_t PacketAlignmentFactor;
- rt_uint32_t AfListOffset;
- rt_uint32_t AfListSize;
+ rt_uint32_t AfListOffset;
+ rt_uint32_t AfListSize;
};
typedef struct rndis_init_cmplt* rndis_init_cmplt_t;
/* Remote NDIS Halt Message */
struct rndis_halt_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
};
/* Remote NDIS Query Message */
struct rndis_query_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Oid;
- rt_uint32_t InformationBufferLength;
- rt_uint32_t InformationBufferOffset;
- rt_uint32_t DeviceVcHandle;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Oid;
+ rt_uint32_t InformationBufferLength;
+ rt_uint32_t InformationBufferOffset;
+ rt_uint32_t DeviceVcHandle;
};
typedef struct rndis_query_msg* rndis_query_msg_t;
/* Response */
struct rndis_query_cmplt
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Status;
- rt_uint32_t InformationBufferLength;
- rt_uint32_t InformationBufferOffset;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Status;
+ rt_uint32_t InformationBufferLength;
+ rt_uint32_t InformationBufferOffset;
};
typedef struct rndis_query_cmplt* rndis_query_cmplt_t;
/* Remote NDIS Set Message */
struct rndis_set_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Oid;
- rt_uint32_t InformationBufferLength;
- rt_uint32_t InformationBufferOffset;
- rt_uint32_t DeviceVcHandle;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Oid;
+ rt_uint32_t InformationBufferLength;
+ rt_uint32_t InformationBufferOffset;
+ rt_uint32_t DeviceVcHandle;
};
typedef struct rndis_set_msg* rndis_set_msg_t;
/* Response */
struct rndis_set_cmplt
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Status;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Status;
};
typedef struct rndis_set_cmplt* rndis_set_cmplt_t;
/* Remote NDIS Soft Reset Message */
struct rndis_reset_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t Reserved;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t Reserved;
};
/* Remote NDIS Soft Reset Response */
struct rndis_reset_cmplt
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t Status;
- rt_uint32_t AddressingReset;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t Status;
+ rt_uint32_t AddressingReset;
};
/* Remote NDIS Indicate Status Message */
struct rndis_indicate_status_msg
{
rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t Status;
- rt_uint32_t StatusBufferLength;
- rt_uint32_t StatusBufferOffset;
+ rt_uint32_t MessageLength;
+ rt_uint32_t Status;
+ rt_uint32_t StatusBufferLength;
+ rt_uint32_t StatusBufferOffset;
};
typedef struct rndis_indicate_status_msg* rndis_indicate_status_msg_t;
struct rndis_keepalive_msg
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestID;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestID;
};
typedef struct rndis_keepalive_msg* rndis_keepalive_msg_t;
/* Response: */
struct rndis_keepalive_cmplt
{
- rt_uint32_t MessageType;
- rt_uint32_t MessageLength;
- rt_uint32_t RequestId;
- rt_uint32_t Status;
+ rt_uint32_t MessageType;
+ rt_uint32_t MessageLength;
+ rt_uint32_t RequestId;
+ rt_uint32_t Status;
};
typedef struct rndis_keepalive_cmplt* rndis_keepalive_cmplt_t;
diff --git a/components/drivers/usb/usbdevice/class/uaudioreg.h b/components/drivers/usb/usbdevice/class/uaudioreg.h
new file mode 100644
index 0000000000..6ed8614c39
--- /dev/null
+++ b/components/drivers/usb/usbdevice/class/uaudioreg.h
@@ -0,0 +1,418 @@
+/* $NetBSD: uaudioreg.h,v 1.15.38.1 2012/06/02 11:09:29 mrg Exp $ */
+
+/*
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Lennart Augustsson ([email protected]) at
+ * Carlstedt Research & Technology.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <rtdef.h>
+
+typedef uint8_t uByte;
+typedef uint16_t uWord;
+
+#define UPACKED __attribute__ ((packed))
+
+#define UAUDIO_VERSION 0x100
+
+#define USB_SUBCLASS_AUDIOCONTROL 1
+#define USB_SUBCLASS_AUDIOSTREAMING 2
+#define USB_SUBCLASS_AUDIOMIDISTREAM 3
+
+#define UDESC_CS_CONFIG 0x22
+#define UDESC_CS_STRING 0x23
+#define UDESC_CS_INTERFACE 0x24
+#define UDESC_CS_ENDPOINT 0x25
+
+#define UDESCSUB_AC_HEADER 1
+#define UDESCSUB_AC_INPUT 2
+#define UDESCSUB_AC_OUTPUT 3
+#define UDESCSUB_AC_MIXER 4
+#define UDESCSUB_AC_SELECTOR 5
+#define UDESCSUB_AC_FEATURE 6
+#define UDESCSUB_AC_PROCESSING 7
+#define UDESCSUB_AC_EXTENSION 8
+
+#ifndef AUFMT_MAX_FREQUENCIES
+#define AUFMT_MAX_FREQUENCIES 1
+#endif
+
+/* The first fields are identical to usb_endpoint_descriptor_t */
+typedef struct {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bEndpointAddress;
+ uByte bmAttributes;
+ uWord wMaxPacketSize;
+ uByte bInterval;
+ /*
+ * The following two entries are only used by the Audio Class.
+ * And according to the specs the Audio Class is the only one
+ * allowed to extend the endpoint descriptor.
+ * Who knows what goes on in the minds of the people in the USB
+ * standardization? :-(
+ */
+ uByte bRefresh;
+ uByte bSynchAddress;
+} UPACKED usb_endpoint_descriptor_audio_t;
+
+/* generic, for iteration */
+typedef struct {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+} UPACKED uaudio_cs_descriptor_t;
+
+struct usb_audio_control_descriptor {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uWord bcdADC;
+ uWord wTotalLength;
+ uByte bInCollection;
+ uByte baInterfaceNr[1];
+} UPACKED;
+
+struct usb_audio_streaming_interface_descriptor {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bTerminalLink;
+ uByte bDelay;
+ uWord wFormatTag;
+} UPACKED;
+
+struct usb_audio_streaming_endpoint_descriptor {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bmAttributes;
+#define UA_SED_FREQ_CONTROL 0x01
+#define UA_SED_PITCH_CONTROL 0x02
+#define UA_SED_MAXPACKETSONLY 0x80
+ uByte bLockDelayUnits;
+ uWord wLockDelay;
+} UPACKED;
+
+struct usb_audio_streaming_type1_descriptor {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bFormatType;
+ uByte bNrChannels;
+ uByte bSubFrameSize;
+ uByte bBitResolution;
+ uByte bSamFreqType;
+#define UA_SAMP_CONTNUOUS 0
+ uByte tSamFreq[3*AUFMT_MAX_FREQUENCIES];
+#define UA_GETSAMP(p, n) ((p)->tSamFreq[(n)*3+0] | ((p)->tSamFreq[(n)*3+1] << 8) | ((p)->tSamFreq[(n)*3+2] << 16))
+#define UA_SAMP_LO(p) UA_GETSAMP(p, 0)
+#define UA_SAMP_HI(p) UA_GETSAMP(p, 1)
+} UPACKED;
+
+struct usb_audio_cluster {
+ uByte bNrChannels;
+ uWord wChannelConfig;
+#define UA_CHANNEL_LEFT 0x0001
+#define UA_CHANNEL_RIGHT 0x0002
+#define UA_CHANNEL_CENTER 0x0004
+#define UA_CHANNEL_LFE 0x0008
+#define UA_CHANNEL_L_SURROUND 0x0010
+#define UA_CHANNEL_R_SURROUND 0x0020
+#define UA_CHANNEL_L_CENTER 0x0040
+#define UA_CHANNEL_R_CENTER 0x0080
+#define UA_CHANNEL_SURROUND 0x0100
+#define UA_CHANNEL_L_SIDE 0x0200
+#define UA_CHANNEL_R_SIDE 0x0400
+#define UA_CHANNEL_TOP 0x0800
+ uByte iChannelNames;
+} UPACKED;
+
+/* Shared by all units and terminals */
+struct usb_audio_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+};
+
+/* UDESCSUB_AC_INPUT */
+struct usb_audio_input_terminal {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bTerminalId;
+ uWord wTerminalType;
+ uByte bAssocTerminal;
+ uByte bNrChannels;
+ uWord wChannelConfig;
+ uByte iChannelNames;
+ uByte iTerminal;
+} UPACKED;
+
+/* UDESCSUB_AC_OUTPUT */
+struct usb_audio_output_terminal {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bTerminalId;
+ uWord wTerminalType;
+ uByte bAssocTerminal;
+ uByte bSourceId;
+ uByte iTerminal;
+} UPACKED;
+
+/* UDESCSUB_AC_MIXER */
+struct usb_audio_mixer_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+ uByte bNrInPins;
+ uByte baSourceId[255]; /* [bNrInPins] */
+ /* struct usb_audio_mixer_unit_1 */
+} UPACKED;
+struct usb_audio_mixer_unit_1 {
+ uByte bNrChannels;
+ uWord wChannelConfig;
+ uByte iChannelNames;
+ uByte bmControls[255]; /* [bNrChannels] */
+ /*uByte iMixer;*/
+} UPACKED;
+
+/* UDESCSUB_AC_SELECTOR */
+struct usb_audio_selector_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+ uByte bNrInPins;
+ uByte baSourceId[255]; /* [bNrInPins] */
+ /* uByte iSelector; */
+} UPACKED;
+
+/* UDESCSUB_AC_FEATURE */
+struct usb_audio_feature_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+ uByte bSourceId;
+ uByte bControlSize;
+ uByte bmaControls[2]; /* size for more than enough */
+ /* uByte iFeature; */
+} UPACKED;
+
+/* UDESCSUB_AC_PROCESSING */
+struct usb_audio_processing_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+ uWord wProcessType;
+ uByte bNrInPins;
+ uByte baSourceId[255]; /* [bNrInPins] */
+ /* struct usb_audio_processing_unit_1 */
+} UPACKED;
+struct usb_audio_processing_unit_1{
+ uByte bNrChannels;
+ uWord wChannelConfig;
+ uByte iChannelNames;
+ uByte bControlSize;
+ uByte bmControls[255]; /* [bControlSize] */
+#define UA_PROC_ENABLE_MASK 1
+} UPACKED;
+
+struct usb_audio_processing_unit_updown {
+ uByte iProcessing;
+ uByte bNrModes;
+ uWord waModes[255]; /* [bNrModes] */
+} UPACKED;
+
+/* UDESCSUB_AC_EXTENSION */
+struct usb_audio_extension_unit {
+ uByte bLength;
+ uByte bDescriptorType;
+ uByte bDescriptorSubtype;
+ uByte bUnitId;
+ uWord wExtensionCode;
+ uByte bNrInPins;
+ uByte baSourceId[255]; /* [bNrInPins] */
+ /* struct usb_audio_extension_unit_1 */
+} UPACKED;
+struct usb_audio_extension_unit_1 {
+ uByte bNrChannels;
+ uWord wChannelConfig;
+ uByte iChannelNames;
+ uByte bControlSize;
+ uByte bmControls[255]; /* [bControlSize] */
+#define UA_EXT_ENABLE_MASK 1
+#define UA_EXT_ENABLE 1
+ /*uByte iExtension;*/
+} UPACKED;
+
+/* USB terminal types */
+#define UAT_UNDEFINED 0x0100
+#define UAT_STREAM 0x0101
+#define UAT_VENDOR 0x01ff
+/* input terminal types */
+#define UATI_UNDEFINED 0x0200
+#define UATI_MICROPHONE 0x0201
+#define UATI_DESKMICROPHONE 0x0202
+#define UATI_PERSONALMICROPHONE 0x0203
+#define UATI_OMNIMICROPHONE 0x0204
+#define UATI_MICROPHONEARRAY 0x0205
+#define UATI_PROCMICROPHONEARR 0x0206
+/* output terminal types */
+#define UATO_UNDEFINED 0x0300
+#define UATO_SPEAKER 0x0301
+#define UATO_HEADPHONES 0x0302
+#define UATO_DISPLAYAUDIO 0x0303
+#define UATO_DESKTOPSPEAKER 0x0304
+#define UATO_ROOMSPEAKER 0x0305
+#define UATO_COMMSPEAKER 0x0306
+#define UATO_SUBWOOFER 0x0307
+/* bidir terminal types */
+#define UATB_UNDEFINED 0x0400
+#define UATB_HANDSET 0x0401
+#define UATB_HEADSET 0x0402
+#define UATB_SPEAKERPHONE 0x0403
+#define UATB_SPEAKERPHONEESUP 0x0404
+#define UATB_SPEAKERPHONEECANC 0x0405
+/* telephony terminal types */
+#define UATT_UNDEFINED 0x0500
+#define UATT_PHONELINE 0x0501
+#define UATT_TELEPHONE 0x0502
+#define UATT_DOWNLINEPHONE 0x0503
+/* external terminal types */
+#define UATE_UNDEFINED 0x0600
+#define UATE_ANALOGCONN 0x0601
+#define UATE_DIGITALAUIFC 0x0602
+#define UATE_LINECONN 0x0603
+#define UATE_LEGACYCONN 0x0604
+#define UATE_SPDIF 0x0605
+#define UATE_1394DA 0x0606
+#define UATE_1394DV 0x0607
+/* embedded function terminal types */
+#define UATF_UNDEFINED 0x0700
+#define UATF_CALIBNOISE 0x0701
+#define UATF_EQUNOISE 0x0702
+#define UATF_CDPLAYER 0x0703
+#define UATF_DAT 0x0704
+#define UATF_DCC 0x0705
+#define UATF_MINIDISK 0x0706
+#define UATF_ANALOGTAPE 0x0707
+#define UATF_PHONOGRAPH 0x0708
+#define UATF_VCRAUDIO 0x0709
+#define UATF_VIDEODISCAUDIO 0x070a
+#define UATF_DVDAUDIO 0x070b
+#define UATF_TVTUNERAUDIO 0x070c
+#define UATF_SATELLITE 0x070d
+#define UATF_CABLETUNER 0x070e
+#define UATF_DSS 0x070f
+#define UATF_RADIORECV 0x0710
+#define UATF_RADIOXMIT 0x0711
+#define UATF_MULTITRACK 0x0712
+#define UATF_SYNTHESIZER 0x0713
+
+
+#define SET_CUR 0x01
+#define GET_CUR 0x81
+#define SET_MIN 0x02
+#define GET_MIN 0x82
+#define SET_MAX 0x03
+#define GET_MAX 0x83
+#define SET_RES 0x04
+#define GET_RES 0x84
+#define SET_MEM 0x05
+#define GET_MEM 0x85
+#define GET_STAT 0xff
+
+#define MUTE_CONTROL 0x01
+#define VOLUME_CONTROL 0x02
+#define BASS_CONTROL 0x03
+#define MID_CONTROL 0x04
+#define TREBLE_CONTROL 0x05
+#define GRAPHIC_EQUALIZER_CONTROL 0x06
+#define AGC_CONTROL 0x07
+#define DELAY_CONTROL 0x08
+#define BASS_BOOST_CONTROL 0x09
+#define LOUDNESS_CONTROL 0x0a
+
+#define FU_MASK(u) (1 << ((u)-1))
+
+#define MASTER_CHAN 0
+
+#define AS_GENERAL 1
+#define FORMAT_TYPE 2
+#define FORMAT_SPECIFIC 3
+
+#define UA_FMT_PCM 1
+#define UA_FMT_PCM8 2
+#define UA_FMT_IEEE_FLOAT 3
+#define UA_FMT_ALAW 4
+#define UA_FMT_MULAW 5
+#define UA_FMT_MPEG 0x1001
+#define UA_FMT_AC3 0x1002
+
+#define SAMPLING_FREQ_CONTROL 0x01
+#define PITCH_CONTROL 0x02
+
+#define FORMAT_TYPE_UNDEFINED 0
+#define FORMAT_TYPE_I 1
+#define FORMAT_TYPE_II 2
+#define FORMAT_TYPE_III 3
+
+#define UA_PROC_MASK(n) (1<< ((n)-1))
+#define PROCESS_UNDEFINED 0
+#define XX_ENABLE_CONTROL 1
+#define UPDOWNMIX_PROCESS 1
+#define UD_ENABLE_CONTROL 1
+#define UD_MODE_SELECT_CONTROL 2
+#define DOLBY_PROLOGIC_PROCESS 2
+#define DP_ENABLE_CONTROL 1
+#define DP_MODE_SELECT_CONTROL 2
+#define P3D_STEREO_EXTENDER_PROCESS 3
+#define P3D_ENABLE_CONTROL 1
+#define P3D_SPACIOUSNESS_CONTROL 2
+#define REVERBATION_PROCESS 4
+#define RV_ENABLE_CONTROL 1
+#define RV_LEVEL_CONTROL 2
+#define RV_TIME_CONTROL 3
+#define RV_FEEDBACK_CONTROL 4
+#define CHORUS_PROCESS 5
+#define CH_ENABLE_CONTROL 1
+#define CH_LEVEL_CONTROL 2
+#define CH_RATE_CONTROL 3
+#define CH_DEPTH_CONTROL 4
+#define DYN_RANGE_COMP_PROCESS 6
+#define DR_ENABLE_CONTROL 1
+#define DR_COMPRESSION_RATE_CONTROL 2
+#define DR_MAXAMPL_CONTROL 3
+#define DR_THRESHOLD_CONTROL 4
+#define DR_ATTACK_TIME_CONTROL 5
+#define DR_RELEASE_TIME_CONTROL 6
diff --git a/components/drivers/usb/usbdevice/class/winusb.c b/components/drivers/usb/usbdevice/class/winusb.c
index 4af6dba3cf..b5a169d2cb 100644
--- a/components/drivers/usb/usbdevice/class/winusb.c
+++ b/components/drivers/usb/usbdevice/class/winusb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -19,7 +19,7 @@ struct winusb_device
uep_t ep_out;
uep_t ep_in;
};
-
+#define WINUSB_INTF_STR_INDEX 13
typedef struct winusb_device * winusb_device_t;
ALIGN(4)
@@ -57,7 +57,7 @@ static struct usb_qualifier_descriptor dev_qualifier =
};
ALIGN(4)
-struct winusb_descriptor _winusb_desc =
+struct winusb_descriptor _winusb_desc =
{
#ifdef RT_USB_DEVICE_COMPOSITE
/* Interface Association Descriptor */
@@ -82,7 +82,11 @@ struct winusb_descriptor _winusb_desc =
0xFF, //bInterfaceClass;
0x00, //bInterfaceSubClass;
0x00, //bInterfaceProtocol;
+#ifdef RT_USB_DEVICE_COMPOSITE
+ WINUSB_INTF_STR_INDEX,
+#else
0x00, //iInterface;
+#endif
},
/*endpoint descriptor*/
{
@@ -117,13 +121,13 @@ const static char* _ustring[] =
};
ALIGN(4)
-struct usb_os_proerty winusb_proerty[] =
+struct usb_os_proerty winusb_proerty[] =
{
USB_OS_PROPERTY_DESC(USB_OS_PROPERTY_TYPE_REG_SZ,"DeviceInterfaceGUID",RT_WINUSB_GUID),
};
ALIGN(4)
-struct usb_os_function_comp_id_descriptor winusb_func_comp_id_desc =
+struct usb_os_function_comp_id_descriptor winusb_func_comp_id_desc =
{
.bFirstInterfaceNumber = USB_DYNAMIC,
.reserved1 = 0x01,
@@ -155,7 +159,7 @@ static ufunction_t cmd_func = RT_NULL;
static rt_err_t _ep0_cmd_handler(udevice_t device, rt_size_t size)
{
winusb_device_t winusb_device;
-
+
if(cmd_func != RT_NULL)
{
winusb_device = (winusb_device_t)cmd_func->user_data;
@@ -191,7 +195,7 @@ static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
_ep0_cmd_read(func, setup);
break;
}
-
+
return RT_EOK;
}
static rt_err_t _function_enable(ufunction_t func)
@@ -291,7 +295,7 @@ static rt_err_t rt_usb_winusb_init(ufunction_t func)
winusb_device->parent.user_data = func;
-
+
return rt_device_register(&winusb_device->parent, "winusb", RT_DEVICE_FLAG_RDWR);
}
@@ -308,7 +312,11 @@ ufunction_t rt_usbd_function_winusb_create(udevice_t device)
RT_ASSERT(device != RT_NULL);
/* set usb device string description */
+#ifdef RT_USB_DEVICE_COMPOSITE
+ rt_usbd_device_set_interface_string(device, WINUSB_INTF_STR_INDEX, _ustring[2]);
+#else
rt_usbd_device_set_string(device, _ustring);
+#endif
/* create a cdc function */
func = rt_usbd_function_new(device, &dev_desc, &ops);
@@ -352,7 +360,7 @@ ufunction_t rt_usbd_function_winusb_create(udevice_t device)
return func;
}
-struct udclass winusb_class =
+struct udclass winusb_class =
{
.rt_usbd_function_create = rt_usbd_function_winusb_create
};
diff --git a/components/drivers/usb/usbdevice/class/winusb.h b/components/drivers/usb/usbdevice/class/winusb.h
index b5f87b4e56..43fec34b6a 100644
--- a/components/drivers/usb/usbdevice/class/winusb.h
+++ b/components/drivers/usb/usbdevice/class/winusb.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/usb/usbdevice/core/usbdevice.c b/components/drivers/usb/usbdevice/core/usbdevice.c
index 2455bd8017..0891c0bd26 100644
--- a/components/drivers/usb/usbdevice/core/usbdevice.c
+++ b/components/drivers/usb/usbdevice/core/usbdevice.c
@@ -1,9 +1,9 @@
/*
* File : hid.c
- * COPYRIGHT (C) 2008 - 2018, RT-Thread Development Team
+ * COPYRIGHT (C) 2006 - 2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
- *
+ *
* Change Logs:
* Date Author Notes
* 2012-10-02 Yi Qiu first version
@@ -62,7 +62,7 @@ static struct usb_qualifier_descriptor dev_qualifier =
};
#endif
-struct usb_os_comp_id_descriptor usb_comp_id_desc =
+struct usb_os_comp_id_descriptor usb_comp_id_desc =
{
//head section
{
diff --git a/components/drivers/usb/usbdevice/core/usbdevice_core.c b/components/drivers/usb/usbdevice/core/usbdevice_core.c
index ef569d7bf2..c12636aaf5 100644
--- a/components/drivers/usb/usbdevice/core/usbdevice_core.c
+++ b/components/drivers/usb/usbdevice/core/usbdevice_core.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -123,12 +123,18 @@ static rt_err_t _get_string_descriptor(struct udevice* device, ureq_t setup)
}
else
{
- len = rt_strlen(device->str[index]);
+ if(index < 5)
+ len = rt_strlen(device->str[index]);
+ else
+ len = rt_strlen(device->str_intf[index]);
str_desc.bLength = len*2 + 2;
for(i=0; i<len; i++)
{
- str_desc.String[i*2] = device->str[index][i];
+ if(index < 5)
+ str_desc.String[i*2] = device->str[index][i];
+ else
+ str_desc.String[i*2] = device->str_intf[index][i];
str_desc.String[i*2 + 1] = 0;
}
}
@@ -238,7 +244,7 @@ static rt_err_t _get_interface(struct udevice* device, ureq_t setup)
rt_uint8_t value;
uintf_t intf;
ufunction_t func;
-
+
/* parameter check */
RT_ASSERT(device != RT_NULL);
RT_ASSERT(setup != RT_NULL);
@@ -262,7 +268,7 @@ static rt_err_t _get_interface(struct udevice* device, ureq_t setup)
{
intf->handler(func, setup);
}
-
+
return RT_EOK;
}
@@ -293,7 +299,7 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
rt_usbd_ep0_set_stall(device);
return -RT_ERROR;
}
-
+
/* find the specified interface */
intf = rt_usbd_find_interface(device, setup->wIndex & 0xFF, &func);
@@ -309,12 +315,12 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
dcd_ep_enable(device->dcd, ep);
}
dcd_ep0_send_status(device->dcd);
-
+
if (intf->handler)
{
intf->handler(func, setup);
}
-
+
return RT_EOK;
}
@@ -336,7 +342,7 @@ static rt_err_t _get_config(struct udevice* device, ureq_t setup)
RT_ASSERT(device->curr_cfg != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_get_config\n"));
-
+
if (device->state == USB_STATE_CONFIGURED)
{
/* get current configuration */
@@ -443,7 +449,7 @@ static rt_err_t _set_address(struct udevice* device, ureq_t setup)
dcd_ep0_send_status(device->dcd);
RT_DEBUG_LOG(RT_DEBUG_USB, ("_set_address\n"));
-
+
device->state = USB_STATE_ADDRESS;
return RT_EOK;
@@ -479,7 +485,7 @@ static rt_err_t _request_interface(struct udevice* device, ureq_t setup)
{
ret = -RT_ERROR;
}
-
+
return ret;
}
@@ -564,9 +570,9 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
case USB_REQ_GET_STATUS:
{
uep_t ep;
-
+
ep = rt_usbd_find_endpoint(device, RT_NULL, setup->wIndex);
- value = ep->stalled;
+ value = ep->stalled;
rt_usbd_ep0_write(device, &value, 2);
}
break;
@@ -581,13 +587,13 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
{
rt_usbd_clear_feature(device, setup->wValue, setup->wIndex);
dcd_ep0_send_status(dcd);
- ep->stalled = RT_FALSE;
+ ep->stalled = RT_FALSE;
for (node = ep->request_list.next; node != &ep->request_list; node = node->next)
{
- req = (uio_request_t)rt_list_entry(node, struct uio_request, list);
+ req = (uio_request_t)rt_list_entry(node, struct uio_request, list);
rt_usbd_io_request(device, ep, req);
- RT_DEBUG_LOG(RT_DEBUG_USB, ("fired a request\n"));
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("fired a request\n"));
}
rt_list_init(&ep->request_list);
@@ -601,10 +607,10 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
if(USB_EP_HALT == setup->wValue)
{
ep = rt_usbd_find_endpoint(device, RT_NULL, setup->wIndex);
- ep->stalled = RT_TRUE;
+ ep->stalled = RT_TRUE;
rt_usbd_set_feature(device, setup->wValue, setup->wIndex);
dcd_ep0_send_status(dcd);
- }
+ }
}
break;
case USB_REQ_SYNCH_FRAME:
@@ -698,7 +704,7 @@ static rt_err_t _vendor_request(udevice_t device, ureq_t setup)
{
rt_uint8_t * pusb_comp_id_desc;
rt_list_t *p;
- usb_comp_id_desc_size = sizeof(struct usb_os_header_comp_id_descriptor) +
+ usb_comp_id_desc_size = sizeof(struct usb_os_header_comp_id_descriptor) +
(sizeof(struct usb_os_function_comp_id_descriptor)-sizeof(rt_list_t))*rt_list_len(&device->os_comp_id_desc->func_desc);
usb_comp_id_desc = (rt_uint8_t *)rt_malloc(usb_comp_id_desc_size);
@@ -707,7 +713,7 @@ static rt_err_t _vendor_request(udevice_t device, ureq_t setup)
pusb_comp_id_desc = usb_comp_id_desc;
rt_memcpy((void *)pusb_comp_id_desc,(void *)&device->os_comp_id_desc->head_desc,sizeof(struct usb_os_header_comp_id_descriptor));
pusb_comp_id_desc += sizeof(struct usb_os_header_comp_id_descriptor);
-
+
for (p = device->os_comp_id_desc->func_desc.next; p != &device->os_comp_id_desc->func_desc; p = p->next)
{
func_comp_id_desc = rt_list_entry(p,struct usb_os_function_comp_id_descriptor,list);
@@ -726,7 +732,7 @@ static rt_err_t _vendor_request(udevice_t device, ureq_t setup)
}
break;
}
-
+
break;
}
return RT_EOK;
@@ -784,7 +790,7 @@ static rt_err_t _setup_request(udevice_t device, ureq_t setup)
/**
* This function will hanle data notify event.
*
- * @param device the usb device object.
+ * @param device the usb device object.
* @param ep_msg the endpoint message.
*
* @return RT_EOK.
@@ -794,18 +800,18 @@ static rt_err_t _data_notify(udevice_t device, struct ep_msg* ep_msg)
uep_t ep;
ufunction_t func;
rt_size_t size = 0;
-
+
RT_ASSERT(device != RT_NULL);
RT_ASSERT(ep_msg != RT_NULL);
-
+
if (device->state != USB_STATE_CONFIGURED)
{
return -RT_ERROR;
}
-
+
ep = rt_usbd_find_endpoint(device, &func, ep_msg->ep_addr);
if(ep == RT_NULL)
- {
+ {
rt_kprintf("invalid endpoint\n");
return -RT_ERROR;
}
@@ -817,7 +823,7 @@ static rt_err_t _data_notify(udevice_t device, struct ep_msg* ep_msg)
{
dcd_ep_write(device->dcd, EP_ADDRESS(ep), ep->request.buffer, EP_MAXPACKET(ep));
ep->request.remain_size -= EP_MAXPACKET(ep);
- ep->request.buffer += EP_MAXPACKET(ep);
+ ep->request.buffer += EP_MAXPACKET(ep);
}
else if(ep->request.remain_size > 0)
{
@@ -834,9 +840,9 @@ static rt_err_t _data_notify(udevice_t device, struct ep_msg* ep_msg)
size = ep_msg->size;
if(ep->request.remain_size == 0)
{
- return RT_EOK;
+ return RT_EOK;
}
-
+
if(size == 0)
{
size = dcd_ep_read(device->dcd, EP_ADDRESS(ep), ep->request.buffer);
@@ -865,9 +871,9 @@ static rt_err_t _ep0_out_notify(udevice_t device, struct ep_msg* ep_msg)
{
uep_t ep0;
rt_size_t size;
-
+
RT_ASSERT(device != RT_NULL);
- RT_ASSERT(ep_msg != RT_NULL);
+ RT_ASSERT(ep_msg != RT_NULL);
RT_ASSERT(device->dcd != RT_NULL);
ep0 = &device->dcd->ep0;
@@ -875,18 +881,18 @@ static rt_err_t _ep0_out_notify(udevice_t device, struct ep_msg* ep_msg)
if(ep0->request.remain_size == 0)
{
- return RT_EOK;
- }
+ return RT_EOK;
+ }
if(size == 0)
{
size = dcd_ep_read(device->dcd, EP0_OUT_ADDR, ep0->request.buffer);
if(size == 0)
{
return RT_EOK;
- }
+ }
}
- ep0->request.remain_size -= size;
+ ep0->request.remain_size -= size;
ep0->request.buffer += size;
if(ep0->request.remain_size == 0)
{
@@ -894,7 +900,7 @@ static rt_err_t _ep0_out_notify(udevice_t device, struct ep_msg* ep_msg)
if(ep0->rx_indicate != RT_NULL)
{
ep0->rx_indicate(device, size);
- }
+ }
}
else
{
@@ -959,10 +965,10 @@ static rt_err_t _stop_notify(udevice_t device)
static rt_size_t rt_usbd_ep_write(udevice_t device, uep_t ep, void *buffer, rt_size_t size)
{
rt_uint16_t maxpacket;
-
- RT_ASSERT(device != RT_NULL);
+
+ RT_ASSERT(device != RT_NULL);
RT_ASSERT(device->dcd != RT_NULL);
- RT_ASSERT(ep != RT_NULL);
+ RT_ASSERT(ep != RT_NULL);
rt_enter_critical();
maxpacket = EP_MAXPACKET(ep);
@@ -970,11 +976,11 @@ static rt_size_t rt_usbd_ep_write(udevice_t device, uep_t ep, void *buffer, rt_s
{
dcd_ep_write(device->dcd, EP_ADDRESS(ep), ep->request.buffer, maxpacket);
ep->request.remain_size -= maxpacket;
- ep->request.buffer += maxpacket;
+ ep->request.buffer += maxpacket;
}
else
{
- dcd_ep_write(device->dcd, EP_ADDRESS(ep), ep->request.buffer,
+ dcd_ep_write(device->dcd, EP_ADDRESS(ep), ep->request.buffer,
ep->request.remain_size);
ep->request.remain_size = 0;
}
@@ -984,9 +990,9 @@ static rt_size_t rt_usbd_ep_write(udevice_t device, uep_t ep, void *buffer, rt_s
static rt_size_t rt_usbd_ep_read_prepare(udevice_t device, uep_t ep, void *buffer, rt_size_t size)
{
- RT_ASSERT(device != RT_NULL);
+ RT_ASSERT(device != RT_NULL);
RT_ASSERT(device->dcd != RT_NULL);
- RT_ASSERT(ep != RT_NULL);
+ RT_ASSERT(ep != RT_NULL);
RT_ASSERT(buffer != RT_NULL);
RT_ASSERT(ep->ep_desc != RT_NULL);
@@ -1044,6 +1050,28 @@ rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring)
return RT_EOK;
}
+/**
+ * This function will set usb device interface string description.
+ *
+ * @param device the usb device object.
+ * @param index of interface string
+ * @param string pointer to interface string description.
+ *
+ * @return RT_EOK.
+ */
+rt_err_t rt_usbd_device_set_interface_string(udevice_t device, int index, const char* string)
+{
+ /* parameter check */
+ RT_ASSERT(device != RT_NULL);
+ RT_ASSERT(string != RT_NULL);
+ RT_ASSERT(index < MAX_INTF_STR);
+
+ /* set string descriptor array to the device object */
+ device->str_intf[index] = string;
+
+ return RT_EOK;
+}
+
rt_err_t rt_usbd_device_set_os_comp_id_desc(udevice_t device, usb_os_comp_id_desc_t os_comp_id_desc)
{
/* parameter check */
@@ -1705,7 +1733,7 @@ rt_err_t rt_usbd_set_config(udevice_t device, rt_uint8_t value)
device->curr_cfg = cfg;
dcd_set_config(device->dcd, value);
-
+
return RT_TRUE;
}
@@ -1713,7 +1741,7 @@ rt_err_t rt_usbd_set_config(udevice_t device, rt_uint8_t value)
* This function will bRequest an IO transaction.
*
* @param device the usb device object.
- * @param ep the endpoint object.
+ * @param ep the endpoint object.
* @param req IO bRequest.
*
* @return RT_EOK.
@@ -1721,7 +1749,7 @@ rt_err_t rt_usbd_set_config(udevice_t device, rt_uint8_t value)
rt_size_t rt_usbd_io_request(udevice_t device, uep_t ep, uio_request_t req)
{
rt_size_t size = 0;
-
+
RT_ASSERT(device != RT_NULL);
RT_ASSERT(req != RT_NULL);
@@ -1747,7 +1775,7 @@ rt_size_t rt_usbd_io_request(udevice_t device, uep_t ep, uio_request_t req)
{
rt_list_insert_before(&ep->request_list, &req->list);
RT_DEBUG_LOG(RT_DEBUG_USB, ("suspend a request\n"));
- }
+ }
return size;
}
@@ -1770,10 +1798,10 @@ rt_err_t rt_usbd_set_feature(udevice_t device, rt_uint16_t value, rt_uint16_t in
}
else if (value == USB_FEATURE_ENDPOINT_HALT)
{
- RT_DEBUG_LOG(RT_DEBUG_USB, ("set feature stall\n"));
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("set feature stall\n"));
dcd_ep_set_stall(device->dcd, (rt_uint32_t)(index & 0xFF));
}
-
+
return RT_EOK;
}
@@ -1798,38 +1826,38 @@ rt_err_t rt_usbd_clear_feature(udevice_t device, rt_uint16_t value, rt_uint16_t
RT_DEBUG_LOG(RT_DEBUG_USB, ("clear feature stall\n"));
dcd_ep_clear_stall(device->dcd, (rt_uint32_t)(index & 0xFF));
}
-
+
return RT_EOK;
}
rt_err_t rt_usbd_ep0_set_stall(udevice_t device)
{
RT_ASSERT(device != RT_NULL);
-
+
return dcd_ep_set_stall(device->dcd, 0);
}
rt_err_t rt_usbd_ep0_clear_stall(udevice_t device)
{
RT_ASSERT(device != RT_NULL);
-
+
return dcd_ep_clear_stall(device->dcd, 0);
}
rt_err_t rt_usbd_ep_set_stall(udevice_t device, uep_t ep)
{
rt_err_t ret;
-
+
RT_ASSERT(device != RT_NULL);
RT_ASSERT(ep != RT_NULL);
- RT_ASSERT(ep->ep_desc != RT_NULL);
+ RT_ASSERT(ep->ep_desc != RT_NULL);
ret = dcd_ep_set_stall(device->dcd, EP_ADDRESS(ep));
if(ret == RT_EOK)
{
ep->stalled = RT_TRUE;
}
-
+
return ret;
}
@@ -1846,44 +1874,44 @@ rt_err_t rt_usbd_ep_clear_stall(udevice_t device, uep_t ep)
{
ep->stalled = RT_FALSE;
}
-
+
return ret;
}
static rt_err_t rt_usbd_ep_assign(udevice_t device, uep_t ep)
{
int i = 0;
-
+
RT_ASSERT(device != RT_NULL);
- RT_ASSERT(device->dcd != RT_NULL);
- RT_ASSERT(device->dcd->ep_pool != RT_NULL);
+ RT_ASSERT(device->dcd != RT_NULL);
+ RT_ASSERT(device->dcd->ep_pool != RT_NULL);
RT_ASSERT(ep != RT_NULL);
RT_ASSERT(ep->ep_desc != RT_NULL);
while(device->dcd->ep_pool[i].addr != 0xFF)
{
- if(device->dcd->ep_pool[i].status == ID_UNASSIGNED &&
+ if(device->dcd->ep_pool[i].status == ID_UNASSIGNED &&
ep->ep_desc->bmAttributes == device->dcd->ep_pool[i].type && (EP_ADDRESS(ep) & 0x80) == device->dcd->ep_pool[i].dir)
{
EP_ADDRESS(ep) |= device->dcd->ep_pool[i].addr;
ep->id = &device->dcd->ep_pool[i];
device->dcd->ep_pool[i].status = ID_ASSIGNED;
- RT_DEBUG_LOG(RT_DEBUG_USB, ("assigned %d\n", device->dcd->ep_pool[i].addr));
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("assigned %d\n", device->dcd->ep_pool[i].addr));
return RT_EOK;
}
-
+
i++;
}
-
+
return -RT_ERROR;
}
rt_err_t rt_usbd_ep_unassign(udevice_t device, uep_t ep)
{
RT_ASSERT(device != RT_NULL);
- RT_ASSERT(device->dcd != RT_NULL);
- RT_ASSERT(device->dcd->ep_pool != RT_NULL);
+ RT_ASSERT(device->dcd != RT_NULL);
+ RT_ASSERT(device->dcd->ep_pool != RT_NULL);
RT_ASSERT(ep != RT_NULL);
RT_ASSERT(ep->ep_desc != RT_NULL);
@@ -1911,8 +1939,8 @@ rt_err_t rt_usbd_ep0_setup_handler(udcd_t dcd, struct urequest* setup)
else
{
rt_memcpy((void*)&msg.content.setup, (void*)setup, sizeof(struct urequest));
- }
-
+ }
+
msg.type = USB_MSG_SETUP_NOTIFY;
msg.dcd = dcd;
rt_usbd_event_signal(&msg);
@@ -2011,7 +2039,7 @@ rt_err_t rt_usbd_reset_handler(udcd_t dcd)
struct udev_msg msg;
RT_ASSERT(dcd != RT_NULL);
-
+
msg.type = USB_MSG_RESET;
msg.dcd = dcd;
rt_usbd_event_signal(&msg);
@@ -2024,7 +2052,7 @@ rt_err_t rt_usbd_connect_handler(udcd_t dcd)
struct udev_msg msg;
RT_ASSERT(dcd != RT_NULL);
-
+
msg.type = USB_MSG_PLUG_IN;
msg.dcd = dcd;
rt_usbd_event_signal(&msg);
@@ -2037,7 +2065,7 @@ rt_err_t rt_usbd_disconnect_handler(udcd_t dcd)
struct udev_msg msg;
RT_ASSERT(dcd != RT_NULL);
-
+
msg.type = USB_MSG_PLUG_OUT;
msg.dcd = dcd;
rt_usbd_event_signal(&msg);
@@ -2050,7 +2078,7 @@ rt_err_t rt_usbd_sof_handler(udcd_t dcd)
struct udev_msg msg;
RT_ASSERT(dcd != RT_NULL);
-
+
msg.type = USB_MSG_SOF;
msg.dcd = dcd;
rt_usbd_event_signal(&msg);
@@ -2063,7 +2091,7 @@ rt_size_t rt_usbd_ep0_write(udevice_t device, void *buffer, rt_size_t size)
uep_t ep0;
rt_size_t sent_size = 0;
- RT_ASSERT(device != RT_NULL);
+ RT_ASSERT(device != RT_NULL);
RT_ASSERT(device->dcd != RT_NULL);
RT_ASSERT(buffer != RT_NULL);
RT_ASSERT(size > 0);
@@ -2085,7 +2113,7 @@ rt_size_t rt_usbd_ep0_write(udevice_t device, void *buffer, rt_size_t size)
return dcd_ep_write(device->dcd, EP0_IN_ADDR, ep0->request.buffer, sent_size);
}
-rt_size_t rt_usbd_ep0_read(udevice_t device, void *buffer, rt_size_t size,
+rt_size_t rt_usbd_ep0_read(udevice_t device, void *buffer, rt_size_t size,
rt_err_t (*rx_ind)(udevice_t device, rt_size_t size))
{
uep_t ep0;
@@ -2096,7 +2124,7 @@ rt_size_t rt_usbd_ep0_read(udevice_t device, void *buffer, rt_size_t size,
RT_ASSERT(buffer != RT_NULL);
ep0 = &device->dcd->ep0;
- ep0->request.buffer = (rt_uint8_t *)buffer;
+ ep0->request.buffer = (rt_uint8_t *)buffer;
ep0->request.remain_size = size;
ep0->rx_indicate = rx_ind;
if(size >= ep0->id->maxpacket)
@@ -2143,7 +2171,7 @@ static void rt_usbd_thread_entry(void* parameter)
}
RT_DEBUG_LOG(RT_DEBUG_USB, ("message type %d\n", msg.type));
-
+
switch (msg.type)
{
case USB_MSG_SOF:
@@ -2160,7 +2188,7 @@ static void rt_usbd_thread_entry(void* parameter)
case USB_MSG_EP0_OUT:
_ep0_out_notify(device, &msg.content.ep_msg);
break;
- case USB_MSG_RESET:
+ case USB_MSG_RESET:
RT_DEBUG_LOG(RT_DEBUG_USB, ("reset %d\n", device->state));
if (device->state == USB_STATE_ADDRESS || device->state == USB_STATE_CONFIGURED)
_stop_notify(device);
@@ -2170,7 +2198,7 @@ static void rt_usbd_thread_entry(void* parameter)
device->state = USB_STATE_ATTACHED;
break;
case USB_MSG_PLUG_OUT:
- device->state = USB_STATE_NOTATTACHED;
+ device->state = USB_STATE_NOTATTACHED;
_stop_notify(device);
break;
default:
diff --git a/components/drivers/usb/usbhost/class/adk.c b/components/drivers/usb/usbhost/class/adk.c
index 2425de7bba..492a2f9bb7 100644
--- a/components/drivers/usb/usbhost/class/adk.c
+++ b/components/drivers/usb/usbhost/class/adk.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/usb/usbhost/class/adk.h b/components/drivers/usb/usbhost/class/adk.h
index c582ad7f17..aebe7de705 100644
--- a/components/drivers/usb/usbhost/class/adk.h
+++ b/components/drivers/usb/usbhost/class/adk.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -19,7 +19,7 @@ struct uadkinst
upipe_t pipe_out;
struct rt_device device;
-};
+};
typedef struct uadkinst* uadk_t;
#define USB_ACCESSORY_VENDOR_ID 0x18D1
diff --git a/components/drivers/usb/usbhost/class/hid.c b/components/drivers/usb/usbhost/class/hid.c
index e16096877f..eaf413a2a6 100644
--- a/components/drivers/usb/usbhost/class/hid.c
+++ b/components/drivers/usb/usbhost/class/hid.c
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2011-12-12 Yi Qiu first version
+ * 2021-02-23 Leslie Lee update with current usb api
*/
#include <rtthread.h>
@@ -23,31 +24,32 @@ static rt_list_t _protocal_list;
* @param intf the interface instance.
* @duration the idle period of requesting data.
* @report_id the report id
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
+rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id)
{
struct urequest setup;
- struct uinstance* device;
+ struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(intf != RT_NULL);
RT_ASSERT(intf->device != RT_NULL);
device = intf->device;
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_IDLE;
- setup.index = 0;
- setup.length = 0;
- setup.value = (duration << 8 )| report_id;
+ setup.bRequest = USB_REQ_SET_IDLE;
+ setup.wIndex = 0;
+ setup.wLength = 0;
+ setup.wValue = (duration << 8 )| report_id;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
- timeout) == 0) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
@@ -56,32 +58,42 @@ rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
* @param intf the interface instance.
* @buffer the data buffer to save usb report descriptor.
* @param nbytes the size of buffer
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
+rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type,
rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(intf != RT_NULL);
RT_ASSERT(intf->device != RT_NULL);
device = intf->device;
- setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_GET_REPORT;
- setup.index = intf->intf_desc->bInterfaceNumber;
- setup.length = size;
- setup.value = (type << 8 ) + id;
+ setup.bRequest = USB_REQ_GET_REPORT;
+ setup.wIndex = intf->intf_desc->bInterfaceNumber;
+ setup.wLength = size;
+ setup.wValue = (type << 8 ) + id;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ {
+ if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, buffer, size, timeout) == size)
+ {
+ if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_out, RT_NULL, 0, timeout) == 0)
+ {
+ return RT_EOK;
+ }
+ }
+ }
+ else
+ return -RT_FALSE;
+ return -RT_FALSE;
}
/**
@@ -90,31 +102,32 @@ rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
* @param intf the interface instance.
* @buffer the data buffer to save usb report descriptor.
* @param nbytes the size of buffer
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size)
+rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
- struct uinstance* device;
+ struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(intf != RT_NULL);
RT_ASSERT(intf->device != RT_NULL);
-
+
device = intf->device;
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_REPORT;
- setup.index = intf->intf_desc->bInterfaceNumber;
- setup.length = size;
- setup.value = 0x02 << 8;
+ setup.bRequest = USB_REQ_SET_REPORT;
+ setup.wIndex = intf->intf_desc->bInterfaceNumber;
+ setup.wLength = size;
+ setup.wValue = 0x02 << 8;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
@@ -122,73 +135,84 @@ rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_
*
* @param intf the interface instance.
* @param protocol the protocol id.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
+rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol)
{
struct urequest setup;
struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(intf != RT_NULL);
RT_ASSERT(intf->device != RT_NULL);
-
+
device = intf->device;
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_PROTOCOL;
- setup.index = 0;
- setup.length = 0;
- setup.value = protocol;
+ setup.bRequest = USB_REQ_SET_PROTOCOL;
+ setup.wIndex = 0;
+ setup.wLength = 0;
+ setup.wValue = protocol;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
- timeout) == 0) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
- * This function will do USB_REQ_GET_DESCRIPTOR request for the device instance
+ * This function will do USB_REQ_GET_DESCRIPTOR request for the device instance
* to set feature of the hub port.
*
* @param intf the interface instance.
* @buffer the data buffer to save usb report descriptor.
* @param nbytes the size of buffer
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf,
+rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf,
rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
- struct uinstance* device;
+ struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(intf != RT_NULL);
RT_ASSERT(intf->device != RT_NULL);
-
+
device = intf->device;
- setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD|
+ setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD|
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_GET_DESCRIPTOR;
- setup.index = 0;
- setup.length = size;
- setup.value = USB_DESC_TYPE_REPORT << 8;
+ setup.bRequest = USB_REQ_GET_DESCRIPTOR;
+ setup.wIndex = 0;
+ setup.wLength = size;
+ setup.wValue = USB_DESC_TYPE_REPORT << 8;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ {
+ if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, buffer, size, timeout) == size)
+ {
+ if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_out, RT_NULL, 0, timeout) == 0)
+ {
+ return RT_EOK;
+ }
+ }
+ }
+ else
+ return -RT_FALSE;
+ return -RT_FALSE;
}
/**
* This function will register specified hid protocal to protocal list
*
* @param protocal the specified protocal.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hid_protocal_register(uprotocal_t protocal)
@@ -199,44 +223,44 @@ rt_err_t rt_usbh_hid_protocal_register(uprotocal_t protocal)
/* insert class driver into driver list */
rt_list_insert_after(&_protocal_list, &(protocal->list));
-
- return RT_EOK;
+
+ return RT_EOK;
}
/**
* This function is the callback function of hid's int endpoint, it is invoked when data comes.
*
* @param context the context of the callback function.
- *
+ *
* @return none.
*/
static void rt_usbh_hid_callback(void* context)
{
- upipe_t pipe;
+ upipe_t pipe;
struct uhid* hid;
int timeout = USB_TIMEOUT_LONG;
/* parameter check */
RT_ASSERT(context != RT_NULL);
-
+
pipe = (upipe_t)context;
- hid = (struct uhid*)pipe->intf->user_data;
+ hid = (struct uhid*)((struct uhintf*)pipe->inst)->user_data;
/* invoke protocal callback function */
hid->protocal->callback((void*)hid);
/* parameter check */
- RT_ASSERT(pipe->intf->device->hcd != RT_NULL);
+ RT_ASSERT(((struct uhintf*)pipe->inst)->device->hcd != RT_NULL);
- rt_usb_hcd_int_xfer(pipe->intf->device->hcd, pipe, hid->buffer,
- pipe->ep.wMaxPacketSize, timeout);
+ rt_usb_hcd_pipe_xfer(((struct uhintf*)pipe->inst)->device->hcd, pipe,
+ hid->buffer, pipe->ep.wMaxPacketSize, timeout);
}
/**
* This function will find specified hid protocal from protocal list
*
* @param pro_id the protocal id.
- *
+ *
* @return the found protocal or RT_NULL if there is no this protocal.
*/
static uprotocal_t rt_usbh_hid_protocal_find(int pro_id)
@@ -246,7 +270,7 @@ static uprotocal_t rt_usbh_hid_protocal_find(int pro_id)
/* try to find protocal object */
for (node = _protocal_list.next; node != &_protocal_list; node = node->next)
{
- uprotocal_t protocal =
+ uprotocal_t protocal =
(uprotocal_t)rt_list_entry(node, struct uprotocal, list);
if (protocal->pro_id == pro_id) return protocal;
}
@@ -260,18 +284,16 @@ static uprotocal_t rt_usbh_hid_protocal_find(int pro_id)
* as a hid class device, it will continue the enumulate process.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_hid_enable(void* arg)
{
int i = 0, pro_id;
- uprotocal_t protocal;
+ uprotocal_t protocal;
struct uhid* hid;
- struct uintf* intf = (struct uintf*)arg;
- int timeout = USB_TIMEOUT_BASIC;
- upipe_t pipe;
-
+ struct uhintf* intf = (struct uhintf*)arg;
+
/* parameter check */
if(intf == RT_NULL)
{
@@ -282,71 +304,65 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
pro_id = intf->intf_desc->bInterfaceProtocol;
RT_DEBUG_LOG(RT_DEBUG_USB,
- ("HID device enable, protocal id %d\n", pro_id));
+ ("HID device enable, protocal id %d\n", pro_id));
- protocal = rt_usbh_hid_protocal_find(pro_id);
+ protocal = rt_usbh_hid_protocal_find(pro_id);
if(protocal == RT_NULL)
{
rt_kprintf("can't find hid protocal %d\n", pro_id);
- intf->user_data = RT_NULL;
+ intf->user_data = RT_NULL;
return -RT_ERROR;
}
-
+
hid = rt_malloc(sizeof(struct uhid));
RT_ASSERT(hid != RT_NULL);
- /* initilize the data structure */
+ /* initilize the data structure */
rt_memset(hid, 0, sizeof(struct uhid));
intf->user_data = (void*)hid;
hid->protocal = protocal;
-
+
for(i=0; i<intf->intf_desc->bNumEndpoints; i++)
- {
+ {
rt_err_t ret;
uep_desc_t ep_desc;
- /* get endpoint descriptor */
+ /* get endpoint descriptor */
rt_usbh_get_endpoint_descriptor(intf->intf_desc, i, &ep_desc);
if(ep_desc == RT_NULL)
{
rt_kprintf("rt_usbh_get_endpoint_descriptor error\n");
return -RT_ERROR;
}
-
- if(USB_EP_ATTR(ep_desc->bmAttributes) != USB_EP_ATTR_INT)
+
+ if(USB_EP_ATTR(ep_desc->bmAttributes) != USB_EP_ATTR_INT)
continue;
-
+
if(!(ep_desc->bEndpointAddress & USB_DIR_IN)) continue;
- ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &hid->pipe_in,
- intf, ep_desc, rt_usbh_hid_callback);
+ ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &hid->pipe_in,
+ intf, ep_desc);
if(ret != RT_EOK) return ret;
}
/* initialize hid protocal */
- hid->protocal->init((void*)intf);
- pipe = hid->pipe_in;
+ hid->protocal->init((void*)intf);
- /* parameter check */
- RT_ASSERT(pipe->intf->device->hcd != RT_NULL);
-
- rt_usb_hcd_int_xfer(pipe->intf->device->hcd, hid->pipe_in,
- hid->buffer, hid->pipe_in->ep.wMaxPacketSize, timeout);
return RT_EOK;
}
/**
- * This function will be invoked when usb device plug out is detected and it would clean
+ * This function will be invoked when usb device plug out is detected and it would clean
* and release all hub class related resources.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_hid_disable(void* arg)
{
struct uhid* hid;
- struct uintf* intf = (struct uintf*)arg;
+ struct uhintf* intf = (struct uhintf*)arg;
RT_ASSERT(intf != RT_NULL);
@@ -361,12 +377,9 @@ static rt_err_t rt_usbh_hid_disable(void* arg)
rt_usb_hcd_free_pipe(intf->device->hcd, hid->pipe_in);
}
- /* free the hid instance */
+ /* free the hid instance */
rt_free(hid);
}
-
- /* free the instance */
- rt_free(intf);
return RT_EOK;
}
@@ -374,7 +387,7 @@ static rt_err_t rt_usbh_hid_disable(void* arg)
/**
* This function will register hid class driver to the usb class driver manager.
* and it should be invoked in the usb system initialization.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
ucd_t rt_usbh_class_driver_hid(void)
@@ -382,7 +395,7 @@ ucd_t rt_usbh_class_driver_hid(void)
rt_list_init(&_protocal_list);
hid_driver.class_code = USB_CLASS_HID;
-
+
hid_driver.enable = rt_usbh_hid_enable;
hid_driver.disable = rt_usbh_hid_disable;
diff --git a/components/drivers/usb/usbhost/class/hid.h b/components/drivers/usb/usbhost/class/hid.h
index 8e446c8cea..19b2b09855 100644
--- a/components/drivers/usb/usbhost/class/hid.h
+++ b/components/drivers/usb/usbhost/class/hid.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -18,7 +18,7 @@ struct uhid
upipe_t pipe_in;
rt_uint8_t buffer[8];
uprotocal_t protocal;
-};
+};
typedef struct uhid uhid_t;
#define USB_REQ_GET_REPORT 0x01
@@ -28,14 +28,14 @@ typedef struct uhid uhid_t;
#define USB_REQ_SET_IDLE 0x0a
#define USB_REQ_SET_PROTOCOL 0x0b
-#define USB_HID_KEYBOARD 1
+#define USB_HID_KEYBOARD 1
#define USB_HID_MOUSE 2
-rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id);
-rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type, rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size);
-rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size);
-rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol);
-rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id);
+rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type, rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol);
+rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size);
rt_err_t rt_usbh_hid_protocal_register(uprotocal_t protocal);
#endif
diff --git a/components/drivers/usb/usbhost/class/mass.c b/components/drivers/usb/usbhost/class/mass.c
index 20048873f5..abd89a5efc 100644
--- a/components/drivers/usb/usbhost/class/mass.c
+++ b/components/drivers/usb/usbhost/class/mass.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -24,29 +24,29 @@ static struct uclass_driver storage_driver;
*
* @param intf the interface instance.
* @param max_lun the buffer to save max_lun.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t _pipe_check(struct uhintf* intf, upipe_t pipe)
{
- struct uinstance* device;
+ struct uinstance* device;
rt_err_t ret;
ustor_t stor;
- int size = 0;
+ int size = 0;
struct ustorage_csw csw;
if(intf == RT_NULL || pipe == RT_NULL)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
+ }
- /* get usb device instance from the interface instance */
- device = intf->device;
+ /* get usb device instance from the interface instance */
+ device = intf->device;
- /* get storage instance from the interface instance */
+ /* get storage instance from the interface instance */
stor = (ustor_t)intf->user_data;
-
+
/* check pipe status */
if(pipe->status == UPIPE_STATUS_OK) return RT_EOK;
@@ -58,11 +58,11 @@ static rt_err_t _pipe_check(struct uhintf* intf, upipe_t pipe)
if(pipe->status == UPIPE_STATUS_STALL)
{
/* clear the pipe stall status */
- ret = rt_usbh_clear_feature(device, pipe->ep.bEndpointAddress,
+ ret = rt_usbh_clear_feature(device, pipe->ep.bEndpointAddress,
USB_FEATURE_ENDPOINT_HALT);
if(ret != RT_EOK) return ret;
}
-
+
rt_thread_delay(50);
@@ -73,14 +73,14 @@ static rt_err_t _pipe_check(struct uhintf* intf, upipe_t pipe)
RT_DEBUG_LOG(RT_DEBUG_USB, ("clean storage in pipe stall\n"));
/* it should receive csw after clear the stall feature */
- size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd,
+ size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd,
stor->pipe_in, &csw, SIZEOF_CSW, 100);
- if(size != SIZEOF_CSW)
+ if(size != SIZEOF_CSW)
{
rt_kprintf("receive the csw after stall failed\n");
return -RT_EIO;
}
-
+
return -RT_ERROR;
}
@@ -89,35 +89,35 @@ static rt_err_t _pipe_check(struct uhintf* intf, upipe_t pipe)
*
* @param intf the interface instance.
* @param max_lun the buffer to save max_lun.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
+static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
ustorage_cbw_t cmd, rt_uint8_t* buffer, int timeout)
{
rt_size_t size;
- rt_err_t ret;
+ rt_err_t ret;
upipe_t pipe;
struct ustorage_csw csw;
ustor_t stor;
- RT_ASSERT(cmd != RT_NULL);
+ RT_ASSERT(cmd != RT_NULL);
if(intf == RT_NULL)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
}
-
- /* get storage instance from the interface instance */
+
+ /* get storage instance from the interface instance */
stor = (ustor_t)intf->user_data;
do
{
/* send the cbw */
- size = rt_usb_hcd_pipe_xfer(stor->pipe_out->inst->hcd, stor->pipe_out,
+ size = rt_usb_hcd_pipe_xfer(stor->pipe_out->inst->hcd, stor->pipe_out,
cmd, SIZEOF_CBW, timeout);
- if(size != SIZEOF_CBW)
+ if(size != SIZEOF_CBW)
{
rt_kprintf("CBW size error\n");
return -RT_EIO;
@@ -126,20 +126,20 @@ static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
{
pipe = (cmd->dflags == CBWFLAGS_DIR_IN) ? stor->pipe_in :
stor->pipe_out;
- size = rt_usb_hcd_pipe_xfer(pipe->inst->hcd, pipe, (void*)buffer,
+ size = rt_usb_hcd_pipe_xfer(pipe->inst->hcd, pipe, (void*)buffer,
cmd->xfer_len, timeout);
if(size != cmd->xfer_len)
{
- rt_kprintf("request size %d, transfer size %d\n",
+ rt_kprintf("request size %d, transfer size %d\n",
cmd->xfer_len, size);
break;
- }
+ }
}
-
+
/* receive the csw */
- size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd, stor->pipe_in,
+ size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd, stor->pipe_in,
&csw, SIZEOF_CSW, timeout);
- if(size != SIZEOF_CSW)
+ if(size != SIZEOF_CSW)
{
rt_kprintf("csw size error\n");
return -RT_EIO;
@@ -148,12 +148,12 @@ static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
/* check in pipes status */
ret = _pipe_check(intf, stor->pipe_in);
- if(ret != RT_EOK)
+ if(ret != RT_EOK)
{
rt_kprintf("in pipe error\n");
return ret;
}
-
+
/* check out pipes status */
ret = _pipe_check(intf, stor->pipe_out);
if(ret != RT_EOK)
@@ -161,20 +161,20 @@ static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
rt_kprintf("out pipe error\n");
return ret;
}
-
+
/* check csw status */
if(csw.signature != CSW_SIGNATURE || csw.tag != CBW_TAG_VALUE)
{
rt_kprintf("csw signature error\n");
return -RT_EIO;
}
-
+
if(csw.status != 0)
{
//rt_kprintf("csw status error:%d\n",csw.status);
return -RT_ERROR;
}
-
+
return RT_EOK;
}
@@ -183,12 +183,12 @@ static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf,
*
* @param intf the interface instance.
* @param max_lun the buffer to save max_lun.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun)
{
- struct uinstance* device;
+ struct uinstance* device;
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
@@ -196,17 +196,17 @@ rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
+ }
/* parameter check */
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_get_max_lun\n"));
- /* get usb device instance from the interface instance */
- device = intf->device;
+ /* get usb device instance from the interface instance */
+ device = intf->device;
/* construct the request */
- setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
setup.bRequest = USBREQ_GET_MAX_LUN;
setup.wValue = intf->intf_desc->bInterfaceNumber;
@@ -233,13 +233,13 @@ rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun)
* This function will do USBREQ_MASS_STORAGE_RESET request for the usb interface instance.
*
* @param intf the interface instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_reset(struct uhintf* intf)
{
struct urequest setup;
- struct uinstance* device;
+ struct uinstance* device;
int timeout = USB_TIMEOUT_BASIC;
/* parameter check */
@@ -247,16 +247,16 @@ rt_err_t rt_usbh_storage_reset(struct uhintf* intf)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
+ }
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_reset\n"));
- /* get usb device instance from the interface instance */
- device = intf->device;
+ /* get usb device instance from the interface instance */
+ device = intf->device;
/* construct the request */
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
setup.bRequest = USBREQ_MASS_STORAGE_RESET;
setup.wIndex = intf->intf_desc->bInterfaceNumber;
@@ -279,12 +279,12 @@ rt_err_t rt_usbh_storage_reset(struct uhintf* intf)
*
* @param intf the interface instance.
* @param buffer the data buffer to save read data
- * @param sector the start sector address to read.
+ * @param sector the start sector address to read.
* @param sector the sector count to read.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
+rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
rt_uint32_t sector, rt_size_t count, int timeout)
{
struct ustorage_cbw cmd;
@@ -294,8 +294,8 @@ rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
{
rt_kprintf("interface is not available\n");
return -RT_EIO;
- }
-
+ }
+
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_read10\n"));
@@ -325,12 +325,12 @@ rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
*
* @param intf the interface instance.
* @param buffer the data buffer to save write data
- * @param sector the start sector address to write.
+ * @param sector the start sector address to write.
* @param sector the sector count to write.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
+rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
rt_uint32_t sector, rt_size_t count, int timeout)
{
struct ustorage_cbw cmd;
@@ -340,8 +340,8 @@ rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
-
+ }
+
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_write10\n"));
@@ -371,7 +371,7 @@ rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
*
* @param intf the interface instance.
* @param buffer the data buffer to save sense data
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer)
@@ -384,12 +384,12 @@ rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
-
+ }
+
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_request_sense\n"));
- /* construct the command block wrapper */
+ /* construct the command block wrapper */
rt_memset(&cmd, 0, sizeof(struct ustorage_cbw));
cmd.signature = CBW_SIGNATURE;
cmd.tag = CBW_TAG_VALUE;
@@ -407,7 +407,7 @@ rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer)
* This function will execute SCSI_TEST_UNIT_READY command to get unit ready status.
*
* @param intf the interface instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf)
@@ -420,8 +420,8 @@ rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
-
+ }
+
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_test_unit_ready\n"));
@@ -434,7 +434,7 @@ rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf)
cmd.lun = 0;
cmd.cb_len = 12;
cmd.cb[0] = SCSI_TEST_UNIT_READY;
-
+
return rt_usb_bulk_only_xfer(intf, &cmd, RT_NULL, timeout);
}
@@ -443,21 +443,21 @@ rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf)
*
* @param intf the interface instance.
* @param buffer the data buffer to save inquiry data
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_inquiry(struct uhintf* intf, rt_uint8_t* buffer)
{
struct ustorage_cbw cmd;
int timeout = USB_TIMEOUT_LONG;
-
+
/* parameter check */
if(intf == RT_NULL)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
-
+ }
+
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_inquiry\n"));
@@ -480,7 +480,7 @@ rt_err_t rt_usbh_storage_inquiry(struct uhintf* intf, rt_uint8_t* buffer)
*
* @param intf the interface instance.
* @param buffer the data buffer to save capacity data
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_storage_get_capacity(struct uhintf* intf, rt_uint8_t* buffer)
@@ -493,7 +493,7 @@ rt_err_t rt_usbh_storage_get_capacity(struct uhintf* intf, rt_uint8_t* buffer)
{
rt_kprintf("the interface is not available\n");
return -RT_EIO;
- }
+ }
RT_ASSERT(intf->device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_get_capacity\n"));
@@ -513,17 +513,17 @@ rt_err_t rt_usbh_storage_get_capacity(struct uhintf* intf, rt_uint8_t* buffer)
/**
* This function will run mass storage class driver when usb device is detected
- * and identified as a mass storage class device, it will continue to do the enumulate
+ * and identified as a mass storage class device, it will continue to do the enumulate
* process.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_storage_enable(void* arg)
{
int i = 0;
- rt_err_t ret;
+ rt_err_t ret;
ustor_t stor;
struct uhintf* intf = (struct uhintf*)arg;
@@ -534,25 +534,25 @@ static rt_err_t rt_usbh_storage_enable(void* arg)
return -RT_EIO;
}
- RT_DEBUG_LOG(RT_DEBUG_USB, ("subclass %d, protocal %d\n",
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("subclass %d, protocal %d\n",
intf->intf_desc->bInterfaceSubClass,
intf->intf_desc->bInterfaceProtocol));
-
+
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_storage_run\n"));
/* only support SCSI subclass and bulk only protocal */
-
+
stor = rt_malloc(sizeof(struct ustor));
RT_ASSERT(stor != RT_NULL);
/* initilize the data structure */
- rt_memset(stor, 0, sizeof(struct ustor));
+ rt_memset(stor, 0, sizeof(struct ustor));
intf->user_data = (void*)stor;
for(i=0; i<intf->intf_desc->bNumEndpoints; i++)
- {
+ {
uep_desc_t ep_desc;
-
+
/* get endpoint descriptor from interface descriptor */
rt_usbh_get_endpoint_descriptor(intf->intf_desc, i, &ep_desc);
if(ep_desc == RT_NULL)
@@ -560,11 +560,11 @@ static rt_err_t rt_usbh_storage_enable(void* arg)
rt_kprintf("rt_usb_get_endpoint_descriptor error\n");
return -RT_ERROR;
}
-
- /* the endpoint type of mass storage class should be BULK */
+
+ /* the endpoint type of mass storage class should be BULK */
if((ep_desc->bmAttributes & USB_EP_ATTR_TYPE_MASK) != USB_EP_ATTR_BULK)
continue;
-
+
/* allocate pipes according to the endpoint type */
if(ep_desc->bEndpointAddress & USB_DIR_IN)
{
@@ -572,7 +572,7 @@ static rt_err_t rt_usbh_storage_enable(void* arg)
stor->pipe_in = rt_usb_instance_find_pipe(intf->device,ep_desc->bEndpointAddress);
}
else
- {
+ {
/* alloc an output pipe for the storage instance */
stor->pipe_out = rt_usb_instance_find_pipe(intf->device,ep_desc->bEndpointAddress);
}
@@ -583,8 +583,8 @@ static rt_err_t rt_usbh_storage_enable(void* arg)
{
rt_kprintf("pipe error, unsupported device\n");
return -RT_ERROR;
- }
-
+ }
+
/* should implement as callback */
ret = rt_udisk_run(intf);
if(ret != RT_EOK) return ret;
@@ -593,11 +593,11 @@ static rt_err_t rt_usbh_storage_enable(void* arg)
}
/**
- * This function will be invoked when usb device plug out is detected and it would clean
+ * This function will be invoked when usb device plug out is detected and it would clean
* and release all mass storage class related resources.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_storage_disable(void* arg)
@@ -617,7 +617,7 @@ static rt_err_t rt_usbh_storage_disable(void* arg)
rt_udisk_stop(intf);
-
+
/* free storage instance */
if(stor != RT_NULL) rt_free(stor);
return RT_EOK;
@@ -626,13 +626,13 @@ static rt_err_t rt_usbh_storage_disable(void* arg)
/**
* This function will register mass storage class driver to the usb class driver manager.
* and it should be invoked in the usb system initialization.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
ucd_t rt_usbh_class_driver_storage(void)
{
storage_driver.class_code = USB_CLASS_MASS_STORAGE;
-
+
storage_driver.enable = rt_usbh_storage_enable;
storage_driver.disable = rt_usbh_storage_disable;
diff --git a/components/drivers/usb/usbhost/class/mass.h b/components/drivers/usb/usbhost/class/mass.h
index 770e64a03f..2578fb54c7 100644
--- a/components/drivers/usb/usbhost/class/mass.h
+++ b/components/drivers/usb/usbhost/class/mass.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -30,17 +30,17 @@ struct ustor
upipe_t pipe_in;
upipe_t pipe_out;
rt_uint32_t capicity[2];
-
+
struct rt_device dev[MAX_PARTITION_COUNT];
rt_uint8_t dev_cnt;
-};
+};
typedef struct ustor* ustor_t;
rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun);
rt_err_t rt_usbh_storage_reset(struct uhintf* intf);
-rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
+rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer,
rt_uint32_t sector, rt_size_t count, int timeout);
-rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
+rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer,
rt_uint32_t sector, rt_size_t count, int timeout);
rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer);
rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf);
diff --git a/components/drivers/usb/usbhost/class/udisk.c b/components/drivers/usb/usbhost/class/udisk.c
index 6c8030b29a..8be311e657 100644
--- a/components/drivers/usb/usbhost/class/udisk.c
+++ b/components/drivers/usb/usbhost/class/udisk.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/usb/usbhost/class/ukbd.c b/components/drivers/usb/usbhost/class/ukbd.c
index 7d608de259..c89d60cd36 100644
--- a/components/drivers/usb/usbhost/class/ukbd.c
+++ b/components/drivers/usb/usbhost/class/ukbd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -14,13 +14,13 @@
#if defined(RT_USBH_HID) && defined(RT_USBH_HID_KEYBOARD)
-static struct uprotocal kbd_protocal;
+static struct uprotocal kbd_protocal;
static rt_err_t rt_usbh_hid_kbd_callback(void* arg)
{
int int1, int2;
- struct uhid* hid;
-
+ struct uhid* hid;
+
hid = (struct uhid*)arg;
int1 = *(rt_uint32_t*)hid->buffer;
@@ -28,9 +28,9 @@ static rt_err_t rt_usbh_hid_kbd_callback(void* arg)
if(int1 != 0 || int2 != 0)
{
- RT_DEBUG_LOG(RT_DEBUG_USB, ("key down 0x%x, 0x%x\n", int1, int2));
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("key down 0x%x, 0x%x\n", int1, int2));
}
-
+
return RT_EOK;
}
@@ -38,20 +38,20 @@ static rt_err_t rt_usbh_hid_kbd_init(void* arg)
{
struct uintf* intf = (struct uintf*)arg;
- RT_ASSERT(intf != RT_NULL);
-
+ RT_ASSERT(intf != RT_NULL);
+
rt_usbh_hid_set_protocal(intf, 0);
rt_usbh_hid_set_idle(intf, 10, 0);
- //RT_DEBUG_LOG(RT_DEBUG_USB, ("start usb keyboard\n"));
+ //RT_DEBUG_LOG(RT_DEBUG_USB, ("start usb keyboard\n"));
return RT_EOK;
}
/**
* This function will define the hid keyboard protocal, it will be register to the protocal list.
- *
+ *
* @return the keyboard protocal structure.
*/
uprotocal_t rt_usbh_hid_protocal_kbd(void)
diff --git a/components/drivers/usb/usbhost/class/umouse.c b/components/drivers/usb/usbhost/class/umouse.c
index e769475a98..ae14cba22c 100644
--- a/components/drivers/usb/usbhost/class/umouse.c
+++ b/components/drivers/usb/usbhost/class/umouse.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -126,15 +126,36 @@ static rt_err_t rt_usbh_hid_mouse_callback(void* arg)
return RT_EOK;
}
+rt_thread_t mouse_thread;
+void mouse_task(void* param)
+{
+ struct uhintf* intf = (struct uhintf*)param;
+ while (1)
+ {
+ if (rt_usb_hcd_pipe_xfer(intf->device->hcd, ((struct uhid*)intf->user_data)->pipe_in,
+ ((struct uhid*)intf->user_data)->buffer, ((struct uhid*)intf->user_data)->pipe_in->ep.wMaxPacketSize,
+ USB_TIMEOUT_BASIC) == 0)
+ {
+ break;
+ }
+
+ rt_usbh_hid_mouse_callback(intf->user_data);
+ }
+}
+
+
static rt_err_t rt_usbh_hid_mouse_init(void* arg)
{
- struct uintf* intf = (struct uintf*)arg;
+ struct uhintf* intf = (struct uhintf*)arg;
RT_ASSERT(intf != RT_NULL);
rt_usbh_hid_set_protocal(intf, 0);
- rt_usbh_hid_set_idle(intf, 10, 0);
+ rt_usbh_hid_set_idle(intf, 0, 0);
+
+ mouse_thread = rt_thread_create("mouse0", mouse_task, intf, 500, 8, 100);
+ rt_thread_startup(mouse_thread);
RT_DEBUG_LOG(RT_DEBUG_USB, ("start usb mouse\n"));
#ifdef RT_USING_RTGUI
diff --git a/components/drivers/usb/usbhost/core/driver.c b/components/drivers/usb/usbhost/core/driver.c
index 542d456ff1..102e388154 100644
--- a/components/drivers/usb/usbhost/core/driver.c
+++ b/components/drivers/usb/usbhost/core/driver.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -19,7 +19,7 @@ static rt_bool_t _driver_list_created = RT_FALSE;
/**
* This function will initilize the usb class driver related data structure,
* and it should be invoked in the usb system initialization.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_class_driver_init(void)
@@ -29,14 +29,14 @@ rt_err_t rt_usbh_class_driver_init(void)
rt_list_init(&_driver_list);
_driver_list_created = RT_TRUE;
}
- return RT_EOK;
+ return RT_EOK;
}
/**
* This function will register an usb class driver to the class driver manager.
*
* @param drv the pointer of the usb class driver.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
@@ -49,15 +49,15 @@ rt_err_t rt_usbh_class_driver_register(ucd_t drv)
/* insert class driver into driver list */
rt_list_insert_after(&_driver_list, &(drv->list));
}
-
- return RT_EOK;
+
+ return RT_EOK;
}
/**
* This function will removes a previously registed usb class driver.
*
* @param drv the pointer of the usb class driver structure.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_class_driver_unregister(ucd_t drv)
@@ -75,7 +75,7 @@ rt_err_t rt_usbh_class_driver_unregister(ucd_t drv)
*
* @param drv the pointer of usb class driver.
* @param args the parameter of run function.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_class_driver_enable(ucd_t drv, void* args)
@@ -93,7 +93,7 @@ rt_err_t rt_usbh_class_driver_enable(ucd_t drv, void* args)
*
* @param drv the pointer of usb class driver structure.
* @param args the argument of the stop function.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_class_driver_disable(ucd_t drv, void* args)
@@ -110,7 +110,7 @@ rt_err_t rt_usbh_class_driver_disable(ucd_t drv, void* args)
/**
* This function finds a usb class driver by specified class code and subclass code.
*
- * @param class_code the usb class driver's class code.
+ * @param class_code the usb class driver's class code.
* @param subclass_code the usb class driver's sub class code.
*
* @return the registered usb class driver on successful, or RT_NULL on failure.
@@ -126,7 +126,7 @@ ucd_t rt_usbh_class_driver_find(int class_code, int subclass_code)
/* try to find driver object */
for (node = _driver_list.next; node != &_driver_list; node = node->next)
{
- ucd_t drv =
+ ucd_t drv =
(ucd_t)rt_list_entry(node, struct uclass_driver, list);
if (drv->class_code == class_code)
{
diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c
index e8c8dfff72..bf48bc4c61 100644
--- a/components/drivers/usb/usbhost/core/hub.c
+++ b/components/drivers/usb/usbhost/core/hub.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -78,7 +78,7 @@ static rt_err_t root_hub_ctrl(struct uhcd *hcd, rt_uint16_t port, rt_uint8_t cmd
return RT_ERROR;
}
return RT_EOK;
-}
+}
void rt_usbh_root_hub_connect_handler(struct uhcd *hcd, rt_uint8_t port, rt_bool_t isHS)
{
struct uhost_msg msg;
@@ -107,23 +107,23 @@ void rt_usbh_root_hub_disconnect_handler(struct uhcd *hcd, rt_uint8_t port)
}
/**
- * This function will do USB_REQ_GET_DESCRIPTOR bRequest for the device instance
+ * This function will do USB_REQ_GET_DESCRIPTOR bRequest for the device instance
* to get usb hub descriptor.
*
* @param intf the interface instance.
* @buffer the data buffer to save usb hub descriptor.
* @param nbytes the size of buffer
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer, rt_size_t nbytes)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(device != RT_NULL);
-
+
setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_DEVICE;
setup.bRequest = USB_REQ_GET_DESCRIPTOR;
setup.wIndex = 0;
@@ -136,24 +136,24 @@ rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer
{
return RT_EOK;
}
- }
- return -RT_FALSE;
+ }
+ return -RT_FALSE;
}
/**
- * This function will do USB_REQ_GET_STATUS bRequest for the device instance
+ * This function will do USB_REQ_GET_STATUS bRequest for the device instance
* to get usb hub status.
*
* @param intf the interface instance.
* @buffer the data buffer to save usb hub status.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint32_t* buffer)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(device != RT_NULL);
@@ -169,31 +169,31 @@ rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint32_t* buffer)
return RT_EOK;
}
}
- return -RT_FALSE;
+ return -RT_FALSE;
}
/**
- * This function will do USB_REQ_GET_STATUS bRequest for the device instance
+ * This function will do USB_REQ_GET_STATUS bRequest for the device instance
* to get hub port status.
*
* @param intf the interface instance.
* @port the hub port to get status.
* @buffer the data buffer to save usb hub status.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, rt_uint32_t* buffer)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(hub != RT_NULL);
/* get roothub port status */
if(hub->is_roothub)
{
- root_hub_ctrl(hub->hcd, port, RH_GET_PORT_STATUS,
+ root_hub_ctrl(hub->hcd, port, RH_GET_PORT_STATUS,
(void*)buffer);
return RT_EOK;
}
@@ -211,36 +211,36 @@ rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, rt_uint32_t*
return RT_EOK;
}
}
- return -RT_FALSE;
+ return -RT_FALSE;
}
/**
- * This function will do USB_REQ_CLEAR_FEATURE bRequest for the device instance
+ * This function will do USB_REQ_CLEAR_FEATURE bRequest for the device instance
* to clear feature of the hub port.
*
* @param intf the interface instance.
* @port the hub port.
* @feature feature to be cleared.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, rt_uint16_t feature)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(hub != RT_NULL);
/* clear roothub feature */
if(hub->is_roothub)
{
- root_hub_ctrl(hub->hcd, port, RH_CLEAR_PORT_FEATURE,
+ root_hub_ctrl(hub->hcd, port, RH_CLEAR_PORT_FEATURE,
(void*)(rt_uint32_t)feature);
return RT_EOK;
}
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_OTHER;
setup.bRequest = USB_REQ_CLEAR_FEATURE;
setup.wIndex = port;
@@ -251,37 +251,37 @@ rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, rt_uint16_
{
return RT_EOK;
}
- return -RT_FALSE;
+ return -RT_FALSE;
}
/**
- * This function will do USB_REQ_SET_FEATURE bRequest for the device instance
+ * This function will do USB_REQ_SET_FEATURE bRequest for the device instance
* to set feature of the hub port.
*
* @param intf the interface instance.
* @port the hub port.
* @feature feature to be set.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port,
+rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port,
rt_uint16_t feature)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
/* parameter check */
RT_ASSERT(hub != RT_NULL);
/* clear roothub feature */
if(hub->is_roothub)
{
- root_hub_ctrl(hub->hcd, port, RH_SET_PORT_FEATURE,
+ root_hub_ctrl(hub->hcd, port, RH_SET_PORT_FEATURE,
(void*)(rt_uint32_t)feature);
return RT_EOK;
}
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_OTHER;
setup.bRequest = USB_REQ_SET_FEATURE;
setup.wIndex = port;
@@ -292,7 +292,7 @@ rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port,
{
return RT_EOK;
}
- else return -RT_FALSE;
+ else return -RT_FALSE;
}
/**
@@ -300,17 +300,17 @@ rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port,
*
* @param intf the interface instance.
* @param port the hub port.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_reset_port(uhub_t hub, rt_uint16_t port)
{
rt_err_t ret;
rt_uint32_t pstatus;
-
+
/* parameter check */
RT_ASSERT(hub != RT_NULL);
-
+
rt_thread_delay(50);
/* reset hub port */
@@ -322,12 +322,12 @@ rt_err_t rt_usbh_hub_reset_port(uhub_t hub, rt_uint16_t port)
ret = rt_usbh_hub_get_port_status(hub, port, &pstatus);
if(!(pstatus & PORT_PRS)) break;
}
-
+
/* clear port reset feature */
- ret = rt_usbh_hub_clear_port_feature(hub, port, PORT_FEAT_C_RESET);
+ ret = rt_usbh_hub_clear_port_feature(hub, port, PORT_FEAT_C_RESET);
if(ret != RT_EOK) return ret;
- rt_thread_delay(50);
+ rt_thread_delay(50);
return RT_EOK;
}
@@ -337,7 +337,7 @@ rt_err_t rt_usbh_hub_reset_port(uhub_t hub, rt_uint16_t port)
*
* @param device the usb instance.
* @param port the hub port.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_hub_port_debounce(uhub_t hub, rt_uint16_t port)
@@ -357,15 +357,15 @@ rt_err_t rt_usbh_hub_port_debounce(uhub_t hub, rt_uint16_t port)
{
ret = rt_usbh_hub_get_port_status(hub, port, &pstatus);
if(ret != RT_EOK) return ret;
-
- if(!(pstatus & PORT_CCS))
+
+ if(!(pstatus & PORT_CCS))
{
connect = RT_FALSE;
break;
}
-
+
rt_thread_delay(delayticks);
- }
+ }
if(connect) return RT_EOK;
else return -RT_ERROR;
@@ -376,7 +376,7 @@ rt_err_t rt_usbh_hub_port_debounce(uhub_t hub, rt_uint16_t port)
* disconnect events.
*
* @param intf the interface instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
@@ -387,7 +387,7 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
/* parameter check */
RT_ASSERT(hub != RT_NULL);
- /* get usb device instance */
+ /* get usb device instance */
for (i = 0; i < hub->num_ports; i++)
{
rt_err_t ret;
@@ -395,7 +395,7 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
rt_uint32_t pstatus = 0;
reconnect = RT_FALSE;
-
+
/* get hub port status */
ret = rt_usbh_hub_get_port_status(hub, i + 1, &pstatus);
if(ret != RT_EOK) continue;
@@ -403,8 +403,8 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
RT_DEBUG_LOG(RT_DEBUG_USB, ("port %d status 0x%x\n", i + 1, pstatus));
/* check port status change */
- if (pstatus & PORT_CCSC)
- {
+ if (pstatus & PORT_CCSC)
+ {
/* clear port status change feature */
rt_usbh_hub_clear_port_feature(hub, i + 1, PORT_FEAT_C_CONNECTION);
reconnect = RT_TRUE;
@@ -412,39 +412,39 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
if(pstatus & PORT_PESC)
{
- rt_usbh_hub_clear_port_feature(hub, i + 1, PORT_FEAT_C_ENABLE);
+ rt_usbh_hub_clear_port_feature(hub, i + 1, PORT_FEAT_C_ENABLE);
reconnect = RT_TRUE;
}
-
+
if(reconnect)
- {
+ {
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;
-
+
/* allocate an usb instance for new connected device */
device = rt_usbh_alloc_instance(hub->hcd);
if(device == RT_NULL) break;
-
+
/* set usb device speed */
device->speed = (pstatus & PORT_LSDA) ? 1 : 0;
- device->parent_hub = hub;
+ device->parent_hub = hub;
device->hcd = hub->hcd;
device->port = i + 1;
hub->child[i] = device;
/* reset usb roothub port */
rt_usbh_hub_reset_port(hub, i + 1);
-
+
/* attatch the usb instance to the hcd */
- rt_usbh_attatch_instance(device);
+ rt_usbh_attatch_instance(device);
}
}
@@ -455,7 +455,7 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub)
* This function is the callback function of hub's int endpoint, it is invoked when data comes.
*
* @param context the context of the callback function.
- *
+ *
* @return none.
*/
static void rt_usbh_hub_irq(void* context)
@@ -463,9 +463,9 @@ static void rt_usbh_hub_irq(void* context)
upipe_t pipe;
uhub_t hub;
int timeout = USB_TIMEOUT_BASIC;
-
+
RT_ASSERT(context != RT_NULL);
-
+
pipe = (upipe_t)context;
hub = (uhub_t)pipe->user_data;
@@ -474,14 +474,14 @@ static void rt_usbh_hub_irq(void* context)
RT_DEBUG_LOG(RT_DEBUG_USB,("hub irq error\n"));
return;
}
-
+
rt_usbh_hub_port_change(hub);
RT_DEBUG_LOG(RT_DEBUG_USB,("hub int xfer...\n"));
/* parameter check */
RT_ASSERT(pipe->inst->hcd != RT_NULL);
-
+
rt_usb_hcd_pipe_xfer(hub->self->hcd, pipe, hub->buffer, pipe->ep.wMaxPacketSize, timeout);
}
@@ -490,7 +490,7 @@ static void rt_usbh_hub_irq(void* context)
* as a hub class device, it will continue to do the enumulate process.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
@@ -506,7 +506,7 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
int timeout = USB_TIMEOUT_LONG;
/* paremeter check */
RT_ASSERT(intf != RT_NULL);
-
+
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbh_hub_run\n"));
/* get usb device instance */
@@ -516,7 +516,7 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
hub = rt_malloc(sizeof(struct uhub));
RT_ASSERT(hub != RT_NULL);
rt_memset(hub, 0, sizeof(struct uhub));
-
+
/* make interface instance's user data point to hub instance */
intf->user_data = (void*)hub;
@@ -525,17 +525,17 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
if(ret != RT_EOK)
{
rt_kprintf("get hub descriptor failed\n");
- return -RT_ERROR;
+ return -RT_ERROR;
}
/* get full hub descriptor */
- ret = rt_usbh_hub_get_descriptor(device, (rt_uint8_t*)&hub->hub_desc,
+ ret = rt_usbh_hub_get_descriptor(device, (rt_uint8_t*)&hub->hub_desc,
hub->hub_desc.length);
if(ret != RT_EOK)
{
rt_kprintf("get hub descriptor again failed\n");
- return -RT_ERROR;
- }
+ return -RT_ERROR;
+ }
/* get hub ports number */
/* If hub device supported ports over USB_HUB_PORT_NUM(Ex: 8 port hub). Set hub->num_ports to USB_HUB_PORT_NUM */
@@ -555,7 +555,7 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
* 2 * RT_TICK_PER_SECOND / 1000 );
}
- if(intf->intf_desc->bNumEndpoints != 1)
+ if(intf->intf_desc->bNumEndpoints != 1)
return -RT_ERROR;
/* get endpoint descriptor from interface descriptor */
@@ -566,12 +566,12 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
return -RT_ERROR;
}
- /* the endpoint type of hub class should be interrupt */
+ /* the endpoint type of hub class should be interrupt */
if( USB_EP_ATTR(ep_desc->bmAttributes) == USB_EP_ATTR_INT)
{
/* the endpoint direction of hub class should be in */
if(ep_desc->bEndpointAddress & USB_DIR_IN)
- {
+ {
/* allocate a pipe according to the endpoint type */
pipe_in = rt_usb_instance_find_pipe(device,ep_desc->bEndpointAddress);
if(pipe_in == RT_NULL)
@@ -586,17 +586,17 @@ static rt_err_t rt_usbh_hub_enable(void *arg)
/* parameter check */
RT_ASSERT(device->hcd != RT_NULL);
pipe_in->user_data = hub;
- rt_usb_hcd_pipe_xfer(hub->hcd, pipe_in, hub->buffer,
+ rt_usb_hcd_pipe_xfer(hub->hcd, pipe_in, hub->buffer,
pipe_in->ep.wMaxPacketSize, timeout);
return RT_EOK;
}
/**
- * This function will be invoked when usb hub plug out is detected and it would clean
+ * This function will be invoked when usb hub plug out is detected and it would clean
* and release all hub class related resources.
*
* @param arg the argument.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
static rt_err_t rt_usbh_hub_disable(void* arg)
@@ -616,7 +616,7 @@ static rt_err_t rt_usbh_hub_disable(void* arg)
if(hub->child[i] != RT_NULL)
rt_usbh_detach_instance(hub->child[i]);
}
-
+
if(hub != RT_NULL) rt_free(hub);
return RT_EOK;
@@ -625,13 +625,13 @@ static rt_err_t rt_usbh_hub_disable(void* arg)
/**
* This function will register hub class driver to the usb class driver manager.
* and it should be invoked in the usb system initialization.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
ucd_t rt_usbh_class_driver_hub(void)
-{
+{
hub_driver.class_code = USB_CLASS_HUB;
-
+
hub_driver.enable = rt_usbh_hub_enable;
hub_driver.disable = rt_usbh_hub_disable;
@@ -639,28 +639,28 @@ ucd_t rt_usbh_class_driver_hub(void)
}
/**
- * This function is the main entry of usb hub thread, it is in charge of
- * processing all messages received from the usb message buffer.
+ * This function is the main entry of usb hub thread, it is in charge of
+ * processing all messages received from the usb message buffer.
*
* @param parameter the parameter of the usb host thread.
- *
+ *
* @return none.
*/
static void rt_usbh_hub_thread_entry(void* parameter)
-{
+{
uhcd_t hcd = (uhcd_t)parameter;
while(1)
- {
+ {
struct uhost_msg msg;
-
+
/* receive message */
- if(rt_mq_recv(hcd->usb_mq, &msg, sizeof(struct uhost_msg), RT_WAITING_FOREVER)
+ if(rt_mq_recv(hcd->usb_mq, &msg, sizeof(struct uhost_msg), RT_WAITING_FOREVER)
!= RT_EOK ) continue;
//RT_DEBUG_LOG(RT_DEBUG_USB, ("msg type %d\n", msg.type));
-
+
switch (msg.type)
- {
+ {
case USB_MSG_CONNECT_CHANGE:
rt_usbh_hub_port_change(msg.content.hub);
break;
@@ -670,7 +670,7 @@ static void rt_usbh_hub_thread_entry(void* parameter)
break;
default:
break;
- }
+ }
}
}
@@ -678,8 +678,8 @@ static void rt_usbh_hub_thread_entry(void* parameter)
* This function will post an message to the usb message queue,
*
* @param msg the message to be posted
- *
- * @return the error code, RT_EOK on successfully.
+ *
+ * @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_event_signal(uhcd_t hcd, struct uhost_msg* msg)
{
@@ -695,7 +695,7 @@ rt_err_t rt_usbh_event_signal(uhcd_t hcd, struct uhost_msg* msg)
* This function will initialize usb hub thread.
*
* @return none.
- *
+ *
*/
void rt_usbh_hub_init(uhcd_t hcd)
{
@@ -707,10 +707,11 @@ void rt_usbh_hub_init(uhcd_t hcd)
hcd->roothub->hcd = hcd;
hcd->roothub->num_ports = hcd->num_ports;
/* create usb message queue */
+
hcd->usb_mq = rt_mq_create(hcd->parent.parent.name, 32, 16, RT_IPC_FLAG_FIFO);
-
+
/* create usb hub thread */
- thread = rt_thread_create(hcd->parent.parent.name, rt_usbh_hub_thread_entry, hcd,
+ thread = rt_thread_create(hcd->parent.parent.name, rt_usbh_hub_thread_entry, hcd,
USB_THREAD_STACK_SIZE, 8, 20);
if(thread != RT_NULL)
{
diff --git a/components/drivers/usb/usbhost/core/usbhost.c b/components/drivers/usb/usbhost/core/usbhost.c
index 201ec2229b..84b9640b76 100644
--- a/components/drivers/usb/usbhost/core/usbhost.c
+++ b/components/drivers/usb/usbhost/core/usbhost.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -20,13 +20,13 @@
/**
* This function will initialize the usb host stack, all the usb class driver and
* host controller driver are also be initialized here.
- *
+ *
* @return none.
*/
rt_err_t rt_usb_host_init(const char *name)
{
ucd_t drv;
- rt_device_t uhc;
+ rt_device_t uhc;
uhc = rt_device_find(name);
if(uhc == RT_NULL)
diff --git a/components/drivers/usb/usbhost/core/usbhost_core.c b/components/drivers/usb/usbhost/core/usbhost_core.c
index d72dca82f2..71fe3b8b3f 100644
--- a/components/drivers/usb/usbhost/core/usbhost_core.c
+++ b/components/drivers/usb/usbhost/core/usbhost_core.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -27,28 +27,28 @@ uinst_t rt_usbh_alloc_instance(uhcd_t uhcd)
/* lock scheduler */
rt_enter_critical();
-
+
for(i=0; i<USB_MAX_DEVICE; i++)
{
/* to find an idle instance handle */
if(dev[i].status != DEV_STATUS_IDLE) continue;
-
+
/* initialize the usb device instance */
rt_memset(&dev[i], 0, sizeof(struct uinstance));
-
+
dev[i].status = DEV_STATUS_BUSY;
dev[i].index = i + 1;
dev[i].address = 0;
dev[i].max_packet_size = 0x8;
rt_list_init(&dev[i].pipe);
dev[i].hcd = uhcd;
- /* unlock scheduler */
+ /* unlock scheduler */
rt_exit_critical();
return &dev[i];
}
- /* unlock scheduler */
- rt_exit_critical();
+ /* unlock scheduler */
+ rt_exit_critical();
return RT_NULL;
}
@@ -59,10 +59,10 @@ uinst_t rt_usbh_alloc_instance(uhcd_t uhcd)
*
* @param hcd the host controller driver.
* @param device the usb device instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-static struct uendpoint_descriptor ep0_out_desc =
+static struct uendpoint_descriptor ep0_out_desc =
{
/*endpoint descriptor*/
USB_DESC_LENGTH_ENDPOINT,
@@ -72,7 +72,7 @@ static struct uendpoint_descriptor ep0_out_desc =
0x00,
0x00,
};
-static struct uendpoint_descriptor ep0_in_desc =
+static struct uendpoint_descriptor ep0_in_desc =
{
/*endpoint descriptor*/
USB_DESC_LENGTH_ENDPOINT,
@@ -95,10 +95,10 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
ucd_t drv;
RT_ASSERT(device != RT_NULL);
-
+
rt_memset(&cfg_desc, 0, sizeof(struct uconfig_descriptor));
dev_desc = &device->dev_desc;
-
+
/* alloc address 0 ep0 pipe*/
ep0_out_desc.wMaxPacketSize = 8;
ep0_in_desc.wMaxPacketSize = 8;
@@ -106,7 +106,7 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
rt_usb_hcd_alloc_pipe(device->hcd, &device->pipe_ep0_in, device, &ep0_in_desc);
RT_DEBUG_LOG(RT_DEBUG_USB, ("start enumnation\n"));
-
+
/* get device descriptor head */
ret = rt_usbh_get_descriptor(device, USB_DESC_TYPE_DEVICE, (void*)dev_desc, 8);
if(ret != RT_EOK)
@@ -114,7 +114,7 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
rt_kprintf("get device descriptor head failed\n");
return ret;
}
-
+
/* reset bus */
rt_usbh_hub_reset_port(device->parent_hub, device->port);
rt_thread_delay(2);
@@ -127,20 +127,20 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
return ret;
}
/* free address 0 ep0 pipe*/
-
+
rt_usb_hcd_free_pipe(device->hcd,device->pipe_ep0_out);
rt_usb_hcd_free_pipe(device->hcd,device->pipe_ep0_in);
-
+
/* set device max packet size */
ep0_out_desc.wMaxPacketSize = device->dev_desc.bMaxPacketSize0;
ep0_in_desc.wMaxPacketSize = device->dev_desc.bMaxPacketSize0;
-
+
/* alloc true address ep0 pipe*/
rt_usb_hcd_alloc_pipe(device->hcd, &device->pipe_ep0_out, device, &ep0_out_desc);
rt_usb_hcd_alloc_pipe(device->hcd, &device->pipe_ep0_in, device, &ep0_in_desc);
RT_DEBUG_LOG(RT_DEBUG_USB, ("get device descriptor length %d\n",
dev_desc->bLength));
-
+
/* get full device descriptor again */
ret = rt_usbh_get_descriptor(device, USB_DESC_TYPE_DEVICE, (void*)dev_desc, dev_desc->bLength);
if(ret != RT_EOK)
@@ -169,7 +169,7 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
rt_memset(device->cfg_desc, 0, cfg_desc.wTotalLength);
/* get full configuration descriptor */
- ret = rt_usbh_get_descriptor(device, USB_DESC_TYPE_CONFIGURATION,
+ ret = rt_usbh_get_descriptor(device, USB_DESC_TYPE_CONFIGURATION,
device->cfg_desc, cfg_desc.wTotalLength);
if(ret != RT_EOK)
{
@@ -179,12 +179,12 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
/* set configuration */
ret = rt_usbh_set_configure(device, 1);
- if(ret != RT_EOK)
+ if(ret != RT_EOK)
{
return ret;
}
for(i=0; i<device->cfg_desc->bNumInterfaces; i++)
- {
+ {
/* get interface descriptor through configuration descriptor */
ret = rt_usbh_get_interface_descriptor(device->cfg_desc, i, &intf_desc);
if(ret != RT_EOK)
@@ -193,7 +193,7 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
return -RT_ERROR;
}
- RT_DEBUG_LOG(RT_DEBUG_USB, ("interface class 0x%x, subclass 0x%x\n",
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("interface class 0x%x, subclass 0x%x\n",
intf_desc->bInterfaceClass,
intf_desc->bInterfaceSubClass));
/* alloc pipe*/
@@ -216,9 +216,9 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
}
}
/* find driver by class code found in interface descriptor */
- drv = rt_usbh_class_driver_find(intf_desc->bInterfaceClass,
+ drv = rt_usbh_class_driver_find(intf_desc->bInterfaceClass,
intf_desc->bInterfaceSubClass);
-
+
if(drv != RT_NULL)
{
/* allocate memory for interface device */
@@ -245,7 +245,7 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
continue;
}
}
-
+
return RT_EOK;
}
@@ -254,19 +254,19 @@ rt_err_t rt_usbh_attatch_instance(uinst_t device)
* and release all resource.
*
* @param device the usb device instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_detach_instance(uinst_t device)
{
int i = 0;
rt_list_t * l;
- if(device == RT_NULL)
+ if(device == RT_NULL)
{
rt_kprintf("no usb instance to detach\n");
return -RT_ERROR;
}
-
+
/* free configration descriptor */
if (device->cfg_desc) {
for (i = 0; i < device->cfg_desc->bNumInterfaces; i++)
@@ -282,10 +282,10 @@ rt_err_t rt_usbh_detach_instance(uinst_t device)
}
rt_free(device->cfg_desc);
}
-
+
rt_usb_hcd_free_pipe(device->hcd,device->pipe_ep0_out);
rt_usb_hcd_free_pipe(device->hcd,device->pipe_ep0_in);
-
+
while(device->pipe.next!= &device->pipe)
{
l = device->pipe.next;
@@ -293,29 +293,29 @@ rt_err_t rt_usbh_detach_instance(uinst_t device)
rt_usb_hcd_free_pipe(device->hcd,rt_list_entry(l,struct upipe,list));
}
rt_memset(device, 0, sizeof(struct uinstance));
-
+
return RT_EOK;
}
/**
* This function will do USB_REQ_GET_DESCRIPTO' bRequest for the usb device instance,
*
- * @param device the usb device instance.
+ * @param device the usb device instance.
* @param type the type of descriptor bRequest.
* @param buffer the data buffer to save requested data
* @param nbytes the size of buffer
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_get_descriptor(uinst_t device, rt_uint8_t type, void* buffer,
+rt_err_t rt_usbh_get_descriptor(uinst_t device, rt_uint8_t type, void* buffer,
int nbytes)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
RT_ASSERT(device != RT_NULL);
- setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD |
+ setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD |
USB_REQ_TYPE_DEVICE;
setup.bRequest = USB_REQ_GET_DESCRIPTOR;
setup.wIndex = 0;
@@ -339,19 +339,19 @@ rt_err_t rt_usbh_get_descriptor(uinst_t device, rt_uint8_t type, void* buffer,
* This function will set an address to the usb device.
*
* @param device the usb device instance.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_set_address(uinst_t device)
{
struct urequest setup;
int timeout = USB_TIMEOUT_BASIC;
-
+
RT_ASSERT(device != RT_NULL);
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usb_set_address\n"));
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
USB_REQ_TYPE_DEVICE;
setup.bRequest = USB_REQ_SET_ADDRESS;
setup.wIndex = 0;
@@ -375,7 +375,7 @@ rt_err_t rt_usbh_set_address(uinst_t device)
*
* @param device the usb device instance.
* @param config the configuration number.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_set_configure(uinst_t device, int config)
@@ -386,7 +386,7 @@ rt_err_t rt_usbh_set_configure(uinst_t device, int config)
/* check parameter */
RT_ASSERT(device != RT_NULL);
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
USB_REQ_TYPE_DEVICE;
setup.bRequest = USB_REQ_SET_CONFIGURATION;
setup.wIndex = 0;
@@ -401,7 +401,7 @@ rt_err_t rt_usbh_set_configure(uinst_t device, int config)
{
return RT_ERROR;
}
- return RT_EOK;
+ return RT_EOK;
}
/**
@@ -409,7 +409,7 @@ rt_err_t rt_usbh_set_configure(uinst_t device, int config)
*
* @param device the usb device instance.
* @param intf the interface number.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_set_interface(uinst_t device, int intf)
@@ -420,7 +420,7 @@ rt_err_t rt_usbh_set_interface(uinst_t device, int intf)
/* check parameter */
RT_ASSERT(device != RT_NULL);
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
USB_REQ_TYPE_INTERFACE;
setup.bRequest = USB_REQ_SET_INTERFACE;
setup.wIndex = 0;
@@ -431,8 +431,8 @@ rt_err_t rt_usbh_set_interface(uinst_t device, int intf)
{
return RT_ERROR;
}
-
- return RT_EOK;
+
+ return RT_EOK;
}
/**
@@ -440,7 +440,7 @@ rt_err_t rt_usbh_set_interface(uinst_t device, int intf)
*
* @param device the usb device instance.
* @param endpoint the endpoint number of the usb device.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
rt_err_t rt_usbh_clear_feature(uinst_t device, int endpoint, int feature)
@@ -451,7 +451,7 @@ rt_err_t rt_usbh_clear_feature(uinst_t device, int endpoint, int feature)
/* check parameter */
RT_ASSERT(device != RT_NULL);
- setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
+ setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_STANDARD |
USB_REQ_TYPE_ENDPOINT;
setup.bRequest = USB_REQ_CLEAR_FEATURE;
setup.wIndex = endpoint;
@@ -462,8 +462,8 @@ rt_err_t rt_usbh_clear_feature(uinst_t device, int endpoint, int feature)
{
return RT_ERROR;
}
-
- return RT_EOK;
+
+ return RT_EOK;
}
/**
@@ -472,10 +472,10 @@ rt_err_t rt_usbh_clear_feature(uinst_t device, int endpoint, int feature)
* @param cfg_desc the point of configuration descriptor structure.
* @param num the number of interface descriptor.
* @intf_desc the point of interface descriptor point.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num,
+rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num,
uintf_desc_t* intf_desc)
{
rt_uint32_t ptr, depth = 0;
@@ -487,9 +487,9 @@ rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num,
ptr = (rt_uint32_t)cfg_desc + cfg_desc->bLength;
while(ptr < (rt_uint32_t)cfg_desc + cfg_desc->wTotalLength)
{
- if(depth++ > 0x20)
+ if(depth++ > 0x20)
{
- *intf_desc = RT_NULL;
+ *intf_desc = RT_NULL;
return -RT_EIO;
}
desc = (udesc_t)ptr;
@@ -500,10 +500,10 @@ rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num,
*intf_desc = (uintf_desc_t)desc;
RT_DEBUG_LOG(RT_DEBUG_USB,
- ("rt_usb_get_interface_descriptor: %d\n", num));
+ ("rt_usb_get_interface_descriptor: %d\n", num));
return RT_EOK;
}
- }
+ }
ptr = (rt_uint32_t)desc + desc->bLength;
}
@@ -517,14 +517,14 @@ rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num,
* @param intf_desc the point of interface descriptor structure.
* @param num the number of endpoint descriptor.
* @param ep_desc the point of endpoint descriptor point.
- *
+ *
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_get_endpoint_descriptor(uintf_desc_t intf_desc, int num,
+rt_err_t rt_usbh_get_endpoint_descriptor(uintf_desc_t intf_desc, int num,
uep_desc_t* ep_desc)
{
int count = 0, depth = 0;
- rt_uint32_t ptr;
+ rt_uint32_t ptr;
udesc_t desc;
/* check parameter */
@@ -535,15 +535,15 @@ rt_err_t rt_usbh_get_endpoint_descriptor(uintf_desc_t intf_desc, int num,
ptr = (rt_uint32_t)intf_desc + intf_desc->bLength;
while(count < intf_desc->bNumEndpoints)
{
- if(depth++ > 0x20)
+ if(depth++ > 0x20)
{
- *ep_desc = RT_NULL;
+ *ep_desc = RT_NULL;
return -RT_EIO;
}
- desc = (udesc_t)ptr;
+ desc = (udesc_t)ptr;
if(desc->type == USB_DESC_TYPE_ENDPOINT)
{
- if(num == count)
+ if(num == count)
{
*ep_desc = (uep_desc_t)desc;
diff --git a/components/drivers/watchdog/watchdog.c b/components/drivers/watchdog/watchdog.c
index 09a6bf4fad..d26626863d 100644
--- a/components/drivers/watchdog/watchdog.c
+++ b/components/drivers/watchdog/watchdog.c
@@ -1,6 +1,6 @@
/*
- * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
- *
+ * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ *
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
@@ -65,7 +65,7 @@ static rt_err_t rt_watchdog_control(struct rt_device *dev,
}
#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops wdt_ops =
+const static struct rt_device_ops wdt_ops =
{
rt_watchdog_init,
rt_watchdog_open,
@@ -89,7 +89,7 @@ rt_err_t rt_hw_watchdog_register(struct rt_watchdog_device *wtd,
device = &(wtd->parent);
- device->type = RT_Device_Class_Miscellaneous;
+ device->type = RT_Device_Class_Security;
device->rx_indicate = RT_NULL;
device->tx_complete = RT_NULL;
diff --git a/components/drivers/wlan/wlan_cfg.c b/components/drivers/wlan/wlan_cfg.c
index 7fa9ecb2da..0befe6e7da 100644
--- a/components/drivers/wlan/wlan_cfg.c
+++ b/components/drivers/wlan/wlan_cfg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_cfg.h b/components/drivers/wlan/wlan_cfg.h
index 3fae3f3e98..4d0e73729d 100644
--- a/components/drivers/wlan/wlan_cfg.h
+++ b/components/drivers/wlan/wlan_cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_cmd.c b/components/drivers/wlan/wlan_cmd.c
index fead6a8bf2..52c25f6755 100644
--- a/components/drivers/wlan/wlan_cmd.c
+++ b/components/drivers/wlan/wlan_cmd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -586,8 +586,8 @@ static int wifi_msh(int argc, char *argv[])
return 0;
}
-#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
-FINSH_FUNCTION_EXPORT_ALIAS(wifi_msh, __cmd_wifi, wifi command.);
+#if defined(RT_USING_FINSH)
+MSH_CMD_EXPORT_ALIAS(wifi_msh, wifi, wifi command);
#endif
#endif
diff --git a/components/drivers/wlan/wlan_dev.c b/components/drivers/wlan/wlan_dev.c
index 53b6138e99..4db8d5e43d 100644
--- a/components/drivers/wlan/wlan_dev.c
+++ b/components/drivers/wlan/wlan_dev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_dev.h b/components/drivers/wlan/wlan_dev.h
index 3019afb19d..9fce22b7c9 100644
--- a/components/drivers/wlan/wlan_dev.h
+++ b/components/drivers/wlan/wlan_dev.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -589,7 +589,7 @@ rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int
/*
* wlan device register interface
*/
-rt_err_t rt_wlan_dev_register(struct rt_wlan_device *wlan, const char *name,
+rt_err_t rt_wlan_dev_register(struct rt_wlan_device *wlan, const char *name,
const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data);
#ifdef __cplusplus
diff --git a/components/drivers/wlan/wlan_lwip.c b/components/drivers/wlan/wlan_lwip.c
index 3c4e4dd598..30205ac332 100644
--- a/components/drivers/wlan/wlan_lwip.c
+++ b/components/drivers/wlan/wlan_lwip.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_mgnt.c b/components/drivers/wlan/wlan_mgnt.c
index fefe700acc..6abac5691c 100644
--- a/components/drivers/wlan/wlan_mgnt.c
+++ b/components/drivers/wlan/wlan_mgnt.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_mgnt.h b/components/drivers/wlan/wlan_mgnt.h
index df0827bb7b..38d5c31da2 100644
--- a/components/drivers/wlan/wlan_mgnt.h
+++ b/components/drivers/wlan/wlan_mgnt.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_prot.c b/components/drivers/wlan/wlan_prot.c
index b1a1b5de99..5c32a3fbda 100644
--- a/components/drivers/wlan/wlan_prot.c
+++ b/components/drivers/wlan/wlan_prot.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_prot.h b/components/drivers/wlan/wlan_prot.h
index 2df979270f..5f8930f452 100644
--- a/components/drivers/wlan/wlan_prot.h
+++ b/components/drivers/wlan/wlan_prot.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_workqueue.c b/components/drivers/wlan/wlan_workqueue.c
index 4cd98346d2..76b95e66b0 100644
--- a/components/drivers/wlan/wlan_workqueue.c
+++ b/components/drivers/wlan/wlan_workqueue.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/components/drivers/wlan/wlan_workqueue.h b/components/drivers/wlan/wlan_workqueue.h
index 49bc4a5f9f..7a68a27e03 100644
--- a/components/drivers/wlan/wlan_workqueue.h
+++ b/components/drivers/wlan/wlan_workqueue.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*