forked from PAWPAW-Mirror/lib_xua
Compare commits
278 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d9266a080 | ||
|
|
4ac07b2df4 | ||
|
|
afcf576d43 | ||
|
|
bb73f2140e | ||
|
|
c260039d0b | ||
|
|
a89371c143 | ||
|
|
f3ab9a8532 | ||
|
|
fff1568c6f | ||
|
|
5a13a1b751 | ||
|
|
2ada7e7534 | ||
|
|
c9989e4d87 | ||
|
|
a1cb1336cd | ||
|
|
bd71651cc4 | ||
|
|
ae599686ac | ||
|
|
045059ad1e | ||
|
|
572bbdc8ff | ||
|
|
4d0de4e01a | ||
|
|
5fd34acab5 | ||
|
|
c786b846d0 | ||
|
|
09a81f5c1f | ||
|
|
ee1feb6c48 | ||
|
|
3f2d0eb6f7 | ||
|
|
b5d2aae3d6 | ||
|
|
d146435d07 | ||
|
|
ae27cfa89b | ||
|
|
e8bdaf8004 | ||
|
|
db005a08ed | ||
|
|
1dbad0ff89 | ||
|
|
40ab0b563c | ||
|
|
2175103510 | ||
|
|
73015bc44f | ||
|
|
8b52c83b4c | ||
|
|
0978f0d50d | ||
|
|
cd8e46308f | ||
|
|
dbaf66fdb2 | ||
|
|
d3f2220be4 | ||
|
|
d125860552 | ||
|
|
11c8d56657 | ||
|
|
abbafba3a7 | ||
|
|
b31028a3d6 | ||
|
|
4ae9956a13 | ||
|
|
be45d04423 | ||
|
|
0b5ddbd85e | ||
|
|
c63df2e961 | ||
|
|
050d7757bc | ||
|
|
ee239ba18c | ||
|
|
1efe7c8822 | ||
|
|
dac808e9fa | ||
|
|
6402051165 | ||
|
|
07b829cd7e | ||
|
|
76f12ccad6 | ||
|
|
cb842df492 | ||
|
|
27c99623ac | ||
|
|
18cef82b06 | ||
|
|
23cf086b84 | ||
|
|
ed6ad4ce9f | ||
|
|
40a2ac6d73 | ||
|
|
0a8db236f1 | ||
|
|
035970c7a9 | ||
|
|
c8da4ca8f6 | ||
|
|
f1b6a0b903 | ||
|
|
86c8bc9128 | ||
|
|
d5d9c6ebc4 | ||
|
|
bef8fad109 | ||
|
|
2c44f2c323 | ||
|
|
e99d1cc486 | ||
|
|
03b5dd6319 | ||
|
|
a46c8b134a | ||
|
|
f6d5bffad5 | ||
|
|
ad7ce6369e | ||
|
|
a4507a172e | ||
|
|
5c5d7cb077 | ||
|
|
8666722798 | ||
|
|
ae2f19224e | ||
|
|
75efab4a41 | ||
|
|
4e13f9e442 | ||
|
|
b324bb04c8 | ||
|
|
6485830a73 | ||
|
|
dac71e8b38 | ||
|
|
90edaebc6e | ||
|
|
97e6ae4269 | ||
|
|
27bf0e4fc4 | ||
|
|
16138c2d42 | ||
|
|
7530591a64 | ||
|
|
6e184af899 | ||
|
|
c2f2ef1999 | ||
|
|
2f4da7f262 | ||
|
|
1ef566a570 | ||
|
|
f6d0ede133 | ||
|
|
8f2509845a | ||
|
|
eae62a9e3c | ||
|
|
95f39ae590 | ||
|
|
4d5c0ec394 | ||
|
|
f189f02c02 | ||
|
|
a2ff2897f9 | ||
|
|
5361ef8866 | ||
|
|
6b1da7610f | ||
|
|
ad453c8a82 | ||
|
|
67764fb0e8 | ||
|
|
3b80f63cb9 | ||
|
|
6eb30c5646 | ||
|
|
edb020da9d | ||
|
|
d81af18d1f | ||
|
|
538f2be5b4 | ||
|
|
02185f6701 | ||
|
|
8b6f6bc8e1 | ||
|
|
9f1e9735b8 | ||
|
|
1ee146ef60 | ||
|
|
e5389e4348 | ||
|
|
31bb86c161 | ||
|
|
d8f34aa64d | ||
|
|
746635b2eb | ||
|
|
83284620cc | ||
|
|
255e9f75b5 | ||
|
|
3a5b982774 | ||
|
|
daf378e4a5 | ||
|
|
471ab4548a | ||
|
|
f22027564d | ||
|
|
82404f539c | ||
|
|
a85cbc06b8 | ||
|
|
6d01aa5cb8 | ||
|
|
82d364a25d | ||
|
|
3a1c1b0265 | ||
|
|
eeca5fdd60 | ||
|
|
241afbe7e6 | ||
|
|
2aaa12e60b | ||
|
|
6b454b0ebe | ||
|
|
4ff6815d07 | ||
|
|
e097b5dc3d | ||
|
|
f594d1d423 | ||
|
|
c8299998c8 | ||
|
|
f91728485c | ||
|
|
9674ae3328 | ||
|
|
192d8f54d7 | ||
|
|
3b6f6b6a10 | ||
|
|
5c3cff6a91 | ||
|
|
fecc01d203 | ||
|
|
e0c7272190 | ||
|
|
23e5094e50 | ||
|
|
ec396961be | ||
|
|
b0a26351ce | ||
|
|
3f03dae23d | ||
|
|
c7cce77fb2 | ||
|
|
41654b17a9 | ||
|
|
861d20827b | ||
|
|
94afffe517 | ||
|
|
c640829d9f | ||
|
|
a865f4bc51 | ||
|
|
0ef1fe81a1 | ||
|
|
bc6a0cbcd8 | ||
|
|
955301ca76 | ||
|
|
a2094e8953 | ||
|
|
5bb5998788 | ||
|
|
28cce8b51c | ||
|
|
92019d851a | ||
|
|
6dd1853094 | ||
|
|
7fce471fd9 | ||
|
|
75abc71cd7 | ||
|
|
aea89a4cd6 | ||
|
|
102d1b4e3a | ||
|
|
9fb073a2b0 | ||
|
|
a6f3daf581 | ||
|
|
a7c0ac6234 | ||
|
|
024c0304f1 | ||
|
|
21ec3cf7bd | ||
|
|
9a7c2d85b2 | ||
|
|
8820ddf269 | ||
|
|
6afb4ab7e4 | ||
|
|
5caca37177 | ||
|
|
a5f17c46fc | ||
|
|
e4f0b73a88 | ||
|
|
3331c9e97b | ||
|
|
aeb1d58bf3 | ||
|
|
97e3233120 | ||
|
|
962e91adec | ||
|
|
9f98e13342 | ||
|
|
1808d7affa | ||
|
|
8ba9a0064c | ||
|
|
b592c943f8 | ||
|
|
2a960700c5 | ||
|
|
f08e79197d | ||
|
|
1690c4eff6 | ||
|
|
75fea9ed84 | ||
|
|
34ebbc8509 | ||
|
|
5b87efb5a7 | ||
|
|
22323daa5f | ||
|
|
211a49f26f | ||
|
|
74564edde8 | ||
|
|
e7e8b58275 | ||
|
|
ce24c73dc0 | ||
|
|
0440020c2f | ||
|
|
17317093d5 | ||
|
|
2fb0bdfcc2 | ||
|
|
d32235d0f0 | ||
|
|
e1b72c47bc | ||
|
|
660b483d1e | ||
|
|
d7be8419d8 | ||
|
|
b68c192ad9 | ||
|
|
0b30ba0cb7 | ||
|
|
37bbea3726 | ||
|
|
ba666fb314 | ||
|
|
9472bd7dce | ||
|
|
3c86da7c09 | ||
|
|
d491eb2da9 | ||
|
|
960333ca09 | ||
|
|
3131b89a1d | ||
|
|
958d52b5eb | ||
|
|
35393d3739 | ||
|
|
75422de6d1 | ||
|
|
017d937ec7 | ||
|
|
bb5757e099 | ||
|
|
8ff44c553c | ||
|
|
3987224d50 | ||
|
|
37ef88a602 | ||
|
|
786ce134c6 | ||
|
|
7339ceca19 | ||
|
|
06317b0b17 | ||
|
|
0588ea2d18 | ||
|
|
0b926fd907 | ||
|
|
b12aeac264 | ||
|
|
86b4ab89ea | ||
|
|
a8fa274230 | ||
|
|
abd3141b0d | ||
|
|
45d84a2b84 | ||
|
|
0b2839c9fc | ||
|
|
d7c96c717a | ||
|
|
19e6dca445 | ||
|
|
8e7e1bfc51 | ||
|
|
25f94fe430 | ||
|
|
436e8f4bd4 | ||
|
|
ad5c2e8583 | ||
|
|
d92614ced9 | ||
|
|
6333ca5621 | ||
|
|
ca7ee58883 | ||
|
|
8dd33cf33b | ||
|
|
e93901f0cc | ||
|
|
7af92668f5 | ||
|
|
4262cc81ac | ||
|
|
4d5049a47a | ||
|
|
1251425ee6 | ||
|
|
f014922e98 | ||
|
|
3debc9fef4 | ||
|
|
a72885634d | ||
|
|
409da256d6 | ||
|
|
54f42a37fe | ||
|
|
c662acaa3b | ||
|
|
3214d4ea9f | ||
|
|
0709860f48 | ||
|
|
05f16da222 | ||
|
|
a49aad644e | ||
|
|
c352a08c55 | ||
|
|
90d1a60595 | ||
|
|
9be45c7e89 | ||
|
|
239f9b9cb7 | ||
|
|
c0d80b665a | ||
|
|
5643d2b675 | ||
|
|
35468c7d77 | ||
|
|
40ea575589 | ||
|
|
12327505e5 | ||
|
|
fc68acae6e | ||
|
|
3f1e612d67 | ||
|
|
eaf190b485 | ||
|
|
4b73f17997 | ||
|
|
f0c6b22ddc | ||
|
|
44ea92e229 | ||
|
|
5cfbd550fe | ||
|
|
6046dc905e | ||
|
|
b3fe0cb172 | ||
|
|
f097e0a016 | ||
|
|
491b3936ac | ||
|
|
35b43c0762 | ||
|
|
78f9e890d6 | ||
|
|
2405b2f4f1 | ||
|
|
1db927601a | ||
|
|
6fbbbedc28 | ||
|
|
35042e742f | ||
|
|
161b934b8f | ||
|
|
770c11b3f0 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -27,3 +27,4 @@ _build*
|
||||
build/
|
||||
.build*
|
||||
*.pyc
|
||||
xscope.xmt
|
||||
|
||||
@@ -1,6 +1,36 @@
|
||||
lib_xua Change Log
|
||||
==================
|
||||
|
||||
1.0.1
|
||||
-----
|
||||
|
||||
* FIXED: Wrong size of vendor and product strings
|
||||
|
||||
1.0.0
|
||||
-----
|
||||
|
||||
* ADDED: UAC1 HID support with simulated Voice Command detection reported
|
||||
every 10 seconds
|
||||
* ADDED: Support for USB HID Set Idle request
|
||||
* ADDED: Pre-processor symbols to enable single-threaded, dual-PDM
|
||||
microphone operation
|
||||
* FIXED: Descriptors for XUA_ADAPTIVE incorrectly defined for IN endpoint
|
||||
* ADDED: Guards to user_hid.h and xua_hid.h
|
||||
* ADDED: UAC1 HID support for AC Stop (End Call), Volume Increment and
|
||||
Volume Decrement
|
||||
* CHANGE: UAC1 HID to report function keys f21 through f24 as specified by
|
||||
customer
|
||||
* CHANGE: HID interface for user to set and clear events from global
|
||||
variable to function
|
||||
* CHANGE HID report descriptor to use generic events instead of GPI
|
||||
events, to report Key-phrase detection as AC Search, and to report end-call
|
||||
detection as AC Stop
|
||||
* ADDED: Ability to read or modify vendor and product IDs and strings
|
||||
* ADDED: Ability to read or modify bcdDevice
|
||||
* ADDED: Override USB descriptor with sampling frequency and
|
||||
bit-resolution set at boot time.
|
||||
* ADDED: Global pointer to allow external access to masterClockFreq
|
||||
|
||||
0.2.1
|
||||
-----
|
||||
|
||||
|
||||
42
Jenkinsfile
vendored
42
Jenkinsfile
vendored
@@ -1,4 +1,4 @@
|
||||
@Library('xmos_jenkins_shared_library@develop') _
|
||||
@Library('xmos_jenkins_shared_library@v0.12.1') _
|
||||
|
||||
getApproval()
|
||||
|
||||
@@ -6,45 +6,7 @@ pipeline {
|
||||
agent none
|
||||
environment {
|
||||
REPO = 'lib_xua'
|
||||
VIEW = "${env.JOB_NAME.contains('PR-') ? REPO+'_'+env.CHANGE_TARGET : REPO+'_'+env.BRANCH_NAME}"
|
||||
}
|
||||
triggers {
|
||||
/* Trigger this Pipeline on changes to the repos dependencies
|
||||
*
|
||||
* If this Pipeline is running in a pull request, the triggers are set
|
||||
* on the base branch the PR is set to merge in to.
|
||||
*
|
||||
* Otherwise the triggers are set on the branch of a matching name to the
|
||||
* one this Pipeline is on.
|
||||
*/
|
||||
upstream(
|
||||
upstreamProjects:
|
||||
(env.JOB_NAME.contains('PR-') ?
|
||||
"../lib_device_control/${env.CHANGE_TARGET}," +
|
||||
"../lib_dsp/${env.CHANGE_TARGET}," +
|
||||
"../lib_i2c/${env.CHANGE_TARGET}," +
|
||||
"../lib_logging/${env.CHANGE_TARGET}," +
|
||||
"../lib_mic_array/${env.CHANGE_TARGET}," +
|
||||
"../lib_spdif/${env.CHANGE_TARGET}," +
|
||||
"../lib_xassert/${env.CHANGE_TARGET}," +
|
||||
"../lib_xud/${env.CHANGE_TARGET}," +
|
||||
"../tools_released/${env.CHANGE_TARGET}," +
|
||||
"../tools_xmostest/${env.CHANGE_TARGET}," +
|
||||
"../xdoc_released/${env.CHANGE_TARGET}"
|
||||
:
|
||||
"../lib_device_control/${env.BRANCH_NAME}," +
|
||||
"../lib_dsp/${env.BRANCH_NAME}," +
|
||||
"../lib_i2c/${env.BRANCH_NAME}," +
|
||||
"../lib_logging/${env.BRANCH_NAME}," +
|
||||
"../lib_mic_array/${env.BRANCH_NAME}," +
|
||||
"../lib_spdif/${env.BRANCH_NAME}," +
|
||||
"../lib_xassert/${env.BRANCH_NAME}," +
|
||||
"../lib_xud/${env.BRANCH_NAME}," +
|
||||
"../tools_released/${env.BRANCH_NAME}," +
|
||||
"../tools_xmostest/${env.BRANCH_NAME}," +
|
||||
"../xdoc_released/${env.BRANCH_NAME}"),
|
||||
threshold: hudson.model.Result.SUCCESS
|
||||
)
|
||||
VIEW = getViewName(REPO)
|
||||
}
|
||||
options {
|
||||
skipDefaultCheckout()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2011-2019, XMOS, All rights reserved.
|
||||
Copyright (c) 2011-2020, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2018, XMOS, All rights reserved.
|
||||
Copyright (c) 2018-2019, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2017-2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
@@ -21,5 +21,6 @@
|
||||
#define PID_AUDIO_1 1
|
||||
#define PID_AUDIO_2 2
|
||||
#define XUA_DFU_EN 0 /* Disable DFU (for simplicity of example */
|
||||
#define MIC_DUAL_ENABLED 0 // Use multi-threaded design
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2018, XMOS, All rights reserved.
|
||||
Copyright (c) 2018-2019, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2017-2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
@@ -26,5 +26,6 @@
|
||||
#define AUDIO_CLASS_FALLBACK 0
|
||||
#define BCD_DEVICE 0x1234
|
||||
#define XUA_DFU_EN 0
|
||||
#define MIC_DUAL_ENABLED 0 // Use multi-threaded design
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2018, XMOS, All rights reserved.
|
||||
Copyright (c) 2018-2019, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2017-2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
@@ -25,5 +25,6 @@
|
||||
#define AUDIO_CLASS_FALLBACK 0
|
||||
#define BCD_DEVICE 0x1234
|
||||
#define XUA_DFU_EN 0
|
||||
#define MIC_DUAL_ENABLED 0 // Use multi-threaded design
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2017-2019, XMOS, All rights reserved.
|
||||
Copyright (c) 2017-2020, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2019, XMOS Ltd, All rights reserved
|
||||
#ifndef __XUA_BUFFER_H__
|
||||
#define __XUA_BUFFER_H__
|
||||
|
||||
@@ -58,7 +58,7 @@ void XUA_Buffer(
|
||||
chanend c_sof,
|
||||
chanend c_aud_ctl,
|
||||
in port p_off_mclk
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, chanend c_hid
|
||||
#endif
|
||||
, chanend c_aud
|
||||
@@ -97,7 +97,7 @@ void XUA_Buffer_Ep(chanend c_aud_out,
|
||||
chanend c_sof,
|
||||
chanend c_aud_ctl,
|
||||
in port p_off_mclk
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, chanend c_hid
|
||||
#endif
|
||||
#ifdef CHAN_BUFF_CTRL
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
/*
|
||||
* @brief Defines relating to device configuration and customisation of lib_xua
|
||||
* @author Ross Owen, XMOS Limited
|
||||
@@ -288,6 +288,13 @@
|
||||
#define PDM_MIC_INDEX (0)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Size of a frame of microphone data samples. Default: 1
|
||||
*/
|
||||
#ifndef XUA_MIC_FRAME_SIZE
|
||||
#define XUA_MIC_FRAME_SIZE (1)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enable MIDI functionality including buffering, descriptors etc. Default: DISABLED
|
||||
*/
|
||||
@@ -425,10 +432,6 @@
|
||||
#define HID_CONTROLS (0)
|
||||
#endif
|
||||
|
||||
#if defined(HID_CONTROLS) && (HID_CONTROLS == 0)
|
||||
#undef HID_CONTROLS
|
||||
#endif
|
||||
|
||||
/* @brief Defines whether XMOS device runs as master (i.e. drives LR and Bit clocks)
|
||||
*
|
||||
* 0: XMOS is I2S master. 1: CODEC is I2s master.
|
||||
@@ -1158,6 +1161,10 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if (defined(UAC_FORCE_FEEDBACK_EP) && UAC_FORCE_FEEDBACK_EP == 0)
|
||||
#undef UAC_FORCE_FEEDBACK_EP
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
/* Endpoint addresses enums */
|
||||
enum USBEndpointNumber_In
|
||||
@@ -1173,7 +1180,7 @@ enum USBEndpointNumber_In
|
||||
#ifdef MIDI
|
||||
ENDPOINT_NUMBER_IN_MIDI,
|
||||
#endif
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
ENDPOINT_NUMBER_IN_HID,
|
||||
#endif
|
||||
#ifdef IAP
|
||||
@@ -1438,6 +1445,12 @@ enum USBEndpointNumber_Out
|
||||
#error Bad DEFAULT_MCLK_FREQ
|
||||
#endif
|
||||
|
||||
/* DFU functional descriptor wDetachTimeOut field (milliseconds)
|
||||
* Time for device to wait for bus reset after DETACH request before reverting to idle state */
|
||||
#ifndef DFU_DETACH_TIME_OUT
|
||||
#define DFU_DETACH_TIME_OUT 250
|
||||
#endif
|
||||
|
||||
#if ((MCLK_441 % MIN_FREQ) == 0)
|
||||
#define MIN_FREQ_44 MIN_FREQ
|
||||
#define MIN_FREQ_48 ((48000 * 512)/((44100 * 512)/MIN_FREQ))
|
||||
@@ -1459,4 +1472,3 @@ enum USBEndpointNumber_Out
|
||||
#if (CODEC_MASTER == 1) && (DSD_CHANS_DAC != 0)
|
||||
#error CODEC_MASTER with DSD is currently unsupported
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef _XUA_ENDPOINT0_H_
|
||||
#define _XUA_ENDPOINT0_H_
|
||||
@@ -28,5 +28,85 @@ void XUA_Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCtrl,
|
||||
chanend ?c_mix_ctl,chanend ?c_clk_ctl, chanend ?c_EANativeTransport_ctr, client interface i_dfu ?dfuInterface
|
||||
VENDOR_REQUESTS_PARAMS_DEC_);
|
||||
|
||||
/** Function to set the Vendor ID value
|
||||
*
|
||||
* \param vid vendor ID value to set
|
||||
*/
|
||||
void XUA_Endpoint0_setVendorId(unsigned short vid);
|
||||
|
||||
/** Function to set the Product ID value
|
||||
*
|
||||
* \param pid Product ID value to set
|
||||
*/
|
||||
void XUA_Endpoint0_setProductId(unsigned short pid);
|
||||
|
||||
|
||||
/** Function to set the Vendor string
|
||||
*
|
||||
* \param vendor_str Vendor string to set
|
||||
*/
|
||||
#ifdef __XC__
|
||||
void XUA_Endpoint0_setVendorStr(char * unsafe vendor_str);
|
||||
#else
|
||||
void XUA_Endpoint0_setVendorStr(char * vendor_str);
|
||||
#endif
|
||||
|
||||
/** Function to set the Product string
|
||||
*
|
||||
* \param product_str Product string to set
|
||||
*/
|
||||
|
||||
#ifdef __XC__
|
||||
void XUA_Endpoint0_setProductStr(char * unsafe product_str);
|
||||
#else
|
||||
void XUA_Endpoint0_setProductStr(char * product_str);
|
||||
#endif
|
||||
|
||||
/** Function to set the BCD device
|
||||
*
|
||||
* \param bcdDevice BCD device to set
|
||||
|
||||
*/
|
||||
|
||||
void XUA_Endpoint0_setBcdDevice(unsigned short bcdDevice);
|
||||
|
||||
/** Function to get the Vendor string
|
||||
*
|
||||
* \param vid vendor string
|
||||
*/
|
||||
#ifdef __XC__
|
||||
char * unsafe XUA_Endpoint0_getVendorStr();
|
||||
#else
|
||||
char * XUA_Endpoint0_getVendorStr(;
|
||||
#endif
|
||||
|
||||
/** Function to get the Product string
|
||||
*
|
||||
* \param pid Product string
|
||||
*/
|
||||
#ifdef __XC__
|
||||
char * unsafe XUA_Endpoint0_getProductStr();
|
||||
#else
|
||||
char * XUA_Endpoint0_getProductStr(;
|
||||
#endif
|
||||
|
||||
/** Function to get the Vendor string
|
||||
*
|
||||
* \return Vendor string
|
||||
*/
|
||||
unsigned short XUA_Endpoint0_getVendorId();
|
||||
|
||||
/** Function to get the Product string
|
||||
*
|
||||
* \return Product string
|
||||
*/
|
||||
unsigned short XUA_Endpoint0_getProductId();
|
||||
|
||||
/** Function to get the BCD device
|
||||
*
|
||||
* \return BCD device
|
||||
*/
|
||||
unsigned short XUA_Endpoint0_getBcdDevice();
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
18
lib_xua/api/xua_usb_params_funcs.h
Normal file
18
lib_xua/api/xua_usb_params_funcs.h
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) 2017-2020, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef __XUA_API_H__
|
||||
#define __XUA_API_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void set_usb_to_device_rate(uint32_t rate);
|
||||
void set_device_to_usb_rate(uint32_t rate);
|
||||
void set_usb_to_device_bit_res(uint32_t rate);
|
||||
void set_device_to_usb_bit_res(uint32_t rate);
|
||||
|
||||
uint32_t get_usb_to_device_rate();
|
||||
uint32_t get_device_to_usb_rate();
|
||||
uint32_t get_usb_to_device_bit_res();
|
||||
uint32_t get_device_to_usb_bit_res();
|
||||
|
||||
#endif //__XUA_API_H__
|
||||
@@ -1,8 +1,8 @@
|
||||
VERSION = 0.2.1
|
||||
VERSION = 1.0.1
|
||||
|
||||
DEPENDENT_MODULES = lib_logging(>=3.0.0) \
|
||||
lib_xassert(>=4.0.0) \
|
||||
lib_xud(>=0.2.0) \
|
||||
lib_xud(>=1.0.0) \
|
||||
lib_spdif(>=4.0.0) \
|
||||
lib_mic_array(>=4.0.0)
|
||||
|
||||
@@ -43,6 +43,7 @@ INCLUDE_DIRS = $(EXPORT_INCLUDE_DIRS) \
|
||||
src/core/support/powersave \
|
||||
src/core/user \
|
||||
src/core/user/audiostream \
|
||||
src/core/user/hid \
|
||||
src/core/user/hostactive \
|
||||
src/midi
|
||||
|
||||
@@ -61,6 +62,7 @@ SOURCE_DIRS = src/core \
|
||||
src/core/user/hostactive \
|
||||
src/core/xuduser \
|
||||
src/dfu \
|
||||
src/hid \
|
||||
src/midi
|
||||
|
||||
EXCLUDE_FILES += descriptors_2.rst
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
#include "xua.h"
|
||||
|
||||
#if XUA_USB_EN
|
||||
@@ -7,16 +7,18 @@
|
||||
#include "interrupt.h"
|
||||
#include "xua_commands.h"
|
||||
#include "xud.h"
|
||||
#include "xua_usb_params_funcs.h"
|
||||
|
||||
#ifdef NATIVE_DSD
|
||||
#include "usbaudio20.h" /* Defines from the USB Audio 2.0 Specifications */
|
||||
#endif
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#include "user_hid.h"
|
||||
#endif
|
||||
#define MAX(x,y) ((x)>(y) ? (x) : (y))
|
||||
|
||||
|
||||
/* TODO use SLOTSIZE to potentially save memory */
|
||||
/* Note we could improve on this, for one subslot is set to 4 */
|
||||
/* The *4 is conversion to bytes, note we're assuming a slotsize of 4 here whic is potentially as waste */
|
||||
@@ -136,6 +138,7 @@ unsigned unpackData = 0;
|
||||
unsigned packState = 0;
|
||||
unsigned packData = 0;
|
||||
|
||||
|
||||
/* Default to something sensible but the following are setup at stream start (unless UAC1 only..) */
|
||||
#if (AUDIO_CLASS == 2)
|
||||
unsigned g_curSubSlot_Out = HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES;
|
||||
@@ -145,7 +148,6 @@ unsigned g_curSubSlot_Out = FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES;
|
||||
unsigned g_curSubSlot_In = FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES;
|
||||
#endif
|
||||
|
||||
|
||||
/* IN packet size. Init to something sensible, but expect to be re-set before stream start */
|
||||
#if (AUDIO_CLASS==2)
|
||||
int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_HS;
|
||||
@@ -158,6 +160,10 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS;
|
||||
void handle_audio_request(chanend c_mix_out)
|
||||
{
|
||||
int space_left;
|
||||
#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES)
|
||||
g_curSubSlot_Out = get_usb_to_device_bit_res() >> 3;
|
||||
g_curSubSlot_In = get_device_to_usb_bit_res() >> 3;
|
||||
#endif
|
||||
|
||||
/* Input word that triggered interrupt and handshake back */
|
||||
unsigned underflowSample = inuint(c_mix_out);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
#include "xua.h"
|
||||
#if XUA_USB_EN
|
||||
#include <xs1.h>
|
||||
@@ -19,9 +19,9 @@
|
||||
#include "xud.h"
|
||||
#include "testct_byref.h"
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#include "user_hid.h"
|
||||
unsigned char g_hidData[1] = {0};
|
||||
unsigned char g_hidData[HID_DATA_BYTES] = {0};
|
||||
#endif
|
||||
|
||||
void GetADCCounts(unsigned samFreq, int &min, int &mid, int &max);
|
||||
@@ -120,7 +120,7 @@ void XUA_Buffer(
|
||||
chanend c_sof,
|
||||
chanend c_aud_ctl,
|
||||
in port p_off_mclk
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, chanend c_hid
|
||||
#endif
|
||||
, chanend c_aud
|
||||
@@ -164,7 +164,7 @@ void XUA_Buffer(
|
||||
c_clk_int,
|
||||
#endif
|
||||
c_sof, c_aud_ctl, p_off_mclk
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, c_hid
|
||||
#endif
|
||||
#ifdef CHAN_BUFF_CTRL
|
||||
@@ -182,6 +182,8 @@ void XUA_Buffer(
|
||||
}
|
||||
}
|
||||
|
||||
// Allows us to externally modify masterClockFreq
|
||||
unsafe{volatile unsigned * unsafe masterClockFreq_ptr;}
|
||||
|
||||
/**
|
||||
* Buffers data from audio endpoints
|
||||
@@ -223,7 +225,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
chanend c_sof,
|
||||
chanend c_aud_ctl,
|
||||
in port p_off_mclk
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, chanend c_hid
|
||||
#endif
|
||||
#ifdef CHAN_BUFF_CTRL
|
||||
@@ -260,7 +262,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
XUD_ep ep_int = XUD_InitEp(c_ep_int);
|
||||
#endif
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
XUD_ep ep_hid = XUD_InitEp(c_hid);
|
||||
#endif
|
||||
unsigned u_tmp;
|
||||
@@ -268,6 +270,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
unsigned masterClockFreq = DEFAULT_MCLK_FREQ;
|
||||
unsigned lastClock = 0;
|
||||
|
||||
unsafe{masterClockFreq_ptr = &masterClockFreq;}
|
||||
|
||||
unsigned clocks = 0;
|
||||
long long clockcounter = 0;
|
||||
|
||||
@@ -364,7 +368,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
||||
#endif
|
||||
|
||||
@@ -875,12 +879,12 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
/* HID Report Data */
|
||||
case XUD_SetData_Select(c_hid, ep_hid, result):
|
||||
{
|
||||
g_hidData[0]=0;
|
||||
UserReadHIDButtons(g_hidData);
|
||||
UserHIDGetData(g_hidData);
|
||||
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
// Copyright (c) 2015-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2015-2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef __DESCRIPTOR_DEFS_H__
|
||||
#define __DESCRIPTOR_DEFS_H__
|
||||
|
||||
/*
|
||||
Include xua.h to pick up the #defines of NUM_USB_CHAN_IN and NUM_USB_CHAN_OUT.
|
||||
*/
|
||||
#include "xua.h"
|
||||
|
||||
#if (NUM_USB_CHAN_IN > 0) && (NUM_USB_CHAN_OUT > 0)
|
||||
#define AUDIO_INTERFACE_COUNT 3
|
||||
#elif (NUM_USB_CHAN_IN > 0) || (NUM_USB_CHAN_OUT > 0)
|
||||
@@ -54,10 +59,14 @@ enum USBInterfaceNumber
|
||||
INTERFACE_NUMBER_IAP_EA_NATIVE_TRANS,
|
||||
#endif
|
||||
#endif
|
||||
#if defined(HID_CONTROLS) && (HID_CONTROLS != 0)
|
||||
#if( 0 < HID_CONTROLS )
|
||||
INTERFACE_NUMBER_HID,
|
||||
#endif
|
||||
INTERFACE_COUNT /* End marker */
|
||||
};
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#define ENDPOINT_INT_INTERVAL_IN_HID 0x08
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2019, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
/**
|
||||
* @file xua_ep0_descriptors.h
|
||||
* @brief Device Descriptors
|
||||
@@ -26,7 +26,23 @@
|
||||
|
||||
#define APPEND_PRODUCT_STR_A1(x) PRODUCT_STR_A1 " "#x
|
||||
|
||||
#define STR_TABLE_ENTRY(name) char *name
|
||||
#define STR_TABLE_ENTRY(name) char * name
|
||||
|
||||
// The empty strings below are used in the g_strTable to set the maximum size of the table entries
|
||||
// The last char of the strings are different, so that the compiler allocates separate memory spaces
|
||||
#define XUA_VENDOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\01"
|
||||
#define XUA_PRODUCT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\02"
|
||||
#define XUA_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\03"
|
||||
#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\04"
|
||||
#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\05"
|
||||
#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06"
|
||||
#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\07"
|
||||
#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08"
|
||||
#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09"
|
||||
#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0a"
|
||||
|
||||
// The value below must match the length of XUA_DESCR_EMPTY_STRING.
|
||||
#define XUA_MAX_STR_LEN (32)
|
||||
|
||||
#define ISO_EP_ATTRIBUTES_ASYNCH 0x05 //ISO, ASYNCH, DATA EP
|
||||
#define ISO_EP_ATTRIBUTES_ADAPTIVE 0x09 //ISO, ADAPTIVE, DATA EP
|
||||
@@ -317,41 +333,42 @@ typedef struct
|
||||
StringDescTable_t g_strTable =
|
||||
{
|
||||
.langID = "\x09\x04", /* US English */
|
||||
.vendorStr = VENDOR_STR,
|
||||
.vendorStr = XUA_VENDOR_EMPTY_STRING,
|
||||
.serialStr = "",
|
||||
#if (AUDIO_CLASS == 2)
|
||||
.productStr_Audio2 = PRODUCT_STR_A2,
|
||||
.outputInterfaceStr_Audio2 = APPEND_PRODUCT_STR_A2(),
|
||||
.inputInterfaceStr_Audio2 = APPEND_PRODUCT_STR_A2(),
|
||||
.usbInputTermStr_Audio2 = APPEND_PRODUCT_STR_A2(),
|
||||
.usbOutputTermStr_Audio2 = APPEND_PRODUCT_STR_A2(),
|
||||
.productStr_Audio2 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.outputInterfaceStr_Audio2 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.inputInterfaceStr_Audio2 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.usbInputTermStr_Audio2 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.usbOutputTermStr_Audio2 = XUA_PRODUCT_EMPTY_STRING,
|
||||
#endif
|
||||
#if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1)
|
||||
.productStr_Audio1 = PRODUCT_STR_A1,
|
||||
.outputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(),
|
||||
.inputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(),
|
||||
.usbInputTermStr_Audio1 = APPEND_PRODUCT_STR_A1(),
|
||||
.usbOutputTermStr_Audio1 = APPEND_PRODUCT_STR_A1(),
|
||||
|
||||
.productStr_Audio1 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.outputInterfaceStr_Audio1 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.inputInterfaceStr_Audio1 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.usbInputTermStr_Audio1 = XUA_PRODUCT_EMPTY_STRING,
|
||||
.usbOutputTermStr_Audio1 = XUA_PRODUCT_EMPTY_STRING,
|
||||
#endif
|
||||
#if (AUDIO_CLASS == 2)
|
||||
.clockSelectorStr = APPEND_VENDOR_STR(Clock Selector),
|
||||
.internalClockSourceStr = APPEND_VENDOR_STR(Internal Clock),
|
||||
.clockSelectorStr = XUA_CLOCK_SELECTOR_EMPTY_STRING,
|
||||
.internalClockSourceStr = XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING,
|
||||
#if SPDIF_RX
|
||||
.spdifClockSourceStr = APPEND_VENDOR_STR(S/PDIF Clock),
|
||||
.spdifClockSourceStr = XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING,
|
||||
#endif
|
||||
#if ADAT_RX
|
||||
.adatClockSourceStr = APPEND_VENDOR_STR(ADAT Clock),
|
||||
.adatClockSourceStr = XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING,
|
||||
#endif
|
||||
#endif
|
||||
#if (XUA_DFU_EN == 1)
|
||||
.dfuStr = APPEND_VENDOR_STR(DFU),
|
||||
.dfuStr = XUA_DFU_EMPTY_STRING,
|
||||
#endif
|
||||
#ifdef USB_CONTROL_DESCS
|
||||
.ctrlStr = APPEND_VENDOR_STR(Control),
|
||||
.ctrlStr = XUA_CTRL_EMPTY_STRING,
|
||||
#endif
|
||||
#ifdef MIDI
|
||||
.midiOutStr = APPEND_VENDOR_STR(MIDI Out),
|
||||
.midiInStr = APPEND_VENDOR_STR(MIDI In),
|
||||
.midiOutStr = XUA_MIDI_OUT_EMPTY_STRING,
|
||||
.midiInStr = XUA_MIDI_IN_EMPTY_STRING,
|
||||
#endif
|
||||
|
||||
#include "chanstrings.h"
|
||||
@@ -561,27 +578,30 @@ unsigned char devQualDesc_Null[] =
|
||||
#define MIXER_LENGTH (0)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
unsigned char hidReportDescriptor[] =
|
||||
#if( 0 < HID_CONTROLS )
|
||||
unsigned char hidReportDescriptor[] = /* Voice Command usage as per request #HUTRR45 */
|
||||
{
|
||||
0x05, 0x0c, /* Usage Page (Consumer Device) */
|
||||
0x09, 0x01, /* Usage (Consumer Control) */
|
||||
0xa1, 0x01, /* Collection (Application) */
|
||||
0x15, 0x00, /* Logical Minimum (0) */
|
||||
0x25, 0x01, /* Logical Maximum (1) */
|
||||
0x09, 0xb0, /* Usage (Play) */
|
||||
0x09, 0xb5, /* Usage (Scan Next Track) */
|
||||
0x09, 0xb6, /* Usage (Scan Previous Track) */
|
||||
0x09, 0xe9, /* Usage (Volume Up) */
|
||||
0x09, 0xea, /* Usage (Volume Down) */
|
||||
0x09, 0xe2, /* Usage (Mute) */
|
||||
0x75, 0x01, /* Report Size (1) */
|
||||
0x95, 0x06, /* Report Count (6) */
|
||||
0x81, 0x02, /* Input (Data, Var, Abs) */
|
||||
0x95, 0x02, /* Report Count (2) */
|
||||
0x81, 0x01, /* Input (Cnst, Ary, Abs) */
|
||||
0xc0 /* End collection */
|
||||
0x05, 0x01, /* Usage Page (Generic Desktop) */
|
||||
0x09, 0x06, /* Usage (Keyboard) */
|
||||
0xa1, 0x01, /* Collection (Application) */
|
||||
0x75, 0x01, /* Report Size (1) */
|
||||
0x95, 0x04, /* Report Count (4) */
|
||||
0x15, 0x00, /* Logical Minimum (0) */
|
||||
0x25, 0x00, /* Logical Maximum (0) */
|
||||
0x81, 0x01, /* Input (Cnst, Ary, Abs, No Wrap, Lin, Pref, No Nul) */
|
||||
0x95, 0x01, /* Report Count (1) */
|
||||
0x25, 0x01, /* Logical Maximum (1) */
|
||||
0x05, 0x0C, /* Usage Page (Consumer) */
|
||||
0x0a, 0x21, 0x02, /* Usage (AC Search) */
|
||||
0x81, 0x02, /* Input (Data, Var, Abs, No Wrap, Lin, Pref, No Nul) */
|
||||
0x0a, 0x26, 0x02, /* Usage (AC Stop) */
|
||||
0x81, 0x02, /* Input (Data, Var, Abs, No Wrap, Lin, Pref, No Nul) */
|
||||
0x95, 0x02, /* Report Count (2) */
|
||||
0x05, 0x07, /* Usage Page (Key Codes) */
|
||||
0x19, 0x72, /* Usage Minimum (Keyboard F23) */
|
||||
0x29, 0x73, /* Usage Maximum (Keyboard F24) */
|
||||
0x81, 0x02, /* Input (Data, Var, Abs, No Wrap, Lin, Pref, No Nul) */
|
||||
0xc0 /* End collection (Application) */
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -784,7 +804,7 @@ typedef struct
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
USB_Descriptor_Interface_t HID_Interface;
|
||||
unsigned char hidDesc[9]; //TODO ideally we would have a struct for this.
|
||||
USB_Descriptor_Endpoint_t HID_In_Endpoint;
|
||||
@@ -1099,7 +1119,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
},
|
||||
0, /* 60 iFeature */
|
||||
},
|
||||
#endif
|
||||
#endif /* (OUTPUT_VOLUME_CONTROL == 1) */
|
||||
|
||||
/* Output Terminal Descriptor (Audio) */
|
||||
.Audio_Out_OutputTerminal =
|
||||
@@ -1119,7 +1139,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
0x0000, /* 9 bmControls */
|
||||
0, /* 11 iTerminal */
|
||||
},
|
||||
#endif
|
||||
#endif /* (NUM_USB_CHAN_OUT > 0) */
|
||||
|
||||
|
||||
|
||||
@@ -1274,7 +1294,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
},
|
||||
0, /* 60 iFeature */
|
||||
},
|
||||
#endif
|
||||
#endif /* (INPUT_VOLUME_CONTROL == 1) */
|
||||
|
||||
.Audio_In_OutputTerminal =
|
||||
{
|
||||
@@ -1295,7 +1315,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bmControls = 0x0000,
|
||||
.iTerminal = offsetof(StringDescTable_t, usbOutputTermStr_Audio2)/sizeof(char *)
|
||||
},
|
||||
#endif
|
||||
#endif /* (NUM_USB_CHAN_IN > 0) */
|
||||
|
||||
#if defined(MIXER) && (MAX_MIX_COUNT > 0)
|
||||
/* Extension Unit Descriptor (4.7.2.12) */
|
||||
@@ -1389,7 +1409,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
0x00, /* bmControls */
|
||||
0 /* Mixer unit string descriptor index */
|
||||
},
|
||||
#endif
|
||||
#endif /* defined(MIXER) && (MAX_MIX_COUNT > 0) */
|
||||
|
||||
#if (SPDIF_RX) || (ADAT_RX)
|
||||
/* Standard AS Interrupt Endpoint Descriptor (4.8.2.1): */
|
||||
@@ -1473,9 +1493,13 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_OUT_AUDIO,
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE, /* (bitmap) */
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* (bitmap) */
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
#endif
|
||||
.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_1_MAXPACKETSIZE,
|
||||
.bInterval = 1,
|
||||
@@ -1555,9 +1579,13 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_OUT_AUDIO,
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE, /* (bitmap) */
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* (bitmap) */
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
#endif
|
||||
.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_2_MAXPACKETSIZE,
|
||||
.bInterval = 1,
|
||||
@@ -1586,7 +1614,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
4, /* 6 bInterval. Only values <= 1 frame (4) supported by MS */
|
||||
},
|
||||
#endif
|
||||
#endif
|
||||
#endif /* OUTPUT_FORMAT_COUNT > 1 */
|
||||
#if (OUTPUT_FORMAT_COUNT > 2)
|
||||
/* Standard AS Interface Descriptor (4.9.1) (Alt) */
|
||||
.Audio_Out_StreamInterface_Alt3 =
|
||||
@@ -1639,10 +1667,15 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_OUT_AUDIO,
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE, /* (bitmap) */
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* (bitmap) */
|
||||
#endif .wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_3_MAXPACKETSIZE,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
#endif
|
||||
.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_3_MAXPACKETSIZE,
|
||||
.bInterval = 1,
|
||||
},
|
||||
|
||||
@@ -1734,11 +1767,11 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bLength = 0x07,
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_IN_AUDIO,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
#ifdef XUA_ADAPTIVE
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
@@ -1806,11 +1839,11 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bLength = 0x07,
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_IN_AUDIO,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
#ifdef XUA_ADAPTIVE
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
@@ -1830,7 +1863,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bLockDelayUnits = 0x02,
|
||||
.wLockDelay = 0x0008,
|
||||
},
|
||||
#endif
|
||||
#endif /* (INPUT_FORMAT_COUNT > 1) */
|
||||
#if (INPUT_FORMAT_COUNT > 2)
|
||||
/* Alternative 3 */
|
||||
/* Standard AS Interface Descriptor (4.9.1) (Alt) */
|
||||
@@ -1879,11 +1912,11 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bLength = 0x07,
|
||||
.bDescriptorType = USB_DESCTYPE_ENDPOINT,
|
||||
.bEndpointAddress = ENDPOINT_ADDRESS_IN_AUDIO,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
#ifdef XUA_ADAPTIVE
|
||||
#ifdef XUA_ADAPTIVE
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
.bmAttributes = ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
.bmAttributes = ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
@@ -1903,7 +1936,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bLockDelayUnits = 0x02,
|
||||
.wLockDelay = 0x0008,
|
||||
},
|
||||
#endif
|
||||
#endif /* (INPUT_FORMAT_COUNT > 2) */
|
||||
|
||||
#endif /* #if(NUM_USB_CHAN_IN > 0) */
|
||||
#ifdef MIDI
|
||||
@@ -2052,14 +2085,14 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
0x09, /* 0 Size */
|
||||
0x21, /* 1 bDescriptorType : DFU FUNCTIONAL */
|
||||
0x07, /* 2 bmAttributes */
|
||||
0xFA, /* 3 wDetachTimeOut */
|
||||
0x00, /* 4 wDetachTimeOut */
|
||||
DFU_DETACH_TIME_OUT & 0xFF, /* 3 wDetachTimeOut */
|
||||
(DFU_DETACH_TIME_OUT >> 8) & 0xFF, /* 4 wDetachTimeOut */
|
||||
0x40, /* 5 wTransferSize */
|
||||
0x00, /* 6 wTransferSize */
|
||||
0x10, /* 7 bcdDFUVersion */
|
||||
0x01}, /* 7 bcdDFUVersion */
|
||||
#endif
|
||||
#endif
|
||||
#endif /* (XUA_DFU_EN == 1) */
|
||||
|
||||
#ifdef IAP
|
||||
/* Interface descriptor */
|
||||
@@ -2168,7 +2201,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
#endif
|
||||
#endif /* IAP */
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
.HID_Interface =
|
||||
{
|
||||
9, /* 0 bLength : Size of descriptor in Bytes */
|
||||
@@ -2202,22 +2235,22 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
ENDPOINT_ADDRESS_IN_HID, /* 2 bEndpointAddress */
|
||||
3, /* 3 bmAttributes (INTERRUPT) */
|
||||
64, /* 4 wMaxPacketSize */
|
||||
8, /* 6 bInterval */
|
||||
ENDPOINT_INT_INTERVAL_IN_HID, /* 6 bInterval */
|
||||
}
|
||||
#endif
|
||||
|
||||
};
|
||||
#endif
|
||||
#endif /* (AUDIO_CLASS == 2) */
|
||||
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
unsigned char hidDescriptor[] =
|
||||
{
|
||||
9, /* 0 bLength : Size of descriptor in Bytes */
|
||||
0x09, /* 0 bLength : Size of descriptor in Bytes */
|
||||
0x21, /* 1 bDescriptorType (HID) */
|
||||
0x10, /* 2 bcdHID */
|
||||
0x01, /* 3 bcdHID */
|
||||
0, /* 4 bCountryCode */
|
||||
1, /* 5 bNumDescriptors */
|
||||
0x00, /* 4 bCountryCode */
|
||||
0x01, /* 5 bNumDescriptors */
|
||||
0x22, /* 6 bDescriptorType[0] (Report) */
|
||||
sizeof(hidReportDescriptor) & 0xff, /* 7 wDescriptorLength[0] */
|
||||
sizeof(hidReportDescriptor) >> 8, /* 8 wDescriptorLength[0] */
|
||||
@@ -2277,6 +2310,8 @@ unsigned char cfgDesc_Null[] =
|
||||
* To work around this we repeat MAX_FREQ_FS multiple times in some cases */
|
||||
|
||||
#define MAX(a,b) (((a)>(b))?(a):(b))
|
||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||
|
||||
const unsigned num_freqs_a1 = MAX(3, (0
|
||||
#if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000)
|
||||
+ 1
|
||||
@@ -2324,18 +2359,13 @@ const unsigned num_freqs_a1 = MAX(3, (0
|
||||
#define DFU_INTERFACES_A1 0
|
||||
#endif
|
||||
|
||||
/* Total number of bytes returned for the class-specific AudioControl interface descriptor.
|
||||
* Includes the combined length of this descriptor header and all Unit and Terminal descriptors
|
||||
* For us this is IT -> FU -> OT * 2 and a header */
|
||||
#define AC_TOTAL_LENGTH (AC_LENGTH + \
|
||||
(INPUT_INTERFACES_A1 * (12 + ( (8 + NUM_USB_CHAN_IN_FS) * INPUT_VOLUME_CONTROL) + 9)) +\
|
||||
(OUTPUT_INTERFACES_A1 * (12 + ( (8 + NUM_USB_CHAN_OUT_FS) * OUTPUT_VOLUME_CONTROL) + 9)))
|
||||
|
||||
#define STREAMING_INTERFACES (INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1)
|
||||
|
||||
//#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
//#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES)
|
||||
//#endif
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#define HID_INTERFACE_BYTES ( 9 + 9 + 7 )
|
||||
#define HID_INTERFACES_A1 1
|
||||
#else
|
||||
#define HID_INTERFACE_BYTES 0
|
||||
#define HID_INTERFACES_A1 0
|
||||
#endif
|
||||
|
||||
/* Total number of bytes returned for the class-specific AudioControl interface descriptor.
|
||||
* Includes the combined length of this descriptor header and all Unit and Terminal descriptors
|
||||
@@ -2348,12 +2378,27 @@ const unsigned num_freqs_a1 = MAX(3, (0
|
||||
|
||||
/* Number of interfaces for Audio 1.0 (+1 for control ) */
|
||||
/* Note, this is different that INTERFACE_COUNT since we dont support items such as MIDI, iAP etc in UAC1 mode */
|
||||
#define NUM_INTERFACES_A1 (1+INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1+NUM_CONTROL_USB_INTERFACES+DFU_INTERFACES_A1)
|
||||
#define NUM_INTERFACES_A1 (1 + INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1 + NUM_CONTROL_USB_INTERFACES + DFU_INTERFACES_A1 + HID_INTERFACES_A1)
|
||||
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES)
|
||||
#if ((NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP))
|
||||
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES)
|
||||
#else
|
||||
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES)
|
||||
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES)
|
||||
#endif
|
||||
|
||||
#ifdef XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES
|
||||
#define AS_INTERFACE_BYTES (7)
|
||||
#define INTERFACE_DESCRIPTOR_BYTES (9)
|
||||
#define AS_FORMAT_TYPE_BYTES (17)
|
||||
#define USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 5)
|
||||
#define USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 5)
|
||||
|
||||
#define USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 8)
|
||||
#define USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 8)
|
||||
|
||||
#define USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + (AS_FORMAT_TYPE_BYTES) + 4)
|
||||
#define USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + (AS_FORMAT_TYPE_BYTES) + 4)
|
||||
|
||||
#endif
|
||||
|
||||
#define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16)
|
||||
@@ -2588,7 +2633,6 @@ unsigned char cfgDesc_Audio1[] =
|
||||
NUM_USB_CHAN_OUT_FS, /* nrChannels */
|
||||
FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, /* subFrameSize */
|
||||
FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS, /* bitResolution */
|
||||
|
||||
num_freqs_a1, /* SamFreqType - sample freq count */
|
||||
|
||||
/* Windows enum issue with <= two sample rates work around */
|
||||
@@ -2645,16 +2689,20 @@ unsigned char cfgDesc_Audio1[] =
|
||||
/* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */
|
||||
0x09,
|
||||
0x05, /* ENDPOINT */
|
||||
0x01, /* endpointAddress - D7, direction (0 OUT, 1 IN). D6..4 reserved (0). D3..0 endpoint no. */
|
||||
ENDPOINT_ADDRESS_OUT_AUDIO, /* endpointAddress - D7, direction (0 OUT, 1 IN). D6..4 reserved (0). D3..0 endpoint no. */
|
||||
#ifdef XUA_ADAPTIVE
|
||||
ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
ISO_EP_ATTRIBUTES_ASYNCH,
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
#endif
|
||||
(FS_STREAM_FORMAT_OUTPUT_1_MAXPACKETSIZE&0xff), /* 4 wMaxPacketSize (Typically 294 bytes)*/
|
||||
(FS_STREAM_FORMAT_OUTPUT_1_MAXPACKETSIZE&0xff00)>>8, /* 5 wMaxPacketSize */
|
||||
0x01, /* bInterval */
|
||||
0x00, /* bRefresh */
|
||||
0x00, /* bRefresh */
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
ENDPOINT_ADDRESS_IN_FEEDBACK, /* bSynchAdddress - address of EP used to communicate sync info */
|
||||
#else /* Bi-directional in/out device */
|
||||
@@ -2786,11 +2834,11 @@ unsigned char cfgDesc_Audio1[] =
|
||||
0x09,
|
||||
0x05, /* ENDPOINT */
|
||||
ENDPOINT_ADDRESS_IN_AUDIO, /* EndpointAddress */
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
#ifdef XUA_ADAPTIVE
|
||||
#ifdef XUA_ADAPTIVE
|
||||
ISO_EP_ATTRIBUTES_ADAPTIVE,
|
||||
#else
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
|
||||
ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */
|
||||
#else
|
||||
ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */
|
||||
#endif
|
||||
@@ -2834,8 +2882,8 @@ unsigned char cfgDesc_Audio1[] =
|
||||
0x09, /* 0 Size */
|
||||
0x21, /* 1 bDescriptorType : DFU FUNCTIONAL */
|
||||
0x07, /* 2 bmAttributes */
|
||||
0xFA, /* 3 wDetachTimeOut */
|
||||
0x00, /* 4 wDetachTimeOut */
|
||||
DFU_DETACH_TIME_OUT & 0xFF, /* 3 wDetachTimeOut */
|
||||
(DFU_DETACH_TIME_OUT >> 8) & 0xFF, /* 4 wDetachTimeOut */
|
||||
0x40, /* 5 wTransferSize */
|
||||
0x00, /* 6 wTransferSize */
|
||||
0x10, /* 7 bcdDFUVersion */
|
||||
@@ -2855,6 +2903,39 @@ unsigned char cfgDesc_Audio1[] =
|
||||
offsetof(StringDescTable_t, ctrlStr)/sizeof(char *), /* 8 iInterface */
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
/* HID interface descriptor */
|
||||
0x09, /* 0 bLength : Size of descriptor in Bytes */
|
||||
0x04, /* 1 bDescriptorType (Interface: 0x04)*/
|
||||
INTERFACE_NUMBER_HID, /* 2 bInterfaceNumber : Number of interface */
|
||||
0x00, /* 3 bAlternateSetting : Value used alternate interfaces using SetInterface Request */
|
||||
0x01, /* 4: bNumEndpoints : Number of endpoitns for this interface (excluding 0) */
|
||||
0x03, /* 5: bInterfaceClass */
|
||||
0x00, /* 6: bInterfaceSubClass - no boot device */
|
||||
0x00, /* 7: bInterfaceProtocol*/
|
||||
0x00, /* 8 iInterface */
|
||||
|
||||
/* HID descriptor */
|
||||
0x09, /* 0 bLength : Size of descriptor in Bytes */
|
||||
0x21, /* 1 bDescriptorType (HID) */
|
||||
0x10, /* 2 bcdHID */
|
||||
0x01, /* 3 bcdHID */
|
||||
0x00, /* 4 bCountryCode */
|
||||
0x01, /* 5 bNumDescriptors */
|
||||
0x22, /* 6 bDescriptorType[0] (Report) */
|
||||
0x2B, /* 7 wDescriptorLength[0] */
|
||||
0x00, /* 8 wDescriptorLength[0] */
|
||||
|
||||
/* HID Endpoint descriptor (IN) */
|
||||
0x07, /* 0 bLength */
|
||||
0x05, /* 1 bDescriptorType */
|
||||
ENDPOINT_ADDRESS_IN_HID, /* 2 bEndpointAddress */
|
||||
0x03, /* 3 bmAttributes (INTERRUPT) */
|
||||
0x40, /* 4 wMaxPacketSize */
|
||||
0x00, /* 5 wMaxPacketSize */
|
||||
ENDPOINT_INT_INTERVAL_IN_HID, /* 6 bInterval */
|
||||
#endif
|
||||
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
// Copyright (c) 2014-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2014-2020, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef _AUDIOREQUESTS_H_
|
||||
#define _AUDIOREQUESTS_H_
|
||||
|
||||
#include <xccompat.h>
|
||||
|
||||
int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), chanend c_audioControl,
|
||||
int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctl));
|
||||
|
||||
XUD_Result_t AudioClassRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), chanend c_audioControl,
|
||||
XUD_Result_t AudioClassRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctl));
|
||||
|
||||
int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), chanend c_audioControl,
|
||||
int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp), NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctl));
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved
|
||||
/**
|
||||
* @brief Implements relevant requests from the USB Audio 2.0 Specification
|
||||
* @author Ross Owen, XMOS Semiconductor
|
||||
@@ -273,7 +273,7 @@ static void updateVol(int unitID, int channel, chanend ?c_mix_ctl)
|
||||
* XUD_RES_RST for device reset
|
||||
* else XUD_RES_ERR
|
||||
*/
|
||||
int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl
|
||||
int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend ?c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl
|
||||
)
|
||||
{
|
||||
unsigned int buffer[32];
|
||||
@@ -1071,7 +1071,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
|
||||
|
||||
#if (AUDIO_CLASS_FALLBACK != 0) || (AUDIO_CLASS == 1)
|
||||
|
||||
int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl)
|
||||
int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend ?c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl)
|
||||
{
|
||||
/* At this point we know:
|
||||
* bmRequestType.Recipient = Endpoint
|
||||
@@ -1159,7 +1159,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp
|
||||
|
||||
|
||||
/* Handles the Audio Class 1.0 specific requests */
|
||||
XUD_Result_t AudioClassRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl
|
||||
XUD_Result_t AudioClassRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, chanend ?c_audioControl, chanend ?c_mix_ctl, chanend ?c_clk_ctl
|
||||
)
|
||||
{
|
||||
#if (OUTPUT_VOLUME_CONTROL == 1) || (INPUT_VOLUME_CONTROL == 1)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2012-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2012-2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#include "xua.h" /* Device specific defines */
|
||||
#ifndef EXCLUDE_USB_AUDIO_MAIN
|
||||
@@ -259,7 +259,7 @@ XUD_EpType epTypeTableIn[ENDPOINT_COUNT_IN] = { XUD_EPTYPE_CTL | XUD_STATUS_ENAB
|
||||
#ifdef MIDI
|
||||
XUD_EPTYPE_BUL,
|
||||
#endif
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
XUD_EPTYPE_INT,
|
||||
#endif
|
||||
#ifdef IAP
|
||||
@@ -400,7 +400,7 @@ VENDOR_REQUESTS_PARAMS_DEC_
|
||||
c_clk_int,
|
||||
#endif
|
||||
c_sof, c_aud_ctl, p_for_mclk_count
|
||||
#ifdef HID_CONTROLS
|
||||
#if( 0 < HID_CONTROLS )
|
||||
, c_xud_in[ENDPOINT_NUMBER_IN_HID]
|
||||
#endif
|
||||
#ifdef CHAN_BUFF_CTRL
|
||||
|
||||
@@ -1,15 +1,26 @@
|
||||
// Copyright (c) 2015-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2015-2019, XMOS Ltd, All rights reserved
|
||||
#ifndef MIC_ARRAY_CONF_H_
|
||||
#define MIC_ARRAY_CONF_H_
|
||||
|
||||
#include "xua_conf_full.h"
|
||||
|
||||
// The default definition of MIC_ARRAY_MAX_FRAME_SIZE_LOG2 must appear in this file
|
||||
// because an assembler file #includes it.
|
||||
// The assembler does not understand C language syntax, only C pre-processor syntax.
|
||||
#ifndef MIC_ARRAY_MAX_FRAME_SIZE_LOG2
|
||||
#define MIC_ARRAY_MAX_FRAME_SIZE_LOG2 0
|
||||
#define MIC_ARRAY_MAX_FRAME_SIZE_LOG2 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MIC_ARRAY_NUM_MICS
|
||||
#define MIC_ARRAY_NUM_MICS (XUA_NUM_PDM_MICS)
|
||||
#endif
|
||||
|
||||
// MIC_DUAL_FRAME_SIZE has no meaning if MIC_DUAL_ENABLED is false.
|
||||
// Only define MIC_DUAL_FRAME_SIZE if MIC_DUAL_ENABLED is true.
|
||||
#if defined(MIC_DUAL_ENABLED) && (MIC_DUAL_ENABLED != 0)
|
||||
#ifndef MIC_DUAL_FRAME_SIZE
|
||||
#define MIC_DUAL_FRAME_SIZE (XUA_MIC_FRAME_SIZE)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* MIC_ARRAY_CONF_H_ */
|
||||
|
||||
85
lib_xua/src/core/user/hid/user_hid.h
Normal file
85
lib_xua/src/core/user/hid/user_hid.h
Normal file
@@ -0,0 +1,85 @@
|
||||
// Copyright (c) 2013-2020, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef __USER_HID_H__
|
||||
#define __USER_HID_H__
|
||||
|
||||
/**
|
||||
* \brief HID event identifiers
|
||||
*
|
||||
* This enumeration defines a constant value for each HID event.
|
||||
* It defines one value for each of the four GPI pins supported in the standard voice products.
|
||||
* It defines a further 28 values for generic events.
|
||||
*/
|
||||
typedef enum hidEventId_t {
|
||||
HID_EVENT_ID_GPI0 = 0,
|
||||
HID_EVENT_ID_GPI1,
|
||||
HID_EVENT_ID_GPI2,
|
||||
HID_EVENT_ID_GPI3,
|
||||
HID_EVENT_ID_EVT0,
|
||||
HID_EVENT_ID_EVT1,
|
||||
HID_EVENT_ID_EVT2,
|
||||
HID_EVENT_ID_EVT3,
|
||||
HID_EVENT_ID_EVT4,
|
||||
HID_EVENT_ID_EVT5,
|
||||
HID_EVENT_ID_EVT6,
|
||||
HID_EVENT_ID_EVT7,
|
||||
HID_EVENT_ID_EVT8,
|
||||
HID_EVENT_ID_EVT9,
|
||||
HID_EVENT_ID_EVT10,
|
||||
HID_EVENT_ID_EVT11,
|
||||
HID_EVENT_ID_EVT12,
|
||||
HID_EVENT_ID_EVT13,
|
||||
HID_EVENT_ID_EVT14,
|
||||
HID_EVENT_ID_EVT15,
|
||||
HID_EVENT_ID_EVT16,
|
||||
HID_EVENT_ID_EVT17,
|
||||
HID_EVENT_ID_EVT18,
|
||||
HID_EVENT_ID_EVT19,
|
||||
HID_EVENT_ID_EVT20,
|
||||
HID_EVENT_ID_EVT21,
|
||||
HID_EVENT_ID_EVT22,
|
||||
HID_EVENT_ID_EVT23,
|
||||
HID_EVENT_ID_EVT24,
|
||||
HID_EVENT_ID_EVT25,
|
||||
HID_EVENT_ID_EVT26,
|
||||
HID_EVENT_ID_EVT27,
|
||||
HID_EVENT_ID_INVALID = 0xffffffff,
|
||||
} hidEventId_t;
|
||||
|
||||
#define HID_DATA_BYTES 4
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
|
||||
/**
|
||||
* \brief Get the data for the next HID report
|
||||
*
|
||||
* \note This function returns the HID data as a list of unsigned char because the
|
||||
* \c XUD_SetReady_In() accepts data for transmission to the USB Host using
|
||||
* this type.
|
||||
*
|
||||
* \param{out} hidData The HID data
|
||||
*/
|
||||
void UserHIDGetData( unsigned char hidData[ HID_DATA_BYTES ]);
|
||||
|
||||
/**
|
||||
* \brief Initialize HID processing
|
||||
*/
|
||||
void UserHIDInit( void );
|
||||
|
||||
/**
|
||||
* \brief Record that a HID event has occurred
|
||||
*
|
||||
* \param{in} hidEventId The identifier of an event which has occurred
|
||||
* \param{in} hidEventData A list of data associated with the event
|
||||
* \param{in} hidEventDataSize The length of the event data list
|
||||
*
|
||||
* \note At present, this function only takes a single element of event data, i.e.
|
||||
* hidEventDataSize must equal 1.
|
||||
*
|
||||
* \note At present, this function treats the event data as a Boolean flag.
|
||||
* Zero means False; all other values mean True.
|
||||
*/
|
||||
void UserHIDRecordEvent( const hidEventId_t hidEventId, const int * hidEventData, const unsigned hidEventDataSize );
|
||||
|
||||
#endif /* ( 0 < HID_CONTROLS ) */
|
||||
#endif /* __USER_HID_H__ */
|
||||
@@ -1,13 +0,0 @@
|
||||
// Copyright (c) 2013-2018, XMOS Ltd, All rights reserved
|
||||
|
||||
|
||||
/* These defines relate to the HID report desc - do not mod */
|
||||
#define HID_CONTROL_PLAYPAUSE_SHIFT 0x00
|
||||
#define HID_CONTROL_NEXT_SHIFT 0x01
|
||||
#define HID_CONTROL_PREV_SHIFT 0x02
|
||||
#define HID_CONTROL_VOLUP_SHIFT 0x03
|
||||
#define HID_CONTROL_VOLDN_SHIFT 0x04
|
||||
#define HID_CONTROL_MUTE_SHIFT 0x05
|
||||
|
||||
void UserReadHIDButtons(unsigned char hidData[]);
|
||||
|
||||
249
lib_xua/src/hid/hid.xc
Normal file
249
lib_xua/src/hid/hid.xc
Normal file
@@ -0,0 +1,249 @@
|
||||
// Copyright (c) 2019, XMOS Ltd, All rights reserved
|
||||
#include <xs1.h>
|
||||
#include "descriptor_defs.h"
|
||||
#include "hid.h"
|
||||
#include "xud.h"
|
||||
#include "xud_std_requests.h"
|
||||
#include "xua_hid.h"
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#define MS_IN_TICKS 100000U
|
||||
|
||||
static unsigned s_hidChangePending = 0U;
|
||||
static unsigned s_hidCurrentPeriod = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
|
||||
static unsigned s_hidIdleActive = 0U;
|
||||
static unsigned s_hidIndefiniteDuration = 0U;
|
||||
static unsigned s_hidNextReportTime = 0U;
|
||||
static unsigned s_hidReportTime = 0U;
|
||||
|
||||
unsafe {
|
||||
volatile unsigned * unsafe s_hidChangePendingPtr = &s_hidChangePending;
|
||||
}
|
||||
|
||||
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod );
|
||||
static unsigned HidCalcReportToSetIdleInterval( const unsigned reportTime );
|
||||
static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, const unsigned timeWithinPeriod );
|
||||
static XUD_Result_t HidProcessSetIdleRequest( XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_SetupPacket_t &sp );
|
||||
static unsigned HidTimeDiff( const unsigned earlierTime, const unsigned laterTime );
|
||||
|
||||
void HidCalcNextReportTime( void )
|
||||
{
|
||||
s_hidNextReportTime = s_hidReportTime + s_hidCurrentPeriod;
|
||||
}
|
||||
|
||||
void HidCaptureReportTime( void )
|
||||
{
|
||||
timer tmr;
|
||||
tmr :> s_hidReportTime;
|
||||
}
|
||||
|
||||
XUD_Result_t HidInterfaceClassRequests(
|
||||
XUD_ep c_ep0_out,
|
||||
XUD_ep c_ep0_in,
|
||||
USB_SetupPacket_t &sp )
|
||||
{
|
||||
XUD_Result_t result = XUD_RES_ERR;
|
||||
|
||||
switch ( sp.bRequest ) {
|
||||
case HID_SET_IDLE:
|
||||
result = HidProcessSetIdleRequest( c_ep0_out, c_ep0_in, sp );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void HidClearChangePending( void )
|
||||
{
|
||||
unsafe {
|
||||
*s_hidChangePendingPtr = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned HidIsChangePending( void )
|
||||
{
|
||||
return( s_hidChangePending != 0 );
|
||||
}
|
||||
|
||||
unsigned HidIsSetIdleSilenced( void )
|
||||
{
|
||||
unsigned isSilenced = s_hidIdleActive;
|
||||
|
||||
if( s_hidIdleActive ) {
|
||||
unsigned currentTime;
|
||||
// Use inline assembly to access the time without creating a side-effect.
|
||||
// The mapper complains if the time comes from an XC timer because this function is called in the guard of a select case.
|
||||
// Appearently the use of a timer creates a side-effect that prohibits the operation of the select functionality.
|
||||
asm volatile( "gettime %0" : "=r" ( currentTime ));
|
||||
isSilenced = ( s_hidIndefiniteDuration || ( timeafter( s_hidNextReportTime, currentTime )));
|
||||
}
|
||||
|
||||
return isSilenced;
|
||||
}
|
||||
|
||||
void HidSetChangePending( void )
|
||||
{
|
||||
unsafe {
|
||||
*s_hidChangePendingPtr = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Calculate the timer value for sending the next HID Report.
|
||||
*
|
||||
* With regard to Section 7.2.4 Set_Idle Request of the USB Device Class Definition for Human
|
||||
* Interface Devices (HID) Version 1.11, I've interpreted 'currently executing period' and
|
||||
* 'current period' to mean the previously established Set Idle duration if one has been
|
||||
* established or the polling interval from the HID Report Descriptor if a Set Idle duration
|
||||
* has not been established.
|
||||
*
|
||||
* \param[in] currentPeriod -- The duration of the current period in timer ticks
|
||||
* \param[in] reportTime -- The time at which the last HID Report was sent
|
||||
* \param[in] reportToSetIdleInterval -- The time interval between receiving the Set Idle Request
|
||||
* and sending the most recent HID Report
|
||||
* \param[in] newPeriod -- The new period value in timer ticks
|
||||
*
|
||||
* \return The time at which the next HID Report should be sent
|
||||
*/
|
||||
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod )
|
||||
{
|
||||
unsigned nextReportTime = 0;
|
||||
|
||||
if( HidFindSetIdleActivationPoint( currentPeriod, reportToSetIdleInterval )) {
|
||||
/* Activate immediately after sending the next HID Report */
|
||||
nextReportTime = reportTime + currentPeriod;
|
||||
} else {
|
||||
/* Activate immediately after sending the most recent HID Report */
|
||||
nextReportTime = reportTime + newPeriod;
|
||||
}
|
||||
|
||||
return nextReportTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Calculate the time interval between the most recent HID Report and a subsequent Set Idle Request
|
||||
*
|
||||
* \warning For this function to produce an accurate interval measument, it must be called without delay
|
||||
* upon receiving a Set Idle Request from the USB Host.
|
||||
*
|
||||
* \param[in] reportTime -- The time at which the last HID Report was sent
|
||||
*
|
||||
* \return The time interval between receiving the Set Idle Request and sending the most recent HID Report
|
||||
*/
|
||||
static unsigned HidCalcReportToSetIdleInterval( const unsigned reportTime )
|
||||
{
|
||||
timer tmr;
|
||||
unsigned setIdleTime;
|
||||
|
||||
tmr :> setIdleTime;
|
||||
unsigned result = HidTimeDiff( reportTime, setIdleTime );
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Indicate if activation of the Set Idle Request happens at the previous or next HID Report
|
||||
*
|
||||
* Section 7.2.4 Set_Idle Request of the USB Device Class Definition for Human Interface
|
||||
* Devices (HID) Version 1.11 makes two statements about the activation point for starting the
|
||||
* duration of the request:
|
||||
* - 'A new request will be executed as if it were issued immediately after the last report, if
|
||||
* the new request is received at least 4 milliseconds before the end of the currently executing
|
||||
* period.'
|
||||
* - 'If the new request is received within 4 milliseconds of the end of the current period, then
|
||||
* the new request will have no effect until after the report.'
|
||||
*
|
||||
* \param[in] currentPeriod -- The duration of the current period
|
||||
* \param[in] timeWithinPeriod -- The current point in time relative to the current period
|
||||
*
|
||||
* \return A Boolean indicating where the activation of the Set Idle Request Duration occurs.
|
||||
* \retval 1 -- Activate immediately after the next HID Report
|
||||
* \retval 0 -- Activate immediately after the previous HID Report
|
||||
*/
|
||||
static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, const unsigned timeWithinPeriod )
|
||||
{
|
||||
unsigned result = (( currentPeriod - timeWithinPeriod ) < ( 4U * MS_IN_TICKS )) ? 1 : 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Process a Set Idle request
|
||||
*
|
||||
* \param[in] c_ep0_out -- the channel that carries data from Endpoint 0
|
||||
* \param[in] c_ep0_in -- the channel that carries data for Endpoint 0
|
||||
* \param[in] sp -- a structure containing the Set Idle data
|
||||
*
|
||||
* \return An XUD status value
|
||||
*/
|
||||
static XUD_Result_t HidProcessSetIdleRequest( XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_SetupPacket_t &sp )
|
||||
{
|
||||
XUD_Result_t result = XUD_RES_ERR;
|
||||
|
||||
/*
|
||||
The Set Idle request wValue field contains two sub-fields:
|
||||
- Duration in the MSB; and
|
||||
- Report ID in the LSB.
|
||||
|
||||
The Duration field specifies how long the USB Device responds with NAK provided the HID data hasn't changed.
|
||||
Zero means indefinitely.
|
||||
The value is in units of 4ms.
|
||||
|
||||
The Report ID identifies the HID report that the USB Host wishes to silence.
|
||||
|
||||
The Set Idle request xIndex field contains the interface number.
|
||||
*/
|
||||
uint16_t duration = ( sp.wValue & 0xFF00 ) >> 6; // Transform from units of 4ms into units of 1ms.
|
||||
uint8_t reportId = sp.wValue & 0x00FF;
|
||||
uint16_t interfaceNum = sp.wIndex;
|
||||
|
||||
/*
|
||||
As long as our HID Report Descriptor does not include a Report ID, any Report ID value other than zero
|
||||
indicates an error by the USB Host (see xua_ep0_descriptors.h for the definition of the HID
|
||||
Report Descriptor).
|
||||
|
||||
Any Interface value other than INTERFACE_NUMBER_HID indicates an error by the USB Host.
|
||||
*/
|
||||
if(( 0U == reportId ) && ( INTERFACE_NUMBER_HID == interfaceNum )) {
|
||||
s_hidIdleActive = (( 0U == duration ) || ( ENDPOINT_INT_INTERVAL_IN_HID < duration ));
|
||||
|
||||
if( s_hidIdleActive ) {
|
||||
unsigned reportToSetIdleInterval = HidCalcReportToSetIdleInterval( s_hidReportTime );
|
||||
s_hidNextReportTime = HidCalcNewReportTime( s_hidCurrentPeriod, s_hidReportTime, reportToSetIdleInterval, duration * MS_IN_TICKS );
|
||||
s_hidCurrentPeriod = duration * MS_IN_TICKS;
|
||||
s_hidIndefiniteDuration = ( 0U == duration );
|
||||
} else {
|
||||
s_hidCurrentPeriod = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS;
|
||||
s_hidIndefiniteDuration = 0U;
|
||||
}
|
||||
|
||||
result = XUD_DoSetRequestStatus( c_ep0_in );
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Calculate the difference between two points in time
|
||||
*
|
||||
* This function calculates the difference between two two points in time.
|
||||
* It always returns a positive value even if the timer used to obtain the two
|
||||
* time measurements has wrapped around.
|
||||
*
|
||||
* \warning If time values have been obtained from a timer that has wrapped
|
||||
* more than once in between the two measurements, this function returns an
|
||||
* incorrect value.
|
||||
*
|
||||
* \param[in] earlierTime -- A value from a timer
|
||||
* \param[in] laterTime -- A value from a timer taken after \a earlierTime
|
||||
*
|
||||
* \return The interval between the two points in time
|
||||
*/
|
||||
static unsigned HidTimeDiff( const unsigned earlierTime, const unsigned laterTime )
|
||||
{
|
||||
return ( earlierTime < laterTime ) ? laterTime - earlierTime : UINT_MAX - earlierTime + laterTime;
|
||||
}
|
||||
|
||||
#endif /* ( 0 < HID_CONTROLS ) */
|
||||
77
lib_xua/src/hid/xua_hid.h
Normal file
77
lib_xua/src/hid/xua_hid.h
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright (c) 2019, XMOS Ltd, All rights reserved
|
||||
|
||||
#ifndef __XUA_HID_H__
|
||||
#define __XUA_HID_H__
|
||||
|
||||
#include <xs1.h>
|
||||
#include <xccompat.h>
|
||||
#include "xud.h"
|
||||
#include "xud_std_requests.h"
|
||||
|
||||
/**
|
||||
* \brief Calculate the next time to respond with a HID Report.
|
||||
*
|
||||
* If the USB Host has previously sent a valid HID Set_Idle request with
|
||||
* a duration of zero or greater than the default reporting interval,
|
||||
* the device sends HID Reports periodically or when the value of the
|
||||
* payload has changed.
|
||||
*
|
||||
* This function calculates the time for sending the next periodic
|
||||
* HID Report.
|
||||
*/
|
||||
void HidCalcNextReportTime( void );
|
||||
|
||||
/**
|
||||
* \brief Capture the time of sending the current HID Report.
|
||||
*
|
||||
* If the USB Host has previously sent a valid HID Set_Idle request with
|
||||
* a duration of zero or greater than the default reporting interval,
|
||||
* the device sends HID Reports periodically or when the value of the
|
||||
* payload has changed.
|
||||
*
|
||||
* This function captures the time when the HID Report was sent so that
|
||||
* a subsequent call to HidCalNextReportTime() can calculate the time
|
||||
* to send the next periodic HID Report.
|
||||
*/
|
||||
void HidCaptureReportTime( void );
|
||||
|
||||
XUD_Result_t HidInterfaceClassRequests(
|
||||
XUD_ep c_ep0_out,
|
||||
XUD_ep c_ep0_in,
|
||||
REFERENCE_PARAM( USB_SetupPacket_t, sp ));
|
||||
|
||||
/**
|
||||
* \brief Register that previously changed HID Report data has reported
|
||||
* to the USB Host.
|
||||
*/
|
||||
void HidClearChangePending( void );
|
||||
|
||||
/**
|
||||
* \brief Indicate if a change to the HID Report data has been received.
|
||||
*/
|
||||
unsigned HidIsChangePending( void );
|
||||
|
||||
/**
|
||||
* \brief Indicate whether to send a HID Report based on elapsed time.
|
||||
*
|
||||
* If the USB Host has previously sent a valid HID Set_Idle request with
|
||||
* a duration of zero or greater than the default reporting interval,
|
||||
* the device sends HID Reports periodically or when the value of the
|
||||
* payload has changed.
|
||||
*
|
||||
* This function monitors the passage of time and reports to the caller
|
||||
* whether or not the time to send the next periodic HID Report has
|
||||
* elapsed.
|
||||
*
|
||||
* \return A Boolean value indicating whether or not to send the HID Report.
|
||||
* \retval 1 -- Do not send the HID Report
|
||||
* \retval 0 -- Send the HID Report
|
||||
*/
|
||||
unsigned HidIsSetIdleSilenced( void );
|
||||
|
||||
/**
|
||||
* \brief Register that a change to the HID Report data has been received.
|
||||
*/
|
||||
void HidSetChangePending( void );
|
||||
|
||||
#endif // __XUA_HID_H__
|
||||
@@ -1,6 +1,6 @@
|
||||
Software Release License Agreement
|
||||
|
||||
Copyright (c) 2016-2018, XMOS, All rights reserved.
|
||||
Copyright (c) 2016-2019, XMOS, All rights reserved.
|
||||
|
||||
BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2016-2018, XMOS Ltd, All rights reserved
|
||||
// Copyright (c) 2016-2019, XMOS Ltd, All rights reserved
|
||||
#ifndef __custom_defines_h__
|
||||
#define __custom_defines_h__
|
||||
|
||||
@@ -22,5 +22,7 @@
|
||||
#define AUDIO_CLASS_FALLBACK 0
|
||||
#define BCD_DEVICE 0x1234
|
||||
#define XUA_DFU_EN 0
|
||||
#define MIC_DUAL_ENABLED 1 //Use single thread, dual PDM mic
|
||||
#define XUA_MIC_FRAME_SIZE 240
|
||||
|
||||
#endif // __custom_defines_h__
|
||||
|
||||
Reference in New Issue
Block a user