本帖最后由 vsfopen 于 2019-12-31 15:47 编辑
目前声明式的UI很火,其实,声明式的开发范式,并不应该只是UI的,而是一种通用的开发范式。
VSF最新对USB设备端开发的用户层封装了,就是用了这种开发范式。
简单说明一下,声明式的开发方式里,用户需要提供的是what,就是实现什么。而不需要在意how,也就是怎么实现。
怎么实现都是协议栈和系统的事情。
这里简单列举一些应用层的代码,第一个是基础例子,后面的例子中,红色的部分,是相对第一个例子的改动:
1. 实现1路CDC,不带数据流(只是USB部分):
#include "vsf.h"
implement_usbd(user_usbd, 0x2348, 0xA7A8, 0x0409, USB_DC_SPEED_HIGH)
implement_usbd_common_desc(user_usbd, u"VSF-USBD-Simplest", u"SimonQian", u"1.0.0", 64, USB_DESC_CDC_ACM_IAD_LEN, USB_CDC_ACM_IFS_NUM, USB_CONFIG_ATT_WAKEUP, 100)
implement_cdc_acm_desc(user_usbd, 0, 0, 1, 2, 2, 512, 16)
implement_usbd_func_desc(user_usbd)
implement_usbd_func_str_desc(user_usbd, 0, u"VSF-CDC")
implement_usbd_std_desc_table(user_usbd)
implement_usbd_func_str_desc_table(user_usbd, 0)
implement_usbd_device_func(user_usbd)
implement_cdc_acm_func(user_usbd, 0, 1, 2, 2, NULL, NULL, USB_CDC_ACM_LINECODE(115200, 8, USB_CDC_ACM_PARITY_NONE, USB_CDC_ACM_STOPBIT_1))
implement_usbd_device_ifs(user_usbd)
implement_cdc_acm_ifs(user_usbd, 0)
end_implement_usbd(user_usbd, VSF_USB_DC0)
void main(void)
{
vk_usbd_init(&user_usbd);
vk_usbd_connect(&user_usbd);
}
2. 实现2路CDC,不带数据流:
#include "vsf.h"
implement_usbd(user_usbd, 0x2348, 0xA7A8, 0x0409, USB_DC_SPEED_HIGH)
implement_usbd_common_desc(user_usbd, u"VSF-USBD-Simplest", u"SimonQian", u"1.0.0", 64, 2 * USB_DESC_CDC_ACM_IAD_LEN, 2 * USB_CDC_ACM_IFS_NUM, USB_CONFIG_ATT_WAKEUP, 100)
implement_cdc_acm_desc(user_usbd, 0, 0, 1, 2, 2, 512, 16)
implement_cdc_acm_desc(user_usbd, 1 * USB_CDC_ACM_IFS_NUM, 1, 3, 4, 4, 512, 16)
implement_usbd_func_desc(user_usbd)
implement_usbd_func_str_desc(user_usbd, 0, u"VSF-CDC0")
implement_usbd_func_str_desc(user_usbd, 1, u"VSF-CDC1")
implement_usbd_std_desc_table(user_usbd)
implement_usbd_func_str_desc_table(user_usbd, 0)
implement_usbd_func_str_desc_table(user_usbd, 1)
implement_usbd_device_func(user_usbd)
implement_cdc_acm_func(user_usbd, 0, 1, 2, 2, NULL, NULL, USB_CDC_ACM_LINECODE(115200, 8, USB_CDC_ACM_PARITY_NONE, USB_CDC_ACM_STOPBIT_1))
implement_cdc_acm_func(user_usbd, 1, 3, 4, 4, NULL, NULL, USB_CDC_ACM_LINECODE(115200, 8, USB_CDC_ACM_PARITY_NONE, USB_CDC_ACM_STOPBIT_1))
implement_usbd_device_ifs(user_usbd)
implement_cdc_acm_ifs(user_usbd, 0)
implement_cdc_acm_ifs(user_usbd, 1)
end_implement_usbd(user_usbd, VSF_USB_DC0)
void main(void)
{
vk_usbd_init(&user_usbd);
vk_usbd_connect(&user_usbd);
}
3. 实现1路CDC,实现echo功能(收发指向同一个数据流):
#include "vsf.h"
implement_mem_stream(user_usbd_cdc_acm_stream, 1024)
implement_usbd(user_usbd, 0x2348, 0xA7A8, 0x0409, USB_DC_SPEED_HIGH)
implement_usbd_common_desc(user_usbd, u"VSF-USBD-Simplest", u"SimonQian", u"1.0.0", 64, USB_DESC_CDC_ACM_IAD_LEN, USB_CDC_ACM_IFS_NUM, USB_CONFIG_ATT_WAKEUP, 100)
implement_cdc_acm_desc(user_usbd, 0, 0, 1, 2, 2, 512, 16)
implement_usbd_func_desc(user_usbd)
implement_usbd_func_str_desc(user_usbd, 0, u"VSF-CDC")
implement_usbd_std_desc_table(user_usbd)
implement_usbd_func_str_desc_table(user_usbd, 0)
implement_usbd_device_func(user_usbd)
implement_cdc_acm_func(user_usbd, 0, 1, 2, 2, &user_usbd_cdc_acm_stream, &user_usbd_cdc_acm_stream, USB_CDC_ACM_LINECODE(115200, 8, USB_CDC_ACM_PARITY_NONE, USB_CDC_ACM_STOPBIT_1))
implement_usbd_device_ifs(user_usbd)
implement_cdc_acm_ifs(user_usbd, 0)
end_implement_usbd(user_usbd, VSF_USB_DC0)
void main(void)
{
vk_usbd_init(&user_usbd);
vk_usbd_connect(&user_usbd);
}
声明式的USBD开发范式里,用户只需要提供USB需要实现的功能,并且提供参数,而不需要在意是怎么去实现等等的细节。
|