From 38b993f1fa929b111b496901ba7bb4670db267ee Mon Sep 17 00:00:00 2001 From: wangqiang Date: Fri, 29 Apr 2022 18:40:08 +0800 Subject: [PATCH 01/15] =?UTF-8?q?1.=20=E5=9C=A8AT32=E7=9A=84BSP=E7=9A=84dr?= =?UTF-8?q?v=5Fgpio=E4=B8=AD=E5=A2=9E=E5=8A=A0=E4=BA=86at32=5Fpin=5Fget?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?rt=5Fpin=5Fops=E5=AF=B9=E8=B1=A1=E4=B8=AD=E7=9A=84pin=5Fget=202?= =?UTF-8?q?.=20=E5=9C=A8MSH=E4=B8=AD=E5=A2=9E=E5=8A=A0=E4=BA=86PIN?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E5=91=BD=E4=BB=A4=203.=20=E4=B8=BA?= =?UTF-8?q?=E4=BA=86=E6=96=B9=E4=BE=BF=E5=9C=A8MSH=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E4=B8=AD=E8=A7=A3=E6=9E=90=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=80=E4=BA=9B=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E7=9B=B8=E5=85=B3=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/at32/libraries/rt_drivers/drv_gpio.c | 34 ++++- components/drivers/misc/pin.c | 182 +++++++++++++++++++---- include/rtthread.h | 5 + src/kservice.c | 152 +++++++++++++++++++ 4 files changed, 341 insertions(+), 32 deletions(-) diff --git a/bsp/at32/libraries/rt_drivers/drv_gpio.c b/bsp/at32/libraries/rt_drivers/drv_gpio.c index b4fa19408d5..e15063c1317 100644 --- a/bsp/at32/libraries/rt_drivers/drv_gpio.c +++ b/bsp/at32/libraries/rt_drivers/drv_gpio.c @@ -102,6 +102,38 @@ static uint32_t pin_irq_enable_mask = 0; #define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) +static rt_base_t at32_pin_get(const char *name) +{ + rt_base_t pin = -1; + rt_base_t port, index; + int32_t cnt = 0; + if (((name[1] >= 'A') && (name[1] <= 'Z')) || ((name[1] >= 'a') && (name[1] <= 'z'))) + { + if (name[1] >= 'A') + { + port = name[1] - 'A'; + } + else + { + port = name[1] - 'a'; + } + cnt++; + } + if (((name[2] >= '0') && (name[2] <= '9')) && ((name[3] >= '0') && (name[3] <= '9'))) + { + index = name[2] - '0'; + index *= 10; + index += name[3] - '0'; + cnt++; + } + if (cnt < 2) + { + return pin; + } + pin = PIN_NUM(port, index); + return pin; +} + static void at32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value) { gpio_type *gpio_port; @@ -423,7 +455,7 @@ const static struct rt_pin_ops _at32_pin_ops = at32_pin_attach_irq, at32_pin_dettach_irq, at32_pin_irq_enable, - RT_NULL, + at32_pin_get, }; rt_inline void pin_irq_handler(int irqno) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index f12dffdcfcb..06b0959bb39 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -7,6 +7,7 @@ * Date Author Notes * 2015-01-20 Bernard the first version * 2021-02-06 Meco Man fix RT_ENOSYS code in negative + * 2022-04-29 WangQiang add pin operate command in MSH */ #include @@ -24,8 +25,9 @@ static rt_size_t _pin_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_ /* check parameters */ RT_ASSERT(pin != RT_NULL); - status = (struct rt_device_pin_status *) buffer; - if (status == RT_NULL || size != sizeof(*status)) return 0; + status = (struct rt_device_pin_status *)buffer; + if (status == RT_NULL || size != sizeof(*status)) + return 0; status->status = pin->ops->pin_read(dev, status->pin); return size; @@ -39,8 +41,9 @@ static rt_size_t _pin_write(rt_device_t dev, rt_off_t pos, const void *buffer, r /* check parameters */ RT_ASSERT(pin != RT_NULL); - status = (struct rt_device_pin_status *) buffer; - if (status == RT_NULL || size != sizeof(*status)) return 0; + status = (struct rt_device_pin_status *)buffer; + if (status == RT_NULL || size != sizeof(*status)) + return 0; pin->ops->pin_write(dev, (rt_base_t)status->pin, (rt_base_t)status->status); @@ -55,8 +58,9 @@ static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args) /* check parameters */ RT_ASSERT(pin != RT_NULL); - mode = (struct rt_device_pin_mode *) args; - if (mode == RT_NULL) return -RT_ERROR; + mode = (struct rt_device_pin_mode *)args; + if (mode == RT_NULL) + return -RT_ERROR; pin->ops->pin_mode(dev, (rt_base_t)mode->pin, (rt_base_t)mode->mode); @@ -65,35 +69,34 @@ static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args) #ifdef RT_USING_DEVICE_OPS const static struct rt_device_ops pin_ops = -{ - RT_NULL, - RT_NULL, - RT_NULL, - _pin_read, - _pin_write, - _pin_control -}; + { + RT_NULL, + RT_NULL, + RT_NULL, + _pin_read, + _pin_write, + _pin_control}; #endif int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data) { - _hw_pin.parent.type = RT_Device_Class_Pin; - _hw_pin.parent.rx_indicate = RT_NULL; - _hw_pin.parent.tx_complete = RT_NULL; + _hw_pin.parent.type = RT_Device_Class_Miscellaneous; + _hw_pin.parent.rx_indicate = RT_NULL; + _hw_pin.parent.tx_complete = RT_NULL; #ifdef RT_USING_DEVICE_OPS - _hw_pin.parent.ops = &pin_ops; + _hw_pin.parent.ops = &pin_ops; #else - _hw_pin.parent.init = RT_NULL; - _hw_pin.parent.open = RT_NULL; - _hw_pin.parent.close = RT_NULL; - _hw_pin.parent.read = _pin_read; - _hw_pin.parent.write = _pin_write; - _hw_pin.parent.control = _pin_control; + _hw_pin.parent.init = RT_NULL; + _hw_pin.parent.open = RT_NULL; + _hw_pin.parent.close = RT_NULL; + _hw_pin.parent.read = _pin_read; + _hw_pin.parent.write = _pin_write; + _hw_pin.parent.control = _pin_control; #endif - _hw_pin.ops = ops; - _hw_pin.parent.user_data = user_data; + _hw_pin.ops = ops; + _hw_pin.parent.user_data = user_data; /* register a character device */ rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR); @@ -102,10 +105,10 @@ int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void } rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, - void (*hdr)(void *args), void *args) + void (*hdr)(void *args), void *args) { RT_ASSERT(_hw_pin.ops != RT_NULL); - if(_hw_pin.ops->pin_attach_irq) + if (_hw_pin.ops->pin_attach_irq) { return _hw_pin.ops->pin_attach_irq(&_hw_pin.parent, pin, mode, hdr, args); } @@ -115,7 +118,7 @@ rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, rt_err_t rt_pin_detach_irq(rt_int32_t pin) { RT_ASSERT(_hw_pin.ops != RT_NULL); - if(_hw_pin.ops->pin_detach_irq) + if (_hw_pin.ops->pin_detach_irq) { return _hw_pin.ops->pin_detach_irq(&_hw_pin.parent, pin); } @@ -125,7 +128,7 @@ 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) { RT_ASSERT(_hw_pin.ops != RT_NULL); - if(_hw_pin.ops->pin_irq_enable) + if (_hw_pin.ops->pin_irq_enable) { return _hw_pin.ops->pin_irq_enable(&_hw_pin.parent, pin, enabled); } @@ -138,32 +141,149 @@ void rt_pin_mode(rt_base_t pin, rt_base_t mode) RT_ASSERT(_hw_pin.ops != RT_NULL); _hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode); } +#ifdef FINSH_USING_MSH +#define PINMODE_USAGE "\r\npinMode pin_xxx mode_xxx\r\n\tpin_xxx : 1\r\n\tmode_xxx : output or input\r\n" +static void pinMode(int argc, char *argv[]) +{ + rt_base_t pin; + rt_base_t mode; + if (argc < 3) + { + rt_kprintf(PINMODE_USAGE); + return; + } + if (!rt_isint(argv[1])) + { + rt_kprintf(PINMODE_USAGE); + return; + } + pin = rt_strtoint(argv[1]); + if (0 == rt_strcmp("output", argv[2])) + { + mode = PIN_MODE_OUTPUT; + } + else if (0 == rt_strcmp("input", argv[2])) + { + mode = PIN_MODE_INPUT; + } + else + { + rt_kprintf(PINMODE_USAGE); + return; + } + + rt_pin_mode(pin, mode); +} +MSH_CMD_EXPORT(pinMode, set hardware pin mode); +#else FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_mode, pinMode, set hardware pin mode); +#endif void rt_pin_write(rt_base_t pin, rt_base_t value) { RT_ASSERT(_hw_pin.ops != RT_NULL); _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value); } +#ifdef FINSH_USING_MSH +#define PINWRITE_USAGE "\r\npinWrite pin_xxx state_xxx\r\n\tpin_xxx : 1\r\n\tstate_xxx : high or low\r\n\tstate_xxx : on or off\r\n" +static void pinWrite(int argc, char *argv[]) +{ + rt_base_t pin; + rt_base_t value; + if (argc < 3) + { + rt_kprintf(PINWRITE_USAGE); + return; + } + if (!rt_isint(argv[1])) + { + rt_kprintf(PINWRITE_USAGE); + return; + } + pin = rt_strtoint(argv[1]); + if ((0 == rt_strcmp("high", argv[2])) || (0 == rt_strcmp("on", argv[2]))) + { + value = PIN_HIGH; + } + else if ((0 == rt_strcmp("low", argv[2])) || (0 == rt_strcmp("off", argv[2]))) + { + value = PIN_LOW; + } + else + { + rt_kprintf(PINMODE_USAGE); + return; + } + rt_pin_write(pin, value); +} +MSH_CMD_EXPORT(pinWrite, write value to hardware pin); +#else FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_write, pinWrite, write value to hardware pin); +#endif 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); } +#ifdef FINSH_USING_MSH +#define PINREAD_USAGE "\r\npinRead pin_xxx\r\n\tpin_xxx : 1\r\n" +static void pinRead(int argc, char *argv[]) +{ + rt_base_t pin; + rt_base_t value; + if (argc < 2) + { + rt_kprintf(PINREAD_USAGE); + return; + } + if (!rt_isint(argv[1])) + { + rt_kprintf(PINREAD_USAGE); + return; + } + pin = rt_strtoint(argv[1]); + value = rt_pin_read(pin); + if (value == PIN_HIGH) + { + rt_kprintf("pin[%d] = on\r\n", pin); + } + else + { + rt_kprintf("pin[%d] = off\r\n", pin); + } +} +MSH_CMD_EXPORT(pinRead, read status from hardware pin); +#else FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_read, pinRead, read status from hardware pin); +#endif 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) + if (_hw_pin.ops->pin_get == RT_NULL) { return -RT_ENOSYS; } return _hw_pin.ops->pin_get(name); } +#ifdef FINSH_USING_MSH +#define PINGET_USAGE "\r\npinGet PortString\r\n\tPortString : PA0\r\n" +static void pinGet(int argc, char *argv[]) +{ + rt_base_t pin; + if (argc < 2) + { + rt_kprintf(PINGET_USAGE); + return; + } + pin = rt_pin_get(argv[1]); + rt_kprintf("%s : %d\r\n", argv[1], pin); +} +MSH_CMD_EXPORT(pinGet, get pin number from hardware pin); +#else FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_get, pinGet, get pin number from hardware pin); +#endif diff --git a/include/rtthread.h b/include/rtthread.h index 8d4f740e8ca..77b71a3059d 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -631,6 +631,11 @@ rt_size_t rt_strlen(const char *src); #define rt_strlen(src) strlen(src) #endif /*RT_KSERVICE_USING_STDLIB*/ +rt_bool_t rt_isint(char *strvalue); +int rt_strtoint(char *strvalue); +rt_bool_t rt_ishex(char *strvalue); +int rt_strtohex(char *strvalue); + char *rt_strdup(const char *s); #if !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION) diff --git a/src/kservice.c b/src/kservice.c index f1df8a179d2..d0317bd13c6 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -20,6 +20,7 @@ * 2021-02-28 Meco Man add RT_KSERVICE_USING_STDLIB * 2021-12-20 Meco Man implement rt_strcpy() * 2022-01-07 Gabriel add __on_rt_assert_hook + * 2022-04-29 WangQiang add some function for process arguments in MSH */ #include @@ -608,6 +609,157 @@ char *strdup(const char *s) __attribute__((alias("rt_strdup"))); #endif /* __ARMCC_VERSION */ #endif /* RT_USING_HEAP */ +#define forstrloop(str) for (; '\0' != *(str); (str)++) + +/** + * This function will tolower. + * + * @param c char + * + * @return tolower char + */ +int rt_tolower(int c) +{ + int temp = 'a' - 'A'; + + if ((c < 'A') || (c > 'Z')) + { + return c; + } + return (c + temp); +} + +/** + * This function will check digit. + * + * @param c char + * + * @return true or false + */ +rt_bool_t rt_isdigit(int ch) +{ + if ((ch >= '0') && (ch <= '9')) + { + return RT_TRUE; + } + return RT_FALSE; +} + +/** + * This function will check integer. + * + * @param strvalue string + * + * @return true or false + */ +rt_bool_t rt_isint(char *strvalue) +{ + if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) + { + return RT_FALSE; + } + if (('+' == *strvalue) || ('-' == *strvalue)) + { + strvalue++; + } + forstrloop(strvalue) + { + if (!rt_isdigit(*strvalue)) + { + return RT_FALSE; + } + } + return RT_TRUE; +} +RTM_EXPORT(rt_isint); + +/** + * This function will transform for string to integer. + * + * @param strvalue string + * + * @return true or false + */ +int rt_strtoint(char *strvalue) +{ + int value = 0; + int sign = 1; + if ('-' == *strvalue) + { + sign = -1; + strvalue++; + } + else if ('+' == *strvalue) + { + strvalue++; + } + + forstrloop(strvalue) + { + value *= 10; + value += *strvalue - '0'; + } + return value * sign; +} +RTM_EXPORT(rt_strtoint); + +/** + * This function will check hex. + * + * @param strvalue string + * + * @return true or false + */ +rt_bool_t rt_ishex(char *strvalue) +{ + char c; + if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) + { + return RT_FALSE; + } + if ('0' != *(strvalue++)) + { + return RT_FALSE; + } + if ('x' != *(strvalue++)) + { + return RT_FALSE; + } + + forstrloop(strvalue) + { + c = rt_tolower(*strvalue); + if (!rt_isdigit(c) && ((c < 'a') || (c > 'f'))) + { + return RT_FALSE; + } + } + return RT_TRUE; +} +RTM_EXPORT(rt_ishex); + +/** + * This function will transform for string to hex. + * + * @param strvalue string + * + * @return true or false + */ +int rt_strtohex(char *strvalue) +{ + char c = 0; + int value = 0; + strvalue += 2; + forstrloop(strvalue) + { + value *= 16; + c = rt_tolower(*strvalue); + value += rt_isdigit(c) ? c - '0' : c - 'a' + 10; + } + return value; +} +RTM_EXPORT(rt_strtohex); + /** * This function will show the version of rt-thread rtos */ From 536eb2ecd4bcd1c357992772f439534308a1d657 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Fri, 29 Apr 2022 22:57:37 +0800 Subject: [PATCH 02/15] fixed some mistake --- components/drivers/misc/pin.c | 47 +++++++++++++++-------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 06b0959bb39..29bef279abb 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -69,34 +69,35 @@ static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args) #ifdef RT_USING_DEVICE_OPS const static struct rt_device_ops pin_ops = - { - RT_NULL, - RT_NULL, - RT_NULL, - _pin_read, - _pin_write, - _pin_control}; +{ + RT_NULL, + RT_NULL, + RT_NULL, + _pin_read, + _pin_write, + _pin_control +}; #endif int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data) { - _hw_pin.parent.type = RT_Device_Class_Miscellaneous; - _hw_pin.parent.rx_indicate = RT_NULL; - _hw_pin.parent.tx_complete = RT_NULL; + _hw_pin.parent.type = RT_Device_Class_Pin; + _hw_pin.parent.rx_indicate = RT_NULL; + _hw_pin.parent.tx_complete = RT_NULL; #ifdef RT_USING_DEVICE_OPS - _hw_pin.parent.ops = &pin_ops; + _hw_pin.parent.ops = &pin_ops; #else - _hw_pin.parent.init = RT_NULL; - _hw_pin.parent.open = RT_NULL; - _hw_pin.parent.close = RT_NULL; - _hw_pin.parent.read = _pin_read; - _hw_pin.parent.write = _pin_write; - _hw_pin.parent.control = _pin_control; + _hw_pin.parent.init = RT_NULL; + _hw_pin.parent.open = RT_NULL; + _hw_pin.parent.close = RT_NULL; + _hw_pin.parent.read = _pin_read; + _hw_pin.parent.write = _pin_write; + _hw_pin.parent.control = _pin_control; #endif - _hw_pin.ops = ops; - _hw_pin.parent.user_data = user_data; + _hw_pin.ops = ops; + _hw_pin.parent.user_data = user_data; /* register a character device */ rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR); @@ -175,8 +176,6 @@ static void pinMode(int argc, char *argv[]) rt_pin_mode(pin, mode); } MSH_CMD_EXPORT(pinMode, set hardware pin mode); -#else -FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_mode, pinMode, set hardware pin mode); #endif void rt_pin_write(rt_base_t pin, rt_base_t value) @@ -217,8 +216,6 @@ static void pinWrite(int argc, char *argv[]) rt_pin_write(pin, value); } MSH_CMD_EXPORT(pinWrite, write value to hardware pin); -#else -FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_write, pinWrite, write value to hardware pin); #endif int rt_pin_read(rt_base_t pin) @@ -254,8 +251,6 @@ static void pinRead(int argc, char *argv[]) } } MSH_CMD_EXPORT(pinRead, read status from hardware pin); -#else -FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_read, pinRead, read status from hardware pin); #endif rt_base_t rt_pin_get(const char *name) @@ -284,6 +279,4 @@ static void pinGet(int argc, char *argv[]) rt_kprintf("%s : %d\r\n", argv[1], pin); } MSH_CMD_EXPORT(pinGet, get pin number from hardware pin); -#else -FINSH_FUNCTION_EXPORT_ALIAS(rt_pin_get, pinGet, get pin number from hardware pin); #endif From 7cc56766a1835c26ac1a6787dfc5bd0aedde8886 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Mon, 9 May 2022 11:33:30 +0800 Subject: [PATCH 03/15] format funcation name for rt-thread gpio command --- components/drivers/misc/pin.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 29bef279abb..352854ecbb8 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -144,7 +144,7 @@ void rt_pin_mode(rt_base_t pin, rt_base_t mode) } #ifdef FINSH_USING_MSH #define PINMODE_USAGE "\r\npinMode pin_xxx mode_xxx\r\n\tpin_xxx : 1\r\n\tmode_xxx : output or input\r\n" -static void pinMode(int argc, char *argv[]) +static void pin_mode(int argc, char *argv[]) { rt_base_t pin; rt_base_t mode; @@ -175,7 +175,7 @@ static void pinMode(int argc, char *argv[]) rt_pin_mode(pin, mode); } -MSH_CMD_EXPORT(pinMode, set hardware pin mode); +MSH_CMD_EXPORT_ALIAS(pin_mode, pinMode, set hardware pin mode); #endif void rt_pin_write(rt_base_t pin, rt_base_t value) @@ -185,7 +185,7 @@ void rt_pin_write(rt_base_t pin, rt_base_t value) } #ifdef FINSH_USING_MSH #define PINWRITE_USAGE "\r\npinWrite pin_xxx state_xxx\r\n\tpin_xxx : 1\r\n\tstate_xxx : high or low\r\n\tstate_xxx : on or off\r\n" -static void pinWrite(int argc, char *argv[]) +static void pin_write(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; @@ -215,7 +215,7 @@ static void pinWrite(int argc, char *argv[]) } rt_pin_write(pin, value); } -MSH_CMD_EXPORT(pinWrite, write value to hardware pin); +MSH_CMD_EXPORT_ALIAS(pin_write, pinWrite, write value to hardware pin); #endif int rt_pin_read(rt_base_t pin) @@ -225,7 +225,7 @@ int rt_pin_read(rt_base_t pin) } #ifdef FINSH_USING_MSH #define PINREAD_USAGE "\r\npinRead pin_xxx\r\n\tpin_xxx : 1\r\n" -static void pinRead(int argc, char *argv[]) +static void pin_read(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; @@ -250,7 +250,7 @@ static void pinRead(int argc, char *argv[]) rt_kprintf("pin[%d] = off\r\n", pin); } } -MSH_CMD_EXPORT(pinRead, read status from hardware pin); +MSH_CMD_EXPORT_ALIAS(pin_read, pinRead, read status from hardware pin); #endif rt_base_t rt_pin_get(const char *name) @@ -267,7 +267,7 @@ rt_base_t rt_pin_get(const char *name) } #ifdef FINSH_USING_MSH #define PINGET_USAGE "\r\npinGet PortString\r\n\tPortString : PA0\r\n" -static void pinGet(int argc, char *argv[]) +static void pin_get(int argc, char *argv[]) { rt_base_t pin; if (argc < 2) @@ -278,5 +278,5 @@ static void pinGet(int argc, char *argv[]) pin = rt_pin_get(argv[1]); rt_kprintf("%s : %d\r\n", argv[1], pin); } -MSH_CMD_EXPORT(pinGet, get pin number from hardware pin); +MSH_CMD_EXPORT_ALIAS(pin_get, pinGet, get pin number from hardware pin); #endif From 060deb2fa7be8badbba3d1fc60f28e7988f6bdbe Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 09:15:22 +0800 Subject: [PATCH 04/15] add new pin operate command --- components/drivers/misc/pin.c | 223 +++++++++++++++++++++++----------- 1 file changed, 150 insertions(+), 73 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 352854ecbb8..1daf87b7f80 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -142,141 +142,218 @@ void rt_pin_mode(rt_base_t pin, rt_base_t mode) RT_ASSERT(_hw_pin.ops != RT_NULL); _hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode); } + +void rt_pin_write(rt_base_t pin, rt_base_t value) +{ + RT_ASSERT(_hw_pin.ops != RT_NULL); + _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value); +} + +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); +} + + +rt_base_t rt_pin_get(const char *name) +{ + RT_ASSERT(_hw_pin.ops != RT_NULL); + RT_ASSERT(name[0] == 'P'); + + if (_hw_pin.ops->pin_get == RT_NULL) + { + return -RT_ENOSYS; + } + + return _hw_pin.ops->pin_get(name); +} + #ifdef FINSH_USING_MSH -#define PINMODE_USAGE "\r\npinMode pin_xxx mode_xxx\r\n\tpin_xxx : 1\r\n\tmode_xxx : output or input\r\n" -static void pin_mode(int argc, char *argv[]) + +static void print_usage(void) +{ + rt_kprintf("\r\npin operate command\t\n"); + rt_kprintf("Usage : pin [option] [pin_num] ...\r\n"); + rt_kprintf("option : \r\n"); + rt_kprintf("\tnum\t: get pin number from hardware pin, \r\n\t\t e.g. MSH >pin num PA16\r\n"); + rt_kprintf("\tmode\t: set pin mode to output/input/input_pullup/input_pulldown/output_od, \r\n\t\t e.g. MSH >pin mode PA16 output\r\n"); + rt_kprintf("\tread\t: read pin level of hardware pin, \r\n\t\t e.g. MSH >pin read PA16\r\n"); + rt_kprintf("\twrite\t: write pin level(high/low or on/off) to hardware pin, \r\n\t\t e.g. MSH >pin write PA16 high\r\n"); + rt_kprintf("\thelp\t: this help list\r\n"); +} + +// e.g. MSH >pin num PA16 +static void pin_get(int argc, char *argv[]) { rt_base_t pin; - rt_base_t mode; if (argc < 3) { - rt_kprintf(PINMODE_USAGE); + print_usage(); return; } - if (!rt_isint(argv[1])) + if ('P' != argv[2][0]) { - rt_kprintf(PINMODE_USAGE); + print_usage(); return; } - pin = rt_strtoint(argv[1]); - if (0 == rt_strcmp("output", argv[2])) + pin = rt_pin_get(argv[2]); + rt_kprintf("%s : %d\r\n", argv[2], pin); +} + +// e.g. MSH >pin mode PA16 output +static void pin_mode(int argc, char *argv[]) +{ + rt_base_t pin; + rt_base_t mode; + if (argc < 4) + { + print_usage(); + return; + } + if (!rt_isint(argv[2])) + { + if ('P' != argv[2][0]) + { + print_usage(); + return; + } + pin = rt_pin_get(argv[2]); + } + else + { + pin = rt_strtoint(argv[2]); + } + if (0 == rt_strcmp("output", argv[3])) { mode = PIN_MODE_OUTPUT; } - else if (0 == rt_strcmp("input", argv[2])) + else if (0 == rt_strcmp("input", argv[3])) { mode = PIN_MODE_INPUT; } + else if (0 == rt_strcmp("input_pullup", argv[3])) + { + mode = PIN_MODE_INPUT_PULLUP; + } + else if (0 == rt_strcmp("input_pulldown", argv[3])) + { + mode = PIN_MODE_INPUT_PULLDOWN; + } + else if (0 == rt_strcmp("output_od", argv[3])) + { + mode = PIN_MODE_OUTPUT_OD; + } else { - rt_kprintf(PINMODE_USAGE); + print_usage(); return; } rt_pin_mode(pin, mode); } -MSH_CMD_EXPORT_ALIAS(pin_mode, pinMode, set hardware pin mode); -#endif -void rt_pin_write(rt_base_t pin, rt_base_t value) -{ - RT_ASSERT(_hw_pin.ops != RT_NULL); - _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value); -} -#ifdef FINSH_USING_MSH -#define PINWRITE_USAGE "\r\npinWrite pin_xxx state_xxx\r\n\tpin_xxx : 1\r\n\tstate_xxx : high or low\r\n\tstate_xxx : on or off\r\n" -static void pin_write(int argc, char *argv[]) +// e.g. MSH >pin read PA16 +static void pin_read(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; if (argc < 3) { - rt_kprintf(PINWRITE_USAGE); + print_usage(); return; } - if (!rt_isint(argv[1])) + if (!rt_isint(argv[2])) { - rt_kprintf(PINWRITE_USAGE); - return; + if ('P' != argv[2][0]) + { + print_usage(); + return; + } + pin = rt_pin_get(argv[2]); } - pin = rt_strtoint(argv[1]); - if ((0 == rt_strcmp("high", argv[2])) || (0 == rt_strcmp("on", argv[2]))) + else { - value = PIN_HIGH; + pin = rt_strtoint(argv[2]); } - else if ((0 == rt_strcmp("low", argv[2])) || (0 == rt_strcmp("off", argv[2]))) + value = rt_pin_read(pin); + if (value == PIN_HIGH) { - value = PIN_LOW; + rt_kprintf("pin[%d] = on\r\n", pin); } else { - rt_kprintf(PINMODE_USAGE); - return; + rt_kprintf("pin[%d] = off\r\n", pin); } - rt_pin_write(pin, value); } -MSH_CMD_EXPORT_ALIAS(pin_write, pinWrite, write value to hardware pin); -#endif -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); -} -#ifdef FINSH_USING_MSH -#define PINREAD_USAGE "\r\npinRead pin_xxx\r\n\tpin_xxx : 1\r\n" -static void pin_read(int argc, char *argv[]) +// e.g. MSH >pin write PA16 high +static void pin_write(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; - if (argc < 2) + if (argc < 4) { - rt_kprintf(PINREAD_USAGE); + print_usage(); return; } - if (!rt_isint(argv[1])) + if (!rt_isint(argv[2])) { - rt_kprintf(PINREAD_USAGE); - return; + if ('P' != argv[2][0]) + { + print_usage(); + return; + } + pin = rt_pin_get(argv[2]); } - pin = rt_strtoint(argv[1]); - value = rt_pin_read(pin); - if (value == PIN_HIGH) + else { - rt_kprintf("pin[%d] = on\r\n", pin); + pin = rt_strtoint(argv[2]); + } + if ((0 == rt_strcmp("high", argv[3])) || (0 == rt_strcmp("on", argv[3]))) + { + value = PIN_HIGH; + } + else if ((0 == rt_strcmp("low", argv[3])) || (0 == rt_strcmp("off", argv[3]))) + { + value = PIN_LOW; } else { - rt_kprintf("pin[%d] = off\r\n", pin); + print_usage(); + return; } + rt_pin_write(pin, value); } -MSH_CMD_EXPORT_ALIAS(pin_read, pinRead, read status from hardware pin); -#endif -rt_base_t rt_pin_get(const char *name) +static void pin_cmd(int argc, char *argv[]) { - RT_ASSERT(_hw_pin.ops != RT_NULL); - RT_ASSERT(name[0] == 'P'); - - if (_hw_pin.ops->pin_get == RT_NULL) + if (argc < 3) { - return -RT_ENOSYS; + print_usage(); + return ; } - - return _hw_pin.ops->pin_get(name); -} -#ifdef FINSH_USING_MSH -#define PINGET_USAGE "\r\npinGet PortString\r\n\tPortString : PA0\r\n" -static void pin_get(int argc, char *argv[]) -{ - rt_base_t pin; - if (argc < 2) + if (0 == rt_strcmp("num", argv[1])) + { + pin_get(argc, argv); + } + else if (0 == rt_strcmp("mode", argv[1])) + { + pin_mode(argc, argv); + } + else if (0 == rt_strcmp("read", argv[1])) + { + pin_read(argc, argv); + } + else if (0 == rt_strcmp("write", argv[1])) + { + pin_write(argc, argv); + } + else { - rt_kprintf(PINGET_USAGE); + print_usage(); return; } - pin = rt_pin_get(argv[1]); - rt_kprintf("%s : %d\r\n", argv[1], pin); } -MSH_CMD_EXPORT_ALIAS(pin_get, pinGet, get pin number from hardware pin); +MSH_CMD_EXPORT_ALIAS(pin_cmd, pin, pin operate command); #endif From cc7f2f8b802fd4bfb7a25523b169e52925e24361 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 10:24:19 +0800 Subject: [PATCH 05/15] format code --- components/drivers/misc/pin.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 1daf87b7f80..6f2691a6a03 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -173,17 +173,17 @@ rt_base_t rt_pin_get(const char *name) static void print_usage(void) { - rt_kprintf("\r\npin operate command\t\n"); - rt_kprintf("Usage : pin [option] [pin_num] ...\r\n"); - rt_kprintf("option : \r\n"); - rt_kprintf("\tnum\t: get pin number from hardware pin, \r\n\t\t e.g. MSH >pin num PA16\r\n"); - rt_kprintf("\tmode\t: set pin mode to output/input/input_pullup/input_pulldown/output_od, \r\n\t\t e.g. MSH >pin mode PA16 output\r\n"); - rt_kprintf("\tread\t: read pin level of hardware pin, \r\n\t\t e.g. MSH >pin read PA16\r\n"); - rt_kprintf("\twrite\t: write pin level(high/low or on/off) to hardware pin, \r\n\t\t e.g. MSH >pin write PA16 high\r\n"); - rt_kprintf("\thelp\t: this help list\r\n"); + rt_kprintf("\npin operate command\n"); + rt_kprintf("Usage : pin [option] [pin_num] ...\n"); + rt_kprintf("option : \n"); + rt_kprintf("\tnum\t: get pin number from hardware pin, \n\t\t e.g. MSH >pin num PA16\n"); + rt_kprintf("\tmode\t: set pin mode to output/input/input_pullup/input_pulldown/output_od, \n\t\t e.g. MSH >pin mode PA16 output\n"); + rt_kprintf("\tread\t: read pin level of hardware pin, \n\t\t e.g. MSH >pin read PA16\n"); + rt_kprintf("\twrite\t: write pin level(high/low or on/off) to hardware pin, \n\t\t e.g. MSH >pin write PA16 high\n"); + rt_kprintf("\thelp\t: this help list\n"); } -// e.g. MSH >pin num PA16 +/*e.g. MSH >pin num PA16*/ static void pin_get(int argc, char *argv[]) { rt_base_t pin; @@ -198,10 +198,10 @@ static void pin_get(int argc, char *argv[]) return; } pin = rt_pin_get(argv[2]); - rt_kprintf("%s : %d\r\n", argv[2], pin); + rt_kprintf("%s : %d\n", argv[2], pin); } -// e.g. MSH >pin mode PA16 output +/*e.g. MSH >pin mode PA16 output*/ static void pin_mode(int argc, char *argv[]) { rt_base_t pin; @@ -235,7 +235,7 @@ static void pin_mode(int argc, char *argv[]) else if (0 == rt_strcmp("input_pullup", argv[3])) { mode = PIN_MODE_INPUT_PULLUP; - } + } else if (0 == rt_strcmp("input_pulldown", argv[3])) { mode = PIN_MODE_INPUT_PULLDOWN; @@ -253,7 +253,7 @@ static void pin_mode(int argc, char *argv[]) rt_pin_mode(pin, mode); } -// e.g. MSH >pin read PA16 +/*e.g. MSH >pin read PA16*/ static void pin_read(int argc, char *argv[]) { rt_base_t pin; @@ -279,15 +279,15 @@ static void pin_read(int argc, char *argv[]) value = rt_pin_read(pin); if (value == PIN_HIGH) { - rt_kprintf("pin[%d] = on\r\n", pin); + rt_kprintf("pin[%d] = on\n", pin); } else { - rt_kprintf("pin[%d] = off\r\n", pin); + rt_kprintf("pin[%d] = off\n", pin); } } -// e.g. MSH >pin write PA16 high +/*e.g. MSH >pin write PA16 high*/ static void pin_write(int argc, char *argv[]) { rt_base_t pin; From f38c706fa48fac694b2bb31ee16c2e7a9e8b8630 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 10:33:58 +0800 Subject: [PATCH 06/15] delete RTM_EXPORT --- src/kservice.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/kservice.c b/src/kservice.c index d0317bd13c6..3016984078e 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -671,7 +671,6 @@ rt_bool_t rt_isint(char *strvalue) } return RT_TRUE; } -RTM_EXPORT(rt_isint); /** * This function will transform for string to integer. @@ -701,7 +700,6 @@ int rt_strtoint(char *strvalue) } return value * sign; } -RTM_EXPORT(rt_strtoint); /** * This function will check hex. @@ -736,7 +734,6 @@ rt_bool_t rt_ishex(char *strvalue) } return RT_TRUE; } -RTM_EXPORT(rt_ishex); /** * This function will transform for string to hex. @@ -758,7 +755,6 @@ int rt_strtohex(char *strvalue) } return value; } -RTM_EXPORT(rt_strtohex); /** * This function will show the version of rt-thread rtos From c559d0e49c35267f79946b624918da86b51e9b6d Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 11:44:31 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86rt=5Fishex?= =?UTF-8?q?=E7=AD=89=E5=87=BD=E6=95=B0=E7=9A=84=E5=90=8D=E5=AD=97=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/misc/pin.c | 13 +-- components/finsh/SConscript | 1 + components/finsh/msh_parse.c | 158 ++++++++++++++++++++++++++++++++++ components/finsh/msh_parse.h | 21 +++++ include/rtthread.h | 4 - src/kservice.c | 147 ------------------------------- 6 files changed, 187 insertions(+), 157 deletions(-) create mode 100644 components/finsh/msh_parse.c create mode 100644 components/finsh/msh_parse.h diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 6f2691a6a03..e236cbc9b9b 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -14,6 +14,7 @@ #ifdef RT_USING_FINSH #include +#include #endif static struct rt_device_pin _hw_pin; @@ -211,7 +212,7 @@ static void pin_mode(int argc, char *argv[]) print_usage(); return; } - if (!rt_isint(argv[2])) + if (!msh_isint(argv[2])) { if ('P' != argv[2][0]) { @@ -222,7 +223,7 @@ static void pin_mode(int argc, char *argv[]) } else { - pin = rt_strtoint(argv[2]); + pin = msh_strtoint(argv[2]); } if (0 == rt_strcmp("output", argv[3])) { @@ -263,7 +264,7 @@ static void pin_read(int argc, char *argv[]) print_usage(); return; } - if (!rt_isint(argv[2])) + if (!msh_isint(argv[2])) { if ('P' != argv[2][0]) { @@ -274,7 +275,7 @@ static void pin_read(int argc, char *argv[]) } else { - pin = rt_strtoint(argv[2]); + pin = msh_strtoint(argv[2]); } value = rt_pin_read(pin); if (value == PIN_HIGH) @@ -297,7 +298,7 @@ static void pin_write(int argc, char *argv[]) print_usage(); return; } - if (!rt_isint(argv[2])) + if (!msh_isint(argv[2])) { if ('P' != argv[2][0]) { @@ -308,7 +309,7 @@ static void pin_write(int argc, char *argv[]) } else { - pin = rt_strtoint(argv[2]); + pin = msh_strtoint(argv[2]); } if ((0 == rt_strcmp("high", argv[3])) || (0 == rt_strcmp("on", argv[3]))) { diff --git a/components/finsh/SConscript b/components/finsh/SConscript index 9b2faa2283a..70f8e5608cf 100644 --- a/components/finsh/SConscript +++ b/components/finsh/SConscript @@ -4,6 +4,7 @@ cwd = GetCurrentDir() src = Split(''' shell.c msh.c +msh_parse.c ''') if GetDepend('MSH_USING_BUILT_IN_COMMANDS'): diff --git a/components/finsh/msh_parse.c b/components/finsh/msh_parse.c new file mode 100644 index 00000000000..f58672a40b6 --- /dev/null +++ b/components/finsh/msh_parse.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-05-25 WangQiang the first verion for msh parse + */ + +#include + +#define forstrloop(str) for (; '\0' != *(str); (str)++) + +/** + * This function will tolower. + * + * @param c char + * + * @return tolower char + */ +int msh_tolower(int c) +{ + int temp = 'a' - 'A'; + + if ((c < 'A') || (c > 'Z')) + { + return c; + } + return (c + temp); +} + +/** + * This function will check digit. + * + * @param c char + * + * @return true or false + */ +rt_bool_t msh_isdigit(int ch) +{ + if ((ch >= '0') && (ch <= '9')) + { + return RT_TRUE; + } + return RT_FALSE; +} + +/** + * This function will check integer. + * + * @param strvalue string + * + * @return true or false + */ +rt_bool_t msh_isint(char *strvalue) +{ + if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) + { + return RT_FALSE; + } + if (('+' == *strvalue) || ('-' == *strvalue)) + { + strvalue++; + } + forstrloop(strvalue) + { + if (!msh_isdigit(*strvalue)) + { + return RT_FALSE; + } + } + return RT_TRUE; +} + +/** + * This function will transform for string to integer. + * + * @param strvalue string + * + * @return true or false + */ +int msh_strtoint(char *strvalue) +{ + int value = 0; + int sign = 1; + if ('-' == *strvalue) + { + sign = -1; + strvalue++; + } + else if ('+' == *strvalue) + { + strvalue++; + } + + forstrloop(strvalue) + { + value *= 10; + value += *strvalue - '0'; + } + return value * sign; +} + +/** + * This function will check hex. + * + * @param strvalue string + * + * @return true or false + */ +rt_bool_t msh_ishex(char *strvalue) +{ + char c; + if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) + { + return RT_FALSE; + } + if ('0' != *(strvalue++)) + { + return RT_FALSE; + } + if ('x' != *(strvalue++)) + { + return RT_FALSE; + } + + forstrloop(strvalue) + { + c = msh_tolower(*strvalue); + if (!msh_isdigit(c) && ((c < 'a') || (c > 'f'))) + { + return RT_FALSE; + } + } + return RT_TRUE; +} + +/** + * This function will transform for string to hex. + * + * @param strvalue string + * + * @return true or false + */ +int msh_strtohex(char *strvalue) +{ + char c = 0; + int value = 0; + strvalue += 2; + forstrloop(strvalue) + { + value *= 16; + c = msh_tolower(*strvalue); + value += msh_isdigit(c) ? c - '0' : c - 'a' + 10; + } + return value; +} diff --git a/components/finsh/msh_parse.h b/components/finsh/msh_parse.h new file mode 100644 index 00000000000..2c1dc43489a --- /dev/null +++ b/components/finsh/msh_parse.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-05-25 WangQiang the first verion for msh parse + */ + +#ifndef MSH_PARSE_H +#define MSH_PARSE_H + +#include + +rt_bool_t msh_isint(char *strvalue); +int msh_strtoint(char *strvalue); +rt_bool_t msh_ishex(char *strvalue); +int msh_strtohex(char *strvalue); + +#endif /* MSH_PARSE_H */ \ No newline at end of file diff --git a/include/rtthread.h b/include/rtthread.h index 77b71a3059d..cda7da773bc 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -631,10 +631,6 @@ rt_size_t rt_strlen(const char *src); #define rt_strlen(src) strlen(src) #endif /*RT_KSERVICE_USING_STDLIB*/ -rt_bool_t rt_isint(char *strvalue); -int rt_strtoint(char *strvalue); -rt_bool_t rt_ishex(char *strvalue); -int rt_strtohex(char *strvalue); char *rt_strdup(const char *s); diff --git a/src/kservice.c b/src/kservice.c index 3016984078e..3b43b78c409 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -609,153 +609,6 @@ char *strdup(const char *s) __attribute__((alias("rt_strdup"))); #endif /* __ARMCC_VERSION */ #endif /* RT_USING_HEAP */ -#define forstrloop(str) for (; '\0' != *(str); (str)++) - -/** - * This function will tolower. - * - * @param c char - * - * @return tolower char - */ -int rt_tolower(int c) -{ - int temp = 'a' - 'A'; - - if ((c < 'A') || (c > 'Z')) - { - return c; - } - return (c + temp); -} - -/** - * This function will check digit. - * - * @param c char - * - * @return true or false - */ -rt_bool_t rt_isdigit(int ch) -{ - if ((ch >= '0') && (ch <= '9')) - { - return RT_TRUE; - } - return RT_FALSE; -} - -/** - * This function will check integer. - * - * @param strvalue string - * - * @return true or false - */ -rt_bool_t rt_isint(char *strvalue) -{ - if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) - { - return RT_FALSE; - } - if (('+' == *strvalue) || ('-' == *strvalue)) - { - strvalue++; - } - forstrloop(strvalue) - { - if (!rt_isdigit(*strvalue)) - { - return RT_FALSE; - } - } - return RT_TRUE; -} - -/** - * This function will transform for string to integer. - * - * @param strvalue string - * - * @return true or false - */ -int rt_strtoint(char *strvalue) -{ - int value = 0; - int sign = 1; - if ('-' == *strvalue) - { - sign = -1; - strvalue++; - } - else if ('+' == *strvalue) - { - strvalue++; - } - - forstrloop(strvalue) - { - value *= 10; - value += *strvalue - '0'; - } - return value * sign; -} - -/** - * This function will check hex. - * - * @param strvalue string - * - * @return true or false - */ -rt_bool_t rt_ishex(char *strvalue) -{ - char c; - if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) - { - return RT_FALSE; - } - if ('0' != *(strvalue++)) - { - return RT_FALSE; - } - if ('x' != *(strvalue++)) - { - return RT_FALSE; - } - - forstrloop(strvalue) - { - c = rt_tolower(*strvalue); - if (!rt_isdigit(c) && ((c < 'a') || (c > 'f'))) - { - return RT_FALSE; - } - } - return RT_TRUE; -} - -/** - * This function will transform for string to hex. - * - * @param strvalue string - * - * @return true or false - */ -int rt_strtohex(char *strvalue) -{ - char c = 0; - int value = 0; - strvalue += 2; - forstrloop(strvalue) - { - value *= 16; - c = rt_tolower(*strvalue); - value += rt_isdigit(c) ? c - '0' : c - 'a' + 10; - } - return value; -} - /** * This function will show the version of rt-thread rtos */ From 67d8e09cbb904a905cb08c70ba716a1d5ac1de5a Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 12:01:59 +0800 Subject: [PATCH 08/15] format --- components/drivers/misc/pin.c | 3 +-- components/finsh/msh_parse.h | 2 +- include/rtthread.h | 1 - src/kservice.c | 1 - 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index e236cbc9b9b..49ec1f312cd 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -166,7 +166,6 @@ rt_base_t rt_pin_get(const char *name) { return -RT_ENOSYS; } - return _hw_pin.ops->pin_get(name); } @@ -357,4 +356,4 @@ static void pin_cmd(int argc, char *argv[]) } } MSH_CMD_EXPORT_ALIAS(pin_cmd, pin, pin operate command); -#endif +#endif /* FINSH_USING_MSH */ diff --git a/components/finsh/msh_parse.h b/components/finsh/msh_parse.h index 2c1dc43489a..68e926de467 100644 --- a/components/finsh/msh_parse.h +++ b/components/finsh/msh_parse.h @@ -18,4 +18,4 @@ int msh_strtoint(char *strvalue); rt_bool_t msh_ishex(char *strvalue); int msh_strtohex(char *strvalue); -#endif /* MSH_PARSE_H */ \ No newline at end of file +#endif /* MSH_PARSE_H */ diff --git a/include/rtthread.h b/include/rtthread.h index cda7da773bc..8d4f740e8ca 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -631,7 +631,6 @@ rt_size_t rt_strlen(const char *src); #define rt_strlen(src) strlen(src) #endif /*RT_KSERVICE_USING_STDLIB*/ - char *rt_strdup(const char *s); #if !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION) diff --git a/src/kservice.c b/src/kservice.c index 3b43b78c409..f1df8a179d2 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -20,7 +20,6 @@ * 2021-02-28 Meco Man add RT_KSERVICE_USING_STDLIB * 2021-12-20 Meco Man implement rt_strcpy() * 2022-01-07 Gabriel add __on_rt_assert_hook - * 2022-04-29 WangQiang add some function for process arguments in MSH */ #include From e3a143bfc27e17ae4b60adf2fc1a2a53c0e1ea34 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 14:32:40 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E5=B0=BD=E9=87=8F=E4=BD=BF=E7=94=A8C?= =?UTF-8?q?=E5=BA=93=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/msh_parse.c | 74 +++--------------------------------- components/finsh/msh_parse.h | 3 +- 2 files changed, 8 insertions(+), 69 deletions(-) diff --git a/components/finsh/msh_parse.c b/components/finsh/msh_parse.c index f58672a40b6..f677f35b7e0 100644 --- a/components/finsh/msh_parse.c +++ b/components/finsh/msh_parse.c @@ -9,43 +9,10 @@ */ #include +#include #define forstrloop(str) for (; '\0' != *(str); (str)++) -/** - * This function will tolower. - * - * @param c char - * - * @return tolower char - */ -int msh_tolower(int c) -{ - int temp = 'a' - 'A'; - - if ((c < 'A') || (c > 'Z')) - { - return c; - } - return (c + temp); -} - -/** - * This function will check digit. - * - * @param c char - * - * @return true or false - */ -rt_bool_t msh_isdigit(int ch) -{ - if ((ch >= '0') && (ch <= '9')) - { - return RT_TRUE; - } - return RT_FALSE; -} - /** * This function will check integer. * @@ -65,7 +32,7 @@ rt_bool_t msh_isint(char *strvalue) } forstrloop(strvalue) { - if (!msh_isdigit(*strvalue)) + if (!isdigit(*strvalue)) { return RT_FALSE; } @@ -73,35 +40,6 @@ rt_bool_t msh_isint(char *strvalue) return RT_TRUE; } -/** - * This function will transform for string to integer. - * - * @param strvalue string - * - * @return true or false - */ -int msh_strtoint(char *strvalue) -{ - int value = 0; - int sign = 1; - if ('-' == *strvalue) - { - sign = -1; - strvalue++; - } - else if ('+' == *strvalue) - { - strvalue++; - } - - forstrloop(strvalue) - { - value *= 10; - value += *strvalue - '0'; - } - return value * sign; -} - /** * This function will check hex. * @@ -127,8 +65,8 @@ rt_bool_t msh_ishex(char *strvalue) forstrloop(strvalue) { - c = msh_tolower(*strvalue); - if (!msh_isdigit(c) && ((c < 'a') || (c > 'f'))) + c = tolower(*strvalue); + if (!isxdigit(c)) { return RT_FALSE; } @@ -151,8 +89,8 @@ int msh_strtohex(char *strvalue) forstrloop(strvalue) { value *= 16; - c = msh_tolower(*strvalue); - value += msh_isdigit(c) ? c - '0' : c - 'a' + 10; + c = tolower(*strvalue); + value += isdigit(c) ? c - '0' : c - 'a' + 10; } return value; } diff --git a/components/finsh/msh_parse.h b/components/finsh/msh_parse.h index 68e926de467..b8d3fc530ec 100644 --- a/components/finsh/msh_parse.h +++ b/components/finsh/msh_parse.h @@ -12,9 +12,10 @@ #define MSH_PARSE_H #include +#include rt_bool_t msh_isint(char *strvalue); -int msh_strtoint(char *strvalue); +#define msh_strtoint atoi rt_bool_t msh_ishex(char *strvalue); int msh_strtohex(char *strvalue); From ed3c0783a4ceb90a986190b81e978db1e9c40400 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Wed, 25 May 2022 14:42:09 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=99=A8=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/msh_parse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/finsh/msh_parse.c b/components/finsh/msh_parse.c index f677f35b7e0..a0f5f5e96d9 100644 --- a/components/finsh/msh_parse.c +++ b/components/finsh/msh_parse.c @@ -32,7 +32,7 @@ rt_bool_t msh_isint(char *strvalue) } forstrloop(strvalue) { - if (!isdigit(*strvalue)) + if (!isdigit((int)(*strvalue))) { return RT_FALSE; } @@ -49,7 +49,7 @@ rt_bool_t msh_isint(char *strvalue) */ rt_bool_t msh_ishex(char *strvalue) { - char c; + int c; if ((RT_NULL == strvalue) || ('\0' == strvalue[0])) { return RT_FALSE; From b26324dc010885800976f5b997bf8db5a6bae398 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Fri, 27 May 2022 18:23:38 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86Port=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E5=90=88=E6=B3=95=E6=80=A7=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/misc/pin.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 49ec1f312cd..dd1d7ff3aeb 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -198,6 +198,11 @@ static void pin_get(int argc, char *argv[]) return; } pin = rt_pin_get(argv[2]); + if (pin < 0) + { + rt_kprintf("Parameter invalid : %s!\n", argv[2]); + return ; + } rt_kprintf("%s : %d\n", argv[2], pin); } @@ -219,6 +224,11 @@ static void pin_mode(int argc, char *argv[]) return; } pin = rt_pin_get(argv[2]); + if (pin < 0) + { + rt_kprintf("Parameter invalid : %s!\n", argv[2]); + return; + } } else { @@ -271,6 +281,11 @@ static void pin_read(int argc, char *argv[]) return; } pin = rt_pin_get(argv[2]); + if (pin < 0) + { + rt_kprintf("Parameter invalid : %s!\n", argv[2]); + return; + } } else { @@ -305,6 +320,11 @@ static void pin_write(int argc, char *argv[]) return; } pin = rt_pin_get(argv[2]); + if (pin < 0) + { + rt_kprintf("Parameter invalid : %s!\n", argv[2]); + return; + } } else { From bf2a8b50cf2a0bc063bffe48a59b2a119f57578a Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sun, 29 May 2022 03:36:17 -0400 Subject: [PATCH 12/15] update codes --- bsp/stm32/libraries/HAL_Drivers/drv_gpio.c | 1 + components/drivers/misc/pin.c | 51 ++++++++-------------- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c b/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c index ee06f26003f..b50819f5790 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c @@ -161,6 +161,7 @@ static uint32_t pin_irq_enable_mask = 0; #define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) +/* e.g. PE.7 */ static rt_base_t stm32_pin_get(const char *name) { rt_base_t pin = 0; diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index dd1d7ff3aeb..e04077a1f06 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -160,8 +160,11 @@ int rt_pin_read(rt_base_t pin) rt_base_t rt_pin_get(const char *name) { RT_ASSERT(_hw_pin.ops != RT_NULL); - RT_ASSERT(name[0] == 'P'); + if (name[0] != 'P' && name[0] != 'p') + { + return -RT_EINVAL; + } if (_hw_pin.ops->pin_get == RT_NULL) { return -RT_ENOSYS; @@ -173,17 +176,15 @@ rt_base_t rt_pin_get(const char *name) static void print_usage(void) { - rt_kprintf("\npin operate command\n"); - rt_kprintf("Usage : pin [option] [pin_num] ...\n"); - rt_kprintf("option : \n"); - rt_kprintf("\tnum\t: get pin number from hardware pin, \n\t\t e.g. MSH >pin num PA16\n"); - rt_kprintf("\tmode\t: set pin mode to output/input/input_pullup/input_pulldown/output_od, \n\t\t e.g. MSH >pin mode PA16 output\n"); - rt_kprintf("\tread\t: read pin level of hardware pin, \n\t\t e.g. MSH >pin read PA16\n"); - rt_kprintf("\twrite\t: write pin level(high/low or on/off) to hardware pin, \n\t\t e.g. MSH >pin write PA16 high\n"); - rt_kprintf("\thelp\t: this help list\n"); + rt_kprintf("pin [option]\n"); + rt_kprintf(" num: get pin number from hardware pin\n e.g. MSH >pin num PA16\n"); + rt_kprintf(" mode: set pin mode to output/input/input_pullup/input_pulldown/output_od\n e.g. MSH >pin mode PA16 output\n"); + rt_kprintf(" read: read pin level of hardware pin\n e.g. MSH >pin read PA16\n"); + rt_kprintf(" write: write pin level(high/low or on/off) to hardware pin\n e.g. MSH >pin write PA16 high\n"); + rt_kprintf(" help: this help list\n"); } -/*e.g. MSH >pin num PA16*/ +/* e.g. MSH >pin num PA16 */ static void pin_get(int argc, char *argv[]) { rt_base_t pin; @@ -192,21 +193,17 @@ static void pin_get(int argc, char *argv[]) print_usage(); return; } - if ('P' != argv[2][0]) - { - print_usage(); - return; - } pin = rt_pin_get(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); + print_usage(); return ; } rt_kprintf("%s : %d\n", argv[2], pin); } -/*e.g. MSH >pin mode PA16 output*/ +/* e.g. MSH >pin mode PA16 output */ static void pin_mode(int argc, char *argv[]) { rt_base_t pin; @@ -218,15 +215,11 @@ static void pin_mode(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - if ('P' != argv[2][0]) - { - print_usage(); - return; - } pin = rt_pin_get(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); + print_usage(); return; } } @@ -263,7 +256,7 @@ static void pin_mode(int argc, char *argv[]) rt_pin_mode(pin, mode); } -/*e.g. MSH >pin read PA16*/ +/* e.g. MSH >pin read PA16 */ static void pin_read(int argc, char *argv[]) { rt_base_t pin; @@ -275,15 +268,11 @@ static void pin_read(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - if ('P' != argv[2][0]) - { - print_usage(); - return; - } pin = rt_pin_get(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); + print_usage(); return; } } @@ -302,7 +291,7 @@ static void pin_read(int argc, char *argv[]) } } -/*e.g. MSH >pin write PA16 high*/ +/* e.g. MSH >pin write PA16 high */ static void pin_write(int argc, char *argv[]) { rt_base_t pin; @@ -314,15 +303,11 @@ static void pin_write(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - if ('P' != argv[2][0]) - { - print_usage(); - return; - } pin = rt_pin_get(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); + print_usage(); return; } } From 8d76e5408e2c9a92b1dc1694df4ab98df6dcb80c Mon Sep 17 00:00:00 2001 From: wangqiang Date: Sun, 29 May 2022 17:17:02 +0800 Subject: [PATCH 13/15] =?UTF-8?q?modify=20at32=E2=80=94=5Fpin=5Fget=20same?= =?UTF-8?q?=20with=20stm32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/at32/libraries/rt_drivers/drv_gpio.c | 47 +++++++++++++----------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/bsp/at32/libraries/rt_drivers/drv_gpio.c b/bsp/at32/libraries/rt_drivers/drv_gpio.c index e15063c1317..94174463675 100644 --- a/bsp/at32/libraries/rt_drivers/drv_gpio.c +++ b/bsp/at32/libraries/rt_drivers/drv_gpio.c @@ -104,33 +104,38 @@ static uint32_t pin_irq_enable_mask = 0; static rt_base_t at32_pin_get(const char *name) { - rt_base_t pin = -1; - rt_base_t port, index; - int32_t cnt = 0; - if (((name[1] >= 'A') && (name[1] <= 'Z')) || ((name[1] >= 'a') && (name[1] <= 'z'))) + rt_base_t pin = 0; + int hw_port_num, hw_pin_num = 0; + int i, name_len; + + name_len = rt_strlen(name); + + if ((name_len < 4) || (name_len >= 6)) { - if (name[1] >= 'A') - { - port = name[1] - 'A'; - } - else - { - port = name[1] - 'a'; - } - cnt++; + return -RT_EINVAL; } - if (((name[2] >= '0') && (name[2] <= '9')) && ((name[3] >= '0') && (name[3] <= '9'))) + if ((name[0] != 'P') || (name[2] != '.')) { - index = name[2] - '0'; - index *= 10; - index += name[3] - '0'; - cnt++; + return -RT_EINVAL; } - if (cnt < 2) + + if ((name[1] >= 'A') && (name[1] <= 'Z')) { - return pin; + hw_port_num = (int)(name[1] - 'A'); } - pin = PIN_NUM(port, index); + else + { + return -RT_EINVAL; + } + + for (i = 3; i < name_len; i++) + { + hw_pin_num *= 10; + hw_pin_num += name[i] - '0'; + } + + pin = PIN_NUM(hw_port_num, hw_pin_num); + return pin; } From 35107c53ec8a8232415fb5adc8ee282b9e1bcb78 Mon Sep 17 00:00:00 2001 From: wangqiang Date: Sun, 29 May 2022 18:08:42 +0800 Subject: [PATCH 14/15] add convert function for port name, support PE02, PE2, PE.02, PE.2, pe02, pe2, pe.02, pe.2 --- components/drivers/misc/pin.c | 27 +++++++++++++++++++++++---- components/finsh/msh_parse.h | 1 + 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index e04077a1f06..913e4f1ac1f 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -15,6 +15,7 @@ #ifdef RT_USING_FINSH #include #include +#include #endif static struct rt_device_pin _hw_pin; @@ -174,6 +175,24 @@ rt_base_t rt_pin_get(const char *name) #ifdef FINSH_USING_MSH +static rt_base_t rt_pin_conv(const char *name) +{ + int size = 0; + char format_name[6] = { 0 }; + format_name[0] = toupper(name[0]); + format_name[1] = toupper(name[1]); + + size = rt_strlen(name); + size = (size > 5) ? 5 : size; + size -= 2; + if (name[2] != '.') + { + format_name[2] = '.'; + } + strncat(format_name, name + 2, size); + return rt_pin_get(format_name); +} + static void print_usage(void) { rt_kprintf("pin [option]\n"); @@ -193,7 +212,7 @@ static void pin_get(int argc, char *argv[]) print_usage(); return; } - pin = rt_pin_get(argv[2]); + pin = rt_pin_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); @@ -215,7 +234,7 @@ static void pin_mode(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - pin = rt_pin_get(argv[2]); + pin = rt_pin_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); @@ -268,7 +287,7 @@ static void pin_read(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - pin = rt_pin_get(argv[2]); + pin = rt_pin_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); @@ -303,7 +322,7 @@ static void pin_write(int argc, char *argv[]) } if (!msh_isint(argv[2])) { - pin = rt_pin_get(argv[2]); + pin = rt_pin_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); diff --git a/components/finsh/msh_parse.h b/components/finsh/msh_parse.h index b8d3fc530ec..1d48c5e58ae 100644 --- a/components/finsh/msh_parse.h +++ b/components/finsh/msh_parse.h @@ -13,6 +13,7 @@ #include #include +#include rt_bool_t msh_isint(char *strvalue); #define msh_strtoint atoi From 3d7a980f9818d9524a5b8bd7011e4923728f009e Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sun, 29 May 2022 14:36:42 -0400 Subject: [PATCH 15/15] update codes --- components/drivers/misc/pin.c | 101 ++++++++++++++++++---------------- components/finsh/finsh.h | 12 ++-- components/finsh/msh_parse.h | 5 +- 3 files changed, 60 insertions(+), 58 deletions(-) diff --git a/components/drivers/misc/pin.c b/components/drivers/misc/pin.c index 913e4f1ac1f..91913dccfdd 100644 --- a/components/drivers/misc/pin.c +++ b/components/drivers/misc/pin.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -12,12 +12,6 @@ #include -#ifdef RT_USING_FINSH -#include -#include -#include -#endif - static struct rt_device_pin _hw_pin; static rt_size_t _pin_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) { @@ -173,9 +167,18 @@ rt_base_t rt_pin_get(const char *name) return _hw_pin.ops->pin_get(name); } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH +#include +#include +#include +#include +#include -static rt_base_t rt_pin_conv(const char *name) +/* + * convert function for port name + * support PE02, PE2, PE.02, PE.2, pe02, pe2, pe.02, pe.2 + */ +static rt_base_t _pin_cmd_conv(const char *name) { int size = 0; char format_name[6] = { 0 }; @@ -193,58 +196,60 @@ static rt_base_t rt_pin_conv(const char *name) return rt_pin_get(format_name); } -static void print_usage(void) +static void _pin_cmd_print_usage(void) { rt_kprintf("pin [option]\n"); - rt_kprintf(" num: get pin number from hardware pin\n e.g. MSH >pin num PA16\n"); - rt_kprintf(" mode: set pin mode to output/input/input_pullup/input_pulldown/output_od\n e.g. MSH >pin mode PA16 output\n"); - rt_kprintf(" read: read pin level of hardware pin\n e.g. MSH >pin read PA16\n"); - rt_kprintf(" write: write pin level(high/low or on/off) to hardware pin\n e.g. MSH >pin write PA16 high\n"); + rt_kprintf(" num: get pin number from hardware pin\n"); + rt_kprintf(" num can be PE02, PE2, PE.02, PE.2, pe02, pe2, pe.02, pe.2\n"); + rt_kprintf(" e.g. MSH >pin num PA.16\n"); + rt_kprintf(" mode: set pin mode to output/input/input_pullup/input_pulldown/output_od\n e.g. MSH >pin mode PA.16 output\n"); + rt_kprintf(" read: read pin level of hardware pin\n e.g. MSH >pin read PA.16\n"); + rt_kprintf(" write: write pin level(high/low or on/off) to hardware pin\n e.g. MSH >pin write PA.16 high\n"); rt_kprintf(" help: this help list\n"); } -/* e.g. MSH >pin num PA16 */ -static void pin_get(int argc, char *argv[]) +/* e.g. MSH >pin num PA.16 */ +static void _pin_cmd_get(int argc, char *argv[]) { rt_base_t pin; if (argc < 3) { - print_usage(); + _pin_cmd_print_usage(); return; } - pin = rt_pin_conv(argv[2]); + pin = _pin_cmd_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); - print_usage(); + _pin_cmd_print_usage(); return ; } rt_kprintf("%s : %d\n", argv[2], pin); } -/* e.g. MSH >pin mode PA16 output */ -static void pin_mode(int argc, char *argv[]) +/* e.g. MSH >pin mode PA.16 output */ +static void _pin_cmd_mode(int argc, char *argv[]) { rt_base_t pin; rt_base_t mode; if (argc < 4) { - print_usage(); + _pin_cmd_print_usage(); return; } if (!msh_isint(argv[2])) { - pin = rt_pin_conv(argv[2]); + pin = _pin_cmd_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); - print_usage(); + _pin_cmd_print_usage(); return; } } else { - pin = msh_strtoint(argv[2]); + pin = atoi(argv[2]); } if (0 == rt_strcmp("output", argv[3])) { @@ -268,36 +273,36 @@ static void pin_mode(int argc, char *argv[]) } else { - print_usage(); + _pin_cmd_print_usage(); return; } rt_pin_mode(pin, mode); } -/* e.g. MSH >pin read PA16 */ -static void pin_read(int argc, char *argv[]) +/* e.g. MSH >pin read PA.16 */ +static void _pin_cmd_read(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; if (argc < 3) { - print_usage(); + _pin_cmd_print_usage(); return; } if (!msh_isint(argv[2])) { - pin = rt_pin_conv(argv[2]); + pin = _pin_cmd_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); - print_usage(); + _pin_cmd_print_usage(); return; } } else { - pin = msh_strtoint(argv[2]); + pin = atoi(argv[2]); } value = rt_pin_read(pin); if (value == PIN_HIGH) @@ -310,29 +315,29 @@ static void pin_read(int argc, char *argv[]) } } -/* e.g. MSH >pin write PA16 high */ -static void pin_write(int argc, char *argv[]) +/* e.g. MSH >pin write PA.16 high */ +static void _pin_cmd_write(int argc, char *argv[]) { rt_base_t pin; rt_base_t value; if (argc < 4) { - print_usage(); + _pin_cmd_print_usage(); return; } if (!msh_isint(argv[2])) { - pin = rt_pin_conv(argv[2]); + pin = _pin_cmd_conv(argv[2]); if (pin < 0) { rt_kprintf("Parameter invalid : %s!\n", argv[2]); - print_usage(); + _pin_cmd_print_usage(); return; } } else { - pin = msh_strtoint(argv[2]); + pin = atoi(argv[2]); } if ((0 == rt_strcmp("high", argv[3])) || (0 == rt_strcmp("on", argv[3]))) { @@ -344,40 +349,40 @@ static void pin_write(int argc, char *argv[]) } else { - print_usage(); + _pin_cmd_print_usage(); return; } rt_pin_write(pin, value); } -static void pin_cmd(int argc, char *argv[]) +static void _pin_cmd(int argc, char *argv[]) { if (argc < 3) { - print_usage(); + _pin_cmd_print_usage(); return ; } if (0 == rt_strcmp("num", argv[1])) { - pin_get(argc, argv); + _pin_cmd_get(argc, argv); } else if (0 == rt_strcmp("mode", argv[1])) { - pin_mode(argc, argv); + _pin_cmd_mode(argc, argv); } else if (0 == rt_strcmp("read", argv[1])) { - pin_read(argc, argv); + _pin_cmd_read(argc, argv); } else if (0 == rt_strcmp("write", argv[1])) { - pin_write(argc, argv); + _pin_cmd_write(argc, argv); } else { - print_usage(); + _pin_cmd_print_usage(); return; } } -MSH_CMD_EXPORT_ALIAS(pin_cmd, pin, pin operate command); -#endif /* FINSH_USING_MSH */ +MSH_CMD_EXPORT_ALIAS(_pin_cmd, pin, pin [option]); +#endif /* RT_USING_FINSH */ diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h index 05399e18636..a26b26fb7e2 100644 --- a/components/finsh/finsh.h +++ b/components/finsh/finsh.h @@ -10,17 +10,17 @@ #ifndef __FINSH_H__ #define __FINSH_H__ -#include +#include -#if defined(_MSC_VER) - #pragma section("FSymTab$f",read) -#endif +#ifdef _MSC_VER +#pragma section("FSymTab$f",read) +#endif /* _MSC_VER */ typedef long (*syscall_func)(void); #ifdef FINSH_USING_SYMTAB #ifdef __TI_COMPILER_VERSION__ - #define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) -#endif +#define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) +#endif /* __TI_COMPILER_VERSION__ */ #ifdef FINSH_USING_DESCRIPTION #ifdef _MSC_VER #define MSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ diff --git a/components/finsh/msh_parse.h b/components/finsh/msh_parse.h index 1d48c5e58ae..ba14625e920 100644 --- a/components/finsh/msh_parse.h +++ b/components/finsh/msh_parse.h @@ -11,12 +11,9 @@ #ifndef MSH_PARSE_H #define MSH_PARSE_H -#include -#include -#include +#include rt_bool_t msh_isint(char *strvalue); -#define msh_strtoint atoi rt_bool_t msh_ishex(char *strvalue); int msh_strtohex(char *strvalue);