打印
[USB编程]

USB设备端的声明式开发范式

[复制链接]
890|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsfopen|  楼主 | 2019-12-31 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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需要实现的功能,并且提供参数,而不需要在意是怎么去实现等等的细节。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

325

帖子

8

粉丝