Is there any way to support more than 8 endpoints when running as a USB device?

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

Is there any way to support more than 8 endpoints when running as a USB device?

跳至解决方案
3,376 次查看
EdSutter
Senior Contributor II

I've been working on a composite USB audio device that uses 6 endpoints, all good.

The last few days I've been working on something that increases the endpoint count to 9 endpoints (0-8).  I just discovered DCCPARAMS register's DEN value which is read-only is 8 and as a result the SDK rejects any attempt to set up more than 8 endpoints.  

I see the register is read-only, so I'm assuming I can't just change it to something higher than 8 (but <= 15), so is there any way around this?  Is this a limitation of the device?

标签 (1)
标记 (1)
0 项奖励
回复
1 解答
3,343 次查看
mjbcswitzerland
Specialist V

Hi Ed

The limit of 8 endpoints is a "physical" limit and not a configuration one. With 8 physical endpoints one can have 15 operational endpoints (as long as each physical (non-control) one does both IN and OUT operations)

To use IN and OUT on a single endpoint should just be a case of editing the descriptors accordingly: Instead of defining two endpoints, one as IN on endpoint X  and one as OUT on endpoint Y, specify one as IN on endpoint X and one as OUT on endpoint X. The host will then uses the same (physical) endpoint for both IN and OUT on the two operational endpoints.

If you use a VCOM just for Rx/TX data you don't need an interrupt endpoint (that is used for modem signals like RTS, CTS) and so you only need one physical endpoint (you can have 7 x VCOMs on the HSUSB of the i.MX RT and 15 on the FSUSB of the Kinetis parts).

This means that for your development you actually need
0 - control
1- CTRL
2. IN + OUT spkrphone
3. FDBK
4. IN mic
5. VCOM IN + OUT

and then you have still 2 left for further features - eg. an RNDIS interface for monitoring and configuration via web browser
6. RNDIS data
7. RNDIS interrupt


In the uTasker project I have two defines:
#define USB_SIMPLEX_ENDPOINTS
#define CDC_WITHOUT_INTERRUPT_ENDPOINT
which allow switching between simplex and separate endpoints (although generally I leave USB_SIMPLEX_ENDPOINTS on because there are no disadvantages of sharing physical endpoints between IN and OUT usage).
When CDC_WITHOUT_INTERRUPT_ENDPOINT is enabled it removes the interrupt endpoints from each VCOM to free up additional physical endpoints.

There is a thread somewhere about VCOMs without interrupt endpoint so it can also be done by modifying SDK examples appropriately. IN/OUT sharing is almost certainly supported by the SDK but if not it is in fact simply a case of ensuring that when an endpoint is configured for IN or OUT it doesn't "touch" any configuration that may have already been set for OUT or IN utilisation (the registers have flags for both IN and OUT usage so only 'touch' the ones that are relevant when activating the endpoint and setting its type of operation).

Regards

Mark
[uTasker project developer for Kinetis and i.MX RT - developer of uTasker USB device/host library]
Contact me by personal message or on the uTasker web site to discuss professional training, solutions to problems or rapid product development requirements

For professionals searching for faster, problem-free Kinetis and i.MX RT 10xx developments the uTasker project holds the key: https://www.utasker.com/iMX/RT1064.html

在原帖中查看解决方案

6 回复数
3,344 次查看
mjbcswitzerland
Specialist V

Hi Ed

The limit of 8 endpoints is a "physical" limit and not a configuration one. With 8 physical endpoints one can have 15 operational endpoints (as long as each physical (non-control) one does both IN and OUT operations)

To use IN and OUT on a single endpoint should just be a case of editing the descriptors accordingly: Instead of defining two endpoints, one as IN on endpoint X  and one as OUT on endpoint Y, specify one as IN on endpoint X and one as OUT on endpoint X. The host will then uses the same (physical) endpoint for both IN and OUT on the two operational endpoints.

If you use a VCOM just for Rx/TX data you don't need an interrupt endpoint (that is used for modem signals like RTS, CTS) and so you only need one physical endpoint (you can have 7 x VCOMs on the HSUSB of the i.MX RT and 15 on the FSUSB of the Kinetis parts).

This means that for your development you actually need
0 - control
1- CTRL
2. IN + OUT spkrphone
3. FDBK
4. IN mic
5. VCOM IN + OUT

and then you have still 2 left for further features - eg. an RNDIS interface for monitoring and configuration via web browser
6. RNDIS data
7. RNDIS interrupt


In the uTasker project I have two defines:
#define USB_SIMPLEX_ENDPOINTS
#define CDC_WITHOUT_INTERRUPT_ENDPOINT
which allow switching between simplex and separate endpoints (although generally I leave USB_SIMPLEX_ENDPOINTS on because there are no disadvantages of sharing physical endpoints between IN and OUT usage).
When CDC_WITHOUT_INTERRUPT_ENDPOINT is enabled it removes the interrupt endpoints from each VCOM to free up additional physical endpoints.

There is a thread somewhere about VCOMs without interrupt endpoint so it can also be done by modifying SDK examples appropriately. IN/OUT sharing is almost certainly supported by the SDK but if not it is in fact simply a case of ensuring that when an endpoint is configured for IN or OUT it doesn't "touch" any configuration that may have already been set for OUT or IN utilisation (the registers have flags for both IN and OUT usage so only 'touch' the ones that are relevant when activating the endpoint and setting its type of operation).

Regards

Mark
[uTasker project developer for Kinetis and i.MX RT - developer of uTasker USB device/host library]
Contact me by personal message or on the uTasker web site to discuss professional training, solutions to problems or rapid product development requirements

For professionals searching for faster, problem-free Kinetis and i.MX RT 10xx developments the uTasker project holds the key: https://www.utasker.com/iMX/RT1064.html

3,298 次查看
EdSutter
Senior Contributor II

Mark,

Just wanted to confirm that I was able to combine IN/OUT to one endpoint for the SPKRPHONE interface of my device.  That gave me the "endpoint space" I needed to fit the VCOM interface into the project.

Thanks much,

Ed

0 项奖励
回复
3,330 次查看
EdSutter
Senior Contributor II

As usual Mark, thanks for the detailed response.

I will work on this today, and add any final notes (if needed), then mark this as the solution.

Ed

0 项奖励
回复
3,362 次查看
mjbcswitzerland
Specialist V

Hi Ed

The HSUSB in the i.MX RT have 8 endpoints for sue by the device.
In comparison the FS USB in the Kinetis parts have 16.

Are you presently using endpoints for either IN or OUT? Or are you using them for both IN and OUT a the same time?
If the first (one for IN and one for OUT) you can combine these to free up endpoints.

Regards

Mark
[uTasker project developer for Kinetis and i.MX RT - and uTasker USB device/host stack]
Contact me by personal message or on the uTasker web site to discuss professional training, solutions to problems or rapid product development requirements

For professionals searching for faster, problem-free Kinetis and i.MX RT 10xx developments the uTasker project holds the key: https://www.utasker.com/iMX/RT1064.html

0 项奖励
回复
3,351 次查看
EdSutter
Senior Contributor II

Hey Mark,

Yea, that's what I was afraid of.  That register was labeled read-only, so I was just hoping that maybe that was a typo. 

My current project (as you know) is composite audio that presents itself as two unique devices to Linux using IADs to form two IACs.  All that is working, but it uses 6 endpoints.  1-4 are CTRL/IN/OUT/FDBK for first audio device (spkrphone) and 5 is IN for second audio device (mic-array), and 0 allocated for USB by default.

My debug system has a UART tied into it; but that goes away when in real use, so I thought it would be handy to add a virtual com port to the mix; but that requires 3 more endpoints (bulk-in/bulk-out/interrupt).  That's when I discovered the limitation of 8.

Is there an example in the SDK that combines endpoints of opposite direction?

0 项奖励
回复
3,304 次查看
jingpan
NXP TechSupport
NXP TechSupport

Hi,

Yes, the USB 2.0 controller has up tp 8 bidirectional endpoints. This is not a typo. You can see it in the USB features list in RT10xx RM.

 

Regards,

Jing 

0 项奖励
回复