VSF StepByStep--(2)CDC调试输出

[复制链接]
974|0
 楼主| vsf 发表于 2018-4-18 13:39 | 显示全部楼层 |阅读模式
本帖最后由 vsf 于 2018-4-18 13:43 编辑

首先,要启动USB,实现CDC协议,模拟一个串口。USB设备协议栈应用部分参考这里:https://bbs.21ic.com/icview-2496928-1-1.html
usrapp.h
  1. struct usrapp_t
  2. {
  3.         struct
  4.         {
  5.                 struct
  6.                 {
  7.                         struct vsfusbd_CDCACM_param_t param;
  8.                         struct vsf_fifostream_t stream_tx;
  9.                         struct vsf_fifostream_t stream_rx;
  10.                         uint8_t txbuff[8 * 1024];
  11.                         uint8_t rxbuff[512 + 1];
  12.                 } cdc;
  13.                 struct vsfusbd_iface_t ifaces[2];
  14.                 struct vsfusbd_config_t config[1];
  15.                 struct vsfusbd_device_t device;
  16.         } usbd;
  17. };
这里,定义了USBD的数据结构,定义了CDC的相关参数,定义了CDC的数据流和缓冲。由于USB使用高速,所以一个USB报文是512字节。VSF中的fifo的实现方式需要实际数组长度+1,因为513字节缓冲中,实际能够写入的只有512字节。

usrapp.c
  1. struct usrapp_t usrapp =
  2. {
  3.         .usbd.cdc.param.CDC.ep_notify                        = 1,
  4.         .usbd.cdc.param.CDC.ep_out                                = 2,
  5.         .usbd.cdc.param.CDC.ep_in                                = 2,
  6.         .usbd.cdc.param.CDC.stream_tx                        = (struct vsf_stream_t *)&usrapp.usbd.cdc.stream_tx,
  7.         .usbd.cdc.param.CDC.stream_rx                        = (struct vsf_stream_t *)&usrapp.usbd.cdc.stream_rx,
  8.         .usbd.cdc.param.line_coding.bitrate                = 115200,
  9.         .usbd.cdc.param.line_coding.stopbittype        = 0,
  10.         .usbd.cdc.param.line_coding.paritytype        = 0,
  11.         .usbd.cdc.param.line_coding.datatype        = 8,
  12.         .usbd.cdc.stream_tx.stream.op                        = &fifostream_op,
  13.         .usbd.cdc.stream_tx.mem.buffer.buffer        = (uint8_t *)&usrapp.usbd.cdc.txbuff,
  14.         .usbd.cdc.stream_tx.mem.buffer.size                = sizeof(usrapp.usbd.cdc.txbuff),
  15.         .usbd.cdc.stream_rx.stream.op                        = &fifostream_op,
  16.         .usbd.cdc.stream_rx.mem.buffer.buffer        = (uint8_t *)&usrapp.usbd.cdc.rxbuff,
  17.         .usbd.cdc.stream_rx.mem.buffer.size                = sizeof(usrapp.usbd.cdc.rxbuff),
  18.         .usbd.ifaces[0].class_protocol                        = (struct vsfusbd_class_protocol_t *)&vsfusbd_CDCACMControl_class,
  19.         .usbd.ifaces[0].protocol_param                        = &usrapp.usbd.cdc.param,
  20.         .usbd.ifaces[1].class_protocol                        = (struct vsfusbd_class_protocol_t *)&vsfusbd_CDCACMData_class,
  21.         .usbd.ifaces[1].protocol_param                        = &usrapp.usbd.cdc.param,
  22.         .usbd.config[0].num_of_ifaces                        = dimof(usrapp.usbd.ifaces),
  23.         .usbd.config[0].iface                                        = usrapp.usbd.ifaces,
  24.         .usbd.device.num_of_configuration                = dimof(usrapp.usbd.config),
  25.         .usbd.device.config                                                = usrapp.usbd.config,
  26.         .usbd.device.desc_filter                                = (struct vsfusbd_desc_filter_t *)usrapp_param.usbd.StdDesc,
  27.         .usbd.device.device_class_iface                        = 0,
  28.         .usbd.device.drv                                                = (struct vsfhal_usbd_t *)&vsfhal_usbd,
  29.         .usbd.device.int_priority                                = 0xFF,
  30. };

  31. static void usrapp_heart_beat(void *p)
  32. {
  33.         vsfdbg_printf("heartbeat: %d" VSFCFG_DEBUG_LINEEND, vsfhal_tickclk_get_ms());
  34. }

  35. static void usrapp_usbd_conn(void *p)
  36. {
  37.         struct usrapp_t *app = (struct usrapp_t *)p;

  38.         vsfusbd_device_init(&app->usbd.device);
  39.         vsfusbd_connect(&app->usbd.device);
  40.         if (app_hwcfg.usbd.pullup.port != VSFHAL_DUMMY_PORT)
  41.                 vsfhal_gpio_set(app_hwcfg.usbd.pullup.port, 1 << app_hwcfg.usbd.pullup.pin);

  42.         vsftimer_create_cb(1000, -1, usrapp_heart_beat, app);
  43. }

  44. void usrapp_srt_init(struct usrapp_t *app)
  45. {
  46.         STREAM_INIT(&app->usbd.cdc.stream_rx);
  47.         STREAM_INIT(&app->usbd.cdc.stream_tx);

  48.         vsfdbg_init((struct vsf_stream_t *)&app->usbd.cdc.stream_tx);

  49.         if (app_hwcfg.usbd.pullup.port != VSFHAL_DUMMY_PORT)
  50.         {
  51.                 vsfhal_gpio_init(app_hwcfg.usbd.pullup.port);
  52.                 vsfhal_gpio_clear(app_hwcfg.usbd.pullup.port, 1 << app_hwcfg.usbd.pullup.pin);
  53.                 vsfhal_gpio_config(app_hwcfg.usbd.pullup.port, app_hwcfg.usbd.pullup.pin, VSFHAL_GPIO_OUTPP);
  54.         }
  55.         vsfusbd_disconnect(&app->usbd.device);

  56.         vsftimer_create_cb(200, 1, usrapp_usbd_conn, app);
  57. }

  58. void usrapp_initial_init(struct usrapp_t *app){}
这里,USB描述符就不贴上来了。初始化了usrapp的数据结构,设置了CDC的参数和数据流的参数。
usrapp_srt_init(软实时初始化函数)中,初始化了CDC的输入和输出流、初始化了vsfdbg调试模块、关闭了USB设备口的上拉,并且延时200ms(超时后,调用usrapp_usbd_conn)。
usrapp_usbd_conn(200ms超时后执行这个函数)中,初始化usb设备协议栈,使能USB上拉,使能1000ms心跳定时器(每隔1000ms调用usrapp_heart_beat)。
usrapp_heart_beat中,简单调用vsfdbg_printf输出调试信息,由于usrapp_srt_init中,vsfdbg模块是连接到CDC的数据流的,那么实际调试信息就是从CDC接口发送给PC的。

运行效果如下(PC上使用putty):
sbs0_cdc_printf.png

代码位于:github.com/versaloon/vsf_open/tree/master/vsf/example/vsfaio/usrapp/stepbystep/step0_printf
vsf

27

主题

60

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部