OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1744|回复: 19

STM32F429 usb Audio 增加 自定义HID

[复制链接]

  离线 

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-7-2
在线时间
6 小时
发表于 2018-4-3 16:00:17 | 显示全部楼层 |阅读模式
5金钱
最近学习STM32 USB Audio + HID复合设备, 在原子哥的 阿波罗 F4开发板上,直接在实验54 USB声卡(Slave)实验上增加自定义HID接口,插入电脑后HID接口没有成功安装设备,显示叹号:

hid failt

hid failt


/* USB AUDIO device Configuration Descriptor */
static uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE] =
{
  /* Configuration 1 */
  0x09,                                 /* bLength */
  USB_CONFIGURATION_DESCRIPTOR_TYPE,    /* bDescriptorType */
  LOBYTE(AUDIO_CONFIG_DESC_SIZE),       /* wTotalLength  109 bytes*/
  HIBYTE(AUDIO_CONFIG_DESC_SIZE),      
  0x03,//0x02,                                 /* bNumInterfaces */
  0x01,                                 /* bConfigurationValue */
  0x00,                                 /* iConfiguration */
  0xC0,                                 /* bmAttributes  BUS Powred*/
  0x32,                                 /* bMaxPower = 100 mA*/
  /* 09 byte*/

  /* USB Speaker Standard interface descriptor */
  AUDIO_INTERFACE_DESC_SIZE,            /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  0x00,                                 /* bInterfaceNumber */
  0x00,                                 /* bAlternateSetting */
  0x00,                                 /* bNumEndpoints */
  USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
  AUDIO_SUBCLASS_AUDIOCONTROL,          /* bInterfaceSubClass */
  AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
  0x00,                                 /* iInterface */
  /* 09 byte*/

  /* USB Speaker Class-specific AC Interface Descriptor */
  AUDIO_INTERFACE_DESC_SIZE,            /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_CONTROL_HEADER,                 /* bDescriptorSubtype */
  0x00,          /* 1.00 */             /* bcdADC */
  0x01,
  0x27,                                 /* wTotalLength = 39*/
  0x00,
  0x01,                                 /* bInCollection */
  0x01,                                 /* baInterfaceNr */
  /* 09 byte*/

  /* USB Speaker Input Terminal Descriptor */
  AUDIO_INPUT_TERMINAL_DESC_SIZE,       /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_CONTROL_INPUT_TERMINAL,         /* bDescriptorSubtype */
  0x01,                                 /* bTerminalID */
  0x01,                                 /* wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0101 */
  0x01,
  0x00,                                 /* bAssocTerminal */
  0x01,                                 /* bNrChannels */
  0x00,                                 /* wChannelConfig 0x0000  Mono */
  0x00,
  0x00,                                 /* iChannelNames */
  0x00,                                 /* iTerminal */
  /* 12 byte*/

  /* USB Speaker Audio Feature Unit Descriptor */
  0x09,                                 /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_CONTROL_FEATURE_UNIT,           /* bDescriptorSubtype */
  AUDIO_OUT_STREAMING_CTRL,             /* bUnitID */
  0x01,                                 /* bSourceID */
  0x01,                                 /* bControlSize */
  AUDIO_CONTROL_MUTE,                   /* bmaControls(0) */
  0x00,                                 /* bmaControls(1) */
  0x00,                                 /* iTerminal */
  /* 09 byte*/

  /*USB Speaker Output Terminal Descriptor */
  0x09,      /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_CONTROL_OUTPUT_TERMINAL,        /* bDescriptorSubtype */
  0x03,                                 /* bTerminalID */
  0x01,                                 /* wTerminalType  0x0301*/
  0x03,
  0x00,                                 /* bAssocTerminal */
  0x02,                                 /* bSourceID */
  0x00,                                 /* iTerminal */
  /* 09 byte*/

  /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
  /* Interface 1, Alternate Setting 0                                             */
  AUDIO_INTERFACE_DESC_SIZE,  /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  0x01,                                 /* bInterfaceNumber */
  0x00,                                 /* bAlternateSetting */
  0x00,                                 /* bNumEndpoints */
  USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
  AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
  AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
  0x00,                                 /* iInterface */
  /* 09 byte*/

  /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
  /* Interface 1, Alternate Setting 1                                           */
  AUDIO_INTERFACE_DESC_SIZE,  /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  0x01,                                 /* bInterfaceNumber */
  0x01,                                 /* bAlternateSetting */
  0x01,                                 /* bNumEndpoints */
  USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
  AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
  AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
  0x00,                                 /* iInterface */
  /* 09 byte*/

  /* USB Speaker Audio Streaming Interface Descriptor */
  AUDIO_STREAMING_INTERFACE_DESC_SIZE,  /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_STREAMING_GENERAL,              /* bDescriptorSubtype */
  0x01,                                 /* bTerminalLink */
  0x01,                                 /* bDelay */
  0x01,                                 /* wFormatTag AUDIO_FORMAT_PCM  0x0001*/
  0x00,
  /* 07 byte*/

  /* USB Speaker Audio Type III Format Interface Descriptor */
  0x0B,                                 /* bLength */
  AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
  AUDIO_STREAMING_FORMAT_TYPE,          /* bDescriptorSubtype */
  AUDIO_FORMAT_TYPE_III,                /* bFormatType */
  0x02,                                 /* bNrChannels */
  0x02,                                 /* bSubFrameSize :  2 Bytes per frame (16bits) */
  16,                                   /* bBitResolution (16-bits per sample) */
  0x01,                                 /* bSamFreqType only one frequency supported */
  SAMPLE_FREQ(USBD_AUDIO_FREQ),         /* Audio sampling frequency coded on 3 bytes */
  /* 11 byte*/

  /* Endpoint 1 - Standard Descriptor */
  AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
  AUDIO_OUT_EP,                         /* bEndpointAddress 1 out endpoint*/
  USB_ENDPOINT_TYPE_ISOCHRONOUS,        /* bmAttributes */
  AUDIO_PACKET_SZE(USBD_AUDIO_FREQ),    /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
  0x01,                                 /* bInterval */
  0x00,                                 /* bRefresh */
  0x00,                                 /* bSynchAddress */
  /* 09 byte*/

  /* Endpoint - Audio Streaming Descriptor*/
  AUDIO_STREAMING_ENDPOINT_DESC_SIZE,   /* bLength */
  AUDIO_ENDPOINT_DESCRIPTOR_TYPE,       /* bDescriptorType */
  AUDIO_ENDPOINT_GENERAL,               /* bDescriptor */
  0x00,                                 /* bmAttributes */
  0x00,                                 /* bLockDelayUnits */
  0x00,                                 /* wLockDelay */
  0x00,
  /* 07 byte*/

//HID Interface====================================HID Interface
  0x09,/* bLength */
  0x04,/* bDescriptorType */
  0x03,
  0x00,
  0x02,
  0x03,
  0x00,
  0x00,  //1是键盘 2是鼠标, 0x00自定义,
  0x00,

  0x09,/* bLength */
  0x21,/* bDescriptorType */
  0x00,
  0x01,
  0x00,
  0x01,
  0x22,
  0x22,
  0x00,

  0x07,/* bLength */
  0x05,/* bDescriptorType */
  HID_IN_EP,//0X85,//0x85,/*bEndpointAddress: Endpoint Address (IN)*/
  0x03,/* bmAttributes: Interrupt endpoint */
  0x20,/* wMaxPacketSize: 2 Bytes max  */
  0x00,
  0x20,/* bInterval: Polling Interval (1 ms) */

  0x07,/* bLength */
  0x05,/* bDescriptorType */
  HID_OUT_EP,//0X05,//0x05,/*bEndpointAddress: Endpoint Address (OUT)*/
  0x03,/* bmAttributes: Interrupt endpoint */
  0x20,/* wMaxPacketSize: 2 Bytes max  */
  0x00,
  0x20,/* bInterval: Polling Interval (1 ms) */


//=============================================================
} ;


请问上面的配置符这样添加HID接口有问题吗?
除了修改配置符,还要修改那些地方才能成功增加枚举HID设备呢?
谢谢!

最佳答案

查看完整内容[请看2#楼]

附件是103C8T6的例子。仅对描述符修改,端点缓冲区未正确配置,端点回调未正确配置,HID和AUDIO的通讯未配置。其中AUDIO是扬声器+麦克风 组合的
回复

使用道具 举报

  离线 

10

主题

194

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2018-3-20
在线时间
76 小时
发表于 2018-4-3 16:00:18 | 显示全部楼层
附件是103C8T6的例子。仅对描述符修改,端点缓冲区未正确配置,端点回调未正确配置,HID和AUDIO的通讯未配置。其中AUDIO是扬声器+麦克风 组合的 ProjectUSBto1HID_2AUDIO.rar (6.57 MB, 下载次数: 184)
回复

使用道具 举报

  离线 

10

主题

194

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2018-3-20
在线时间
76 小时
发表于 2018-4-3 21:47:12 来自手机 | 显示全部楼层
HID要有报告描述符的,在对应data_setup里判断,加载
回复

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-7-2
在线时间
6 小时
 楼主| 发表于 2018-4-6 11:13:55 | 显示全部楼层
孟亮 发表于 2018-4-3 21:47
HID要有报告描述符的,在对应data_setup里判断,加载

我用CubeMX生成单独的HID的可以成功和PC通讯,但是代码用的库不一样,要柔和代码有的困难,我还需要花点时间把各部分的功能理清,你的提示对我还是有帮助,谢谢!
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 2018-5-26 02:50:18 | 显示全部楼层
楼主弄出来了吗,我遇到了和你一模一样的问题
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 2018-6-3 00:11:43 | 显示全部楼层
终于弄明白了,原来是配置的最大接口数设置得太小了。在usbd_conf.h文件里面有个#define USBD_ITF_MAX_NUM                2
原来设置的是1 ,修改为2,就好了。一切正常。HID和AUDIO的composite设备完全正常运行。
困扰我好几个星期的问题终于被这么简单地解决了。为了解决这个问题,把usb协议都快翻烂了,F103,F429,F425以及F303的芯片都测试过了,圈圈的教程看了一遍又一遍,都没有找到方法。最后在今天随便乱翻代码看到这个宏定义,仔细一研究,终于解决了,实在是不容易。
回复

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-7-2
在线时间
6 小时
 楼主| 发表于 2018-7-4 20:57:02 | 显示全部楼层
youguang360 发表于 2018-6-3 00:11
终于弄明白了,原来是配置的最大接口数设置得太小了。在usbd_conf.h文件里面有个#define USBD_ITF_MAX_NUM  ...

你的开发板也是用原子哥的阿波罗 F4 吗?
回复

使用道具 举报

  离线 

1

主题

10

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-5-13
在线时间
11 小时
发表于 2018-7-18 01:20:13 | 显示全部楼层
这个和普通的usb麦克风有共同点吗?最近一直在弄usb麦克风。网上大多数都是说扬声器的。是不是麦克风太容易了?没有人弄
回复

使用道具 举报

  离线 

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-26
在线时间
22 小时
发表于 2018-8-28 18:22:48 | 显示全部楼层
youguang360 发表于 2018-6-3 00:11
终于弄明白了,原来是配置的最大接口数设置得太小了。在usbd_conf.h文件里面有个#define USBD_ITF_MAX_NUM  ...

你介不介意分享一下你怎麼做嗎?USB弄了很久也不行
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 2018-9-7 11:22:49 | 显示全部楼层
ryuki001 发表于 2018-8-28 18:22
你介不介意分享一下你怎麼做嗎?USB弄了很久也不行

你要源码还是什么,我就是在原子的usb声卡的例子上改的,增加了HID接口,困扰我很久的是一开始没找到要修改最大接口数量
回复

使用道具 举报

  离线 

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-26
在线时间
22 小时
发表于 2018-9-7 15:42:23 | 显示全部楼层
要源码,我看加一個接口有很多地方要改,改了好久還是不行,想看看是不是有什麼地方還沒改或是改錯了
回复

使用道具 举报

  离线 

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-26
在线时间
22 小时
发表于 2018-9-25 14:25:08 | 显示全部楼层
youguang360 发表于 2018-6-3 00:11
终于弄明白了,原来是配置的最大接口数设置得太小了。在usbd_conf.h文件里面有个#define USBD_ITF_MAX_NUM  ...

除了修改配置描述,加入報告描述,USBD_ITF_MAX_NUM 改為2,還有什麼需要改。我用聲卡例程修改,現在可以認出HID接口,但還是沒有收到資料
回复

使用道具 举报

  离线 

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-9-25
在线时间
1 小时
发表于 2018-9-25 15:00:31 | 显示全部楼层
学习了!!!!
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 2018-10-6 22:35:10 | 显示全部楼层
本帖最后由 youguang360 于 2018-10-6 22:37 编辑

第一次上传文件,不太会

test -声卡成功 - HID和AUDIO 复合设备成功.zip

1.88 MB, 下载次数: 7

回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 2018-10-6 22:38:15 | 显示全部楼层
ryuki001 发表于 2018-9-25 14:25
除了修改配置描述,加入報告描述,USBD_ITF_MAX_NUM 改為2,還有什麼需要改。我用聲卡例程修改,現在可以 ...

已上传,可以参考一下
回复

使用道具 举报

  离线 

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-26
在线时间
22 小时
发表于 2018-10-12 20:25:06 | 显示全部楼层
youguang360 发表于 2018-10-6 22:38
已上传,可以参考一下

謝謝你的幫助,我試了試把代碼移植到了F767的板子,同樣用了原子哥的例程跟你的例程修改。
板子HID接收是沒問題。但如果HID發送數據到電腦,main()的部份會死機,數據也沒發出去。死機後,還是可以接收數據,音頻功能還在運作。請問有沒有人知道原因?
回复

使用道具 举报

  离线 

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2018-9-27
在线时间
6 小时
发表于 2018-10-13 10:17:11 | 显示全部楼层
谢谢了,谢谢楼主
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 7 天前 | 显示全部楼层
ryuki001 发表于 2018-10-12 20:25
謝謝你的幫助,我試了試把代碼移植到了F767的板子,同樣用了原子哥的例程跟你的例程修改。
板子HID接收 ...

我用的是F4的芯片,F7的没用过,我的多次测试没有问题。看看你的是不是硬件设计有问题,或者哪里移植错了。
回复

使用道具 举报

  离线 

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-26
在线时间
22 小时
发表于 5 天前 | 显示全部楼层
youguang360 发表于 2018-10-14 12:00
我用的是F4的芯片,F7的没用过,我的多次测试没有问题。看看你的是不是硬件设计有问题,或者哪里移植错了 ...

一句句的找,發現是
USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep)
{
        .............
        .............
        USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32);
        .............
        .............
}

這句出問題,感覺好像是fifo出問題

回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-12-30
在线时间
57 小时
发表于 5 天前 | 显示全部楼层
ryuki001 发表于 2018-10-16 18:09
一句句的找,發現是
USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep)
{ ...

usb_core.c里面的代码怎么会出问题呢,这是官方给的usb库,不能修改吧。会不会是你不小心修过里面的某个代码,后来忘了。更新下usb库试试。另外我想请教一下你的音频频率设置的是多少,我现在是除了48khz都不行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-21 05:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */