forked from PAWPAW-Mirror/lib_xua
Compare commits
349 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66adce4150 | ||
|
|
638a4f0d16 | ||
|
|
88251feef6 | ||
|
|
a28dbded86 | ||
|
|
51d5c4bdb2 | ||
|
|
c6c1b48839 | ||
|
|
206a895b74 | ||
|
|
55e01e5b49 | ||
|
|
4ffcef2347 | ||
|
|
9edef4a1f1 | ||
|
|
266711caf7 | ||
|
|
4e5634167b | ||
|
|
d7a9b160c2 | ||
|
|
0d8f080604 | ||
|
|
24d0c51818 | ||
|
|
41cb59dc8d | ||
|
|
fca2ec2058 | ||
|
|
0f8b9dae8c | ||
|
|
d5946b91a4 | ||
|
|
d3fafdfbac | ||
|
|
0e77b159c6 | ||
|
|
116e7a5b90 | ||
|
|
f6a6fb9c5c | ||
|
|
392e00f989 | ||
|
|
edd34ac157 | ||
|
|
fd58827b88 | ||
|
|
8bf991eb76 | ||
|
|
46a7b7ac22 | ||
|
|
ea3dffb05c | ||
|
|
cf826e910d | ||
|
|
a270972bf9 | ||
|
|
9a25e0538e | ||
|
|
93959376c5 | ||
|
|
c09e515455 | ||
|
|
449a899597 | ||
|
|
f0cd906730 | ||
|
|
1865b2c3f1 | ||
|
|
2ba4c37363 | ||
|
|
99e61b0cd9 | ||
|
|
2f298f84e5 | ||
|
|
6a0688d908 | ||
|
|
0ce5b17c2b | ||
|
|
fdc99ffccb | ||
|
|
1f994be63e | ||
|
|
3e87d0ec30 | ||
|
|
136fbcf08c | ||
|
|
c027e2df18 | ||
|
|
2931d41882 | ||
|
|
7a493ca479 | ||
|
|
769bfa1a5a | ||
|
|
7198dbf02c | ||
|
|
29c9b3ea75 | ||
|
|
0ad3048e63 | ||
|
|
de8fbd428b | ||
|
|
1e5d57ae2c | ||
|
|
073bc9552a | ||
|
|
39fda0a178 | ||
|
|
91d16b13a2 | ||
|
|
ad889247a0 | ||
|
|
a7675ba997 | ||
|
|
41c6b90549 | ||
|
|
b62782faa0 | ||
|
|
8c30ce60f2 | ||
|
|
b3d66f4ca4 | ||
|
|
bdb5c56f7c | ||
|
|
a08f5d78fb | ||
|
|
515ec9c022 | ||
|
|
c0104fcf48 | ||
|
|
f88e5877be | ||
|
|
d33397164b | ||
|
|
a087e31b0f | ||
|
|
418622c593 | ||
|
|
6b0688d23e | ||
|
|
37ce235594 | ||
|
|
64cbd072f4 | ||
|
|
9b0e541e95 | ||
|
|
4d68b26b42 | ||
|
|
662b24386d | ||
|
|
c60da7fd82 | ||
|
|
45ab345521 | ||
|
|
692c4ee7ed | ||
|
|
5fa86dabbb | ||
|
|
9863b37ead | ||
|
|
46f516ddbc | ||
|
|
a404138903 | ||
|
|
147b5fb7f7 | ||
|
|
ebb3a0bfcb | ||
|
|
ec87a43dbf | ||
|
|
b0a8735623 | ||
|
|
93721f3144 | ||
|
|
d7b41cd35f | ||
|
|
d3560ca7fe | ||
|
|
ff86ac8d2a | ||
|
|
eebd438620 | ||
|
|
5bb44c54e1 | ||
|
|
36d325a457 | ||
|
|
d40ede1525 | ||
|
|
4f37069efb | ||
|
|
9f667d96f8 | ||
|
|
c352ed1132 | ||
|
|
a18e5a976f | ||
|
|
737c5bd7d0 | ||
|
|
7a0cfca280 | ||
|
|
3988906e39 | ||
|
|
cd0248c162 | ||
|
|
55de7a8abd | ||
|
|
911c8c51f2 | ||
|
|
fa9d483d2f | ||
|
|
1ae9c55477 | ||
|
|
94a05a8ece | ||
|
|
a93987d281 | ||
|
|
4f35551547 | ||
|
|
cb774f3c11 | ||
|
|
66a611f4fd | ||
|
|
b61ea63d40 | ||
|
|
8c132af069 | ||
|
|
93229a7509 | ||
|
|
466cc0abbb | ||
|
|
d5d5bd0637 | ||
|
|
ee6c22bd37 | ||
|
|
703a277059 | ||
|
|
b88342ab2b | ||
|
|
e7f9428731 | ||
|
|
6400e146d0 | ||
|
|
da114a1dea | ||
|
|
77398218b5 | ||
|
|
244a7718a1 | ||
|
|
e71ffdba00 | ||
|
|
625123e4a6 | ||
|
|
548992ab5c | ||
|
|
ccc1ee4021 | ||
|
|
ab96a726d6 | ||
|
|
d3d9b5ba23 | ||
|
|
c3e95a379f | ||
|
|
5be97ac227 | ||
|
|
8799f5f36e | ||
|
|
71dd8b5409 | ||
|
|
e41aed6ffb | ||
|
|
548ccebb27 | ||
|
|
3895b486ab | ||
|
|
ebeae1fa17 | ||
|
|
f328deb336 | ||
|
|
353d7c3c8d | ||
|
|
5f971af054 | ||
|
|
2b5dab51b5 | ||
|
|
19be25809b | ||
|
|
26cac1abb1 | ||
|
|
03a5024520 | ||
|
|
08ed5ee668 | ||
|
|
2b96ea0171 | ||
|
|
1b186a0c2f | ||
|
|
ed7a33b40f | ||
|
|
459ce6bd63 | ||
|
|
3819f30ad0 | ||
|
|
79e256f829 | ||
|
|
be90779db5 | ||
|
|
de382e5cc0 | ||
|
|
6dfc934d36 | ||
|
|
7dfd78deb4 | ||
|
|
fac0542920 | ||
|
|
8c9e8b11b9 | ||
|
|
21b259bc88 | ||
|
|
589c16d56c | ||
|
|
b4d5cb93f1 | ||
|
|
1d22975fd2 | ||
|
|
5354d94987 | ||
|
|
171ef30f42 | ||
|
|
8c175187c8 | ||
|
|
53f80dfba4 | ||
|
|
21c1e661ae | ||
|
|
d515458b83 | ||
|
|
b853589120 | ||
|
|
966d8db9a9 | ||
|
|
dc22b0593f | ||
|
|
0892ff9a8b | ||
|
|
65b1b41ec4 | ||
|
|
3b6f1c80e2 | ||
|
|
bf9e150310 | ||
|
|
1857ddbc67 | ||
|
|
145c0cb80f | ||
|
|
1fe4fc6771 | ||
|
|
88a3d6b20d | ||
|
|
33ec43134c | ||
|
|
2bbebc0a39 | ||
|
|
32af5b7b20 | ||
|
|
fc6915be6f | ||
|
|
d9dc7cc7c7 | ||
|
|
898a6c2410 | ||
|
|
da758f48fa | ||
|
|
2923f7574b | ||
|
|
436a268781 | ||
|
|
8233ef1d47 | ||
|
|
1109e08dd8 | ||
|
|
15f1d4de59 | ||
|
|
911a82cd83 | ||
|
|
ec657d1e8d | ||
|
|
9e82d613bb | ||
|
|
eb62940dc6 | ||
|
|
ef46bd72b9 | ||
|
|
7abcb487a9 | ||
|
|
e87a53ff83 | ||
|
|
8e05595710 | ||
|
|
ffee831f5d | ||
|
|
ad88e3342e | ||
|
|
d0986cb37f | ||
|
|
9d148f68a3 | ||
|
|
3b1b7f81dc | ||
|
|
1e4bcf01c7 | ||
|
|
46ce681a88 | ||
|
|
0cb3aab9c2 | ||
|
|
4c6fb9f271 | ||
|
|
2bc36947a8 | ||
|
|
7f001e1780 | ||
|
|
a04d06303b | ||
|
|
9b153bbda5 | ||
|
|
9d55c315c8 | ||
|
|
36a5163f4f | ||
|
|
e8e31ed8ff | ||
|
|
afeac0fa81 | ||
|
|
46d8201ba6 | ||
|
|
5910638bed | ||
|
|
f25a765e82 | ||
|
|
e3068ad245 | ||
|
|
1a5280ad14 | ||
|
|
4033b26587 | ||
|
|
65103d8c88 | ||
|
|
364efa72c3 | ||
|
|
3da2b12b59 | ||
|
|
8c397b1514 | ||
|
|
55cfb7b7da | ||
|
|
32e4fb55d3 | ||
|
|
687c06864c | ||
|
|
8c7dfab9f2 | ||
|
|
b711b3adf6 | ||
|
|
5c402f26c9 | ||
|
|
bec7111cfd | ||
|
|
20cba85383 | ||
|
|
01c2874953 | ||
|
|
5ea315fee8 | ||
|
|
4dbe332b2c | ||
|
|
0f0e8506b3 | ||
|
|
ada99bd1d9 | ||
|
|
a3617a641f | ||
|
|
f01bf03605 | ||
|
|
a237472efb | ||
|
|
5fe76d3720 | ||
|
|
0130d3fb32 | ||
|
|
45671148d5 | ||
|
|
6f146cccbc | ||
|
|
00eb07e637 | ||
|
|
a411b864c2 | ||
|
|
1f6140c912 | ||
|
|
e98c0b11bc | ||
|
|
285be1cd7a | ||
|
|
3f3007c3ac | ||
|
|
32e06c1ad2 | ||
|
|
95b80ebf72 | ||
|
|
25d4a74b59 | ||
|
|
99be4c9005 | ||
|
|
05bf241ab8 | ||
|
|
e401895314 | ||
|
|
ea5575a621 | ||
|
|
066231d86a | ||
|
|
108c551cef | ||
|
|
008508c8ae | ||
|
|
6636e2f505 | ||
|
|
b47a30a04c | ||
|
|
567e5cc0e0 | ||
|
|
382b1a8754 | ||
|
|
4446ab89c0 | ||
|
|
b871b4c046 | ||
|
|
fd45908ff6 | ||
|
|
dab84e56df | ||
|
|
64805d203e | ||
|
|
9d41387b8a | ||
|
|
162c9a14ce | ||
|
|
345f5dc369 | ||
|
|
bc957cb593 | ||
|
|
12789a1bee | ||
|
|
4c9130166c | ||
|
|
aec5bb8daa | ||
|
|
3106ccefcf | ||
|
|
7b43785816 | ||
|
|
0b9d970f75 | ||
|
|
f2b09522b8 | ||
|
|
d0b2c77177 | ||
|
|
cafdd8c93d | ||
|
|
13abe0e9e1 | ||
|
|
8a9d8cdd3e | ||
|
|
3c129ab521 | ||
|
|
dd7a8f423e | ||
|
|
a9e97b33b9 | ||
|
|
6adc94642a | ||
|
|
33fcac9c47 | ||
|
|
7b433a40fc | ||
|
|
b81d096a5a | ||
|
|
fc8a7a1ec9 | ||
|
|
fcee74d912 | ||
|
|
d1650afd37 | ||
|
|
02596cc5a9 | ||
|
|
a9dddfab2f | ||
|
|
f3e8a1937f | ||
|
|
b1f3cc0024 | ||
|
|
46cac9afb9 | ||
|
|
b552d60567 | ||
|
|
3ae4a4e456 | ||
|
|
728980e7dc | ||
|
|
29ab72e614 | ||
|
|
f1a1ee077f | ||
|
|
eb6d3b0869 | ||
|
|
fbef825a3b | ||
|
|
9cdbe9c62d | ||
|
|
0e27c7f2ff | ||
|
|
c0dade0156 | ||
|
|
ede81bd5f7 | ||
|
|
7836aacf47 | ||
|
|
4ffe3d94c7 | ||
|
|
0f47ef96be | ||
|
|
496dd16431 | ||
|
|
cbf2320de6 | ||
|
|
ae5d364226 | ||
|
|
bd805acf04 | ||
|
|
9b2efd07ad | ||
|
|
1ddbfdd8c1 | ||
|
|
2c5058d953 | ||
|
|
294d3a469e | ||
|
|
f66ddc53eb | ||
|
|
e55aa3ca8e | ||
|
|
368031064a | ||
|
|
e6c8766bb7 | ||
|
|
844cfb2ec2 | ||
|
|
a44d5466b5 | ||
|
|
0ed4ed0974 | ||
|
|
a8ba18094f | ||
|
|
89fe6c4d5d | ||
|
|
4b6a3697ac | ||
|
|
703ba4975a | ||
|
|
8a869ce230 | ||
|
|
6b9249507d | ||
|
|
c31f1521c2 | ||
|
|
35fe4fadeb | ||
|
|
7d7ec6858d | ||
|
|
cf5c486c62 | ||
|
|
d765ba1dfb | ||
|
|
49f1739098 | ||
|
|
21eee27d64 | ||
|
|
8c2dea71dc | ||
|
|
c3a45b2cba | ||
|
|
cd5f7272c8 |
1
.github/CODEOWNERS
vendored
Normal file
1
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1 @@
|
||||
* @xross
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -20,6 +20,9 @@
|
||||
test_results.csv
|
||||
_build*
|
||||
**/.venv/**
|
||||
**/.vscode/**
|
||||
**.egg-info
|
||||
*.pdf
|
||||
|
||||
# waf build files
|
||||
.lock-waf_*
|
||||
|
||||
7
Brewfile
7
Brewfile
@@ -1,7 +0,0 @@
|
||||
tap 'homebrew/core'
|
||||
|
||||
brew 'perl'
|
||||
brew 'cpanm'
|
||||
|
||||
brew 'python@2'
|
||||
brew 'pipenv'
|
||||
382
CHANGELOG.rst
382
CHANGELOG.rst
@@ -1,25 +1,104 @@
|
||||
lib_xua Change Log
|
||||
==================
|
||||
|
||||
3.2.0
|
||||
-----
|
||||
|
||||
* CHANGED: Updated tests to use lib_locks (was legacy module_locks)
|
||||
* CHANGED: Exclude HID Report functions unless the HID feature is enabled
|
||||
* CHANGED: Explicit feedback EP enabled by default (see
|
||||
UAC_FORCE_FEEDBACK_EP)
|
||||
* FIXED: Incorrect conditional compilation of HID report code
|
||||
* FIXED: Input/output descriptors written when input/output not enabled.
|
||||
(Audio class 1.0 mode using XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES)
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
- lib_dsp: 5.0.0 -> 6.2.1
|
||||
|
||||
- lib_locks: Added dependency 2.1.0
|
||||
|
||||
- lib_logging: 3.0.0 -> 3.1.1
|
||||
|
||||
- lib_mic_array: 4.0.0 -> 4.5.0
|
||||
|
||||
- lib_spdif: 4.0.0 -> 4.1.0
|
||||
|
||||
- lib_xassert: 4.0.0 -> 4.1.0
|
||||
|
||||
- lib_xud: 2.0.0 -> 2.1.0
|
||||
|
||||
3.1.0
|
||||
-----
|
||||
|
||||
* CHANGED: Removed logic from HID API functions allowing a Report ID of 0 to
|
||||
be used as "all/any" Report
|
||||
|
||||
3.0.0
|
||||
-----
|
||||
|
||||
* ADDED: Support for HID Report IDs
|
||||
* CHANGED: Renamed the HID API file xua_hid_report_descriptor.h to
|
||||
xua_hid_report.h
|
||||
* REMOVED: Support for HID Reports containing controls from mixed usage
|
||||
pages
|
||||
|
||||
2.1.1
|
||||
-----
|
||||
|
||||
* CHANGED: Setting of HID report items
|
||||
|
||||
2.1.0
|
||||
-----
|
||||
|
||||
* CHANGED: Updated clock blocks to support lib_xud v2.0.0
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
- lib_xud: 1.2.0 -> 2.0.0
|
||||
|
||||
2.0.0
|
||||
-----
|
||||
|
||||
* ADDED: Function to get a Report item description
|
||||
* ADDED: Support for multiple flash specs defined by DFU_FLASH_DEVICE
|
||||
* ADDED: Nullable c_aud_ctl chan-end optimisation for fixed rate devices
|
||||
* CHANGED: Check HID Usage Page when changing a Report item description
|
||||
* CHANGED: HID event ID from list to bit and byte location in HID Report
|
||||
* CHANGED: Interface to UserHIDRecordEvent()
|
||||
|
||||
1.3.0
|
||||
-----
|
||||
|
||||
* ADDED: Build default HID Report descriptor at boot-time
|
||||
* ADDED: Function to return length of HID Report
|
||||
* CHANGED: Move HID descriptors to ease maintenance
|
||||
* CHANGED: Move legacy tests to separate directory
|
||||
* CHANGED: Replace unused GPI-specific HID event names with generic ones
|
||||
* CHANGED: HID Report to return multiple bytes
|
||||
* CHANGED: NO_USB conditional compilation switch with XUA_USB_EN
|
||||
* CHANGED: Clock blocks used for BCLK and MCLK
|
||||
* CHANGED: Arguments no longer supported by XUD_Main
|
||||
* REMOVED: Support for XS1 based devices
|
||||
|
||||
1.2.0
|
||||
-----
|
||||
|
||||
* ADDED: Updates for xcore.ai/XS3 compatibility
|
||||
* ADDED: Makefile.Win32 for xmosdfu on Windows
|
||||
* CHANGED: Use XMOS Public Licence Version 1
|
||||
* FIXED: Bump default BCD device number to v1.2.0
|
||||
* FIXED: xmosdfu now fails with an error when given a directory (#119)
|
||||
* FIXED: Compilation errors related to HID code
|
||||
* FIXED: Runtime error when using mic array interface
|
||||
* CHANGED: Use XMOS Public Licence Version 1
|
||||
* FIXED: Automate HID Report Descriptor length in AC1 HID Descriptor
|
||||
|
||||
1.1.1
|
||||
-----
|
||||
|
||||
* RESOLVED: Zero length input packets generated before enumeration causing I2S
|
||||
timing pushout at startup
|
||||
* CHANGED: Pin Python package versions
|
||||
* REMOVED: not necessary cpanfile
|
||||
* CHANGED: Pin Python package versions
|
||||
* FIXED: Zero length input packets generated before enumeration causing
|
||||
I2S timing pushout at startup
|
||||
|
||||
1.1.0
|
||||
-----
|
||||
@@ -39,13 +118,12 @@ lib_xua Change Log
|
||||
* 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
|
||||
* CHANGED: 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
|
||||
* CHANGED: 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
|
||||
@@ -55,11 +133,24 @@ lib_xua Change Log
|
||||
* ADDED: Override USB descriptor with sampling frequency and
|
||||
bit-resolution set at boot time.
|
||||
* ADDED: Global pointer to allow external access to masterClockFreq
|
||||
* FIXED: Descriptors for XUA_ADAPTIVE incorrectly defined for IN endpoint
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
- lib_spdif: 3.1.0 -> 4.0.0
|
||||
|
||||
- lib_xassert: 3.0.1 -> 4.0.0
|
||||
|
||||
0.2.1
|
||||
-----
|
||||
|
||||
* HOTFIX: Fix descriptors for XUA_ADAPTIVE
|
||||
* FIXED: Fix descriptors for XUA_ADAPTIVE
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
- lib_logging: 2.1.1 -> 3.0.0
|
||||
|
||||
- lib_xud: 0.1.0 -> 0.2.0
|
||||
|
||||
0.2.0
|
||||
-----
|
||||
@@ -67,17 +158,17 @@ lib_xua Change Log
|
||||
* ADDED: Initial library documentation
|
||||
* ADDED: Application note AN00247: Using lib_xua with lib_spdif (transmit)
|
||||
* ADDED: Separate callbacks for input/output audio stream start/stop
|
||||
* CHANGE: I2S hardware resources no longer used globally and must be passed
|
||||
* CHANGED: I2S hardware resources no longer used globally and must be passed
|
||||
to XUA_AudioHub()
|
||||
* CHANGE: XUA_AudioHub() no longer pars S/PDIF transmitter task
|
||||
* CHANGE: Moved to lib_spdif (from module_spdif_tx & module_spdif_rx)
|
||||
* CHANGE: Define NUM_PDM_MICS renamed to XUA_NUM_PDM_MICS
|
||||
* CHANGE: Define NO_USB renamed to XUA_USB_EN
|
||||
* CHANGE: Build files updated to support new "xcommon" behaviour in xwaf.
|
||||
* RESOLVED: wChannelConfig in UAC1 descriptor set according to output channel
|
||||
* CHANGED: XUA_AudioHub() no longer pars S/PDIF transmitter task
|
||||
* CHANGED: Moved to lib_spdif (from module_spdif_tx & module_spdif_rx)
|
||||
* CHANGED: Define NUM_PDM_MICS renamed to XUA_NUM_PDM_MICS
|
||||
* CHANGED: Define NO_USB renamed to XUA_USB_EN
|
||||
* CHANGED: Build files updated to support new "xcommon" behaviour in xwaf.
|
||||
* FIXED: wChannelConfig in UAC1 descriptor set according to output channel
|
||||
count
|
||||
* RESOLVED: Indexing of ADAT channel strings (#18059)
|
||||
* RESOLVED: Rebooting device fails when PLL config "not reset" bit is set
|
||||
* FIXED: Indexing of ADAT channel strings (#18059)
|
||||
* FIXED: Rebooting device fails when PLL config "not reset" bit is set
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
@@ -93,20 +184,19 @@ lib_xua Change Log
|
||||
-----
|
||||
|
||||
* ADDED: Application note AN00246: Simple USB Audio Device using lib_xua
|
||||
* CHANGE: xmosdfu emits warning if empty image read via upload
|
||||
* CHANGE: Simplified mclk port sharing - no longer uses unsafe pointer
|
||||
* RESOLVED: Runtime exception issues when incorrect feedback calculated
|
||||
* CHANGED: xmosdfu emits warning if empty image read via upload
|
||||
* CHANGED: Simplified mclk port sharing - no longer uses unsafe pointer
|
||||
* FIXED: Runtime exception issues when incorrect feedback calculated
|
||||
(introduced in sc_usb_audio 6.13)
|
||||
* RESOLVED: Output sample counter reset on stream start. Caused playback
|
||||
* FIXED: Output sample counter reset on stream start. Caused playback
|
||||
issues on some Linux based hosts
|
||||
|
||||
0.1.1
|
||||
-----
|
||||
|
||||
* RESOLVED: Configurations where I2S_CHANS_DAC and I2S_CHANS_ADC are both 0
|
||||
now build
|
||||
* RESOLVED: Deadlock in mixer when MAX_MIX_COUNT > 0 for larger channel
|
||||
counts
|
||||
* FIXED: Configurations where I2S_CHANS_DAC and I2S_CHANS_ADC are both 0 now
|
||||
build
|
||||
* FIXED: Deadlock in mixer when MAX_MIX_COUNT > 0 for larger channel counts
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
@@ -117,31 +207,31 @@ lib_xua Change Log
|
||||
0.1.0
|
||||
-----
|
||||
|
||||
* ADDED: FB_USE_REF_CLOCK to allow feedback generation from xCORE
|
||||
internal reference
|
||||
* ADDED: Linux Makefile for xmosdfu host application
|
||||
* ADDED: Raspberry Pi Makefile for xmosdfu host application
|
||||
* ADDED: Documentation of PID argument to xmosdfu
|
||||
* ADDED: Optional build time microphone delay line (MIC_BUFFER_DEPTH)
|
||||
* CHANGE: Removal of audManage_if, users should define their own
|
||||
interfaces as required
|
||||
* CHANGE: Vendor specific control interface in UAC1 descriptor now has a
|
||||
* ADDED: FB_USE_REF_CLOCK to allow feedback generation from xCORE internal
|
||||
reference
|
||||
* ADDED: Linux Makefile for xmosdfu host application
|
||||
* ADDED: Raspberry Pi Makefile for xmosdfu host application
|
||||
* ADDED: Documentation of PID argument to xmosdfu
|
||||
* ADDED: Optional build time microphone delay line (MIC_BUFFER_DEPTH)
|
||||
* CHANGED: Removal of audManage_if, users should define their own interfaces
|
||||
as required
|
||||
* CHANGED: Vendor specific control interface in UAC1 descriptor now has a
|
||||
string descriptor so it shows up with a descriptive name in Windows Device
|
||||
Manager
|
||||
* CHANGE: DFU_BCD_DEVICE removed (now uses BCD_DEVICE)
|
||||
* CHANGE: Renaming in descriptors.h to avoid clashes with application
|
||||
* CHANGE: Make device reboot function no-argument (was one channel end)
|
||||
* RESOLVED: FIR gain compensation for PDM mics set incorrectly for divide of
|
||||
* CHANGED: DFU_BCD_DEVICE removed (now uses BCD_DEVICE)
|
||||
* CHANGED: Renaming in descriptors.h to avoid clashes with application
|
||||
* CHANGED: Make device reboot function no-argument (was one channel end)
|
||||
* FIXED: FIR gain compensation for PDM mics set incorrectly for divide of
|
||||
8
|
||||
* RESOLVED: Incorrect xmosdfu DYLD path in test script code
|
||||
* RESOLVED: xmosdfu cannot find XMOS device on modern MacBook Pro (#17897)
|
||||
* RESOLVED: Issue when feedback is initially incorrect when two SOF's are
|
||||
not yet received
|
||||
* RESOLVED: AUDIO_TILE and PDM_TILE may now share the same value/tile
|
||||
* RESOLVED: Cope with out of order interface numbers in xmosdfu
|
||||
* RESOLVED: DSD playback not functional on xCORE-200 (introduced in
|
||||
* FIXED: Incorrect xmosdfu DYLD path in test script code
|
||||
* FIXED: xmosdfu cannot find XMOS device on modern MacBook Pro (#17897)
|
||||
* FIXED: Issue when feedback is initially incorrect when two SOF's are not
|
||||
yet received
|
||||
* FIXED: AUDIO_TILE and PDM_TILE may now share the same value/tile
|
||||
* FIXED: Cope with out of order interface numbers in xmosdfu
|
||||
* FIXED: DSD playback not functional on xCORE-200 (introduced in
|
||||
sc_usb_audio 6.14)
|
||||
* RESOLVED: Improvements made to clock sync code in TDM slave mode
|
||||
* FIXED: Improvements made to clock sync code in TDM slave mode
|
||||
|
||||
|
||||
Legacy release history
|
||||
@@ -151,105 +241,105 @@ Legacy release history
|
||||
|
||||
7.4.1
|
||||
-----
|
||||
- RESOLVED: Exception due to null chanend when using NO_USB
|
||||
- FIXED: Exception due to null chanend when using NO_USB
|
||||
|
||||
7.4.0
|
||||
-----
|
||||
- RESOLVED: PID_DFU now based on AUDIO_CLASS. This potentially caused issues
|
||||
- FIXED: PID_DFU now based on AUDIO_CLASS. This potentially caused issues
|
||||
with UAC1 DFU
|
||||
|
||||
|
||||
7.3.0
|
||||
-----
|
||||
- CHANGE: Example OSX DFU host app updated to now take PID as runtime
|
||||
- CHANGED: Example OSX DFU host app updated to now take PID as runtime
|
||||
argument. This enabled multiple XMOS devices to be attached to the host
|
||||
during DFU process
|
||||
|
||||
7.2.0
|
||||
-----
|
||||
- ADDED: DFU to UAC1 descriptors (guarded by DFU and FORCE_UAC1_DFU)
|
||||
- RESOLVED: Removed 'reinterpretation to type of larger alignment' warnings
|
||||
- RESOLVED: DFU flash code run on tile[0] even if XUD_TILE and AUDIO_IO_TILE are not 0
|
||||
- FIXED: Removed 'reinterpretation to type of larger alignment' warnings
|
||||
- FIXED: DFU flash code run on tile[0] even if XUD_TILE and AUDIO_IO_TILE are not 0
|
||||
|
||||
7.1.0
|
||||
-----
|
||||
- ADDED: UserBufferManagementInit() to reset any state required in UserBufferManagement()
|
||||
- ADDED: I2S output up-sampling (enabled when AUD_TO_USB_RATIO is > 1)
|
||||
- ADDED: PDM Mic decimator output rate can now be controlled independently (via AUD_TO_MICS_RATIO)
|
||||
- CHANGE: Rename I2S input down-sampling (enabled when AUD_TO_USB_RATIO is > 1, rather than via I2S_DOWNSAMPLE_FACTOR)
|
||||
- RESOLVED: Crosstalk between input channels when I2S input down-sampling is enabled
|
||||
- RESOLVED: Mic decimation data tables properly sized when mic sample-rate < USB audio sample-rate
|
||||
- CHANGED: Rename I2S input down-sampling (enabled when AUD_TO_USB_RATIO is > 1, rather than via I2S_DOWNSAMPLE_FACTOR)
|
||||
- FIXED: Crosstalk between input channels when I2S input down-sampling is enabled
|
||||
- FIXED: Mic decimation data tables properly sized when mic sample-rate < USB audio sample-rate
|
||||
|
||||
7.0.1
|
||||
-----
|
||||
- RESOLVED: PDM microphone decimation issue at some sample rates caused by integration
|
||||
- FIXED: PDM microphone decimation issue at some sample rates caused by integration
|
||||
|
||||
7.0.0
|
||||
------
|
||||
- ADDED: I2S down-sampling (I2S_DOWNSAMPLE_FACTOR)
|
||||
- ADDED: I2S resynchronisation when in slave mode (CODEC_MASTER=1)
|
||||
- CHANGE: Various memory optimisations when MAX_FREQ = MIN_FREQ
|
||||
- CHANGE: Memory optimisations in audio buffering
|
||||
- CHANGE: Various memory optimisations in UAC1 mode
|
||||
- CHANGE: user_pdm_process() API change
|
||||
- CHANGE: PDM Mic decimator table now related to MIN_FREQ (memory optimisation)
|
||||
- RESOLVED: Audio request interrupt handler properly eliminated
|
||||
- CHANGED: Various memory optimisations when MAX_FREQ = MIN_FREQ
|
||||
- CHANGED: Memory optimisations in audio buffering
|
||||
- CHANGED: Various memory optimisations in UAC1 mode
|
||||
- CHANGED: user_pdm_process() API change
|
||||
- CHANGED: PDM Mic decimator table now related to MIN_FREQ (memory optimisation)
|
||||
- FIXED: Audio request interrupt handler properly eliminated
|
||||
|
||||
6.30.0
|
||||
------
|
||||
- RESOLVED: Number of PDM microphone channels configured now based on NUM_PDM_MICS define
|
||||
(previously hard-coded)
|
||||
- RESOLVED: PDM microphone clock divide now based MCLK defines (previously hard-coded)
|
||||
- CHANGE: Second microphone decimation core only run if NUM_PDM_MICS > 4
|
||||
- FIXED: Number of PDM microphone channels configured now based on NUM_PDM_MICS define
|
||||
(previously hard-coded)
|
||||
- FIXED: PDM microphone clock divide now based MCLK defines (previously hard-coded)
|
||||
- CHANGED: Second microphone decimation core only run if NUM_PDM_MICS > 4
|
||||
|
||||
6.20.0
|
||||
------
|
||||
- RESOLVED: Intra-frame sample delays of 1/2 samples on input streaming in TDM mode
|
||||
- RESOLVED: Build issue with NUM_USB_CHAN_OUT set to 0 and MIXER enabled
|
||||
- RESOLVED: SPDIF_TX_INDEX not defined build warning only emitted when SPDIF_TX defined
|
||||
- RESOLVED: Failure to enter DFU mode when configured without input volume control
|
||||
- FIXED: Intra-frame sample delays of 1/2 samples on input streaming in TDM mode
|
||||
- FIXED: Build issue with NUM_USB_CHAN_OUT set to 0 and MIXER enabled
|
||||
- FIXED: SPDIF_TX_INDEX not defined build warning only emitted when SPDIF_TX defined
|
||||
- FIXED: Failure to enter DFU mode when configured without input volume control
|
||||
|
||||
6.19.0
|
||||
------
|
||||
- RESOLVED: SPDIF_TX_INDEX not defined build warning only emitted when SPDIF_TX defined
|
||||
- RESOLVED: Failure to enter DFU mode when configured without input volume control
|
||||
- FIXED: SPDIF_TX_INDEX not defined build warning only emitted when SPDIF_TX defined
|
||||
- FIXED: Failure to enter DFU mode when configured without input volume control
|
||||
|
||||
6.18.1
|
||||
------
|
||||
- ADDED: Vendor Specific control interface added to UAC1 descriptors to allow control of
|
||||
XVSM params from Windows (via lib_usb)
|
||||
- ADDED: Vendor Specific control interface added to UAC1 descriptors to allow control of
|
||||
XVSM params from Windows (via lib_usb)
|
||||
|
||||
6.18.0
|
||||
------
|
||||
- ADDED: Call to VendorRequests() and VendorRequests_Init() to Endpoint 0
|
||||
- ADDED: VENDOR_REQUESTS_PARAMS define to allow for custom parameters to VendorRequest calls
|
||||
- RESOLVED: FIR gain compensation set appropriately in lib_mic_array usage
|
||||
- CHANGE: i_dsp interface renamed i_audManage
|
||||
- ADDED: Call to VendorRequests() and VendorRequests_Init() to Endpoint 0
|
||||
- ADDED: VENDOR_REQUESTS_PARAMS define to allow for custom parameters to VendorRequest calls
|
||||
- FIXED: FIR gain compensation set appropriately in lib_mic_array usage
|
||||
- CHANGED: i_dsp interface renamed i_audManage
|
||||
|
||||
6.16.0
|
||||
------
|
||||
- ADDED: Call to UserBufferManagement()
|
||||
- ADDED: PDM_MIC_INDEX in devicedefines.h and usage
|
||||
- CHANGE: pdm_buffer() task now combinable
|
||||
- CHANGE: Audio I/O task now takes i_dsp interface as a parameter
|
||||
- CHANGE: Removed built-in support for A/U series internal ADC
|
||||
- CHANGE: User PDM Microphone processing now uses an interface (previously function call)
|
||||
- CHANGED: pdm_buffer() task now combinable
|
||||
- CHANGED: Audio I/O task now takes i_dsp interface as a parameter
|
||||
- CHANGED: Removed built-in support for A/U series internal ADC
|
||||
- CHANGED: User PDM Microphone processing now uses an interface (previously function call)
|
||||
|
||||
6.15.2
|
||||
------
|
||||
- RESOLVED: interrupt.h (used in audio buffering) now compatible with xCORE-200 ABI
|
||||
- FIXED: interrupt.h (used in audio buffering) now compatible with xCORE-200 ABI
|
||||
|
||||
6.15.1
|
||||
------
|
||||
- RESOLVED: DAC data mis-alignment issue in TDM/I2S slave mode
|
||||
- CHANGE: Updates to support API changes in lib_mic_array version 2.0
|
||||
- FIXED: DAC data mis-alignment issue in TDM/I2S slave mode
|
||||
- CHANGED: Updates to support API changes in lib_mic_array version 2.0
|
||||
|
||||
6.15.0
|
||||
------
|
||||
|
||||
- RESOLVED: UAC 1.0 descriptors now support multi-channel volume control (previously were
|
||||
- FIXED: UAC 1.0 descriptors now support multi-channel volume control (previously were
|
||||
hard-coded as stereo)
|
||||
- CHANGE: Removed 32kHz sample-rate support when PDM microphones enabled (lib_mic_array
|
||||
- CHANGED: Removed 32kHz sample-rate support when PDM microphones enabled (lib_mic_array
|
||||
currently does not support non-integer decimation factors)
|
||||
|
||||
6.14.0
|
||||
@@ -263,75 +353,75 @@ Legacy release history
|
||||
list and UAC 1.0 descriptors
|
||||
- ADDED: Support for the use and integration of PDM microphones (including PDM to PCM
|
||||
conversion) via lib_mic_array
|
||||
- RESOLVED: MIDI data not accepted after "sleep" in OSX 10.11 (El Capitan) - related to sc_xud
|
||||
- FIXED: MIDI data not accepted after "sleep" in OSX 10.11 (El Capitan) - related to sc_xud
|
||||
issue #17092
|
||||
- CHANGE: Asynchronous feedback system re-implemented to allow for the first two ADDED
|
||||
- CHANGED: Asynchronous feedback system re-implemented to allow for the first two ADDED
|
||||
changelog items
|
||||
- CHANGE: Hardware divider used to generate bit-clock from master clock (xCORE-200 only).
|
||||
- CHANGED: Hardware divider used to generate bit-clock from master clock (xCORE-200 only).
|
||||
Allows easy support for greater number of master-clock to sample-rate ratios.
|
||||
- CHANGE: module_queue no longer uses any assert module/lib
|
||||
- CHANGED: module_queue no longer uses any assert module/lib
|
||||
|
||||
6.13.0
|
||||
------
|
||||
- ADDED: Device now uses implicit feedback when input stream is available (previously explicit
|
||||
feedback pipe always used). This saves chanend/EP resources and means less processing
|
||||
burden for the host. Previous behaviour available by enabling UAC_FORCE_FEEDBACK_EP
|
||||
- RESOLVED: Exception when SPDIF_TX and ADAT_TX both enabled due to clock-block being configured
|
||||
- FIXED: Exception when SPDIF_TX and ADAT_TX both enabled due to clock-block being configured
|
||||
after already started. Caused by SPDIF_TX define check typo
|
||||
- RESOLVED: DFU flag address changed to properly conform to memory address range allocated to
|
||||
- FIXED: DFU flag address changed to properly conform to memory address range allocated to
|
||||
apps by tools
|
||||
- RESOLVED: Build failure when DFU disabled
|
||||
- RESOLVED: Build issue when I2S_CHANS_ADC/DAC set to 0 and CODEC_MASTER enabled
|
||||
- RESOLVED: Typo in MCLK_441 checking for MIN_FREQ define
|
||||
- CHANGE: Mixer and non-mixer channel comms scheme (decouple <-> audio path) now identical
|
||||
- CHANGE: Input stream buffering modified such that during overflow older samples are removed
|
||||
- FIXED: Build failure when DFU disabled
|
||||
- FIXED: Build issue when I2S_CHANS_ADC/DAC set to 0 and CODEC_MASTER enabled
|
||||
- FIXED: Typo in MCLK_441 checking for MIN_FREQ define
|
||||
- CHANGED: Mixer and non-mixer channel comms scheme (decouple <-> audio path) now identical
|
||||
- CHANGED: Input stream buffering modified such that during overflow older samples are removed
|
||||
rather than ignoring most recent samples. Removes any chance of stale input packets
|
||||
being sent to host
|
||||
- CHANGE: module_queue (in sc_usb_audio) now uses lib_xassert rather than module_xassert
|
||||
- CHANGED: module_queue (in sc_usb_audio) now uses lib_xassert rather than module_xassert
|
||||
|
||||
6.12.6
|
||||
------
|
||||
- RESOLVED: Build error when DFU is disabled
|
||||
- RESOLVED: Build error when I2S_CHANS_ADC or I2S_CHANS_DAC set to 0 and CODEC_MASTER enabled
|
||||
- FIXED: Build error when DFU is disabled
|
||||
- FIXED: Build error when I2S_CHANS_ADC or I2S_CHANS_DAC set to 0 and CODEC_MASTER enabled
|
||||
|
||||
6.12.5
|
||||
------
|
||||
- RESOLVED: Stream issue when NUM_USB_CHAN_IN < I2S_CHANS_ADC
|
||||
- FIXED: Stream issue when NUM_USB_CHAN_IN < I2S_CHANS_ADC
|
||||
|
||||
6.12.4
|
||||
------
|
||||
- RESOLVED: DFU fail when DSD enabled and USB library not running on tile[0]
|
||||
- FIXED: DFU fail when DSD enabled and USB library not running on tile[0]
|
||||
|
||||
6.12.3
|
||||
------
|
||||
- RESOLVED: Method for storing persistent state over a DFU reboot modified to improve resilience
|
||||
- FIXED: Method for storing persistent state over a DFU reboot modified to improve resilience
|
||||
against code-base and tools changes
|
||||
|
||||
6.12.2
|
||||
------
|
||||
- RESOLVED: Reboot code (used for DFU) failure in tools versions > 14.0.2 (xCORE-200 only)
|
||||
- RESOLVED: Run-time exception in mixer when MAX_MIX_COUNT > 0 (xCORE-200 only)
|
||||
- RESOLVED: MAX_MIX_COUNT checked properly for mix strings in string table
|
||||
- CHANGE: DFU code re-written to use an XC interface. The flash-part may now be connected
|
||||
- FIXED: Reboot code (used for DFU) failure in tools versions > 14.0.2 (xCORE-200 only)
|
||||
- FIXED: Run-time exception in mixer when MAX_MIX_COUNT > 0 (xCORE-200 only)
|
||||
- FIXED: MAX_MIX_COUNT checked properly for mix strings in string table
|
||||
- CHANGED: DFU code re-written to use an XC interface. The flash-part may now be connected
|
||||
to a separate tile to the tile running USB code
|
||||
- CHANGE: DFU code can now use quad-SPI flash
|
||||
- CHANGE: Example xmos_dfu application now uses a list of PIDs to allow adding PIDs easier.
|
||||
- CHANGED: DFU code can now use quad-SPI flash
|
||||
- CHANGED: Example xmos_dfu application now uses a list of PIDs to allow adding PIDs easier.
|
||||
--listdevices command also added.
|
||||
- CHANGE: I2S_CHANS_PER_FRAME and I2S_WIRES_xxx defines tidied
|
||||
- CHANGED: I2S_CHANS_PER_FRAME and I2S_WIRES_xxx defines tidied
|
||||
|
||||
6.12.1
|
||||
------
|
||||
- RESOLVED: Fixes to TDM input timing/sample-alignment when BCLK=MCLK
|
||||
- RESOLVED: Various minor fixes to allow ADAT_RX to run on xCORE 200 MC AUDIO hardware
|
||||
- CHANGE: Moved from old SPDIF define to SPDIF_TX
|
||||
- FIXED: Fixes to TDM input timing/sample-alignment when BCLK=MCLK
|
||||
- FIXED: Various minor fixes to allow ADAT_RX to run on xCORE 200 MC AUDIO hardware
|
||||
- CHANGED: Moved from old SPDIF define to SPDIF_TX
|
||||
|
||||
6.12.0
|
||||
------
|
||||
- ADDED: Checks for XUD_200_SERIES define where required
|
||||
- RESOLVED: Run-time exception due to decouple interrupt not entering correct issue mode
|
||||
- FIXED: Run-time exception due to decouple interrupt not entering correct issue mode
|
||||
(affects XCORE-200 only)
|
||||
- CHANGE: SPDIF Tx Core may now reside on a different tile from I2S
|
||||
- CHANGE: I2C ports now in structure to match new module_i2c_singleport/shared API.
|
||||
- CHANGED: SPDIF Tx Core may now reside on a different tile from I2S
|
||||
- CHANGED: I2C ports now in structure to match new module_i2c_singleport/shared API.
|
||||
|
||||
* Changes to dependencies:
|
||||
|
||||
@@ -341,48 +431,48 @@ Legacy release history
|
||||
|
||||
6.11.3
|
||||
------
|
||||
- RESOLVED: (Major) Streaming issue when mixer not enabled (introduced in 6.11.2)
|
||||
- FIXED: (Major) Streaming issue when mixer not enabled (introduced in 6.11.2)
|
||||
|
||||
6.11.2
|
||||
------
|
||||
- RESOLVED: (Major) Enumeration issue when MAX_MIX_COUNT > 0 only. Introduced in mixer
|
||||
- FIXED: (Major) Enumeration issue when MAX_MIX_COUNT > 0 only. Introduced in mixer
|
||||
optimisations in 6.11.0. Only affects designs using mixer functionality.
|
||||
- RESOLVED: (Normal) Audio buffering request system modified such that the mixer output is
|
||||
- FIXED: (Normal) Audio buffering request system modified such that the mixer output is
|
||||
not silent when in underflow case (i.e. host output stream not active) This issue was
|
||||
introduced with the addition of DSD functionality and only affects designs using
|
||||
mixer functionality.
|
||||
- RESOLVED: (Minor) Potential build issue due to duplicate labels in inline asm in
|
||||
- FIXED: (Minor) Potential build issue due to duplicate labels in inline asm in
|
||||
set_interrupt_handler macro
|
||||
- RESOLVED: (Minor) BCD_DEVICE define in devicedefines.h now guarded by ifndef (caused issues
|
||||
- FIXED: (Minor) BCD_DEVICE define in devicedefines.h now guarded by ifndef (caused issues
|
||||
with DFU test build configs.
|
||||
- RESOLVED: (Minor) String descriptor for Clock Selector unit incorrectly reported
|
||||
- RESOLVED: (Minor) BCD_DEVICE in devicedefines.h now guarded by #ifndef (Caused issues with
|
||||
- FIXED: (Minor) String descriptor for Clock Selector unit incorrectly reported
|
||||
- FIXED: (Minor) BCD_DEVICE in devicedefines.h now guarded by #ifndef (Caused issues with
|
||||
default DFU test build configs.
|
||||
- CHANGE: HID report descriptor defines added to shared user_hid.h
|
||||
- CHANGE: Now uses module_adat_rx from sc_adat (local module_usb_audio_adat removed)
|
||||
- CHANGED: HID report descriptor defines added to shared user_hid.h
|
||||
- CHANGED: Now uses module_adat_rx from sc_adat (local module_usb_audio_adat removed)
|
||||
|
||||
6.11.1
|
||||
------
|
||||
- ADDED: ADAT transmit functionality, including SMUX. See ADAT_TX and ADAT_TX_INDEX.
|
||||
- RESOLVED: (Normal) Build issue with CODEC_MASTER (xCore is I2S slave) enabled
|
||||
- RESOLVED: (Minor) Channel ordering issue in when TDM and CODEC_MASTER mode enabled
|
||||
- RESOLVED: (Normal) DFU fails when SPDIF_RX enabled due to clock block being shared between SPDIF
|
||||
- FIXED: (Normal) Build issue with CODEC_MASTER (xCore is I2S slave) enabled
|
||||
- FIXED: (Minor) Channel ordering issue in when TDM and CODEC_MASTER mode enabled
|
||||
- FIXED: (Normal) DFU fails when SPDIF_RX enabled due to clock block being shared between SPDIF
|
||||
core and FlashLib
|
||||
|
||||
6.11.0
|
||||
------
|
||||
- ADDED: Basic TDM I2S functionality added. See I2S_CHANS_PER_FRAME and I2S_MODE_TDM
|
||||
- CHANGE: Various optimisations in 'mixer' core to improve performance for higher
|
||||
- CHANGED: Various optimisations in 'mixer' core to improve performance for higher
|
||||
channel counts including the use of XC unsafe pointers instead of inline ASM
|
||||
- CHANGE: Mixer mapping disabled when MAX_MIX_COUNT is 0 since this is wasted processing.
|
||||
- CHANGE: Descriptor changes to allow for channel input/output channel count up to 32
|
||||
- CHANGED: Mixer mapping disabled when MAX_MIX_COUNT is 0 since this is wasted processing.
|
||||
- CHANGED: Descriptor changes to allow for channel input/output channel count up to 32
|
||||
(previous limit was 18)
|
||||
|
||||
6.10.0
|
||||
------
|
||||
- CHANGE: Endpoint management for iAP EA Native Transport now merged into buffer() core.
|
||||
- CHANGED: Endpoint management for iAP EA Native Transport now merged into buffer() core.
|
||||
Previously was separate core (as added in 6.8.0).
|
||||
- CHANGE: Minor optimisation to I2S port code for inputs from ADC
|
||||
- CHANGED: Minor optimisation to I2S port code for inputs from ADC
|
||||
|
||||
6.9.0
|
||||
-----
|
||||
@@ -390,35 +480,35 @@ Legacy release history
|
||||
supported (4 channels at 96kHz).
|
||||
- ADDED: Explicit build warnings if sample rate/depth & channel combination exceeds
|
||||
available USB bus bandwidth.
|
||||
- RESOLVED: (Major) Reinstated ADAT input functionality, including descriptors and clock
|
||||
- FIXED: (Major) Reinstated ADAT input functionality, including descriptors and clock
|
||||
generation/control and stream configuration defines/tables.
|
||||
- RESOLVED: (Major) S/PDIF/ADAT sample transfer code in audio() (from ClockGen()) moved to
|
||||
- FIXED: (Major) S/PDIF/ADAT sample transfer code in audio() (from ClockGen()) moved to
|
||||
aid timing.
|
||||
- CHANGE: Modifying mix map now only affects specified mix, previous was applied to all
|
||||
- CHANGED: Modifying mix map now only affects specified mix, previous was applied to all
|
||||
mixes. CS_XU_MIXSEL control selector now takes values 0 to MAX_MIX_COUNT + 1
|
||||
(with 0 affecting all mixes).
|
||||
- CHANGE: Channel c_dig_rx is no longer nullable, assists with timing due to removal of
|
||||
- CHANGED: Channel c_dig_rx is no longer nullable, assists with timing due to removal of
|
||||
null checks inserted by compiler.
|
||||
- CHANGE: ADAT SMUX selection now based on device sample frequency rather than selected
|
||||
- CHANGED: ADAT SMUX selection now based on device sample frequency rather than selected
|
||||
stream format - Endpoint 0 now configures clockgen() on a sample-rate change
|
||||
rather than stream start.
|
||||
|
||||
6.8.0
|
||||
-----
|
||||
- ADDED: Evaluation support for iAP EA Native Transport endpoints
|
||||
- RESOLVED: (Minor) Reverted change in 6.5.1 release where sample rate listing in Audio Class
|
||||
- FIXED: (Minor) Reverted change in 6.5.1 release where sample rate listing in Audio Class
|
||||
1.0 descriptors was trimmed (previously 4 rates were always reported). This change
|
||||
appears to highlight a Windows (only) enumeration issue with the Input & Output
|
||||
configs
|
||||
- RESOLVED: (Major) Mixer functionality re-instated, including descriptors and various required
|
||||
- FIXED: (Major) Mixer functionality re-instated, including descriptors and various required
|
||||
updates compatibility with 13 tools
|
||||
- RESOLVED: (Major) Endpoint 0 was requesting an out of bounds channel whilst requesting level data
|
||||
- RESOLVED: (Major) Fast mix code not operates correctly in 13 tools, assembler inserting long jmp
|
||||
- FIXED: (Major) Endpoint 0 was requesting an out of bounds channel whilst requesting level data
|
||||
- FIXED: (Major) Fast mix code not operates correctly in 13 tools, assembler inserting long jmp
|
||||
instructions
|
||||
- RESOLVED: (Minor) LED level meter code now compatible with 13 tools (shared mem access)
|
||||
- RESOLVED (Minor) Ordering of level data from the device now matches channel ordering into
|
||||
- FIXED: (Minor) LED level meter code now compatible with 13 tools (shared mem access)
|
||||
- FIXED: (Minor) Ordering of level data from the device now matches channel ordering into
|
||||
mixer (previously the device input data and the stream from host were swapped)
|
||||
- CHANGE: Level meter buffer naming now resemble functionality
|
||||
- CHANGED: Level meter buffer naming now resemble functionality
|
||||
|
||||
|
||||
Legacy release history
|
||||
|
||||
75
Jenkinsfile
vendored
75
Jenkinsfile
vendored
@@ -1,4 +1,4 @@
|
||||
@Library('xmos_jenkins_shared_library@v0.16.2') _
|
||||
@Library('xmos_jenkins_shared_library@v0.18.0') _
|
||||
|
||||
getApproval()
|
||||
|
||||
@@ -14,7 +14,7 @@ pipeline {
|
||||
stages {
|
||||
stage('Basic tests') {
|
||||
agent {
|
||||
label 'x86_64&&brew'
|
||||
label 'x86_64 && linux'
|
||||
}
|
||||
stages {
|
||||
stage('Get view') {
|
||||
@@ -27,11 +27,70 @@ pipeline {
|
||||
xcoreLibraryChecks("${REPO}")
|
||||
}
|
||||
}
|
||||
stage('Tests') {
|
||||
steps {
|
||||
runXmostest("${REPO}", 'tests')
|
||||
stage('XS2 Tests') {
|
||||
failFast true
|
||||
parallel {
|
||||
stage('Legacy tests') {
|
||||
steps {
|
||||
runXmostest("${REPO}", 'legacy_tests')
|
||||
}
|
||||
}
|
||||
stage('Unit tests') {
|
||||
steps {
|
||||
dir("${REPO}") {
|
||||
dir('tests') {
|
||||
dir('xua_unit_tests') {
|
||||
withVenv {
|
||||
runWaf('.', "configure clean build --target=xcore200")
|
||||
// runWaf('.', "configure clean build --target=xcoreai")
|
||||
// stash name: 'xua_unit_tests', includes: 'bin/*xcoreai.xe, '
|
||||
viewEnv() {
|
||||
runPython("TARGET=XCORE200 pytest -s")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// stage('xcore.ai Verification') {
|
||||
// agent {
|
||||
// label 'xcore.ai-explorer'
|
||||
// }
|
||||
// options {
|
||||
// skipDefaultCheckout()
|
||||
// }
|
||||
// stages{
|
||||
// stage('Get View') {
|
||||
// steps {
|
||||
// xcorePrepareSandbox("${VIEW}", "${REPO}")
|
||||
// }
|
||||
// }
|
||||
// stage('Unit tests') {
|
||||
// steps {
|
||||
// dir("${REPO}") {
|
||||
// dir('tests') {
|
||||
// dir('xua_unit_tests') {
|
||||
// withVenv {
|
||||
// unstash 'xua_unit_tests'
|
||||
// viewEnv() {
|
||||
// runPython("TARGET=XCOREAI pytest -s")
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } // stages
|
||||
// post {
|
||||
// cleanup {
|
||||
// cleanWs()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
stage('xCORE builds') {
|
||||
steps {
|
||||
dir("${REPO}") {
|
||||
@@ -54,7 +113,7 @@ pipeline {
|
||||
parallel {
|
||||
stage('Build Linux host app') {
|
||||
agent {
|
||||
label 'x86_64&&brew&&linux'
|
||||
label 'x86_64&&linux'
|
||||
}
|
||||
steps {
|
||||
xcorePrepareSandbox("${VIEW}", "${REPO}")
|
||||
@@ -70,7 +129,7 @@ pipeline {
|
||||
}
|
||||
stage('Build Mac host app') {
|
||||
agent {
|
||||
label 'x86_64&&brew&&macOS'
|
||||
label 'x86_64&&macOS'
|
||||
}
|
||||
steps {
|
||||
xcorePrepareSandbox("${VIEW}", "${REPO}")
|
||||
@@ -124,7 +183,7 @@ pipeline {
|
||||
}
|
||||
stage('Update') {
|
||||
agent {
|
||||
label 'x86_64&&brew'
|
||||
label 'x86_64 && linux'
|
||||
}
|
||||
steps {
|
||||
updateViewfiles()
|
||||
|
||||
24
README.rst
24
README.rst
@@ -1,6 +1,11 @@
|
||||
lib_xua
|
||||
=======
|
||||
|
||||
:Latest release: 3.2.0rc1
|
||||
|
||||
|
||||
:Scope: General Use
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
@@ -33,6 +38,12 @@ Key features of the various applications in this repository are as follows
|
||||
|
||||
- ADAT input
|
||||
|
||||
- Synchronisation to external digital streams i.e. S/PDIF or ADAT
|
||||
|
||||
- I2S slave & master modes
|
||||
|
||||
- TDM slave & master modes
|
||||
|
||||
- MIDI input/output (Compliant to USB Class Specification for MIDI devices)
|
||||
|
||||
- DSD output (Native and DoP mode) at DSD64 and DSD128 rates
|
||||
@@ -45,7 +56,6 @@ Key features of the various applications in this repository are as follows
|
||||
|
||||
Note, not all features may be supported at all sample frequencies, simultaneously or on all devices. Some features also require specific host driver support.
|
||||
|
||||
|
||||
Software version and dependencies
|
||||
.................................
|
||||
|
||||
@@ -60,3 +70,15 @@ The following application notes use this library:
|
||||
* AN000246 - Simple USB Audio Device using lib_xua
|
||||
* AN000247 - Using lib_xua with lib_spdif (transmit)
|
||||
* AN000248 - Using lib_xua with lib_mic_array
|
||||
|
||||
Required software (dependencies)
|
||||
================================
|
||||
|
||||
* lib_locks (git@github.com:xmos/lib_locks.git)
|
||||
* lib_logging (git@github.com:xmos/lib_logging)
|
||||
* lib_mic_array (git@github.com:xmos/lib_mic_array.git)
|
||||
* lib_xassert (git@github.com:xmos/lib_xassert)
|
||||
* lib_dsp (git@github.com:xmos/lib_dsp)
|
||||
* lib_spdif (git@github.com:xmos/lib_spdif)
|
||||
* lib_xud (git@github.com:xmos/lib_xud)
|
||||
|
||||
|
||||
3
doc/dfu/rst/xdoc.conf
Normal file
3
doc/dfu/rst/xdoc.conf
Normal file
@@ -0,0 +1,3 @@
|
||||
XMOSNEWSTYLE=2
|
||||
SOURCE_INCLUDE_DIRS=../../../lib_xua/host/xmosdfu
|
||||
SPHINX_MASTER_DOC=dfu
|
||||
1
doc_dfu/.gitignore
vendored
1
doc_dfu/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
_build
|
||||
@@ -1,84 +0,0 @@
|
||||
*******************************
|
||||
XMOS PUBLIC LICENCE: Version 1
|
||||
*******************************
|
||||
|
||||
Subject to the conditions and limitations below, permission is hereby granted by XMOS LIMITED (“XMOS”), free of charge, to any person or entity obtaining a copy of the XMOS Software.
|
||||
|
||||
**1. Definitions**
|
||||
|
||||
**“Applicable Patent Rights”** means: (a) where XMOS is the grantor of the rights, (i) claims of patents that are now or in future owned by or assigned to XMOS and (ii) that cover subject matter contained in the Software, but only to the extent it is necessary to use, reproduce or distribute the Software without infringement; and (b) where you are the grantor of the rights, (i) claims of patents that are now or in future owned by or assigned to you and (ii) that cover the subject matter contained in your Derivatives, taken alone or in combination with the Software.
|
||||
|
||||
**“Compiled Code”** means any compiled, binary, machine readable or executable version of the Source Code.
|
||||
|
||||
**“Contributor”** means any person or entity that creates or contributes to the creation of Derivatives.
|
||||
|
||||
**“Derivatives”** means any addition to, deletion from and/or change to the substance, structure of the Software, any previous Derivatives, the combination of the Derivatives and the Software and/or any respective portions thereof.
|
||||
|
||||
**“Source Code”** means the human readable code that is suitable for making modifications but excluding any Compiled Code.
|
||||
|
||||
**“Software”** means the software and associated documentation files which XMOS makes available and which contain a notice identifying the software as original XMOS software and referring to the software being subject to the terms of this XMOS Public Licence.
|
||||
|
||||
This Licence refers to XMOS Software and does not relate to any XMOS hardware or devices which are protected by intellectual property rights (including patent and trade marks) which may be sold to you under a separate agreement.
|
||||
|
||||
|
||||
**2. Licence**
|
||||
|
||||
**Permitted Uses, Conditions and Restrictions.** Subject to the conditions below, XMOS grants you a worldwide, royalty free, non-exclusive licence, to the extent of any Patent Rights to do the following:
|
||||
|
||||
2.1 **Unmodified Software.** You may use, copy, display, publish, distribute and make available unmodified copies of the Software:
|
||||
|
||||
2.1.1 for personal or academic, non-commercial purposes; or
|
||||
|
||||
2.1.2 for commercial purposes provided the Software is at all times used on a device designed, licensed or developed by XMOS and, provided that in each instance (2.1.1 and 2.1.2):
|
||||
|
||||
(a) you must retain and reproduce in all copies of the Software the copyright and proprietary notices and disclaimers of XMOS as they appear in the Software, and keep intact all notices and disclaimers in the Software files that refer to this Licence; and
|
||||
|
||||
(b) you must include a copy of this Licence with every copy of the Software and documentation you publish, distribute and make available and you may not offer or impose any terms on such Software that alter or restrict this Licence or the intent of such Licence, except as permitted below (Additional Terms).
|
||||
|
||||
The licence above does not include any Compiled Code which XMOS may make available under a separate support and licence agreement.
|
||||
|
||||
2.2 **Derivatives.** You may create and modify Derivatives and use, copy, display, publish, distribute and make available Derivatives:
|
||||
|
||||
2.2.1 for personal or academic, non-commercial purposes; or
|
||||
|
||||
2.2.2 for commercial purposes, provided the Derivatives are at all times used on a device designed, licensed or developed by XMOS and, provided that in each instance (2.2.1 and 2.2.2):
|
||||
|
||||
(a) you must comply with the terms of clause 2.1 with respect to the Derivatives;
|
||||
|
||||
(b) you must copy (to the extent it doesn’t already exist) the notice below in each file of the Derivatives, and ensure all the modified files carry prominent notices stating that you have changed the files and the date of any change; and
|
||||
|
||||
(c) if you sublicence, distribute or otherwise make the Software and/or the Derivatives available for commercial purposes, you must provide that the Software and Derivatives are at all times used on a device designed, licensed or developed by XMOS.
|
||||
|
||||
Without limitation to these terms and clause 3 below, the Source Code and Compiled Code to your Derivatives may at your discretion (but without obligation) be released, copied, displayed, published, distributed and made available; and if you elect to do so, it must be under the terms of this Licence including the terms of the licence at clauses 2.2.1, 2.2.2 and clause 3 below.
|
||||
|
||||
2.3 **Distribution of Executable Versions.** If you distribute or make available Derivatives, you must include a prominent notice in the code itself as well as in all related documentation, stating that the Source Code of the Software from which the Derivatives are based is available under the terms of this Licence, with information on how and where to obtain such Source Code.
|
||||
|
||||
**3. Your Grant of Rights.** In consideration and as a condition to this Licence, you grant to any person or entity receiving or distributing any Derivatives, a non-exclusive, royalty free, perpetual, irrevocable license under your Applicable Patent Rights and all other intellectual property rights owned or controlled by you, to use, copy, display, publish, distribute and make available your Derivatives of the same scope and extent as XMOS’s licence under clause 2.2 above.
|
||||
|
||||
**4. Combined Products.** You may create a combined product by combining Software, Derivatives and other code not covered by this Licence as a single application or product. In such instance, you must comply with the requirements of this Licence for any portion of the Software and/or Derivatives.
|
||||
|
||||
**5. Additional Terms.** You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the term of this Licence (“Additional Terms”) to any legitimate recipients of the Software and/or Derivatives. The terms on which you provide such Additional Terms are on your sole responsibility and you shall indemnify, defend and hold XMOS harmless against any claims asserted against XMOS.
|
||||
|
||||
**6. New Versions.** XMOS may publish revised and/or new versions of this Licence from time to time to accommodate changes to the Licence terms, new versions, updates and bug fixes of the Software. Each version will be given a distinguishing version number. Once Software has been published under a particular version of this Licence, you may continue to use it under the terms of that version. You may also choose to use the latest version of the Software under any subsequent version published by XMOS. Only XMOS shall have the right to modify these terms.
|
||||
|
||||
**7. IPR and Ownership**
|
||||
Any rights, including all intellectual property rights and all trademarks not expressly granted herein are reserved in full by the authors or copyright holders. Any requests for additional permissions by XMOS including any rights to use XMOS trademarks, should be made (without obligation) to XMOS at **support@xmos.com**
|
||||
|
||||
Nothing herein shall limit any rights that XMOS is otherwise entitled to under the doctrines of patent exhaustion, implied license, or legal estoppel. Neither the name of the authors, the copyright holders or any contributors may be used to endorse or promote any Derivatives from this Software without specific written permission. Any attempt to deal with the Software which does not comply with this Licence shall be void and shall automatically terminate any rights granted under this licence (including any licence of any intellectual property rights granted herein).
|
||||
Subject to the licences granted under this Licence any Contributor retains all rights, title and interest in and to any Derivatives made by Contributor subject to the underlying rights of XMOS in the Software. XMOS shall retain all rights, title and interest in the Software and any Derivatives made by XMOS (“XMOS Derivatives”). XMOS Derivatives will not automatically be subject to this Licence and XMOS shall be entitled to licence such rights on any terms (without obligation) as it sees fit.
|
||||
|
||||
**8. Termination**
|
||||
|
||||
8.1 This Licence will automatically terminate immediately, without notice to you, if:
|
||||
|
||||
(a) you fail to comply with the terms of this Licence; and/or
|
||||
|
||||
(b) you directly or indirectly commence any action for patent or intellectual property right infringement against XMOS, or any parent, group, affiliate or subsidiary of XMOS; provided XMOS did not first commence an action or patent infringement against you in that instance; and/or
|
||||
|
||||
(c) the terms of this Licence are held by any court of competent jurisdiction to be unenforceable in whole or in part.
|
||||
|
||||
**9. Critical Applications.** Unless XMOS has agreed in writing with you an agreement specifically governing use of the Goods in military, aerospace, automotive or medically related functions (collectively and individually hereinafter referred to as "Special Use"), any permitted use of the Software excludes Special Use. Notwithstanding any agreement between XMOS and you for Special Use, Special Use shall be at your own risk, and you shall fully indemnify XMOS against any damages, losses, costs and claims (direct and indirect) arising out of any Special Use.
|
||||
|
||||
**10. NO WARRANTY OR SUPPORT.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL XMOS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, WARRANTY, CIVIL TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE INCLUDING GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOT WITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE. IN SOME JURISDICTIONS PARTIES ARE UNABLE TO LIMIT LIABILTY IN THIS WAY, IF THIS APPLIES TO YOUR JURISDICTION THIS LIABILITY CLAUSE ABOVE MAY NOT APPLY. NOTWITHSTANDING THE ABOVE, IN NO EVENT SHALL XMOS’s TOTAL LIABILITY TO YOU FOR ALL DAMAGES, LOSS OR OTHERWISE EXCEED $50.
|
||||
|
||||
**11. Governing Law and Jurisdiction.** This Licence constitutes the entire agreement between the parties with respect to the subject matter hereof. The Licence shall be governed by the laws of England and the conflict of laws and UN Convention on Contracts for the International Sale of Goods, shall not apply.
|
||||
@@ -1 +0,0 @@
|
||||
SOURCE_INCLUDE_DIRS=../lib_xua/host/xmosdfu
|
||||
@@ -3,11 +3,10 @@ APP_NAME = app_xua_simple
|
||||
TARGET = xk-audio-216-mc.xn
|
||||
|
||||
# The flags passed to xcc when building the application
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -fsubword-select -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES -DUSB_TILE=tile[1] -fxscope
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES \
|
||||
-DXUD_CORE_CLOCK=600 -DUSB_TILE=tile[1] -fxscope -DUAC_FORCE_FEEDBACK_EP=0
|
||||
|
||||
#-DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope
|
||||
|
||||
# The USED_MODULES variable lists other module used by the application. These
|
||||
# modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables.
|
||||
# Modules are expected to be in the directory above the BASE_DIR directory.
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
XMOSNEWSTYLE=1
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
XMOSNEWSTYLE=2
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
SPHINX_MASTER_DOC=AN00246_xua_example
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
/* A very simple *example* of a USB audio application (and as such is un-verified for production)
|
||||
*
|
||||
* It uses the main blocks from the lib_xua
|
||||
* It uses the main blocks from the lib_xua
|
||||
*
|
||||
* - 2 in/ 2 out I2S only
|
||||
* - No DFU
|
||||
* - I2S only
|
||||
* - I2S only
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -31,7 +31,7 @@ in port p_for_mclk_count = PORT_MCLK_COUNT; /* Extra port for count
|
||||
in port p_mclk_in_usb = PORT_MCLK_IN_USB; /* Extra master clock input for the USB tile */
|
||||
|
||||
/* Clock-block declarations */
|
||||
clock clk_audio_bclk = on tile[0]: XS1_CLKBLK_4; /* Bit clock */
|
||||
clock clk_audio_bclk = on tile[0]: XS1_CLKBLK_4; /* Bit clock */
|
||||
clock clk_audio_mclk = on tile[0]: XS1_CLKBLK_5; /* Master clock */
|
||||
clock clk_audio_mclk_usb = on tile[1]: XS1_CLKBLK_1; /* Master clock for USB tile */
|
||||
|
||||
@@ -51,18 +51,17 @@ int main()
|
||||
|
||||
/* Channel for audio data between buffering cores and AudioHub/IO core */
|
||||
chan c_aud;
|
||||
|
||||
|
||||
/* Channel for communicating control messages from EP0 to the rest of the device (via the buffering cores) */
|
||||
chan c_aud_ctl;
|
||||
|
||||
par
|
||||
{
|
||||
/* Low level USB device layer core */
|
||||
/* Low level USB device layer core */
|
||||
on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2,
|
||||
c_sof, epTypeTableOut, epTypeTableIn,
|
||||
null, null, -1 ,
|
||||
c_sof, epTypeTableOut, epTypeTableIn,
|
||||
XUD_SPEED_HS, XUD_PWR_SELF);
|
||||
|
||||
|
||||
/* Endpoint 0 core from lib_xua */
|
||||
/* Note, since we are not using many features we pass in null for quite a few params.. */
|
||||
on tile[1]: XUA_Endpoint0(c_ep_out[0], c_ep_in[0], c_aud_ctl, null, null, null, null);
|
||||
@@ -70,7 +69,7 @@ int main()
|
||||
/* Buffering cores - handles audio data to/from EP's and gives/gets data to/from the audio I/O core */
|
||||
/* Note, this spawns two cores */
|
||||
on tile[1]: {
|
||||
|
||||
|
||||
/* Connect master-clock clock-block to clock-block pin */
|
||||
set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb); /* Clock clock-block from mclk pin */
|
||||
set_port_clock(p_for_mclk_count, clk_audio_mclk_usb); /* Clock the "count" port from the clock block */
|
||||
@@ -83,7 +82,7 @@ int main()
|
||||
/* AudioHub/IO core does most of the audio IO i.e. I2S (also serves as a hub for all audio) */
|
||||
on tile[0]: XUA_AudioHub(c_aud, clk_audio_mclk, clk_audio_bclk, p_mclk_in, p_lrclk, p_bclk, p_i2s_dac, p_i2s_adc);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
168
examples/AN00246_xua_example/src/hid_report_descriptor.h
Normal file
168
examples/AN00246_xua_example/src/hid_report_descriptor.h
Normal file
@@ -0,0 +1,168 @@
|
||||
// Copyright 2021-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __hid_report_descriptor_h__
|
||||
#define __hid_report_descriptor_h__
|
||||
|
||||
#include "xua_hid_report.h"
|
||||
|
||||
#if 0
|
||||
/* Existing static report descriptor kept for reference */
|
||||
unsigned char hidReportDescriptor[] =
|
||||
{
|
||||
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 */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define non-configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t hidCollectionApplication = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidCollectionEnd = {
|
||||
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidInputConstArray = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidInputDataVar = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidReportCount2 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportCount6 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x06, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportSize1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
/*
|
||||
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
|
||||
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
|
||||
*/
|
||||
static const USB_HID_Report_Element_t hidReportPageConsumer = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
|
||||
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 2, 0, 0 )
|
||||
};
|
||||
|
||||
/*
|
||||
* Define configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE2, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 5)
|
||||
}; // Mute
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xEA, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 4)
|
||||
}; // Vol-
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE9, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 3)
|
||||
}; // Vol+
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB6, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 2)
|
||||
}; // Scan Prev
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB5, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 1)
|
||||
}; // Scan Next
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB0, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 0)
|
||||
}; // Play
|
||||
|
||||
/*
|
||||
* List the configurable elements in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
|
||||
&hidUsageByte0Bit0,
|
||||
&hidUsageByte0Bit1,
|
||||
&hidUsageByte0Bit2,
|
||||
&hidUsageByte0Bit3,
|
||||
&hidUsageByte0Bit4,
|
||||
&hidUsageByte0Bit5
|
||||
};
|
||||
|
||||
/*
|
||||
* List HID Reports, one per Report ID. This should be a usage page item with the relevant
|
||||
* If not using report IDs - still have one with report ID 0
|
||||
*/
|
||||
static const USB_HID_Report_Element_t* const hidReports[] = {
|
||||
&hidReportPageConsumer
|
||||
};
|
||||
|
||||
/*
|
||||
* List all items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = {
|
||||
&(hidReportPageConsumer.item),
|
||||
&hidUsageConsumerControl,
|
||||
&hidCollectionApplication,
|
||||
&hidLogicalMinimum0,
|
||||
&hidLogicalMaximum1,
|
||||
&(hidUsageByte0Bit0.item),
|
||||
&(hidUsageByte0Bit1.item),
|
||||
&(hidUsageByte0Bit2.item),
|
||||
&(hidUsageByte0Bit3.item),
|
||||
&(hidUsageByte0Bit4.item),
|
||||
&(hidUsageByte0Bit5.item),
|
||||
&hidReportSize1,
|
||||
&hidReportCount6,
|
||||
&hidInputDataVar,
|
||||
&hidLogicalMaximum0,
|
||||
&hidReportCount2,
|
||||
&hidInputConstArray,
|
||||
&hidCollectionEnd
|
||||
};
|
||||
|
||||
/*
|
||||
* Define the number of HID Reports
|
||||
* Due to XC not supporting designated initializers, this constant has a hard-coded value.
|
||||
* It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* ))
|
||||
*/
|
||||
#define HID_REPORT_COUNT ( 1 )
|
||||
|
||||
#endif // __hid_report_descriptor_h__
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016-2021 XMOS LIMITED.
|
||||
// Copyright 2016-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include <platform.h>
|
||||
@@ -50,7 +50,7 @@ void AudioHwConfig2(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned
|
||||
delay_microseconds(20000);
|
||||
|
||||
/* Take ADC out of reset */
|
||||
gpioVal |= P_GPIO_ADC_RST_N;
|
||||
gpioVal |= P_GPIO_ADC_RST_N;
|
||||
p_gpio <: gpioVal;
|
||||
|
||||
/* Configure ADC for I2S slave mode via I2C */
|
||||
@@ -58,7 +58,7 @@ void AudioHwConfig2(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned
|
||||
dif = 0x01; /* I2S */
|
||||
mode = 0x03; /* Slave mode all speeds */
|
||||
|
||||
/* Reg 0x01: (GCTL) Global Mode Control Register
|
||||
/* Reg 0x01: (GCTL) Global Mode Control Register
|
||||
* Bit[7]: CP-EN: Manages control-port mode
|
||||
* Bit[6]: CLKMODE: Setting puts part in 384x mode
|
||||
* Bit[5:4]: MDIV[1:0]: Set to 01 for /2
|
||||
@@ -91,7 +91,7 @@ void AudioHwConfig2(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned
|
||||
* bit[0] : Power Down (PDN) : Powered down
|
||||
*/
|
||||
DAC_REGWRITE(CS4384_MODE_CTRL, 0b11000001);
|
||||
|
||||
|
||||
/* PCM Control (Address: 0x03) */
|
||||
/* bit[7:4] : Digital Interface Format (DIF) : 0b0001 for I2S up to 24bit
|
||||
* bit[3:2] : Reserved
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
</Link>
|
||||
</Links>
|
||||
<ExternalDevices>
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K">
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="8192">
|
||||
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
|
||||
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
|
||||
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
|
||||
#define NUM_USB_CHAN_OUT 2 /* Number of channels from host to device */
|
||||
@@ -19,7 +19,7 @@
|
||||
#define VENDOR_ID 0x20B1
|
||||
#define PRODUCT_STR_A2 "XUA Example"
|
||||
#define PRODUCT_STR_A1 "XUA Example"
|
||||
#define PID_AUDIO_1 1
|
||||
#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
|
||||
|
||||
@@ -3,9 +3,10 @@ APP_NAME = app_xua_simple
|
||||
TARGET = xk-audio-216-mc.xn
|
||||
|
||||
# The flags passed to xcc when building the application
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -fsubword-select -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES -DUSB_TILE=tile[1] \
|
||||
-DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES \
|
||||
-DXUD_CORE_CLOCK=600 -DUSB_TILE=tile[1] -DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope \
|
||||
-DUAC_FORCE_FEEDBACK_EP=0
|
||||
|
||||
# The USED_MODULES variable lists other module used by the application. These
|
||||
# modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables.
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
XMOSNEWSTYLE=1
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
XMOSNEWSTYLE=2
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
SPHINX_MASTER_DOC=AN00247_xua_example_spdif_tx
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
/* A very simple *example* of a USB audio application (and as such is un-verified for production)
|
||||
*
|
||||
* It uses the main blocks from the lib_xua
|
||||
* It uses the main blocks from the lib_xua
|
||||
*
|
||||
* - S/PDIF output only
|
||||
* - No DFU
|
||||
@@ -51,7 +51,7 @@ int main()
|
||||
|
||||
/* Channel for audio data between buffering cores and AudioHub/IO core */
|
||||
chan c_aud;
|
||||
|
||||
|
||||
/* Channel for communicating control messages from EP0 to the rest of the device (via the buffering cores) */
|
||||
chan c_aud_ctl;
|
||||
|
||||
@@ -60,9 +60,9 @@ int main()
|
||||
|
||||
par
|
||||
{
|
||||
/* Low level USB device layer core */
|
||||
on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, null, null, -1, XUD_SPEED_HS, XUD_PWR_SELF);
|
||||
|
||||
/* Low level USB device layer core */
|
||||
on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, XUD_SPEED_HS, XUD_PWR_SELF);
|
||||
|
||||
/* Endpoint 0 core from lib_xua */
|
||||
/* Note, since we are not using many features we pass in null for quite a few params.. */
|
||||
on tile[1]: XUA_Endpoint0(c_ep_out[0], c_ep_in[0], c_aud_ctl, null, null, null, null);
|
||||
@@ -70,7 +70,7 @@ int main()
|
||||
/* Buffering cores - handles audio data to/from EP's and gives/gets data to/from the audio I/O core */
|
||||
/* Note, this spawns two cores */
|
||||
on tile[1]: {
|
||||
|
||||
|
||||
/* Connect master-clock clock-block to clock-block pin */
|
||||
set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb); /* Clock clock-block from mclk pin */
|
||||
set_port_clock(p_for_mclk_count, clk_audio_mclk_usb); /* Clock the "count" port from the clock block */
|
||||
@@ -78,28 +78,28 @@ int main()
|
||||
|
||||
XUA_Buffer(c_ep_out[1], c_ep_in[1], c_sof, c_aud_ctl, p_for_mclk_count, c_aud);
|
||||
}
|
||||
|
||||
|
||||
/* AudioHub() (I2S) and S/SPDIF Tx are on the same tile */
|
||||
on tile[0]: {
|
||||
|
||||
/* Setup S/PDIF tx port from clock etc - note we do this before par to avoid parallel usage */
|
||||
spdif_tx_port_config(p_spdif_tx, clk_spdif_tx, p_mclk_in, 7);
|
||||
|
||||
|
||||
par
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
/* Run the S/PDIF transmitter task */
|
||||
spdif_tx(p_spdif_tx, c_spdif_tx);
|
||||
spdif_tx(p_spdif_tx, c_spdif_tx);
|
||||
}
|
||||
|
||||
|
||||
/* AudioHub/IO core does most of the audio IO i.e. I2S (also serves as a hub for all audio) */
|
||||
/* Note, since we are not using I2S we pass in null for LR and Bit clock ports and the I2S dataline ports */
|
||||
XUA_AudioHub(c_aud, clk_audio_mclk, null, p_mclk_in, null, null, null, null, c_spdif_tx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
// Copyright 2021-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __hid_report_descriptor_h__
|
||||
#define __hid_report_descriptor_h__
|
||||
|
||||
#include "xua_hid_report.h"
|
||||
|
||||
#if 0
|
||||
/* Existing static report descriptor kept for reference */
|
||||
unsigned char hidReportDescriptor[] =
|
||||
{
|
||||
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 */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define non-configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t hidCollectionApplication = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidCollectionEnd = {
|
||||
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidInputConstArray = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidInputDataVar = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidReportCount2 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportCount6 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x06, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportSize1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
/*
|
||||
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
|
||||
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
|
||||
*/
|
||||
static const USB_HID_Report_Element_t hidReportPageConsumer = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
|
||||
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 2, 0, 0 )
|
||||
};
|
||||
|
||||
/*
|
||||
* Define configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE2, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 5)
|
||||
}; // Mute
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xEA, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 4)
|
||||
}; // Vol-
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE9, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 3)
|
||||
}; // Vol+
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB6, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 2)
|
||||
}; // Scan Prev
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB5, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 1)
|
||||
}; // Scan Next
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB0, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 0)
|
||||
}; // Play
|
||||
|
||||
/*
|
||||
* List the configurable elements in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
|
||||
&hidUsageByte0Bit0,
|
||||
&hidUsageByte0Bit1,
|
||||
&hidUsageByte0Bit2,
|
||||
&hidUsageByte0Bit3,
|
||||
&hidUsageByte0Bit4,
|
||||
&hidUsageByte0Bit5
|
||||
};
|
||||
|
||||
/*
|
||||
* List HID Reports, one per Report ID. This should be a usage page item with the relevant
|
||||
* If not using report IDs - still have one with report ID 0
|
||||
*/
|
||||
static const USB_HID_Report_Element_t* const hidReports[] = {
|
||||
&hidReportPageConsumer
|
||||
};
|
||||
|
||||
/*
|
||||
* List all items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = {
|
||||
&(hidReportPageConsumer.item),
|
||||
&hidUsageConsumerControl,
|
||||
&hidCollectionApplication,
|
||||
&hidLogicalMinimum0,
|
||||
&hidLogicalMaximum1,
|
||||
&(hidUsageByte0Bit0.item),
|
||||
&(hidUsageByte0Bit1.item),
|
||||
&(hidUsageByte0Bit2.item),
|
||||
&(hidUsageByte0Bit3.item),
|
||||
&(hidUsageByte0Bit4.item),
|
||||
&(hidUsageByte0Bit5.item),
|
||||
&hidReportSize1,
|
||||
&hidReportCount6,
|
||||
&hidInputDataVar,
|
||||
&hidLogicalMaximum0,
|
||||
&hidReportCount2,
|
||||
&hidInputConstArray,
|
||||
&hidCollectionEnd
|
||||
};
|
||||
|
||||
/*
|
||||
* Define the number of HID Reports
|
||||
* Due to XC not supporting designated initializers, this constant has a hard-coded value.
|
||||
* It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* ))
|
||||
*/
|
||||
#define HID_REPORT_COUNT ( 1 )
|
||||
|
||||
#endif // __hid_report_descriptor_h__
|
||||
@@ -22,7 +22,6 @@ out port p_gpio = on tile[0]:XS1_PORT_8C;
|
||||
void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode,
|
||||
unsigned sampRes_DAC, unsigned sampRes_ADC)
|
||||
{
|
||||
unsigned char data[1] = {0};
|
||||
unsigned char gpioVal = 0;
|
||||
|
||||
/* Set master clock select appropriately and put ADC and DAC into reset */
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
</Link>
|
||||
</Links>
|
||||
<ExternalDevices>
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K">
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="8192">
|
||||
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
|
||||
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
|
||||
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
|
||||
#define NUM_USB_CHAN_OUT 2
|
||||
|
||||
@@ -3,9 +3,10 @@ APP_NAME = app_xua_simple
|
||||
TARGET = mic_array_ref.xn
|
||||
|
||||
# The flags passed to xcc when building the application
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -fsubword-select -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES -DUSB_TILE=tile[1] \
|
||||
-DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope
|
||||
XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -O3 -report -save-temps \
|
||||
-g -Wno-unused-function -Wno-timing -DXUD_SERIES_SUPPORT=XUD_X200_SERIES \
|
||||
-DXUD_CORE_CLOCK=600 -DUSB_TILE=tile[1] -DSDA_HIGH=2 -DSCL_HIGH=1 -fxscope \
|
||||
-DUAC_FORCE_FEEDBACK_EP=0
|
||||
|
||||
# The USED_MODULES variable lists other module used by the application. These
|
||||
# modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables.
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
XMOSNEWSTYLE=1
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
XMOSNEWSTYLE=2
|
||||
SOURCE_INCLUDE_DIRS=../../src
|
||||
SPHINX_MASTER_DOC=AN00248_xua_example_pdm_mics
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
/* A very simple *example* of a USB audio application (and as such is un-verified for production)
|
||||
*
|
||||
* It uses the main blocks from the lib_xua with the addition of PDM mic support using lib_mic_array
|
||||
* It uses the main blocks from the lib_xua with the addition of PDM mic support using lib_mic_array
|
||||
*
|
||||
* - No DFU
|
||||
*
|
||||
@@ -24,7 +24,7 @@ in port p_pdm_mclk = PORT_PDM_MCLK; /* Master clock f
|
||||
|
||||
in buffered port:32 p_pdm_mics = PORT_PDM_DATA; /* Port for PDM mic data */
|
||||
|
||||
clock clk_pdm = on tile[0]: XS1_CLKBLK_1; /* Clock-block for PDM mics */
|
||||
clock clk_pdm = on tile[0]: XS1_CLKBLK_1; /* Clock-block for PDM mics */
|
||||
|
||||
|
||||
/* Lib_xua port declarations. Note, the defines come from the xn file */
|
||||
@@ -52,7 +52,7 @@ int main()
|
||||
|
||||
/* Channel for audio data between buffering cores and AudioHub/IO core */
|
||||
chan c_aud;
|
||||
|
||||
|
||||
/* Channel for communicating control messages from EP0 to the rest of the device (via the buffering cores) */
|
||||
chan c_aud_ctl;
|
||||
|
||||
@@ -64,26 +64,26 @@ int main()
|
||||
|
||||
par
|
||||
{
|
||||
/* Low level USB device layer core */
|
||||
on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, null, null, -1, XUD_SPEED_HS, XUD_PWR_BUS);
|
||||
|
||||
/* Low level USB device layer core */
|
||||
on tile[1]: XUD_Main(c_ep_out, 2, c_ep_in, 2, c_sof, epTypeTableOut, epTypeTableIn, XUD_SPEED_HS, XUD_PWR_BUS);
|
||||
|
||||
/* Endpoint 0 core from lib_xua */
|
||||
/* Note, since we are not using many features we pass in null for quite a few params.. */
|
||||
on tile[1]: XUA_Endpoint0(c_ep_out[0], c_ep_in[0], c_aud_ctl, null, null, null, null);
|
||||
|
||||
on tile[1]:
|
||||
on tile[1]:
|
||||
{
|
||||
/* Connect master-clock clock-block to clock-block pin */
|
||||
set_clock_src(clk_audio_mclk, p_mclk_in); /* Clock clock-block from mclk pin */
|
||||
set_port_clock(p_for_mclk_count, clk_audio_mclk); /* Clock the "count" port from the clock block */
|
||||
/* Note, AudioHub() will start the clock */
|
||||
|
||||
|
||||
par
|
||||
{
|
||||
/* Buffering task - handles audio data to/from EP's and gives/gets data to/from the audio I/O core */
|
||||
/* Note, this spawns two cores */
|
||||
XUA_Buffer(c_ep_out[1], c_ep_in[1], c_sof, c_aud_ctl, p_for_mclk_count, c_aud);
|
||||
|
||||
|
||||
/* AudioHub/IO core does most of the audio IO i.e. I2S (also serves as a hub for all audio) */
|
||||
/* Note, since we are not using I2S we pass in null for LR and Bit clock ports and the I2S dataline ports */
|
||||
XUA_AudioHub(c_aud, clk_audio_mclk, null, p_mclk_in, null, null, null, null, c_mic_pcm);
|
||||
@@ -105,7 +105,7 @@ int main()
|
||||
{
|
||||
/* PDM receive I/O task */
|
||||
mic_array_pdm_rx(p_pdm_mics, c_4x_pdm_mic_0, c_4x_pdm_mic_1);
|
||||
|
||||
|
||||
/* Run two decimator tasks for 8 mics */
|
||||
mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_0, c_ds_output[0], MIC_ARRAY_NO_INTERNAL_CHANS);
|
||||
mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1], MIC_ARRAY_NO_INTERNAL_CHANS);
|
||||
@@ -114,7 +114,7 @@ int main()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include <xs1.h>
|
||||
@@ -16,7 +16,7 @@ void AudioHwInit()
|
||||
/* DAC in reset */
|
||||
p_gpio <: 0;
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Configures the external audio hardware for the required sample frequency */
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
// Copyright 2021-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __hid_report_descriptor_h__
|
||||
#define __hid_report_descriptor_h__
|
||||
|
||||
#include "xua_hid_report.h"
|
||||
|
||||
#if 0
|
||||
/* Existing static report descriptor kept for reference */
|
||||
unsigned char hidReportDescriptor[] =
|
||||
{
|
||||
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 */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define non-configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t hidCollectionApplication = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidCollectionEnd = {
|
||||
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidInputConstArray = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidInputDataVar = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidReportCount2 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportCount6 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x06, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportSize1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
/*
|
||||
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
|
||||
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
|
||||
*/
|
||||
static const USB_HID_Report_Element_t hidReportPageConsumer = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
|
||||
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 2, 0, 0 )
|
||||
};
|
||||
|
||||
/*
|
||||
* Define configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE2, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 5)
|
||||
}; // Mute
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xEA, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 4)
|
||||
}; // Vol-
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE9, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 3)
|
||||
}; // Vol+
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB6, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 2)
|
||||
}; // Scan Prev
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB5, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 1)
|
||||
}; // Scan Next
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB0, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC(0, 0, 0, 0)
|
||||
}; // Play
|
||||
|
||||
/*
|
||||
* List the configurable elements in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
|
||||
&hidUsageByte0Bit0,
|
||||
&hidUsageByte0Bit1,
|
||||
&hidUsageByte0Bit2,
|
||||
&hidUsageByte0Bit3,
|
||||
&hidUsageByte0Bit4,
|
||||
&hidUsageByte0Bit5
|
||||
};
|
||||
|
||||
/*
|
||||
* List HID Reports, one per Report ID. This should be a usage page item with the relevant
|
||||
* If not using report IDs - still have one with report ID 0
|
||||
*/
|
||||
static const USB_HID_Report_Element_t* const hidReports[] = {
|
||||
&hidReportPageConsumer
|
||||
};
|
||||
|
||||
/*
|
||||
* List all items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = {
|
||||
&(hidReportPageConsumer.item),
|
||||
&hidUsageConsumerControl,
|
||||
&hidCollectionApplication,
|
||||
&hidLogicalMinimum0,
|
||||
&hidLogicalMaximum1,
|
||||
&(hidUsageByte0Bit0.item),
|
||||
&(hidUsageByte0Bit1.item),
|
||||
&(hidUsageByte0Bit2.item),
|
||||
&(hidUsageByte0Bit3.item),
|
||||
&(hidUsageByte0Bit4.item),
|
||||
&(hidUsageByte0Bit5.item),
|
||||
&hidReportSize1,
|
||||
&hidReportCount6,
|
||||
&hidInputDataVar,
|
||||
&hidLogicalMaximum0,
|
||||
&hidReportCount2,
|
||||
&hidInputConstArray,
|
||||
&hidCollectionEnd
|
||||
};
|
||||
|
||||
/*
|
||||
* Define the number of HID Reports
|
||||
* Due to XC not supporting designated initializers, this constant has a hard-coded value.
|
||||
* It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* ))
|
||||
*/
|
||||
#define HID_REPORT_COUNT ( 1 )
|
||||
|
||||
#endif // __hid_report_descriptor_h__
|
||||
@@ -81,7 +81,7 @@
|
||||
</Link>
|
||||
</Links>
|
||||
<ExternalDevices>
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K">
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="8192">
|
||||
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
|
||||
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
|
||||
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#ifndef _XUA_CONF_H_
|
||||
#ifndef _XUA_CONF_H_
|
||||
#define _XUA_CONF_H_
|
||||
|
||||
#define NUM_USB_CHAN_OUT 0
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
# Copyright (c) 2016, XMOS Ltd, All rights reserved
|
||||
TARGET = xk-audio-216-mc.xn
|
||||
USED_MODULES = lib_xua \
|
||||
module_i2c_shared module_i2c_single_port lib_logging
|
||||
USED_MODULES = lib_xua lib_i2c lib_logging
|
||||
|
||||
BUILD_FLAGS = -O0 -g -lflash -DXUD_SERIES_SUPPORT=4 -fxscope -save-temps -march=xs2a -DUSB_TILE=tile[1]
|
||||
BUILD_FLAGS = -O0 -g -lflash -DXUD_SERIES_SUPPORT=4 -DXUD_CORE_CLOCK=600 -fxscope -save-temps -march=xs2a -DUSB_TILE=tile[1]
|
||||
|
||||
BUILD_FLAGS_i2s_master_2in_2out_48khz = $(BUILD_FLAGS) \
|
||||
-D ADAT_RX=0 -D ADAT_TX=0 -D SPDIF_RX=0 -D SPDIF_TX=0 -D MIDI=0 \
|
||||
167
legacy_tests/app_test_i2s_loopback/hid_report_descriptor.h
Normal file
167
legacy_tests/app_test_i2s_loopback/hid_report_descriptor.h
Normal file
@@ -0,0 +1,167 @@
|
||||
// Copyright 2021-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __hid_report_descriptor_h__
|
||||
#define __hid_report_descriptor_h__
|
||||
|
||||
#include "xua_hid_report.h"
|
||||
|
||||
#if 0
|
||||
/* Existing static report descriptor kept for reference */
|
||||
unsigned char hidReportDescriptor[] =
|
||||
{
|
||||
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 */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define non-configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t hidCollectionApplication = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidCollectionEnd = {
|
||||
.header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidInputConstArray = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidInputDataVar = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMaximum1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM),
|
||||
.data = { 0x01, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidLogicalMinimum0 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM),
|
||||
.data = { 0x00, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidReportCount2 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x02, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportCount6 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT),
|
||||
.data = { 0x06, 0x00 } };
|
||||
static const USB_HID_Short_Item_t hidReportSize1 = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
static const USB_HID_Short_Item_t hidUsageConsumerControl = {
|
||||
.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.data = { 0x01, 0x00 } };
|
||||
|
||||
/*
|
||||
* Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report
|
||||
* For internal purposes, a report element with ID of 0 must be included if report IDs are not being used.
|
||||
*/
|
||||
static const USB_HID_Report_Element_t hidReportPageConsumer = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE),
|
||||
.item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 1, 0, 0 ) };
|
||||
|
||||
/*
|
||||
* Define configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit5 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE2, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 5 )
|
||||
}; // Mute
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit4 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xEA, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 4 )
|
||||
}; // Vol-
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit3 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xE9, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 3 )
|
||||
}; // Vol+
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit2 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB6, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 2 )
|
||||
}; // Scan Prev
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit1 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB5, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 1 )
|
||||
}; // Scan Next
|
||||
static USB_HID_Report_Element_t hidUsageByte0Bit0 = {
|
||||
.item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE),
|
||||
.item.data = { 0xB0, 0x00 },
|
||||
.location = HID_REPORT_SET_LOC( 0, 0, 0, 0 )
|
||||
}; // Play
|
||||
|
||||
/*
|
||||
* List the configurable items in the HID Report descriptor.
|
||||
*/
|
||||
static USB_HID_Report_Element_t* const hidConfigurableElements[] = {
|
||||
&hidUsageByte0Bit0,
|
||||
&hidUsageByte0Bit1,
|
||||
&hidUsageByte0Bit2,
|
||||
&hidUsageByte0Bit3,
|
||||
&hidUsageByte0Bit4,
|
||||
&hidUsageByte0Bit5
|
||||
};
|
||||
|
||||
/*
|
||||
* List HID Reports, one per Report ID. This should be a usage page item with the relevant
|
||||
* If not using report IDs - still have one with report ID 0
|
||||
*/
|
||||
static const USB_HID_Report_Element_t* const hidReports[] = {
|
||||
&hidReportPageConsumer
|
||||
};
|
||||
|
||||
/*
|
||||
* List all items in the HID Report descriptor.
|
||||
*/
|
||||
static const USB_HID_Short_Item_t * const hidReportDescriptorItems[] = {
|
||||
&(hidReportPageConsumer.item),
|
||||
&hidUsageConsumerControl,
|
||||
&hidCollectionApplication,
|
||||
&hidLogicalMinimum0,
|
||||
&hidLogicalMaximum1,
|
||||
&(hidUsageByte0Bit0.item),
|
||||
&(hidUsageByte0Bit1.item),
|
||||
&(hidUsageByte0Bit2.item),
|
||||
&(hidUsageByte0Bit3.item),
|
||||
&(hidUsageByte0Bit4.item),
|
||||
&(hidUsageByte0Bit5.item),
|
||||
&hidReportSize1,
|
||||
&hidReportCount6,
|
||||
&hidInputDataVar,
|
||||
&hidLogicalMaximum0,
|
||||
&hidReportCount2,
|
||||
&hidInputConstArray,
|
||||
&hidCollectionEnd
|
||||
};
|
||||
|
||||
/*
|
||||
* Define the number of HID Reports
|
||||
* Due to XC not supporting designated initializers, this constant has a hard-coded value.
|
||||
* It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* ))
|
||||
*/
|
||||
#define HID_REPORT_COUNT ( 1 )
|
||||
|
||||
#endif // __hid_report_descriptor_h__
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016-2021 XMOS LIMITED.
|
||||
// Copyright 2016-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include <platform.h>
|
||||
#include <stdlib.h>
|
||||
@@ -81,7 +81,7 @@ buffered out port:32 p_bclk = PORT_I2S_BCLK; /* I2S L/R-clock */
|
||||
in port p_mclk_in = PORT_MCLK_IN;
|
||||
|
||||
/* Clock-block declarations */
|
||||
clock clk_audio_bclk = on tile[AUDIO_IO_TILE]: XS1_CLKBLK_1; /* Bit clock */
|
||||
clock clk_audio_bclk = on tile[AUDIO_IO_TILE]: XS1_CLKBLK_1; /* Bit clock */
|
||||
clock clk_audio_mclk = on tile[AUDIO_IO_TILE]: XS1_CLKBLK_2; /* Master clock */
|
||||
|
||||
#ifdef SIMULATION
|
||||
@@ -189,14 +189,14 @@ void checker(chanend c_checker, int disable)
|
||||
|
||||
#ifdef SIMULATION
|
||||
|
||||
out port p_mclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1A;
|
||||
out port p_mclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1A;
|
||||
clock clk_audio_mclk_gen = on tile[AUDIO_IO_TILE] : XS1_CLKBLK_3;
|
||||
void master_mode_clk_setup(void);
|
||||
|
||||
#if CODEC_MASTER
|
||||
out port p_bclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1B;
|
||||
out port p_bclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1B;
|
||||
clock clk_audio_bclk_gen = on tile[AUDIO_IO_TILE] : XS1_CLKBLK_4;
|
||||
out port p_lrclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1C;
|
||||
out port p_lrclk_gen = on tile[AUDIO_IO_TILE] : XS1_PORT_1C;
|
||||
clock clk_audio_lrclk_gen = on tile[AUDIO_IO_TILE] : XS1_CLKBLK_5;
|
||||
void slave_mode_clk_setup(const unsigned samFreq, const unsigned chans_per_frame);
|
||||
#endif
|
||||
@@ -214,11 +214,11 @@ int main(void)
|
||||
chan c_checker;
|
||||
chan c_out;
|
||||
|
||||
par
|
||||
par
|
||||
{
|
||||
on tile[AUDIO_IO_TILE]:
|
||||
{
|
||||
par
|
||||
on tile[AUDIO_IO_TILE]:
|
||||
{
|
||||
par
|
||||
{
|
||||
XUA_AudioHub(c_out, clk_audio_mclk, clk_audio_bclk, p_mclk_in, p_lrclk, p_bclk, p_i2s_dac, p_i2s_adc);
|
||||
generator(c_checker, c_out);
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016-2021 XMOS LIMITED.
|
||||
// Copyright 2016-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifdef SIMULATION
|
||||
|
||||
@@ -22,7 +22,7 @@ void AudioHwInit()
|
||||
|
||||
|
||||
extern clock clk_audio_mclk_gen;
|
||||
extern out port p_mclk_gen;
|
||||
extern out port p_mclk_gen;
|
||||
void master_mode_clk_setup(void)
|
||||
{
|
||||
configure_clock_rate(clk_audio_mclk_gen, 25, 1); // Slighly faster than typical MCLK of 24.576MHz
|
||||
@@ -35,17 +35,17 @@ void master_mode_clk_setup(void)
|
||||
|
||||
|
||||
#if CODEC_MASTER
|
||||
extern out port p_bclk_gen;
|
||||
extern out port p_bclk_gen;
|
||||
extern clock clk_audio_bclk_gen;
|
||||
extern out port p_lrclk_gen;
|
||||
extern out port p_lrclk_gen;
|
||||
extern clock clk_audio_lrclk_gen;
|
||||
|
||||
void slave_mode_clk_setup(const unsigned samFreq, const unsigned chans_per_frame){
|
||||
const unsigned data_bits = 32;
|
||||
const unsigned mclk_freq = 24576000;
|
||||
|
||||
const unsigned mclk_bclk_ratio = mclk_freq / (chans_per_frame * samFreq * data_bits);
|
||||
const unsigned bclk_lrclk_ratio = (chans_per_frame * data_bits); // 48.828Hz LRCLK
|
||||
const unsigned mclk_bclk_ratio = mclk_freq / (chans_per_frame * samFreq * data_bits);
|
||||
const unsigned bclk_lrclk_ratio = (chans_per_frame * data_bits); // 48.828Hz LRCLK
|
||||
|
||||
//bclk
|
||||
configure_clock_src_divide(clk_audio_bclk_gen, p_mclk_gen, mclk_bclk_ratio/2);
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016-2021 XMOS LIMITED.
|
||||
// Copyright 2016-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifdef HARDWARE
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "devicedefines.h"
|
||||
#include <platform.h>
|
||||
#include "gpio_access.h"
|
||||
#include "i2c_shared.h"
|
||||
#include "i2c.h"
|
||||
#include "cs4384.h"
|
||||
#include "cs5368.h"
|
||||
#include "cs2100.h"
|
||||
@@ -25,16 +25,10 @@
|
||||
|
||||
on tile[0] : out port p_gpio = XS1_PORT_8C;
|
||||
|
||||
#ifndef IAP
|
||||
/* If IAP not enabled, i2c ports not declared - still needs for DAC config */
|
||||
on tile [0] : struct r_i2c r_i2c = {XS1_PORT_4A};
|
||||
#else
|
||||
extern struct r_i2c r_i2c;
|
||||
#endif
|
||||
port p_i2c = on tile[0]:PORT_I2C;
|
||||
|
||||
#define DAC_REGWRITE(reg, val) {data[0] = val; i2c_shared_master_write_reg(r_i2c, CS4384_I2C_ADDR, reg, data, 1);}
|
||||
#define DAC_REGREAD(reg, val) {i2c_shared_master_read_reg(r_i2c, CS4384_I2C_ADDR, reg, val, 1);}
|
||||
#define ADC_REGWRITE(reg, val) {data[0] = val; i2c_shared_master_write_reg(r_i2c, CS5368_I2C_ADDR, reg, data, 1);}
|
||||
#define DAC_REGWRITE(reg, val) {result = i2c.write_reg(CS4384_I2C_ADDR, reg, val);}
|
||||
#define ADC_REGWRITE(reg, val) {result = i2c.write_reg(CS5368_I2C_ADDR, reg, val);}
|
||||
|
||||
#ifdef USE_FRACTIONAL_N
|
||||
|
||||
@@ -45,14 +39,15 @@ extern struct r_i2c r_i2c;
|
||||
#define PLL_SYNC_FREQ 300
|
||||
#endif
|
||||
|
||||
#define CS2100_REGREAD(reg, data) {data[0] = 0xAA; i2c_master_read_reg(CS2100_I2C_DEVICE_ADDR, reg, data, 1, r_i2c);}
|
||||
#define CS2100_REGREAD_ASSERT(reg, data, expected) {data[0] = 0xAA; i2c_master_read_reg(CS2100_I2C_DEVICE_ADDR, reg, data, 1, r_i2c); assert(data[0] == expected);}
|
||||
#define CS2100_REGWRITE(reg, val) {data[0] = val; i2c_master_write_reg(CS2100_I2C_DEVICE_ADDR, reg, data, 1, r_i2c);}
|
||||
#define CS2100_REGREAD(reg, data) {data[0] = i2c.read_reg(CS2100_I2C_DEVICE_ADDR, reg, result);}
|
||||
#define CS2100_REGREAD_ASSERT(reg, data, expected) {data[0] = i2c.read_reg(CS2100_I2C_DEVICE_ADDR, reg, result); assert(data[0] == expected);}
|
||||
#define CS2100_REGWRITE(reg, val) {result = i2c.write_reg(CS2100_I2C_DEVICE_ADDR, reg, val);}
|
||||
|
||||
/* Init of CS2100 */
|
||||
void PllInit(void)
|
||||
void PllInit(client interface i2c_master_if i2c)
|
||||
{
|
||||
unsigned char data[1] = {0};
|
||||
i2c_regop_res_t result;
|
||||
|
||||
#if XCORE_200_MC_AUDIO_HW_VERSION < 2
|
||||
/* Enable init */
|
||||
@@ -73,12 +68,15 @@ void PllInit(void)
|
||||
CS2100_REGREAD_ASSERT(CS2100_GLOBAL_CONFIG, data, 0x01);
|
||||
CS2100_REGREAD_ASSERT(CS2100_FUNC_CONFIG_1, data, 0x08);
|
||||
CS2100_REGREAD_ASSERT(CS2100_FUNC_CONFIG_2, data, 0x00);
|
||||
|
||||
i2c.shutdown();
|
||||
}
|
||||
|
||||
/* Setup PLL multiplier */
|
||||
void PllMult(unsigned output, unsigned ref)
|
||||
void PllMult(unsigned output, unsigned ref, client interface i2c_master_if i2c)
|
||||
{
|
||||
unsigned char data[1] = {0};
|
||||
i2c_regop_res_t result;
|
||||
|
||||
/* PLL expects 12:20 format, convert output and ref to 12:20 */
|
||||
/* Shift up the dividend by 12 to retain format... */
|
||||
@@ -120,9 +118,6 @@ void AudioHwInit(chanend ?c_codec)
|
||||
start_clock(clk_pll_sync);
|
||||
#endif
|
||||
|
||||
/* Init the i2c module */
|
||||
i2c_shared_master_init(r_i2c);
|
||||
|
||||
/* Assert reset to ADC and DAC */
|
||||
set_gpio(P_GPIO_DAC_RST_N, 0);
|
||||
set_gpio(P_GPIO_ADC_RST_N, 0);
|
||||
@@ -143,7 +138,12 @@ void AudioHwInit(chanend ?c_codec)
|
||||
set_gpio(P_GPIO_PLL_SEL, 1);
|
||||
|
||||
/* Initialise external PLL */
|
||||
PllInit();
|
||||
i2c_master_if i2c[1];
|
||||
par
|
||||
{
|
||||
i2c_master_single_port(i2c, 1, p_i2c, 10, 0, 1, 0);
|
||||
PllInit(i2c[0]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IAP
|
||||
@@ -155,10 +155,11 @@ void AudioHwInit(chanend ?c_codec)
|
||||
/* Configures the external audio hardware for the required sample frequency.
|
||||
* See gpio.h for I2C helper functions and gpio access
|
||||
*/
|
||||
void AudioHwConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec, unsigned dsdMode,
|
||||
unsigned sampRes_DAC, unsigned sampRes_ADC)
|
||||
void AudioHwConfig2(unsigned samFreq, unsigned mClk, chanend ?c_codec, unsigned dsdMode,
|
||||
unsigned sampRes_DAC, unsigned sampRes_ADC, client interface i2c_master_if i2c)
|
||||
{
|
||||
unsigned char data[1] = {0};
|
||||
unsigned char data[1] = {0};
|
||||
i2c_regop_res_t result;
|
||||
|
||||
/* Put ADC and DAC into reset */
|
||||
set_gpio(P_GPIO_ADC_RST_N, 0);
|
||||
@@ -167,7 +168,7 @@ void AudioHwConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec, unsigned d
|
||||
/* Set master clock select appropriately */
|
||||
#if defined(USE_FRACTIONAL_N)
|
||||
/* Configure external fractional-n clock multiplier for 300Hz -> mClkFreq */
|
||||
PllMult(mClk, PLL_SYNC_FREQ);
|
||||
PllMult(mClk, PLL_SYNC_FREQ, i2c);
|
||||
#endif
|
||||
/* Allow some time for mclk to lock and MCLK to stabilise - this is important to avoid glitches at start of stream */
|
||||
{
|
||||
@@ -365,8 +366,20 @@ void AudioHwConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec, unsigned d
|
||||
DAC_REGWRITE(CS4384_MODE_CTRL, 0b10000000);
|
||||
}
|
||||
#endif
|
||||
|
||||
i2c.shutdown();
|
||||
return;
|
||||
}
|
||||
//:
|
||||
|
||||
void AudioHwConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec, unsigned dsdMode,
|
||||
unsigned sampRes_DAC, unsigned sampRes_ADC)
|
||||
{
|
||||
i2c_master_if i2c[1];
|
||||
par
|
||||
{
|
||||
i2c_master_single_port(i2c, 1, p_i2c, 10, 0, 1, 0);
|
||||
AudioHwConfig2(samFreq, mClk, c_codec, dsdMode, sampRes_DAC, sampRes_ADC, i2c[0]);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -83,10 +83,12 @@
|
||||
</Link>
|
||||
</Links>
|
||||
<ExternalDevices>
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K">
|
||||
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="8192">
|
||||
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
|
||||
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
|
||||
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
|
||||
<Attribute Name="QE_REGISTER" Value="flash_qe_location_status_reg_0"/>
|
||||
<Attribute Name="QE_BIT" Value="flash_qe_bit_6"/>
|
||||
</Device>
|
||||
</ExternalDevices>
|
||||
<JTAGChain>
|
||||
@@ -4,7 +4,7 @@
|
||||
#define __custom_defines_h__
|
||||
|
||||
#define EXCLUDE_USB_AUDIO_MAIN
|
||||
#define NUM_PDM_MICS 0
|
||||
#define XUA_NUM_PDM_MICS 0
|
||||
#define XUD_TILE 1
|
||||
#define AUDIO_IO_TILE 0
|
||||
#define MIXER 0
|
||||
@@ -1,860 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="com.xmos.cdt.toolchain.1285928753">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.xmos.cdt.toolchain.1285928753" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="com.xmos.cdt.core.XdeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="com.xmos.cdt.core.XEBinaryParser" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration buildProperties="" description="" id="com.xmos.cdt.toolchain.1285928753" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
|
||||
<folderInfo id="com.xmos.cdt.toolchain.1285928753.790908561" name="/" resourcePath="">
|
||||
<toolChain id="com.xmos.cdt.toolchain.1969897956" name="com.xmos.cdt.toolchain" superClass="com.xmos.cdt.toolchain">
|
||||
<targetPlatform archList="all" binaryParser="com.xmos.cdt.core.XEBinaryParser;org.eclipse.cdt.core.GNU_ELF" id="com.xmos.cdt.core.platform.1615568037" isAbstract="false" osList="linux,win32,macosx" superClass="com.xmos.cdt.core.platform"/>
|
||||
<builder arguments="-f .makefile" id="com.xmos.cdt.builder.base.45159417" keepEnvironmentInBuildfile="false" managedBuildOn="false" superClass="com.xmos.cdt.builder.base">
|
||||
<outputEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH" kind="outputPath" name="bin"/>
|
||||
</outputEntries>
|
||||
</builder>
|
||||
<tool id="com.xmos.cdt.xc.compiler.404499215" name="com.xmos.cdt.xc.compiler" superClass="com.xmos.cdt.xc.compiler">
|
||||
<option id="com.xmos.xc.compiler.option.defined.symbols.1492092903" name="com.xmos.xc.compiler.option.defined.symbols" superClass="com.xmos.xc.compiler.option.defined.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__XC__=1"/>
|
||||
<listOptionValue builtIn="false" value="__llvm__=1"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELAXED=0"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_CONSUME=1"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQUIRE=2"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELEASE=3"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQ_REL=4"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_SEQ_CST=5"/>
|
||||
<listOptionValue builtIn="false" value="__PRAGMA_REDEFINE_EXTNAME=1"/>
|
||||
<listOptionValue builtIn="false" value="__VERSION__="4.2.1"/>
|
||||
<listOptionValue builtIn="false" value="__CONSTANT_CFSTRINGS__=1"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_LITTLE_ENDIAN__=1234"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_BIG_ENDIAN__=4321"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_PDP_ENDIAN__=3412"/>
|
||||
<listOptionValue builtIn="false" value="__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__"/>
|
||||
<listOptionValue builtIn="false" value="__LITTLE_ENDIAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="_ILP32=1"/>
|
||||
<listOptionValue builtIn="false" value="__ILP32__=1"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_BIT__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SCHAR_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__SHRT_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_MAX__=2147483647L"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_LONG_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_FLOAT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_INT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_LONG__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_POINTER__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SHORT__=2"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_PTRDIFF_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SIZE_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WCHAR_T__=1"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WINT_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_C_SUFFIX__=ULL"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_WIDTH__=64"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_WIDTH__=8"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DENORM_MIN__=1.40129846e-45F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DIG__=6"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EPSILON__=1.19209290e-7F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MANT_DIG__=24"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_10_EXP__=38"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_EXP__=128"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX__=3.40282347e+38F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_10_EXP__=(-37)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_EXP__=(-125)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN__=1.17549435e-38F"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DENORM_MIN__=4.9406564584124654e-324"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_EPSILON__=2.2204460492503131e-16"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX__=1.7976931348623157e+308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN__=2.2250738585072014e-308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DENORM_MIN__=4.9406564584124654e-324L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_EPSILON__=2.2204460492503131e-16L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX__=1.7976931348623157e+308L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN__=2.2250738585072014e-308L"/>
|
||||
<listOptionValue builtIn="false" value="__POINTER_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__USER_LABEL_PREFIX__=_"/>
|
||||
<listOptionValue builtIn="false" value="__FINITE_MATH_ONLY__=0"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EVAL_METHOD__=0"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_RADIX__=2"/>
|
||||
<listOptionValue builtIn="false" value="__DECIMAL_DIG__=17"/>
|
||||
<listOptionValue builtIn="false" value="__xcore__=1"/>
|
||||
<listOptionValue builtIn="false" value="__XS1B__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_HOSTED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_16__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_32__=1"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_YEAR=14"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MONTH=3"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MAJOR=1403"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MINOR=2"/>
|
||||
<listOptionValue builtIn="false" value="__XCC_HAVE_FLOAT__=1"/>
|
||||
<listOptionValue builtIn="false" value="_XSCOPE_PROBES_INCLUDE_FILE="/var/folders/0l/8jd0xy095ps890m302j532580000h5/T//cc8JvR3b.h""/>
|
||||
</option>
|
||||
<option id="com.xmos.xc.compiler.option.include.paths.834699451" name="com.xmos.xc.compiler.option.include.paths" superClass="com.xmos.xc.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include/xc""/>
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include""/>
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include/clang""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst/images}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/client}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/class}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core/included}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/control}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user}""/>
|
||||
</option>
|
||||
<inputType id="com.xmos.cdt.xc.compiler.input.2062798368" name="XC" superClass="com.xmos.cdt.xc.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="com.xmos.cdt.c.compiler.1931691289" name="com.xmos.cdt.c.compiler" superClass="com.xmos.cdt.c.compiler">
|
||||
<option id="com.xmos.c.compiler.option.defined.symbols.534062814" name="com.xmos.c.compiler.option.defined.symbols" superClass="com.xmos.c.compiler.option.defined.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__llvm__=1"/>
|
||||
<listOptionValue builtIn="false" value="__clang__=1"/>
|
||||
<listOptionValue builtIn="false" value="__clang_major__=3"/>
|
||||
<listOptionValue builtIn="false" value="__clang_minor__=6"/>
|
||||
<listOptionValue builtIn="false" value="__clang_patchlevel__=0"/>
|
||||
<listOptionValue builtIn="false" value="__clang_version__="3.6.0"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_MINOR__=2"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_PATCHLEVEL__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC__=4"/>
|
||||
<listOptionValue builtIn="false" value="__GXX_ABI_VERSION=1002"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELAXED=0"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_CONSUME=1"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQUIRE=2"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELEASE=3"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQ_REL=4"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_SEQ_CST=5"/>
|
||||
<listOptionValue builtIn="false" value="__PRAGMA_REDEFINE_EXTNAME=1"/>
|
||||
<listOptionValue builtIn="false" value="__VERSION__="4.2.1"/>
|
||||
<listOptionValue builtIn="false" value="__CONSTANT_CFSTRINGS__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GXX_RTTI=1"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_LITTLE_ENDIAN__=1234"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_BIG_ENDIAN__=4321"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_PDP_ENDIAN__=3412"/>
|
||||
<listOptionValue builtIn="false" value="__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__"/>
|
||||
<listOptionValue builtIn="false" value="__LITTLE_ENDIAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="_ILP32=1"/>
|
||||
<listOptionValue builtIn="false" value="__ILP32__=1"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_BIT__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SCHAR_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__SHRT_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_MAX__=2147483647L"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_LONG_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_FLOAT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_INT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_LONG__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_POINTER__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SHORT__=2"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_PTRDIFF_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SIZE_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WCHAR_T__=1"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WINT_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_C_SUFFIX__=ULL"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_WIDTH__=64"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_WIDTH__=8"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_WIDTH__=64"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DENORM_MIN__=1.40129846e-45F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DIG__=6"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EPSILON__=1.19209290e-7F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MANT_DIG__=24"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_10_EXP__=38"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_EXP__=128"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX__=3.40282347e+38F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_10_EXP__=(-37)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_EXP__=(-125)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN__=1.17549435e-38F"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DENORM_MIN__=4.9406564584124654e-324"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_EPSILON__=2.2204460492503131e-16"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX__=1.7976931348623157e+308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN__=2.2250738585072014e-308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DENORM_MIN__=4.9406564584124654e-324L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_EPSILON__=2.2204460492503131e-16L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX__=1.7976931348623157e+308L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN__=2.2250738585072014e-308L"/>
|
||||
<listOptionValue builtIn="false" value="__POINTER_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_C_SUFFIX__=U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_C_SUFFIX__=ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__USER_LABEL_PREFIX__=_"/>
|
||||
<listOptionValue builtIn="false" value="__FINITE_MATH_ONLY__=0"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_STDC_INLINE__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_BOOL_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_SHORT_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_INT_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_LONG_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_LLONG_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_POINTER_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__NO_INLINE__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EVAL_METHOD__=0"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_RADIX__=2"/>
|
||||
<listOptionValue builtIn="false" value="__DECIMAL_DIG__=17"/>
|
||||
<listOptionValue builtIn="false" value="__xcore__=1"/>
|
||||
<listOptionValue builtIn="false" value="__XS1B__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_HOSTED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_VERSION__=199901L"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_16__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_32__=1"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_YEAR=14"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MONTH=3"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MAJOR=1403"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MINOR=2"/>
|
||||
<listOptionValue builtIn="false" value="__XCC_HAVE_FLOAT__=1"/>
|
||||
<listOptionValue builtIn="false" value="_XSCOPE_PROBES_INCLUDE_FILE="/var/folders/0l/8jd0xy095ps890m302j532580000h5/T//ccVdKn1b.h""/>
|
||||
</option>
|
||||
<option id="com.xmos.c.compiler.option.include.paths.1661660573" name="com.xmos.c.compiler.option.include.paths" superClass="com.xmos.c.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include""/>
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include/clang""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst/images}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/client}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/class}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core/included}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/control}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user}""/>
|
||||
</option>
|
||||
<inputType id="com.xmos.cdt.c.compiler.input.c.1188610778" name="C" superClass="com.xmos.cdt.c.compiler.input.c"/>
|
||||
</tool>
|
||||
<tool id="com.xmos.cdt.cxx.compiler.1403352573" name="com.xmos.cdt.cxx.compiler" superClass="com.xmos.cdt.cxx.compiler">
|
||||
<option id="com.xmos.cxx.compiler.option.defined.symbols.665306874" name="com.xmos.cxx.compiler.option.defined.symbols" superClass="com.xmos.cxx.compiler.option.defined.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__llvm__=1"/>
|
||||
<listOptionValue builtIn="false" value="__clang__=1"/>
|
||||
<listOptionValue builtIn="false" value="__clang_major__=3"/>
|
||||
<listOptionValue builtIn="false" value="__clang_minor__=6"/>
|
||||
<listOptionValue builtIn="false" value="__clang_patchlevel__=0"/>
|
||||
<listOptionValue builtIn="false" value="__clang_version__="3.6.0"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_MINOR__=2"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_PATCHLEVEL__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC__=4"/>
|
||||
<listOptionValue builtIn="false" value="__GXX_ABI_VERSION=1002"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELAXED=0"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_CONSUME=1"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQUIRE=2"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_RELEASE=3"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_ACQ_REL=4"/>
|
||||
<listOptionValue builtIn="false" value="__ATOMIC_SEQ_CST=5"/>
|
||||
<listOptionValue builtIn="false" value="__PRAGMA_REDEFINE_EXTNAME=1"/>
|
||||
<listOptionValue builtIn="false" value="__VERSION__="4.2.1"/>
|
||||
<listOptionValue builtIn="false" value="__CONSTANT_CFSTRINGS__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GXX_RTTI=1"/>
|
||||
<listOptionValue builtIn="false" value="__DEPRECATED=1"/>
|
||||
<listOptionValue builtIn="false" value="__GNUG__=4"/>
|
||||
<listOptionValue builtIn="false" value="__GXX_WEAK__=1"/>
|
||||
<listOptionValue builtIn="false" value="__private_extern__=extern"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_LITTLE_ENDIAN__=1234"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_BIG_ENDIAN__=4321"/>
|
||||
<listOptionValue builtIn="false" value="__ORDER_PDP_ENDIAN__=3412"/>
|
||||
<listOptionValue builtIn="false" value="__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__"/>
|
||||
<listOptionValue builtIn="false" value="__LITTLE_ENDIAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="_ILP32=1"/>
|
||||
<listOptionValue builtIn="false" value="__ILP32__=1"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_BIT__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SCHAR_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__SHRT_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_MAX__=2147483647L"/>
|
||||
<listOptionValue builtIn="false" value="__LONG_LONG_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_FLOAT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_INT__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_DOUBLE__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_LONG_LONG__=8"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_POINTER__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SHORT__=2"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_PTRDIFF_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_SIZE_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WCHAR_T__=1"/>
|
||||
<listOptionValue builtIn="false" value="__SIZEOF_WINT_T__=4"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_C_SUFFIX__=ULL"/>
|
||||
<listOptionValue builtIn="false" value="__INTMAX_WIDTH__=64"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__PTRDIFF_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INTPTR_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__SIZE_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_WIDTH__=8"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__SIG_ATOMIC_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINTMAX_WIDTH__=64"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__UINTPTR_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DENORM_MIN__=1.40129846e-45F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_DIG__=6"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EPSILON__=1.19209290e-7F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MANT_DIG__=24"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_10_EXP__=38"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX_EXP__=128"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MAX__=3.40282347e+38F"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_10_EXP__=(-37)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN_EXP__=(-125)"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_MIN__=1.17549435e-38F"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DENORM_MIN__=4.9406564584124654e-324"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_EPSILON__=2.2204460492503131e-16"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MAX__=1.7976931348623157e+308"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__DBL_MIN__=2.2250738585072014e-308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DENORM_MIN__=4.9406564584124654e-324L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_DENORM__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_DIG__=15"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_EPSILON__=2.2204460492503131e-16L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_INFINITY__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_HAS_QUIET_NAN__=1"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MANT_DIG__=53"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_10_EXP__=308"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX_EXP__=1024"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MAX__=1.7976931348623157e+308L"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_10_EXP__=(-307)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN_EXP__=(-1021)"/>
|
||||
<listOptionValue builtIn="false" value="__LDBL_MIN__=2.2250738585072014e-308L"/>
|
||||
<listOptionValue builtIn="false" value="__POINTER_WIDTH__=32"/>
|
||||
<listOptionValue builtIn="false" value="__CHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WCHAR_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__WINT_UNSIGNED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__INT8_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__INT16_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__INT32_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__INT64_C_SUFFIX__=LL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__UINT8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__INT8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_C_SUFFIX__"/>
|
||||
<listOptionValue builtIn="false" value="__UINT16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__INT16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_C_SUFFIX__=U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__INT32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_C_SUFFIX__=ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__INT64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT_LEAST64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_LEAST64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_TYPE__=signed"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_MAX__=127"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_FMTd__="hhd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST8_FMTi__="hhi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_MAX__=255"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTo__="hho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTu__="hhu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTx__="hhx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST8_FMTX__="hhX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_TYPE__=short"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_MAX__=32767"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_FMTd__="hd""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST16_FMTi__="hi""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_MAX__=65535"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTo__="ho""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTu__="hu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTx__="hx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST16_FMTX__="hX""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_TYPE__=int"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_MAX__=2147483647"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_FMTd__="d""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST32_FMTi__="i""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_TYPE__=unsigned"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_MAX__=4294967295U"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTo__="o""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTu__="u""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTx__="x""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST32_FMTX__="X""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_MAX__=9223372036854775807LL"/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_FMTd__="lld""/>
|
||||
<listOptionValue builtIn="false" value="__INT_FAST64_FMTi__="lli""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_TYPE__=long"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_MAX__=18446744073709551615ULL"/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTo__="llo""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTu__="llu""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTx__="llx""/>
|
||||
<listOptionValue builtIn="false" value="__UINT_FAST64_FMTX__="llX""/>
|
||||
<listOptionValue builtIn="false" value="__USER_LABEL_PREFIX__=_"/>
|
||||
<listOptionValue builtIn="false" value="__FINITE_MATH_ONLY__=0"/>
|
||||
<listOptionValue builtIn="false" value="__GNUC_GNU_INLINE__=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_BOOL_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_SHORT_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_INT_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_LONG_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_LLONG_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__GCC_ATOMIC_POINTER_LOCK_FREE=1"/>
|
||||
<listOptionValue builtIn="false" value="__NO_INLINE__=1"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_EVAL_METHOD__=0"/>
|
||||
<listOptionValue builtIn="false" value="__FLT_RADIX__=2"/>
|
||||
<listOptionValue builtIn="false" value="__DECIMAL_DIG__=17"/>
|
||||
<listOptionValue builtIn="false" value="__xcore__=1"/>
|
||||
<listOptionValue builtIn="false" value="__XS1B__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_HOSTED__=1"/>
|
||||
<listOptionValue builtIn="false" value="__cplusplus=199711L"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_16__=1"/>
|
||||
<listOptionValue builtIn="false" value="__STDC_UTF_32__=1"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_YEAR=14"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MONTH=3"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MAJOR=1403"/>
|
||||
<listOptionValue builtIn="false" value="XCC_VERSION_MINOR=2"/>
|
||||
<listOptionValue builtIn="false" value="__XCC_HAVE_FLOAT__=1"/>
|
||||
<listOptionValue builtIn="false" value="_XSCOPE_PROBES_INCLUDE_FILE="/var/folders/0l/8jd0xy095ps890m302j532580000h5/T//cc8vh80e.h""/>
|
||||
</option>
|
||||
<option id="com.xmos.cxx.compiler.option.include.paths.1031009526" name="com.xmos.cxx.compiler.option.include.paths" superClass="com.xmos.cxx.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include""/>
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include/clang""/>
|
||||
<listOptionValue builtIn="false" value=""${XMOS_TOOL_PATH}/target/include/c++/v1""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst/images}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/client}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/class}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core/included}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/core}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user/control}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_logging/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc/rst}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/api}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/doc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lib_xud/src/user}""/>
|
||||
</option>
|
||||
<inputType id="com.xmos.cdt.cxx.compiler.input.cpp.223196941" name="C++" superClass="com.xmos.cdt.cxx.compiler.input.cpp"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry excluding=".build*" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="lib_xua.null.1378855182" name="lib_xua"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
</cproject>
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>lib_xua</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.xmos.cdt.core.ProjectInfoSyncBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.xmos.cdt.core.LegacyProjectCheckerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.xmos.cdt.core.ModulePathBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
<nature>com.xmos.cdt.core.XdeProjectNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><xproject><repository>lib_xua</repository><partnum>XM-012639-SM</partnum></xproject>
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __XUA_AUDIOHUB_H__
|
||||
#define __XUA_AUDIOHUB_H__
|
||||
@@ -37,13 +37,13 @@
|
||||
* \param c_dig channel connected to the clockGen() thread for
|
||||
* receiving/transmitting samples
|
||||
*/
|
||||
void XUA_AudioHub(chanend ?c_aud,
|
||||
clock ?clk_audio_mclk,
|
||||
clock ?clk_audio_bclk,
|
||||
void XUA_AudioHub(chanend ?c_aud,
|
||||
clock ?clk_audio_mclk,
|
||||
clock ?clk_audio_bclk,
|
||||
in port p_mclk_in,
|
||||
buffered _XUA_CLK_DIR port:32 ?p_lrclk,
|
||||
buffered _XUA_CLK_DIR port:32 ?p_bclk,
|
||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]
|
||||
#if (XUA_SPDIF_TX_EN) //&& (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
||||
, chanend c_spdif_tx
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
/*
|
||||
* @brief Defines relating to device configuration and customisation of lib_xua
|
||||
@@ -57,8 +57,8 @@
|
||||
#define PDM_TILE AUDIO_IO_TILE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Disable USB functionalty just leaving AudioHub
|
||||
/**
|
||||
* @brief Disable USB functionalty just leaving AudioHub
|
||||
*/
|
||||
#ifndef XUA_USB_EN
|
||||
#define XUA_USB_EN 1
|
||||
@@ -83,7 +83,7 @@
|
||||
/**
|
||||
* @brief Number of DSD output channels. Default: 0 (disabled)
|
||||
*/
|
||||
#if defined(DSD_CHANS_DAC)
|
||||
#if defined(DSD_CHANS_DAC) && (DSD_CHANS_DAC != 0)
|
||||
#if defined(NATIVE_DSD) && (NATIVE_DSD == 0)
|
||||
#undef NATIVE_DSD
|
||||
#else
|
||||
@@ -1140,38 +1140,11 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* IAP */
|
||||
#if defined(IAP) && (IAP == 0)
|
||||
#undef IAP
|
||||
/* Always enable explicit feedback EP, even when input stream is present */
|
||||
#ifndef UAC_FORCE_FEEDBACK_EP
|
||||
#define UAC_FORCE_FEEDBACK_EP (1)
|
||||
#endif
|
||||
|
||||
/* IAP Interrupt endpoint */
|
||||
#if defined(IAP_INT_EP) && (IAP_INT_EP == 0)
|
||||
#undef IAP_INT_EP
|
||||
#endif
|
||||
|
||||
/* IAP EA Native Transport */
|
||||
#if defined(IAP_EA_NATIVE_TRANS) && (IAP_EA_NATIVE_TRANS == 0)
|
||||
#undef IAP_EA_NATIVE_TRANS
|
||||
#endif
|
||||
|
||||
#if defined(IAP_EA_NATIVE_TRANS) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Number of supported EA Native Interface Alternative settings.
|
||||
*
|
||||
* Only 1 supported
|
||||
*/
|
||||
#ifndef IAP_EA_NATIVE_TRANS_ALT_COUNT
|
||||
#define IAP_EA_NATIVE_TRANS_ALT_COUNT 1
|
||||
#endif
|
||||
|
||||
#if (IAP_EA_NATIVE_TRANS_ALT_COUNT > 1)
|
||||
/* Only 1 supported */
|
||||
#error
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if (defined(UAC_FORCE_FEEDBACK_EP) && UAC_FORCE_FEEDBACK_EP == 0)
|
||||
#undef UAC_FORCE_FEEDBACK_EP
|
||||
#endif
|
||||
@@ -1228,7 +1201,7 @@ enum USBEndpointNumber_Out
|
||||
#endif
|
||||
|
||||
#ifndef XUA_ENDPOINT_COUNT_CUSTOM_IN
|
||||
#define XUA_ENDPOINT_COUNT_CUSTOM_IN 0
|
||||
#define XUA_ENDPOINT_COUNT_CUSTOM_IN 0
|
||||
#endif
|
||||
|
||||
#define ENDPOINT_COUNT_IN (XUA_ENDPOINT_COUNT_IN + XUA_ENDPOINT_COUNT_CUSTOM_IN)
|
||||
@@ -1244,10 +1217,6 @@ enum USBEndpointNumber_Out
|
||||
|
||||
#define MAX_VOL (0x20000000)
|
||||
|
||||
#if defined(SU1_ADC_ENABLE) && (SU1_ADC_ENABLE == 0)
|
||||
#undef SU1_ADC_ENABLE
|
||||
#endif
|
||||
|
||||
#if defined(LEVEL_METER_LEDS) && !defined(LEVEL_UPDATE_RATE)
|
||||
#define LEVEL_UPDATE_RATE 400000
|
||||
#endif
|
||||
@@ -1480,6 +1449,6 @@ enum USBEndpointNumber_Out
|
||||
#define _XUA_CLK_DIR out
|
||||
#endif
|
||||
|
||||
#if (CODEC_MASTER == 1) && (DSD_CHANS_DAC != 0)
|
||||
#error CODEC_MASTER with DSD is currently unsupported
|
||||
#if (CODEC_MASTER == 1) && (DSD_CHANS_DAC != 0)
|
||||
#error CODEC_MASTER with DSD is currently unsupported
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017-2021 XMOS LIMITED.
|
||||
// Copyright 2017-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef __XUA_CONF_FULL_H__
|
||||
#define __XUA_CONF_FULL_H__
|
||||
@@ -9,6 +9,4 @@
|
||||
|
||||
#include "xua_conf_default.h"
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -15,7 +15,10 @@
|
||||
* \param c_ep0_out Chanend connected to the XUD_Manager() out endpoint array
|
||||
* \param c_ep0_in Chanend connected to the XUD_Manager() in endpoint array
|
||||
* \param c_audioCtrl Chanend connected to the decouple thread for control
|
||||
* audio (sample rate changes etc.)
|
||||
* audio (sample rate changes etc.). Note when nulled, the
|
||||
* audio device only supports single sample rate/format and
|
||||
* DFU is not supported either since this channel is used
|
||||
* to carry messages about format, rate and DFU state
|
||||
* \param c_mix_ctl Optional chanend to be connected to the mixer thread if
|
||||
* present
|
||||
* \param c_clk_ctl Optional chanend to be connected to the clockgen thread if
|
||||
@@ -25,7 +28,7 @@
|
||||
* \param c_EANativeTransport_ctrl Optional chanend to be connected to EA Native
|
||||
* endpoint manager if present
|
||||
*/
|
||||
void XUA_Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCtrl,
|
||||
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_);
|
||||
|
||||
|
||||
Binary file not shown.
@@ -36,4 +36,3 @@ Older versions of Windows are not guaranteed to operate as expected. Devices are
|
||||
|
||||
|
||||
|
||||
.. include:: ../../../CHANGELOG.rst
|
||||
@@ -55,7 +55,7 @@ audio driver and handles locking to the S/PDIF clock source if required (see Ext
|
||||
Ideally the parity of each word/sample received should be checked. This is done using the built in
|
||||
``crc32`` function (see ``xs1.h``):
|
||||
|
||||
.. literalinclude:: sc_usb_audio/module_usb_audio/clocking/clockgen.xc
|
||||
.. literalinclude:: lib_xua/src/core/clocking/clockgen.xc
|
||||
:start-after: //:badParity
|
||||
:end-before: //:
|
||||
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
XMOSNEWSTYLE = 1
|
||||
XMOSNEWSTYLE = 2
|
||||
DOXYGEN_DIRS=../../api
|
||||
SOURCE_INCLUDE_DIRS=../../../lib_xua
|
||||
SPHINX_MASTER_DOC=lib_xua
|
||||
|
||||
|
||||
@@ -1277,7 +1277,7 @@ enum libusb_capability {
|
||||
* still have to call additional libusb functions such as
|
||||
* \ref libusb_detach_kernel_driver(). */
|
||||
LIBUSB_CAP_HAS_HID_ACCESS = 0x0100,
|
||||
/** The library supports detaching of the default USB driver, using
|
||||
/** The library supports detaching of the default USB driver, using
|
||||
* \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */
|
||||
LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101
|
||||
};
|
||||
|
||||
@@ -1273,7 +1273,7 @@ enum libusb_capability {
|
||||
* still have to call additional libusb functions such as
|
||||
* \ref libusb_detach_kernel_driver(). */
|
||||
LIBUSB_CAP_HAS_HID_ACCESS = 0x0100,
|
||||
/** The library supports detaching of the default USB driver, using
|
||||
/** The library supports detaching of the default USB driver, using
|
||||
* \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */
|
||||
LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101
|
||||
};
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
VERSION = 1.2.0
|
||||
VERSION = 3.2.0
|
||||
|
||||
DEPENDENT_MODULES = lib_logging(>=3.0.0) \
|
||||
lib_xassert(>=4.0.0) \
|
||||
lib_xud(>=1.0.0) \
|
||||
lib_spdif(>=4.0.0) \
|
||||
lib_mic_array(>=4.0.0)
|
||||
DEPENDENT_MODULES = lib_locks(>=2.1.0) \
|
||||
lib_logging(>=3.1.1) \
|
||||
lib_mic_array(>=4.5.0) \
|
||||
lib_spdif(>=4.1.0) \
|
||||
lib_xassert(>=4.1.0) \
|
||||
lib_xud(>=2.1.0)
|
||||
|
||||
MODULE_XCC_FLAGS = $(XCC_FLAGS) \
|
||||
-O3 \
|
||||
@@ -40,7 +41,6 @@ INCLUDE_DIRS = $(EXPORT_INCLUDE_DIRS) \
|
||||
src/core/pdm_mics \
|
||||
src/core/ports \
|
||||
src/core/support \
|
||||
src/core/support/powersave \
|
||||
src/core/user \
|
||||
src/core/user/audiostream \
|
||||
src/core/user/hid \
|
||||
@@ -58,7 +58,6 @@ SOURCE_DIRS = src/core \
|
||||
src/core/pdm_mics \
|
||||
src/core/ports \
|
||||
src/core/support \
|
||||
src/core/support/powersave \
|
||||
src/core/user/audiostream \
|
||||
src/core/user/hostactive \
|
||||
src/core/xuduser \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018-2021 XMOS LIMITED.
|
||||
// Copyright 2018-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#if (DSD_CHANS_DAC != 0)
|
||||
@@ -28,7 +28,7 @@ static inline void DoDsdNative(unsigned samplesOut[], unsigned &dsdSample_l, uns
|
||||
asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(dsdSample_r));
|
||||
}
|
||||
|
||||
/* This function performs the DOP loop and collects 16b of DSD per loop
|
||||
/* This function performs the DOP loop and collects 16b of DSD per loop
|
||||
and outputs a 32b word into the port buffer every other cycle. */
|
||||
static inline void DoDsdDop(int &everyOther, unsigned samplesOut[], unsigned &dsdSample_l, unsigned &dsdSample_r, unsigned divide)
|
||||
{
|
||||
@@ -38,7 +38,7 @@ static inline void DoDsdDop(int &everyOther, unsigned samplesOut[], unsigned &ds
|
||||
dsdSample_r = ((samplesOut[1] & 0xffff00) << 8);
|
||||
everyOther = 1;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
everyOther = 0;
|
||||
dsdSample_l = dsdSample_l | ((samplesOut[0] & 0xffff00) >> 8);
|
||||
@@ -77,7 +77,7 @@ static inline int DoDsdDopCheck(unsigned &dsdMode, int &dsdCount, unsigned curSa
|
||||
dsdMarker = DSD_MARKER_2;
|
||||
}
|
||||
}
|
||||
else if(dsdMode == DSD_MODE_DOP)
|
||||
else if(dsdMode == DSD_MODE_DOP)
|
||||
{
|
||||
/* If we are running in DOP mode, check if we need to come out */
|
||||
if((DSD_MASK(samplesOut[0]) != DSD_MARKER_1) && (DSD_MASK(samplesOut[1]) != DSD_MARKER_1))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018-2021 XMOS LIMITED.
|
||||
// Copyright 2018-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include "xua.h"
|
||||
|
||||
@@ -73,7 +73,7 @@ void InitPorts_master(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, bu
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
#else
|
||||
|
||||
void InitPorts_slave(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_DIR port:32 p_bclk, buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC], buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC])
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
/**
|
||||
* @file xua_audiohub.xc
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#if (XUA_NUM_PDM_MICS > 0)
|
||||
#include "xua_pdm_mic.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (AUD_TO_USB_RATIO > 1)
|
||||
#include "src.h"
|
||||
@@ -76,7 +76,7 @@ void InitPorts_slave
|
||||
#else
|
||||
void InitPorts_master
|
||||
#endif
|
||||
(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_DIR port:32 p_bclk, buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buffered _XUA_CLK_DIR port:32 p_bclk, buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]);
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3
|
||||
if(I2S_MODE_TDM)
|
||||
{
|
||||
/* Only check for the rising edge of frame sync being in the right place because falling edge timing not specified */
|
||||
if (frameCount == 1)
|
||||
if (frameCount == 1)
|
||||
{
|
||||
lrval &= 0xc0000000; // Mask off last two (MSB) frame clock bits which are the most recently sampled
|
||||
syncError += (lrval != 0x80000000); // We need MSB = 1 and MSB-1 = 0 to signify rising edge
|
||||
@@ -177,12 +177,12 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3
|
||||
}
|
||||
else
|
||||
{
|
||||
if(frameCount == 0)
|
||||
if(frameCount == 0)
|
||||
syncError += (lrval != 0x80000000);
|
||||
else
|
||||
syncError += (lrval != 0x7FFFFFFF);
|
||||
}
|
||||
|
||||
|
||||
return syncError;
|
||||
|
||||
#else
|
||||
@@ -200,7 +200,7 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3
|
||||
else
|
||||
p_lrclk <: 0x7fffffff;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
@@ -219,7 +219,7 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
|
||||
#if (XUA_NUM_PDM_MICS > 0)
|
||||
, chanend c_pdm_pcm
|
||||
#endif
|
||||
, buffered _XUA_CLK_DIR port:32 ?p_lrclk,
|
||||
, buffered _XUA_CLK_DIR port:32 ?p_lrclk,
|
||||
buffered _XUA_CLK_DIR port:32 ?p_bclk,
|
||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]
|
||||
@@ -322,14 +322,14 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
|
||||
InitPorts_master(divide, p_lrclk, p_bclk, p_i2s_dac, p_i2s_adc);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Note we always expect syncError to be 0 when we are master */
|
||||
while(!syncError)
|
||||
{
|
||||
#if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0)
|
||||
if(dsdMode == DSD_MODE_NATIVE)
|
||||
if(dsdMode == DSD_MODE_NATIVE)
|
||||
DoDsdNative(samplesOut, dsdSample_l, dsdSample_r, divide);
|
||||
else if(dsdMode == DSD_MODE_DOP)
|
||||
else if(dsdMode == DSD_MODE_DOP)
|
||||
DoDsdDop(everyOther, samplesOut, dsdSample_l, dsdSample_r, divide);
|
||||
else
|
||||
#endif
|
||||
@@ -471,7 +471,7 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out
|
||||
#endif
|
||||
}
|
||||
|
||||
frameCount++;
|
||||
frameCount++;
|
||||
|
||||
#if (I2S_CHANS_ADC != 0)
|
||||
index = 0;
|
||||
@@ -663,7 +663,7 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
|
||||
in port p_mclk_in,
|
||||
buffered _XUA_CLK_DIR port:32 ?p_lrclk,
|
||||
buffered _XUA_CLK_DIR port:32 ?p_bclk,
|
||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]
|
||||
#if (XUA_SPDIF_TX_EN) //&& (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
||||
, chanend c_spdif_out
|
||||
@@ -717,7 +717,7 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
|
||||
start_clock(clk_mst_spd);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Perform required CODEC/ADC/DAC initialisation */
|
||||
AudioHwInit();
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include "xua.h"
|
||||
|
||||
@@ -748,28 +748,31 @@ void XUA_Buffer_Decouple(chanend c_mix_out
|
||||
outct(c_mix_out, SET_SAMPLE_FREQ);
|
||||
outuint(c_mix_out, sampFreq);
|
||||
|
||||
inUnderflow = 1;
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_wrptr, aud_to_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4);
|
||||
|
||||
/* Set buffer to send back to zeros buffer */
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros);
|
||||
|
||||
/* Update size of zeros buffer (and sampsToWrite) */
|
||||
SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In);
|
||||
|
||||
/* Reset OUT buffer state */
|
||||
outUnderflow = 1;
|
||||
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(aud_data_remaining_to_device, 0);
|
||||
|
||||
if(outOverflow)
|
||||
if(sampFreq != AUDIO_STOP_FOR_DFU)
|
||||
{
|
||||
/* If we were previously in overflow we wont have marked as ready */
|
||||
XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start+4);
|
||||
outOverflow = 0;
|
||||
inUnderflow = 1;
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_wrptr, aud_to_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4);
|
||||
|
||||
/* Set buffer to send back to zeros buffer */
|
||||
SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros);
|
||||
|
||||
/* Update size of zeros buffer (and sampsToWrite) */
|
||||
SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In);
|
||||
|
||||
/* Reset OUT buffer state */
|
||||
outUnderflow = 1;
|
||||
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start);
|
||||
SET_SHARED_GLOBAL(aud_data_remaining_to_device, 0);
|
||||
|
||||
if(outOverflow)
|
||||
{
|
||||
/* If we were previously in overflow we wont have marked as ready */
|
||||
XUD_SetReady_OutPtr(aud_from_host_usb_ep, aud_from_host_fifo_start+4);
|
||||
outOverflow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wait for handshake back and pass back up */
|
||||
@@ -780,7 +783,8 @@ void XUA_Buffer_Decouple(chanend c_mix_out
|
||||
|
||||
ENABLE_INTERRUPTS();
|
||||
|
||||
speedRem = 0;
|
||||
if(sampFreq != AUDIO_STOP_FOR_DFU)
|
||||
speedRem = 0;
|
||||
continue;
|
||||
}
|
||||
#if (AUDIO_CLASS == 2)
|
||||
|
||||
@@ -72,13 +72,8 @@
|
||||
|
||||
//int ksp_enter, ksp_exit, r11_store;
|
||||
|
||||
#if defined(__XS2A__) || defined(__XS3A__)
|
||||
#define ISSUE_MODE_SINGLE ".issue_mode single\n"
|
||||
#define ISSUE_MODE_DUAL ".issue_mode dual\n"
|
||||
#else
|
||||
#define ISSUE_MODE_SINGLE
|
||||
#define ISSUE_MODE_DUAL
|
||||
#endif
|
||||
|
||||
#define do_interrupt_handler(f,args) \
|
||||
asm(ISSUE_MODE_SINGLE\
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include "xua.h"
|
||||
#if XUA_USB_EN
|
||||
@@ -21,8 +21,10 @@
|
||||
#include "testct_byref.h"
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#include "xua_hid_report.h"
|
||||
#include "user_hid.h"
|
||||
unsigned char g_hidData[HID_DATA_BYTES] = {0};
|
||||
#include "xua_hid.h"
|
||||
unsigned char g_hidData[HID_MAX_DATA_BYTES] = {0U};
|
||||
#endif
|
||||
|
||||
void GetADCCounts(unsigned samFreq, int &min, int &mid, int &max);
|
||||
@@ -89,9 +91,9 @@ unsigned int fb_clocks[4];
|
||||
#define FB_TOLERANCE 0x100
|
||||
|
||||
void XUA_Buffer(
|
||||
register chanend c_aud_out,
|
||||
register chanend c_aud_out,
|
||||
#if (NUM_USB_CHAN_IN > 0)
|
||||
register chanend c_aud_in,
|
||||
register chanend c_aud_in,
|
||||
#endif
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined (UAC_FORCE_FEEDBACK_EP)
|
||||
chanend c_aud_fb,
|
||||
@@ -194,9 +196,9 @@ unsafe{volatile unsigned * unsafe masterClockFreq_ptr;}
|
||||
* @param c_aud_fb chanend for feeback to xud
|
||||
* @return void
|
||||
*/
|
||||
void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#if (NUM_USB_CHAN_IN > 0)
|
||||
register chanend c_aud_in,
|
||||
register chanend c_aud_in,
|
||||
#endif
|
||||
#if (NUM_USB_CHAN_IN == 0) || defined (UAC_FORCE_FEEDBACK_EP)
|
||||
chanend c_aud_fb,
|
||||
@@ -371,7 +373,14 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
||||
|
||||
while (!hidIsReportDescriptorPrepared())
|
||||
;
|
||||
|
||||
UserHIDInit();
|
||||
unsigned hid_ready_flag = 0U;
|
||||
unsigned hid_ready_id = 0U;
|
||||
|
||||
#endif
|
||||
|
||||
#if (AUDIO_CLASS == 1)
|
||||
@@ -381,6 +390,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
timer tmr;
|
||||
|
||||
while(1)
|
||||
{
|
||||
XUD_Result_t result;
|
||||
@@ -437,9 +448,9 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
if(receivedSampleFreq != AUDIO_STOP_FOR_DFU)
|
||||
{
|
||||
sampleFreq = receivedSampleFreq;
|
||||
#ifdef FB_TOLERANCE_TEST
|
||||
#ifdef FB_TOLERANCE_TEST
|
||||
expected_fb = ((sampleFreq * 0x2000) / frameTime);
|
||||
#endif
|
||||
#endif
|
||||
/* Reset FB */
|
||||
/* Note, Endpoint 0 will hold off host for a sufficient period to allow our feedback
|
||||
* to stabilise (i.e. sofCount == 128 to fire) */
|
||||
@@ -555,7 +566,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
{
|
||||
unsigned usb_speed;
|
||||
GET_SHARED_GLOBAL(usb_speed, g_curUsbSpeed);
|
||||
|
||||
|
||||
#if FB_USE_REF_CLOCK
|
||||
unsigned long long feedbackMul = 64ULL;
|
||||
|
||||
@@ -631,7 +642,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
clockcounter = 0;
|
||||
}
|
||||
#else
|
||||
|
||||
|
||||
/* Assuming 48kHz from a 24.576 master clock (0.0407uS period)
|
||||
* MCLK ticks per SOF = 125uS / 0.0407 = 3072 MCLK ticks per SOF.
|
||||
* expected Feedback is 48000/8000 = 6 samples. so 0x60000 in 16:16 format.
|
||||
@@ -700,7 +711,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
#endif
|
||||
sofCount++;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
#if (NUM_USB_CHAN_IN > 0)
|
||||
/* Sent audio packet DEVICE -> HOST */
|
||||
@@ -708,8 +719,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
{
|
||||
/* Inform stream that buffer sent */
|
||||
SET_SHARED_GLOBAL0(g_aud_to_host_flag, bufferIn+1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if (NUM_USB_CHAN_OUT > 0)
|
||||
@@ -729,8 +740,8 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
{
|
||||
XUD_SetReady_In(ep_aud_fb, (fb_clocks, unsigned char[]), 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
/* Received Audio packet HOST -> DEVICE. Datalength written to length */
|
||||
case XUD_GetData_Select(c_aud_out, ep_aud_out, length, result):
|
||||
@@ -741,164 +752,165 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
|
||||
/* Sync with decouple thread */
|
||||
SET_SHARED_GLOBAL0(g_aud_from_host_flag, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MIDI
|
||||
case XUD_GetData_Select(c_midi_from_host, ep_midi_from_host, length, result):
|
||||
case XUD_GetData_Select(c_midi_from_host, ep_midi_from_host, length, result):
|
||||
|
||||
if((result == XUD_RES_OKAY) && (length > 0))
|
||||
{
|
||||
/* Get buffer data from host - MIDI OUT from host always into a single buffer */
|
||||
midi_data_remaining_to_device = length;
|
||||
|
||||
midi_from_host_rdptr = midi_from_host_buffer;
|
||||
|
||||
if (midi_data_remaining_to_device)
|
||||
if((result == XUD_RES_OKAY) && (length > 0))
|
||||
{
|
||||
read_via_xc_ptr(datum, midi_from_host_rdptr);
|
||||
outuint(c_midi, datum);
|
||||
midi_from_host_rdptr += 4;
|
||||
midi_data_remaining_to_device -= 4;
|
||||
/* Get buffer data from host - MIDI OUT from host always into a single buffer */
|
||||
midi_data_remaining_to_device = length;
|
||||
|
||||
midi_from_host_rdptr = midi_from_host_buffer;
|
||||
|
||||
if (midi_data_remaining_to_device)
|
||||
{
|
||||
read_via_xc_ptr(datum, midi_from_host_rdptr);
|
||||
outuint(c_midi, datum);
|
||||
midi_from_host_rdptr += 4;
|
||||
midi_data_remaining_to_device -= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
/* MIDI IN to host */
|
||||
case XUD_SetData_Select(c_midi_to_host, ep_midi_to_host, result):
|
||||
/* MIDI IN to host */
|
||||
case XUD_SetData_Select(c_midi_to_host, ep_midi_to_host, result):
|
||||
|
||||
/* The buffer has been sent to the host, so we can ack the midi thread */
|
||||
if (midi_data_collected_from_device != 0)
|
||||
{
|
||||
/* Swap the collecting and sending buffer */
|
||||
swap(midi_to_host_buffer_being_collected, midi_to_host_buffer_being_sent);
|
||||
/* The buffer has been sent to the host, so we can ack the midi thread */
|
||||
if (midi_data_collected_from_device != 0)
|
||||
{
|
||||
/* Swap the collecting and sending buffer */
|
||||
swap(midi_to_host_buffer_being_collected, midi_to_host_buffer_being_sent);
|
||||
|
||||
/* Request to send packet */
|
||||
XUD_SetReady_InPtr(ep_midi_to_host, midi_to_host_buffer_being_sent, midi_data_collected_from_device);
|
||||
/* Request to send packet */
|
||||
XUD_SetReady_InPtr(ep_midi_to_host, midi_to_host_buffer_being_sent, midi_data_collected_from_device);
|
||||
|
||||
/* Mark as waiting for host to poll us */
|
||||
midi_waiting_on_send_to_host = 1;
|
||||
/* Reset the collected data count */
|
||||
midi_data_collected_from_device = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
midi_waiting_on_send_to_host = 0;
|
||||
}
|
||||
break;
|
||||
/* Mark as waiting for host to poll us */
|
||||
midi_waiting_on_send_to_host = 1;
|
||||
/* Reset the collected data count */
|
||||
midi_data_collected_from_device = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
midi_waiting_on_send_to_host = 0;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef IAP
|
||||
/* IAP OUT from host. Datalength writen to tmp */
|
||||
case XUD_GetData_Select(c_iap_from_host, ep_iap_from_host, length, result):
|
||||
/* IAP OUT from host. Datalength writen to tmp */
|
||||
case XUD_GetData_Select(c_iap_from_host, ep_iap_from_host, length, result):
|
||||
|
||||
if((result == XUD_RES_OKAY) && (length > 0))
|
||||
{
|
||||
iap_data_remaining_to_device = length;
|
||||
|
||||
if(iap_data_remaining_to_device)
|
||||
if((result == XUD_RES_OKAY) && (length > 0))
|
||||
{
|
||||
// Send length first so iAP thread knows how much data to expect
|
||||
// Don't expect ack from this to make it simpler
|
||||
outuint(c_iap, iap_data_remaining_to_device);
|
||||
iap_data_remaining_to_device = length;
|
||||
|
||||
/* Send out first byte in buffer */
|
||||
datum_iap = iap_from_host_buffer[0];
|
||||
outuint(c_iap, datum_iap);
|
||||
if(iap_data_remaining_to_device)
|
||||
{
|
||||
// Send length first so iAP thread knows how much data to expect
|
||||
// Don't expect ack from this to make it simpler
|
||||
outuint(c_iap, iap_data_remaining_to_device);
|
||||
|
||||
/* Set read ptr to next byte in buffer */
|
||||
iap_from_host_rdptr = 1;
|
||||
iap_data_remaining_to_device -= 1;
|
||||
/* Send out first byte in buffer */
|
||||
datum_iap = iap_from_host_buffer[0];
|
||||
outuint(c_iap, datum_iap);
|
||||
|
||||
/* Set read ptr to next byte in buffer */
|
||||
iap_from_host_rdptr = 1;
|
||||
iap_data_remaining_to_device -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
/* IAP IN to host */
|
||||
case XUD_SetData_Select(c_iap_to_host, ep_iap_to_host, result):
|
||||
/* IAP IN to host */
|
||||
case XUD_SetData_Select(c_iap_to_host, ep_iap_to_host, result):
|
||||
|
||||
if(result == XUD_RES_RST)
|
||||
{
|
||||
XUD_ResetEndpoint(ep_iap_to_host, null);
|
||||
if(result == XUD_RES_RST)
|
||||
{
|
||||
XUD_ResetEndpoint(ep_iap_to_host, null);
|
||||
#ifdef IAP_INT_EP
|
||||
XUD_ResetEndpoint(ep_iap_to_host_int, null);
|
||||
XUD_ResetEndpoint(ep_iap_to_host_int, null);
|
||||
#endif
|
||||
iap_send_reset(c_iap);
|
||||
iap_draining_chan = 1; // Drain c_iap until a reset is sent back
|
||||
iap_data_collected_from_device = 0;
|
||||
iap_data_remaining_to_device = -1;
|
||||
iap_expected_data_length = 0;
|
||||
iap_from_host_rdptr = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send out an iAP packet to host, ACK last msg from iAP to let it know we can move on..*/
|
||||
iap_send_ack(c_iap);
|
||||
}
|
||||
break; /* IAP IN to host */
|
||||
iap_send_reset(c_iap);
|
||||
iap_draining_chan = 1; // Drain c_iap until a reset is sent back
|
||||
iap_data_collected_from_device = 0;
|
||||
iap_data_remaining_to_device = -1;
|
||||
iap_expected_data_length = 0;
|
||||
iap_from_host_rdptr = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send out an iAP packet to host, ACK last msg from iAP to let it know we can move on..*/
|
||||
iap_send_ack(c_iap);
|
||||
}
|
||||
break; /* IAP IN to host */
|
||||
|
||||
#ifdef IAP_INT_EP
|
||||
case XUD_SetData_Select(c_iap_to_host_int, ep_iap_to_host_int, result):
|
||||
case XUD_SetData_Select(c_iap_to_host_int, ep_iap_to_host_int, result):
|
||||
|
||||
/* Do nothing.. */
|
||||
/* Note, could get a reset notification here, but deal with it in the case above */
|
||||
break;
|
||||
/* Do nothing.. */
|
||||
/* Note, could get a reset notification here, but deal with it in the case above */
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef IAP_EA_NATIVE_TRANS
|
||||
/* iAP EA Native Transport OUT from host */
|
||||
case XUD_GetData_Select(c_iap_ea_native_out, ep_iap_ea_native_out, iap_ea_native_rx_length, result):
|
||||
if ((result == XUD_RES_OKAY) && iap_ea_native_rx_length > 0)
|
||||
{
|
||||
// Notify EA Protocol user code we have iOS app data from XUD
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_DATA);
|
||||
}
|
||||
break;
|
||||
/* iAP EA Native Transport OUT from host */
|
||||
case XUD_GetData_Select(c_iap_ea_native_out, ep_iap_ea_native_out, iap_ea_native_rx_length, result):
|
||||
if ((result == XUD_RES_OKAY) && iap_ea_native_rx_length > 0)
|
||||
{
|
||||
// Notify EA Protocol user code we have iOS app data from XUD
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_DATA);
|
||||
}
|
||||
break;
|
||||
|
||||
/* iAP EA Native Transport IN to host */
|
||||
case XUD_SetData_Select(c_iap_ea_native_in, ep_iap_ea_native_in, result):
|
||||
switch (result)
|
||||
{
|
||||
case XUD_RES_RST:
|
||||
XUD_ResetEndpoint(ep_iap_ea_native_in, null);
|
||||
// Notify user code of USB reset to allow any state to be cleared
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
|
||||
// Set up the control flag to send to EA Protocol user code when it responds
|
||||
iap_ea_native_control_flag = EA_NATIVE_RESET;
|
||||
iap_ea_native_control_to_send = 1;
|
||||
break;
|
||||
/* iAP EA Native Transport IN to host */
|
||||
case XUD_SetData_Select(c_iap_ea_native_in, ep_iap_ea_native_in, result):
|
||||
switch (result)
|
||||
{
|
||||
case XUD_RES_RST:
|
||||
XUD_ResetEndpoint(ep_iap_ea_native_in, null);
|
||||
// Notify user code of USB reset to allow any state to be cleared
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
|
||||
// Set up the control flag to send to EA Protocol user code when it responds
|
||||
iap_ea_native_control_flag = EA_NATIVE_RESET;
|
||||
iap_ea_native_control_to_send = 1;
|
||||
break;
|
||||
|
||||
case XUD_RES_OKAY: // EA Protocol user data successfully passed to XUD
|
||||
// Notify user code
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
|
||||
// Set up the control flag to send to EA Protocol user code when it responds
|
||||
iap_ea_native_control_flag = EA_NATIVE_DATA_SENT;
|
||||
iap_ea_native_control_to_send = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
//::
|
||||
case XUD_RES_OKAY: // EA Protocol user data successfully passed to XUD
|
||||
// Notify user code
|
||||
iAP2_EANativeTransport_writeToChan_start(c_iap_ea_native_data, EA_NATIVE_SEND_CONTROL);
|
||||
// Set up the control flag to send to EA Protocol user code when it responds
|
||||
iap_ea_native_control_flag = EA_NATIVE_DATA_SENT;
|
||||
iap_ea_native_control_to_send = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
//::
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
/* HID Report Data */
|
||||
/* HID Report Data */
|
||||
case XUD_SetData_Select(c_hid, ep_hid, result):
|
||||
{
|
||||
g_hidData[0]=0;
|
||||
UserHIDGetData(g_hidData);
|
||||
XUD_SetReady_In(ep_hid, g_hidData, 1);
|
||||
}
|
||||
break;
|
||||
hid_ready_flag = 0U;
|
||||
unsigned reportTime;
|
||||
tmr :> reportTime;
|
||||
hidCaptureReportTime(hid_ready_id, reportTime);
|
||||
hidCalcNextReportTime(hid_ready_id);
|
||||
hidClearChangePending(hid_ready_id);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef MIDI
|
||||
/* Received word from MIDI thread - Check for ACK or Data */
|
||||
/* Received word from MIDI thread - Check for ACK or Data */
|
||||
case midi_get_ack_or_data(c_midi, is_ack, datum):
|
||||
if (is_ack)
|
||||
{
|
||||
/* An ack from the midi/uart thread means it has accepted some data we sent it
|
||||
* we are okay to send another word */
|
||||
* we are okay to send another word */
|
||||
if (midi_data_remaining_to_device <= 0)
|
||||
{
|
||||
/* We have read an entire packet - Mark ready to receive another */
|
||||
@@ -963,7 +975,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
if (is_ack_iap)
|
||||
{
|
||||
/* An ack from the iap/uart thread means it has accepted some data we sent it
|
||||
* we are okay to send another word */
|
||||
* we are okay to send another word */
|
||||
if (iap_data_remaining_to_device == 0)
|
||||
{
|
||||
/* We have read an entire packet - Mark ready to receive another */
|
||||
@@ -996,7 +1008,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
}
|
||||
else
|
||||
{
|
||||
// Too many events from device - drop
|
||||
// Too many events from device - drop
|
||||
}
|
||||
|
||||
/* Once we have the whole message, sent it to host */
|
||||
@@ -1034,7 +1046,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
}
|
||||
break;
|
||||
|
||||
# if IAP_EA_NATIVE_TRANS
|
||||
# if IAP_EA_NATIVE_TRANS
|
||||
/* Change of EA Native Transport interface setting */
|
||||
case inuint_byref(c_iap_ea_native_ctrl, iap_ea_native_interface_alt_setting):
|
||||
/* Handshake */
|
||||
@@ -1092,14 +1104,33 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
||||
break;
|
||||
}
|
||||
break;
|
||||
//::
|
||||
#endif
|
||||
#endif // if IAP_EA_NATIVE_TRANS
|
||||
|
||||
#endif // ifdef IAP
|
||||
|
||||
default:
|
||||
#if ( 0 < HID_CONTROLS )
|
||||
if (!hid_ready_flag)
|
||||
{
|
||||
for (unsigned id = hidIsReportIdInUse(); id < hidGetReportIdLimit(); id++)
|
||||
{
|
||||
if ( hidIsChangePending(id) || !HidIsSetIdleSilenced(id) )
|
||||
{
|
||||
int hidDataLength = (int) UserHIDGetData(id, g_hidData);
|
||||
XUD_SetReady_In(ep_hid, g_hidData, hidDataLength);
|
||||
|
||||
hid_ready_id = id;
|
||||
hid_ready_flag = 1U;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
//::
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
#endif /* XUA_USB_EN */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include <xs1.h>
|
||||
@@ -665,7 +665,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, out port p, ch
|
||||
/* Inspect for if we need to produce an edge */
|
||||
if ((adatCounters.receivedSamples >= adatCounters.samplesPerTick))
|
||||
{
|
||||
/* Check edge is about right... S/PDIF may have changed freq... */
|
||||
/* Check edge is about right... ADAT may have changed freq... */
|
||||
if (timeafter(adatReceivedTime, (timeLastEdge + LOCAL_CLOCK_INCREMENT - LOCAL_CLOCK_MARGIN)))
|
||||
{
|
||||
/* Record edge time */
|
||||
|
||||
@@ -66,7 +66,7 @@ enum USBInterfaceNumber
|
||||
INTERFACE_COUNT /* End marker */
|
||||
};
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#ifndef ENDPOINT_INT_INTERVAL_IN_HID
|
||||
#define ENDPOINT_INT_INTERVAL_IN_HID 0x08
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
#include "vendorrequests.h"
|
||||
|
||||
int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn,
|
||||
unsigned short unitId, unsigned char direction, chanend c_audioControl,
|
||||
unsigned short unitId, unsigned char direction, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl),
|
||||
NULLABLE_RESOURCE(chanend, c_clk_ctL)) __attribute__ ((weak));
|
||||
|
||||
int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn,
|
||||
unsigned short unitId, unsigned char direction, chanend c_audioControl,
|
||||
unsigned short unitId, unsigned char direction, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl),
|
||||
NULLABLE_RESOURCE(chanend, c_clk_ctL))
|
||||
{
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#endif
|
||||
|
||||
int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn,
|
||||
unsigned short unitId, unsigned char direction, chanend c_audioControl,
|
||||
unsigned short unitId, unsigned char direction, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
NULLABLE_RESOURCE(chanend, c_mix_ctl),
|
||||
NULLABLE_RESOURCE(chanend, c_clk_ctL));
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
/**
|
||||
* @brief Implements endpoint zero for an USB Audio 1.0/2.0 device
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <xassert.h>
|
||||
#include "xua.h"
|
||||
|
||||
#if XUA_USB_EN
|
||||
@@ -23,18 +24,24 @@
|
||||
#include "vendorrequests.h"
|
||||
#include "xc_ptr.h"
|
||||
#include "xua_ep0_uacreqs.h"
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#include "hid.h"
|
||||
#include "xua_hid.h"
|
||||
#include "xua_hid_report.h"
|
||||
#endif
|
||||
|
||||
#if DSD_CHANS_DAC > 0
|
||||
#include "dsd_support.h"
|
||||
#endif
|
||||
|
||||
#define DEBUG_UNIT XUA_EP0
|
||||
|
||||
#ifndef DEBUG_PRINT_ENABLE_XUA_EP0
|
||||
#define DEBUG_PRINT_ENABLE_XUA_EP0 0
|
||||
#endif // DEBUG_PRINT_ENABLE_XUA_EP0
|
||||
#include "debug_print.h"
|
||||
|
||||
#include "debug_print.h"
|
||||
#include "xua_usb_params_funcs.h"
|
||||
|
||||
#ifndef __XC__
|
||||
@@ -51,7 +58,7 @@
|
||||
#if ((AUDIO_CLASS == 1) || (AUDIO_CLASS_FALLBACK)) && defined(DFU)
|
||||
#warning DFU will not be enabled in AUDIO 1.0 mode due to Windows requesting driver
|
||||
#endif
|
||||
#endif
|
||||
#endif // FORCE_UAC1_DFU
|
||||
|
||||
/* MIDI not supported in Audio 1.0 mode */
|
||||
#if ((AUDIO_CLASS == 1) || (AUDIO_CLASS_FALLBACK)) && defined(MIDI)
|
||||
@@ -85,9 +92,6 @@ extern void device_reboot(void);
|
||||
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#include "xua_hid.h"
|
||||
#endif
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||
#endif
|
||||
@@ -254,8 +258,8 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) {
|
||||
}
|
||||
|
||||
void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer) {
|
||||
debug_printf("concatenateAndCopyStrings() for \"%s\" and \"%s\"\n", string1, string2);
|
||||
|
||||
debug_printf("concatenateAndCopyStrings() for \"%s\" and \"%s\"\n", string1, string2);
|
||||
|
||||
memset(string_buffer, '\0', strlen(string_buffer));
|
||||
|
||||
uint32_t remaining_buffer_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1);
|
||||
@@ -309,7 +313,7 @@ void XUA_Endpoint0_setStrTable() {
|
||||
concatenateAndCopyStrings(g_product_str, "", g_strTable.usbInputTermStr_Audio2);
|
||||
concatenateAndCopyStrings(g_product_str, "", g_strTable.usbOutputTermStr_Audio2);
|
||||
#endif
|
||||
|
||||
|
||||
// update Serial strings
|
||||
concatenateAndCopyStrings(g_serial_str, "", g_strTable.serialStr);
|
||||
}
|
||||
@@ -391,7 +395,7 @@ void XUA_Endpoint0_setBcdDevice(unsigned short bcd) {
|
||||
#endif // AUDIO_CLASS == 1}
|
||||
}
|
||||
|
||||
void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl,
|
||||
void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_)
|
||||
{
|
||||
ep0_out = XUD_InitEp(c_ep0_out);
|
||||
@@ -478,6 +482,8 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont
|
||||
/* Check if device has started in DFU mode */
|
||||
if (DFUReportResetState(null))
|
||||
{
|
||||
assert((c_audioControl != NULL) && msg("DFU not supported when c_audioControl is null"));
|
||||
|
||||
/* Stop audio */
|
||||
outuint(c_audioControl, SET_SAMPLE_FREQ);
|
||||
outuint(c_audioControl, AUDIO_STOP_FOR_DFU);
|
||||
@@ -486,41 +492,65 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES //change USB descriptor frequencies and bit resolution values here
|
||||
#ifdef XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES //change USB descriptor frequencies and bit resolution values here
|
||||
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_device_to_usb_bit_res() >> 3; //sub frame rate = bit rate /8
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_device_to_usb_bit_res() & 0xff); //bit resolution
|
||||
const int num_of_usb_descriptor_freq = 3; //This should be =3 according to the comments "using a value of <=2 or > 7 for num_freqs_a1 causes enumeration issues on Windows" in xua_ep0_descriptors.h
|
||||
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_usb_to_device_bit_res() >> 3; //sub frame rate = bit rate /8
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_usb_to_device_bit_res() & 0xff); //bit resolution
|
||||
#if( 0 < NUM_USB_CHAN_IN )
|
||||
|
||||
const unsigned num_of_usb_descriptor_freq=3; //This should be =3 according to the comments "using a value of <=2 or > 7 for num_freqs_a1 causes enumeration issues on Windows" in xua_ep0_descriptors.h
|
||||
int i=0;
|
||||
for(i=0;i<num_of_usb_descriptor_freq;i++)
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_device_to_usb_bit_res() >> 3; //sub frame rate = bit rate /8
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_device_to_usb_bit_res() & 0xff); //bit resolution
|
||||
|
||||
for(int i=0;i<num_of_usb_descriptor_freq;i++)
|
||||
{
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = get_device_to_usb_rate() & 0xff;
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (get_device_to_usb_rate() & 0xff00)>> 8;
|
||||
cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (get_device_to_usb_rate() & 0xff0000)>> 16;
|
||||
}
|
||||
cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size
|
||||
cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size
|
||||
|
||||
for(i=0;i<num_of_usb_descriptor_freq;i++)
|
||||
#endif // NUM_USB_CHAN_IN
|
||||
|
||||
#if( 0 < NUM_USB_CHAN_OUT )
|
||||
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_usb_to_device_bit_res() >> 3; //sub frame rate = bit rate /8
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_usb_to_device_bit_res() & 0xff); //bit resolution
|
||||
|
||||
for(int i=0;i<num_of_usb_descriptor_freq;i++)
|
||||
{
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = get_usb_to_device_rate() & 0xff;
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (get_usb_to_device_rate() & 0xff00)>> 8;
|
||||
cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (get_usb_to_device_rate() & 0xff0000)>> 16;
|
||||
}
|
||||
|
||||
cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size
|
||||
cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size
|
||||
|
||||
cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size
|
||||
cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size
|
||||
cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size
|
||||
cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size
|
||||
#endif // NUM_USB_CHAN_OUT
|
||||
|
||||
#endif // XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
hidReportInit();
|
||||
hidPrepareReportDescriptor();
|
||||
|
||||
size_t hidReportDescriptorLength = hidGetReportDescriptorLength();
|
||||
unsigned char hidReportDescriptorLengthLo = hidReportDescriptorLength & 0xFF;
|
||||
unsigned char hidReportDescriptorLengthHi = (hidReportDescriptorLength & 0xFF00) >> 8;
|
||||
|
||||
#if( AUDIO_CLASS == 1 )
|
||||
cfgDesc_Audio1[USB_HID_DESCRIPTOR_OFFSET + HID_DESCRIPTOR_LENGTH_FIELD_OFFSET ] = hidReportDescriptorLengthLo;
|
||||
cfgDesc_Audio1[USB_HID_DESCRIPTOR_OFFSET + HID_DESCRIPTOR_LENGTH_FIELD_OFFSET + 1] = hidReportDescriptorLengthHi;
|
||||
#endif
|
||||
|
||||
hidDescriptor[HID_DESCRIPTOR_LENGTH_FIELD_OFFSET ] = hidReportDescriptorLengthLo;
|
||||
hidDescriptor[HID_DESCRIPTOR_LENGTH_FIELD_OFFSET + 1] = hidReportDescriptorLengthHi;
|
||||
#endif // 0 < HID_CONTROLS
|
||||
|
||||
}
|
||||
|
||||
void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl,
|
||||
void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_)
|
||||
{
|
||||
if (result == XUD_RES_OKAY)
|
||||
@@ -547,6 +577,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
|
||||
/* Only send change if we need to */
|
||||
if((sp.wValue > 0) && (g_curStreamAlt_Out != sp.wValue))
|
||||
{
|
||||
assert((c_audioControl != null) && msg("Format change not supported when c_audioControl is null"));
|
||||
g_curStreamAlt_Out = sp.wValue;
|
||||
|
||||
/* Send format of data onto buffering */
|
||||
@@ -582,6 +613,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
|
||||
/* Only send change if we need to */
|
||||
if((sp.wValue > 0) && (g_curStreamAlt_In != sp.wValue))
|
||||
{
|
||||
assert((c_audioControl != null) && msg("Format change not supported when c_audioControl is null"));
|
||||
g_curStreamAlt_In = sp.wValue;
|
||||
|
||||
/* Send format of data onto buffering */
|
||||
@@ -729,15 +761,22 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
|
||||
switch (descriptorType)
|
||||
{
|
||||
case HID_HID:
|
||||
/* Return HID Descriptor */
|
||||
result = XUD_DoGetRequest(ep0_out, ep0_in, hidDescriptor,
|
||||
sizeof(hidDescriptor), sp.wLength);
|
||||
{
|
||||
/* Return HID Descriptor */
|
||||
result = XUD_DoGetRequest(ep0_out, ep0_in, hidDescriptor,
|
||||
sizeof(hidDescriptor), sp.wLength);
|
||||
}
|
||||
break;
|
||||
case HID_REPORT:
|
||||
/* Return HID report descriptor */
|
||||
result = XUD_DoGetRequest(ep0_out, ep0_in, hidReportDescriptor,
|
||||
sizeof(hidReportDescriptor), sp.wLength);
|
||||
break;
|
||||
{
|
||||
/* Return HID report descriptor */
|
||||
unsigned char* hidReportDescriptorPtr;
|
||||
hidReportDescriptorPtr = hidGetReportDescriptor();
|
||||
size_t hidReportDescriptorLength = hidGetReportDescriptorLength();
|
||||
result = XUD_DoGetRequest(ep0_out, ep0_in, hidReportDescriptorPtr,
|
||||
hidReportDescriptorLength, sp.wLength);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -819,6 +858,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
|
||||
if ((DFU_IF == INTERFACE_NUMBER_DFU) && (sp.bRequest != XMOS_DFU_SAVESTATE) &&
|
||||
(sp.bRequest != XMOS_DFU_RESTORESTATE))
|
||||
{
|
||||
assert((c_audioControl != null) && msg("DFU not supported when c_audioControl is null"));
|
||||
// Stop audio
|
||||
outuint(c_audioControl, SET_SAMPLE_FREQ);
|
||||
outuint(c_audioControl, AUDIO_STOP_FOR_DFU);
|
||||
@@ -1061,7 +1101,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
|
||||
}
|
||||
|
||||
/* Endpoint 0 function. Handles all requests to the device */
|
||||
void XUA_Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl,
|
||||
void XUA_Endpoint0(chanend c_ep0_out, chanend c_ep0_in, NULLABLE_RESOURCE(chanend, c_audioControl),
|
||||
chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_)
|
||||
{
|
||||
USB_SetupPacket_t sp;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
/**
|
||||
* @file xua_ep0_descriptors.h
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "usbaudio20.h" /* Defines from the USB Audio 2.0 Specifications */
|
||||
#include "usbaudiocommon.h"
|
||||
#include "xud_device.h"
|
||||
#include "usbaudio20.h" /* Defines from USB Audio 2.0 spec */
|
||||
#include "xua_hid_descriptor.h"
|
||||
|
||||
#ifdef IAP_EA_NATIVE_TRANS
|
||||
#include "iap2.h" /* Defines iAP EA Native Transport protocol name */
|
||||
@@ -580,33 +580,6 @@ unsigned char devQualDesc_Null[] =
|
||||
#define MIXER_LENGTH (0)
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
unsigned char hidReportDescriptor[] = /* Voice Command usage as per request #HUTRR45 */
|
||||
{
|
||||
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
|
||||
|
||||
/* Max packet sizes:
|
||||
* Samples per channel. e.g (192000+7999/8000) = 24
|
||||
* Must allow 1 sample extra per chan (24 + 1) = 25
|
||||
@@ -808,7 +781,7 @@ typedef struct
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
USB_Descriptor_Interface_t HID_Interface;
|
||||
unsigned char hidDesc[9]; //TODO ideally we would have a struct for this.
|
||||
USB_HID_Descriptor_t HID_Descriptor;
|
||||
USB_Descriptor_Endpoint_t HID_In_Endpoint;
|
||||
#endif
|
||||
|
||||
@@ -1311,7 +1284,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.bSourceID = FU_USBIN, /* 7 bSourceID Connect to analog input feature unit*/
|
||||
#else
|
||||
|
||||
.bSourceID = ID_IT_USB,/* 7 bSourceID Connect to analog input term */
|
||||
.bSourceID = ID_IT_AUD,/* 7 bSourceID Connect to analog input term */
|
||||
#endif
|
||||
.bCSourceID = ID_CLKSEL,
|
||||
.bmControls = 0x0000,
|
||||
@@ -1939,7 +1912,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
.wLockDelay = 0x0008,
|
||||
},
|
||||
#endif /* (INPUT_FORMAT_COUNT > 2) */
|
||||
#endif /* #if(NUM_USB_CHAN_IN > 0) */
|
||||
#endif /* (NUM_USB_CHAN_IN > 0) */
|
||||
|
||||
#ifdef MIDI
|
||||
/* MIDI Descriptors */
|
||||
@@ -2204,60 +2177,24 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
|
||||
#endif /* IAP */
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
.HID_Interface =
|
||||
{
|
||||
9, /* 0 bLength : Size of descriptor in Bytes */
|
||||
4, /* 1 bDescriptorType (Interface: 0x04)*/
|
||||
INTERFACE_NUMBER_HID, /* 2 bInterfaceNumber : Number of interface */
|
||||
0, /* 3 bAlternateSetting : Value used alternate interfaces using SetInterface Request */
|
||||
1, /* 4: bNumEndpoints : Number of endpoitns for this interface (excluding 0) */
|
||||
3, /* 5: bInterfaceClass */
|
||||
0, /* 6: bInterfaceSubClass - no boot device */
|
||||
0, /* 7: bInterfaceProtocol*/
|
||||
0, /* 8 iInterface */
|
||||
},
|
||||
|
||||
{
|
||||
9, /* 0 bLength : Size of descriptor in Bytes */
|
||||
0x21, /* 1 bDescriptorType (HID) */
|
||||
0x10, /* 2 bcdHID */
|
||||
0x01, /* 3 bcdHID */
|
||||
0, /* 4 bCountryCode */
|
||||
1, /* 5 bNumDescriptors */
|
||||
0x22, /* 6 bDescriptorType[0] (Report) */
|
||||
sizeof(hidReportDescriptor) & 0xff,/* 7 wDescriptorLength[0] */
|
||||
sizeof(hidReportDescriptor) >> 8, /* 8 wDescriptorLength[0] */
|
||||
},
|
||||
|
||||
.HID_In_Endpoint =
|
||||
{
|
||||
/* Endpoint descriptor (IN) */
|
||||
0x7, /* 0 bLength */
|
||||
5, /* 1 bDescriptorType */
|
||||
ENDPOINT_ADDRESS_IN_HID, /* 2 bEndpointAddress */
|
||||
3, /* 3 bmAttributes (INTERRUPT) */
|
||||
64, /* 4 wMaxPacketSize */
|
||||
ENDPOINT_INT_INTERVAL_IN_HID, /* 6 bInterval */
|
||||
}
|
||||
#include "xua_hid_descriptors.h"
|
||||
#endif
|
||||
|
||||
};
|
||||
#endif /* (AUDIO_CLASS == 2) */
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#if (AUDIO_CLASS ==1 )
|
||||
unsigned char hidDescriptor[] =
|
||||
{
|
||||
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) */
|
||||
sizeof(hidReportDescriptor) & 0xff, /* 7 wDescriptorLength[0] */
|
||||
sizeof(hidReportDescriptor) >> 8, /* 8 wDescriptorLength[0] */
|
||||
#include "xua_hid_descriptor_contents.h"
|
||||
};
|
||||
#elif (AUDIO_CLASS == 2)
|
||||
unsigned char* hidDescriptor = (unsigned char*) &cfgDesc_Audio2.HID_Descriptor;
|
||||
#else
|
||||
#error "Unknown Audio Class"
|
||||
#endif
|
||||
#endif // 0 < HID_CONTROLS
|
||||
|
||||
|
||||
/* Configuration Descriptor for Null device */
|
||||
@@ -2362,6 +2299,12 @@ const unsigned num_freqs_a1 = MAX(3, (0
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
/*
|
||||
* The value of HID_INTERFACE_BYTES must match the length of the descriptors defined in
|
||||
* - xua_hid_descriptor_contents.h
|
||||
* - xua_hid_endpoint_descriptor_contents.h and
|
||||
* - xua_hid_interface_descriptor_contents.h
|
||||
*/
|
||||
#define HID_INTERFACE_BYTES ( 9 + 9 + 7 )
|
||||
#define HID_INTERFACES_A1 1
|
||||
#else
|
||||
@@ -2388,9 +2331,10 @@ const unsigned num_freqs_a1 = MAX(3, (0
|
||||
#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
|
||||
|
||||
#define INTERFACE_DESCRIPTOR_BYTES (9)
|
||||
|
||||
#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)
|
||||
@@ -2403,6 +2347,10 @@ const unsigned num_freqs_a1 = MAX(3, (0
|
||||
|
||||
#endif
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
#define USB_HID_DESCRIPTOR_OFFSET (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 + INTERFACE_DESCRIPTOR_BYTES)
|
||||
#endif
|
||||
|
||||
#define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16)
|
||||
|
||||
#if (MIN_FREQ_FS < 12000) && (MAX_FREQ_FS > 48000)
|
||||
@@ -2906,36 +2854,7 @@ unsigned char cfgDesc_Audio1[] =
|
||||
#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) */
|
||||
sizeof(hidReportDescriptor) & 0xff, /* 7 wDescriptorLength[0] */
|
||||
sizeof(hidReportDescriptor) >> 8, /* 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 */
|
||||
#include "xua_hid_descriptors.h"
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
/**
|
||||
* @brief Implements relevant requests from the USB Audio 2.0 Specification
|
||||
@@ -341,7 +341,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c
|
||||
|
||||
setG_curSamFreqMultiplier(g_curSamFreq/(newMasterClock/512));
|
||||
#endif
|
||||
#if ADAT_RX
|
||||
#if ADAT_RX
|
||||
/* Configure ADAT SMUX based on sample rate */
|
||||
outuint(c_clk_ctl, SET_SMUX);
|
||||
if(g_curSamFreq < 88200)
|
||||
@@ -1095,7 +1095,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp
|
||||
/* Check Control Selector */
|
||||
unsigned short controlSelector = sp.wValue>>8;
|
||||
|
||||
if((result != XUD_GetBuffer(ep0_out, (buffer, unsigned char[]), length)) != XUD_RES_OKAY)
|
||||
if((result = XUD_GetBuffer(ep0_out, (buffer, unsigned char[]), length)) != XUD_RES_OKAY)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
@@ -1280,9 +1280,12 @@ XUD_Result_t AudioClassRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket
|
||||
buffer[0] = (VOLUME_RES_MIXER & 0xff);
|
||||
buffer[1] = (VOLUME_RES_MIXER >> 8);
|
||||
return XUD_DoGetRequest(ep0_out, ep0_in, buffer, 2, sp.wLength);
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return XUD_RES_ERR;
|
||||
}
|
||||
#endif
|
||||
#endif /* NO_USB */
|
||||
#endif /* XUA_USB_EN */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2012-2021 XMOS LIMITED.
|
||||
// Copyright 2012-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include "xua.h" /* Device specific defines */
|
||||
@@ -134,7 +134,7 @@ on tile[AUDIO_IO_TILE] : buffered out port:32 p_bclk = PORT_I2S_BCLK;
|
||||
|
||||
on tile[AUDIO_IO_TILE] : in port p_mclk_in = PORT_MCLK_IN;
|
||||
|
||||
#if XUA_USB_EN
|
||||
#if XUA_USB_EN
|
||||
on tile[XUD_TILE] : in port p_for_mclk_count = PORT_MCLK_COUNT;
|
||||
#endif
|
||||
|
||||
@@ -187,23 +187,15 @@ on tile[XUD_TILE] : clock clk_spd_rx = CLKBLK_SPDIF_RX;
|
||||
#endif
|
||||
|
||||
#if (XUA_NUM_PDM_MICS > 0)
|
||||
in port p_pdm_clk = PORT_PDM_CLK;
|
||||
in port p_pdm_clk = PORT_PDM_CLK;
|
||||
|
||||
in buffered port:32 p_pdm_mics = PORT_PDM_DATA;
|
||||
in buffered port:32 p_pdm_mics = PORT_PDM_DATA;
|
||||
#if (PDM_TILE != AUDIO_IO_TILE)
|
||||
/* If Mics and I2S are not the same tile we need a separate MCLK port */
|
||||
in port p_pdm_mclk = PORT_PDM_MCLK;
|
||||
in port p_pdm_mclk = PORT_PDM_MCLK;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if(XUD_SERIES_SUPPORT == XUD_L_SERIES) && (ADAT_RX)
|
||||
/* Cannot use default clock (CLKBLK_REF) for ADAT RX since it is tied to the
|
||||
60MHz USB clock on G/L series parts. */
|
||||
on tile[XUD_TILE] : clock clk_adat_rx = CLKBLK_ADAT_RX;
|
||||
#endif
|
||||
|
||||
on tile[AUDIO_IO_TILE] : clock clk_audio_mclk = CLKBLK_MCLK; /* Master clock */
|
||||
|
||||
#if(AUDIO_IO_TILE != XUD_TILE) && XUA_USB_EN
|
||||
@@ -212,17 +204,7 @@ on tile[XUD_TILE] : clock clk_audio_mclk_usb = CLKBLK_MCLK;
|
||||
on tile[XUD_TILE] : in port p_mclk_in_usb = PORT_MCLK_IN_USB;
|
||||
#endif
|
||||
|
||||
on tile[AUDIO_IO_TILE] : clock clk_audio_bclk = CLKBLK_I2S_BIT; /* Bit clock */
|
||||
|
||||
|
||||
/* L/G Series needs a port to use for USB reset */
|
||||
#if (XUD_SERIES_SUPPORT != XUD_U_SERIES) && defined(PORT_USB_RESET)
|
||||
/* This define is checked since it could be on a shift reg or similar */
|
||||
on tile[XUD_TILE] : out port p_usb_rst = PORT_USB_RESET;
|
||||
#else
|
||||
/* Reset port not required for U series due to built in Phy */
|
||||
#define p_usb_rst null
|
||||
#endif
|
||||
on tile[AUDIO_IO_TILE] : clock clk_audio_bclk = CLKBLK_I2S_BIT; /* Bit clock */
|
||||
|
||||
#ifdef IAP
|
||||
/* I2C ports - in a struct for use with module_i2c_shared & module_i2c_simple/module_i2c_single_port */
|
||||
@@ -346,8 +328,7 @@ VENDOR_REQUESTS_PARAMS_DEC_
|
||||
|
||||
/* USB Interface Core */
|
||||
XUD_Main(c_xud_out, ENDPOINT_COUNT_OUT, c_xud_in, ENDPOINT_COUNT_IN,
|
||||
c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst,
|
||||
null, 0, usbSpeed, XUD_PWR_CFG);
|
||||
c_sof, epTypeTableOut, epTypeTableIn, usbSpeed, XUD_PWR_CFG);
|
||||
}
|
||||
|
||||
/* USB Packet buffering Core */
|
||||
@@ -445,7 +426,7 @@ void SpdifTxWrapper(chanend c_spdif_tx)
|
||||
}
|
||||
#endif
|
||||
|
||||
void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc,
|
||||
void usb_audio_io(chanend ?c_aud_in,
|
||||
#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
||||
chanend c_spdif_tx,
|
||||
#endif
|
||||
@@ -573,11 +554,6 @@ int main()
|
||||
chan c_ea_data;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef SU1_ADC_ENABLE
|
||||
chan c_adc;
|
||||
#else
|
||||
#define c_adc null
|
||||
#endif
|
||||
|
||||
#ifdef MIXER
|
||||
chan c_mix_ctl;
|
||||
@@ -659,9 +635,9 @@ int main()
|
||||
#endif /* XUA_USB_EN */
|
||||
}
|
||||
|
||||
on tile[AUDIO_IO_TILE]:
|
||||
on tile[AUDIO_IO_TILE]:
|
||||
{
|
||||
usb_audio_io(c_mix_out, c_adc
|
||||
usb_audio_io(c_mix_out
|
||||
#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
||||
, c_spdif_tx
|
||||
#endif
|
||||
@@ -727,11 +703,6 @@ int main()
|
||||
{
|
||||
set_thread_fast_mode_on();
|
||||
|
||||
#if(XUD_SERIES_SUPPORT == XUD_L_SERIES)
|
||||
/* Can't use REF clock on L-series as this is usb clock */
|
||||
set_port_clock(p_adat_rx, clk_adat_rx);
|
||||
start_clock(clk_adat_rx);
|
||||
#endif
|
||||
while (1)
|
||||
{
|
||||
adatReceiver48000(p_adat_rx, c_adat_rx);
|
||||
@@ -750,11 +721,11 @@ int main()
|
||||
#endif
|
||||
|
||||
#ifndef PDM_RECORD
|
||||
#if (XUA_NUM_PDM_MICS > 0)
|
||||
#if (XUA_NUM_PDM_MICS > 0)
|
||||
#if (PDM_TILE != AUDIO_IO_TILE)
|
||||
/* PDM Mics running on a separate to AudioHub */
|
||||
on stdcore[PDM_TILE]:
|
||||
{
|
||||
{
|
||||
xua_pdm_mic_config(p_pdm_mclk, p_pdm_clk, p_pdm_mics, clk_pdm);
|
||||
xua_pdm_mic(c_ds_output, p_pdm_mics);
|
||||
}
|
||||
@@ -767,11 +738,6 @@ int main()
|
||||
#endif /*MIC_PROCESSING_USE_INTERFACE*/
|
||||
#endif /*XUA_NUM_PDM_MICS > 0*/
|
||||
#endif /*PDM_RECORD*/
|
||||
|
||||
|
||||
#ifdef SU1_ADC_ENABLE
|
||||
xs1_su_adc_service(c_adc);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
// Copyright 2018-2021 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
//#include "devicedefines.h"
|
||||
|
||||
#define MAX_MIX_COUNT 8
|
||||
#define MIX_INPUTS 18
|
||||
|
||||
|
||||
#if defined(__XS2A__) || defined(__XS3A__)
|
||||
|
||||
#define DOMIX_TOP(i) \
|
||||
.cc_top doMix##i.function,doMix##i; \
|
||||
.align 4 ;\
|
||||
@@ -50,52 +46,6 @@ doMix##i##: ;\
|
||||
.size doMix##i, .-doMix##i; \
|
||||
.cc_bottom doMix##i##.function;
|
||||
|
||||
#else
|
||||
|
||||
|
||||
#define DOMIX_TOP(i) \
|
||||
.cc_top doMix##i.function,doMix##i; \
|
||||
.align 4 ;\
|
||||
.globl doMix##i ;\
|
||||
.type doMix##i, @function ;\
|
||||
.globl doMix##i##.nstackwords ;\
|
||||
.globl doMix##i##.maxthreads ; \
|
||||
.globl doMix##i##.maxtimers ; \
|
||||
.globl doMix##i##.maxchanends ; \
|
||||
.globl doMix##i##.maxsync ;\
|
||||
.linkset doMix##i##.locnoside, 1; \
|
||||
.linkset doMix##i##.locnochandec, 1;\
|
||||
.linkset doMix##i##.nstackwords, 0 ;\
|
||||
.linkset doMix##i##.maxchanends, 0 ;\
|
||||
.linkset doMix##i##.maxtimers, 0 ;\
|
||||
.linkset doMix##i##.maxthreads, 1; \
|
||||
doMix##i##: ;\
|
||||
set cp, r0; \
|
||||
set dp, r1; \
|
||||
lsub r0, r1, r0, r0, r0;\
|
||||
.label_##i##:
|
||||
|
||||
#define DOMIX_BOT(i) \
|
||||
ldap r11, _dp; \
|
||||
set dp, r11;\
|
||||
ldap r11, _cp;\
|
||||
set cp, r11;\
|
||||
\
|
||||
mov r0, r1;\
|
||||
ldc r2, 0x19;\
|
||||
sext r0, r2;\
|
||||
eq r0, r0, r1;\
|
||||
bf r0, .L20; \
|
||||
\
|
||||
shl r0, r1, 0x7;\
|
||||
retsp 0x0;\
|
||||
\
|
||||
\
|
||||
.size doMix##i, .-doMix##i; \
|
||||
.cc_bottom doMix##i##.function;
|
||||
|
||||
#endif
|
||||
|
||||
#define N MIX_INPUTS
|
||||
#define BODY(i) \
|
||||
ldw r2,cp[i]; \
|
||||
@@ -115,8 +65,6 @@ doMix##i##: ;\
|
||||
retsp 0x0; \
|
||||
|
||||
|
||||
|
||||
|
||||
#if(MAX_MIX_COUNT > 0)
|
||||
DOMIX_TOP(0)
|
||||
#include "repeat.h"
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
|
||||
#include <xs1.h>
|
||||
#include <print.h>
|
||||
#include "xua.h"
|
||||
@@ -15,7 +13,6 @@
|
||||
/* FAST_MIXER has a bit of a nasty implentation but is more effcient */
|
||||
#define FAST_MIXER 1
|
||||
|
||||
|
||||
//#ifdef OUT_VOLUME_IN_MIXER
|
||||
static unsigned int multOut_array[NUM_USB_CHAN_OUT + 1];
|
||||
static xc_ptr multOut;
|
||||
@@ -252,51 +249,53 @@ static inline void GetSamplesFromHost(chanend c)
|
||||
#pragma unsafe arrays
|
||||
static inline void GiveSamplesToDevice(chanend c, xc_ptr ptr, xc_ptr multOut)
|
||||
{
|
||||
{
|
||||
#if(NUM_USB_CHAN_OUT == 0)
|
||||
outuint(c, 0);
|
||||
#else
|
||||
#pragma loop unroll
|
||||
for (int i=0; i<NUM_USB_CHAN_OUT; i++)
|
||||
{
|
||||
int sample, x;
|
||||
for (int i=0; i<NUM_USB_CHAN_OUT; i++)
|
||||
{
|
||||
int sample, x;
|
||||
#if defined(OUT_VOLUME_IN_MIXER) && defined(OUT_VOLUME_AFTER_MIX)
|
||||
int mult;
|
||||
int h;
|
||||
unsigned l;
|
||||
int mult;
|
||||
int h;
|
||||
unsigned l;
|
||||
#endif
|
||||
int index;
|
||||
int index;
|
||||
|
||||
#if MAX_MIX_COUNT > 0
|
||||
/* If mixer turned on sort out the channel mapping */
|
||||
/* If mixer turned on sort out the channel mapping */
|
||||
|
||||
/* Read pointer to sample from the map */
|
||||
read_via_xc_ptr_indexed(index, ptr, i);
|
||||
/* Read pointer to sample from the map */
|
||||
read_via_xc_ptr_indexed(index, ptr, i);
|
||||
|
||||
/* Read the actual sample value */
|
||||
read_via_xc_ptr_indexed(sample, samples, index);
|
||||
/* Read the actual sample value */
|
||||
read_via_xc_ptr_indexed(sample, samples, index);
|
||||
#else
|
||||
unsafe
|
||||
{
|
||||
/* Read the actual sample value */
|
||||
sample = ptr_samples[i];
|
||||
}
|
||||
unsafe
|
||||
{
|
||||
/* Read the actual sample value */
|
||||
sample = ptr_samples[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(OUT_VOLUME_IN_MIXER) && defined(OUT_VOLUME_AFTER_MIX)
|
||||
/* Do volume control processing */
|
||||
/* Do volume control processing */
|
||||
#warning OUT Vols in mixer, AFTER mix & map
|
||||
read_via_xc_ptr_indexed(mult, multOut, i);
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
h<<=3; // Shift used to be done in audio thread but now done here incase of 32bit support
|
||||
read_via_xc_ptr_indexed(mult, multOut, i);
|
||||
{h, l} = macs(mult, sample, 0, 0);
|
||||
h<<=3; // Shift used to be done in audio thread but now done here incase of 32bit support
|
||||
#error
|
||||
#if (STREAM_FORMAT_OUTPUT_RESOLUTION_32BIT_USED == 1)
|
||||
h |= (l >>29)& 0x7; // Note: This step is not required if we assume sample depth is 24bit (rather than 32bit)
|
||||
// Note: We need all 32bits for Native DSD
|
||||
h |= (l >>29)& 0x7; // Note: This step is not required if we assume sample depth is 24bit (rather than 32bit)
|
||||
// Note: We need all 32bits for Native DSD
|
||||
#endif
|
||||
outuint(c, h);
|
||||
outuint(c, h);
|
||||
#else
|
||||
outuint(c, sample);
|
||||
outuint(c, sample);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma unsafe arrays
|
||||
@@ -367,7 +366,7 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
|
||||
/* Forward on Request for data to decouple thread */
|
||||
outuint(c_host, request);
|
||||
|
||||
#if (MAX_MIX_COUNT > 0)
|
||||
#if (MAX_MIX_COUNT > 0)
|
||||
/* Sync */
|
||||
outuint(c_mixer2, 0);
|
||||
#endif
|
||||
@@ -544,8 +543,8 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
|
||||
/* Sync with mixer 2 (once it has swapped samples with audiohub) */
|
||||
outuint(c_mixer2, 0);
|
||||
inuint(c_mixer2);
|
||||
|
||||
/* Do the mixing */
|
||||
|
||||
/* Do the mixing */
|
||||
#ifdef FAST_MIXER
|
||||
mixed = doMix0(samples, mix_mult_slice(0));
|
||||
#else
|
||||
@@ -603,9 +602,6 @@ static void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
|
||||
}
|
||||
#else /* IF MAX_MIX_COUNT > 0 */
|
||||
/* No mixes, this thread runs on its own doing just volume */
|
||||
#if(NUM_USB_CHAN_OUT == 0)
|
||||
outuint(c_mixer2, 0);
|
||||
#endif
|
||||
GiveSamplesToDevice(c_mixer2, samples_to_device_map, multOut);
|
||||
GetSamplesFromDevice(c_mixer2);
|
||||
GetSamplesFromHost(c_host);
|
||||
@@ -677,8 +673,8 @@ static void mixer2(chanend c_mixer1, chanend c_audio)
|
||||
{
|
||||
GiveSamplesToDevice(c_audio, samples_to_device_map, multOut);
|
||||
GetSamplesFromDevice(c_audio);
|
||||
|
||||
/* Sync with mixer 1 (once it has swapped samples with the buffering sub-system) */
|
||||
|
||||
/* Sync with mixer 1 (once it has swapped samples with the buffering sub-system) */
|
||||
inuint(c_mixer1);
|
||||
outuint(c_mixer1, 0);
|
||||
|
||||
@@ -697,7 +693,7 @@ static void mixer2(chanend c_mixer1, chanend c_audio)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if (MAX_FREQ > 96000)
|
||||
/* Fewer mixes when running higher than 96kHz */
|
||||
if (!mixer2_mix2_flag)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2015-2021 XMOS LIMITED.
|
||||
// Copyright 2015-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include "xua.h"
|
||||
@@ -22,7 +22,7 @@
|
||||
#define MAX_DECIMATION_FACTOR (96000/(MIN_FREQ/AUD_TO_MICS_RATIO))
|
||||
|
||||
/* Build time sized microphone delay line */
|
||||
#ifndef MIC_BUFFER_DEPTH
|
||||
#ifndef MIC_BUFFER_DEPTH
|
||||
#define MIC_BUFFER_DEPTH 1
|
||||
#endif
|
||||
|
||||
@@ -229,7 +229,7 @@ void xua_pdm_mic_config(in port p_pdm_mclk, in port p_pdm_clk, buffered in port:
|
||||
unsigned micDiv = MCLK_48/3072000;
|
||||
|
||||
configure_clock_src_divide(clk_pdm, p_pdm_mclk, micDiv/2);
|
||||
|
||||
|
||||
configure_port_clock_output(p_pdm_clk, clk_pdm);
|
||||
configure_in_port(p_pdm_mics, clk_pdm);
|
||||
start_clock(clk_pdm);
|
||||
@@ -243,7 +243,7 @@ void xua_pdm_mic(streaming chanend c_ds_output[2], buffered in port:32 p_pdm_mic
|
||||
#else
|
||||
#define c_4x_pdm_mic_1 null
|
||||
#endif
|
||||
|
||||
|
||||
par
|
||||
{
|
||||
mic_array_pdm_rx(p_pdm_mics, c_4x_pdm_mic_0, c_4x_pdm_mic_1);
|
||||
|
||||
@@ -62,37 +62,12 @@ unsigned int divide, unsigned curSamFreq)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__XS2A__) || defined(__XS3A__)
|
||||
unsafe
|
||||
{
|
||||
/* Clock bitclock clock block from master clock pin (divided) */
|
||||
configure_clock_src_divide(clk_audio_bclk, (port) p_mclk_in, (divide/2));
|
||||
configure_port_clock_output(p_bclk, clk_audio_bclk);
|
||||
}
|
||||
#else
|
||||
#error XS1 no longer supported in audio core
|
||||
/* For a divide of one (i.e. bitclock == master-clock) BClk is set to clock_output mode.
|
||||
* In this mode it outputs an edge clock on every tick of itsassociated clock_block.
|
||||
*
|
||||
* For all other divides, BClk is clocked by the master clock and data
|
||||
* will be output to p_bclk to generate the bit clock.
|
||||
*/
|
||||
if (divide == 1) /* e.g. 176.4KHz from 11.2896 */
|
||||
{
|
||||
configure_port_clock_output(p_bclk, clk_audio_mclk);
|
||||
|
||||
/* Generate bit clock block straight from mclk */
|
||||
configure_clock_src(clk_audio_bclk, p_mclk_in);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* bit clock port from master clock clock-clock block */
|
||||
configure_out_port_no_ready(p_bclk, clk_audio_mclk, 0);
|
||||
|
||||
/* Generate bit clock block from pin */
|
||||
configure_clock_src(clk_audio_bclk, p_bclk);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(!isnull(p_lrclk))
|
||||
{
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2013-2021 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#ifndef ARCH_U_POWER_SAVING_
|
||||
#define ARCH_U_POWER_SAVING_
|
||||
|
||||
/* Sets the voltage down by VOLTAGE_REDUCTION_mV (voltage is set to 10 * X + 600 mV),
|
||||
* and adjusts other features to save power
|
||||
*/
|
||||
void archU_powerSaving();
|
||||
|
||||
#endif /*ARCH_U_POWER_SAVING_*/
|
||||
@@ -1,70 +0,0 @@
|
||||
// Copyright 2013-2021 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#if (XUD_SERIES_SUPPORT==1)
|
||||
#include "archU_powerSaving.h"
|
||||
#include <xs1.h>
|
||||
#include <xs1_l_registers.h>
|
||||
#include <xs1_su_registers.h>
|
||||
#include <platform.h>
|
||||
|
||||
#if (XCC_MAJOR_VERSION >= 1300)
|
||||
#include <hwtimer.h>
|
||||
#else
|
||||
#define hwtimer_t timer
|
||||
#endif
|
||||
|
||||
#ifndef VOLTAGE_REDUCTION_mV
|
||||
#define VOLTAGE_REDUCTION_mV 20
|
||||
#endif
|
||||
|
||||
unsigned get_tile_id(tileref t); // Required for use with 12.0 tools. get_tile_id() available in xs1.h with 13.0 tools.
|
||||
|
||||
#define ARCH_U_VOLTAGE_FIRST_STEP 39 // First step down from 1V
|
||||
#define ARCH_U_SSWITCH_PRESCALER 8 // Sswitch down to 1/8 clk freq
|
||||
|
||||
void archU_powerSaving()
|
||||
{
|
||||
if (get_local_tile_id() == get_tile_id(tile[0]))
|
||||
{
|
||||
unsigned writeval[1];
|
||||
unsigned char writevalc[1];
|
||||
|
||||
// Reduce the VDDCORE voltage level
|
||||
for (unsigned count=0; count < (VOLTAGE_REDUCTION_mV/10); count++)
|
||||
{
|
||||
hwtimer_t t;
|
||||
int time;
|
||||
|
||||
writeval[0] = (ARCH_U_VOLTAGE_FIRST_STEP - count);
|
||||
write_periph_32(usb_tile, XS1_SU_PER_PWR_CHANEND_NUM, XS1_SU_PER_PWR_VOUT1_LVL_NUM, 1, writeval);
|
||||
|
||||
t :> time;
|
||||
time += (1 * PLATFORM_REFERENCE_MHZ); // Wait 1us per step
|
||||
t when timerafter(time) :> void;
|
||||
}
|
||||
|
||||
// Set switch prescaler down
|
||||
write_node_config_reg(tile[0], XS1_SSWITCH_CLK_DIVIDER_NUM, (ARCH_U_SSWITCH_PRESCALER - 1)); // PLL clk will be divided by value + 1
|
||||
|
||||
// Both DC-DCs in PWM mode, I/O and PLL supply on, Analogue & core on
|
||||
writeval[0] = XS1_SU_PWR_VOUT1_EN_SET(0, 1);
|
||||
writeval[0] = XS1_SU_PWR_VOUT2_EN_SET(writeval[0], 1);
|
||||
writeval[0] = XS1_SU_PWR_VOUT5_EN_SET(writeval[0], 1);
|
||||
writeval[0] = XS1_SU_PWR_VOUT6_EN_SET(writeval[0], 1);
|
||||
write_periph_32(usb_tile, XS1_SU_PER_PWR_CHANEND_NUM, XS1_SU_PER_PWR_STATE_AWAKE_NUM, 1, writeval);
|
||||
|
||||
// USB suspend off, voltage adjustable, sleep clock 32KHz
|
||||
writeval[0] = XS1_SU_PWR_USB_PD_EN_SET(0, 1);
|
||||
writeval[0] = XS1_SU_PWR_RST_VOUT_LVL_SET(writeval[0], 1);
|
||||
writeval[0] = XS1_SU_PWR_LD_AWAKE_SET(writeval[0], 1);
|
||||
write_periph_32(usb_tile, XS1_SU_PER_PWR_CHANEND_NUM, XS1_SU_PER_PWR_MISC_CTRL_NUM, 1, writeval);
|
||||
|
||||
// Turn off on-chip silicon oscillator (20MHz or 32KHz)
|
||||
writevalc[0] = XS1_SU_ON_SI_OSC_EN_SET(0, 1);
|
||||
writevalc[0] = XS1_SU_ON_SI_OSC_SLOW_SET(writevalc[0], 1);
|
||||
write_periph_8(usb_tile, XS1_SU_PER_OSC_CHANEND_NUM, XS1_SU_PER_OSC_ON_SI_CTRL_NUM, 1, writevalc);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,22 +1,13 @@
|
||||
// Copyright 2011-2021 XMOS LIMITED.
|
||||
// Copyright 2011-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include <xs1.h>
|
||||
#include <platform.h>
|
||||
#include <print.h>
|
||||
#include <xs1_su.h>
|
||||
|
||||
#define XS1_SU_PERIPH_USB_ID 0x1
|
||||
|
||||
//Normally we would enumerate the XUD_SERIES_SUPPORT possibilities using defines in
|
||||
//xud.h but we have hard coded them to remove dependancy of sc_xud
|
||||
|
||||
#if (XUD_SERIES_SUPPORT == 4)
|
||||
#include "xs2_su_registers.h"
|
||||
#define XS2_SU_PERIPH_USB_ID 0x1
|
||||
#define PLL_MASK 0x3FFFFFFF
|
||||
#else
|
||||
#define PLL_MASK 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
/* Note, this function is prototyped in xs1.h only from 13 tools onwards */
|
||||
unsigned get_tile_id(tileref);
|
||||
@@ -31,29 +22,19 @@ static void reset_tile(unsigned const tileId)
|
||||
read_sswitch_reg(tileId, 6, pllVal);
|
||||
pllVal &= PLL_MASK;
|
||||
write_sswitch_reg_no_ack(tileId, 6, pllVal);
|
||||
}
|
||||
}
|
||||
|
||||
/* Reboots XMOS device by writing to the PLL config register
|
||||
* Note - resetting is per *node* not tile
|
||||
*/
|
||||
void device_reboot(void)
|
||||
{
|
||||
#if (XUD_SERIES_SUPPORT == 1)
|
||||
/* Disconnect from bus */
|
||||
unsigned data[] = {4};
|
||||
write_periph_32(usb_tile, XS1_SU_PERIPH_USB_ID, XS1_SU_PER_UIFM_FUNC_CONTROL_NUM, 1, data);
|
||||
|
||||
/* Ideally we would reset SU1 here but then we loose power to the xcore and therefore the DFU flag */
|
||||
/* Disable USB and issue reset to xcore only - not analogue chip */
|
||||
write_node_config_reg(usb_tile, XS1_SU_CFG_RST_MISC_NUM,0b10);
|
||||
#else
|
||||
|
||||
unsigned int localTileId = get_local_tile_id();
|
||||
unsigned int tileId;
|
||||
unsigned int tileArrayLength;
|
||||
unsigned int localTileNum;
|
||||
|
||||
#if (XUD_SERIES_SUPPORT == 4)
|
||||
#if defined(__XS2A__)
|
||||
/* Disconnect from bus */
|
||||
unsigned data[] = {4};
|
||||
write_periph_32(usb_tile, XS2_SU_PERIPH_USB_ID, XS1_GLX_PER_UIFM_FUNC_CONTROL_NUM, 1, data);
|
||||
@@ -61,12 +42,12 @@ void device_reboot(void)
|
||||
|
||||
tileArrayLength = sizeof(tile)/sizeof(tileref);
|
||||
|
||||
/* Note - we could be in trouble if this doesn't return 0/1 since
|
||||
/* Note - we could be in trouble if this doesn't return 0/1 since
|
||||
* this code doesn't properly handle any network topology other than a
|
||||
* simple line
|
||||
* simple line
|
||||
*/
|
||||
/* Find tile index of the local tile ID */
|
||||
for(int tileNum = 0; tileNum<tileArrayLength; tileNum++)
|
||||
for(int tileNum = 0; tileNum<tileArrayLength; tileNum++)
|
||||
{
|
||||
if (get_tile_id(tile[tileNum]) == localTileId)
|
||||
{
|
||||
@@ -75,24 +56,14 @@ void device_reboot(void)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__XS2A__) || defined(__XS3A__)
|
||||
/* Reset all even tiles, starting from the remote ones */
|
||||
for(int tileNum = tileArrayLength-2; tileNum>=0; tileNum-=2)
|
||||
#else
|
||||
/* Reset all tiles, starting from the remote ones */
|
||||
for(int tileNum = tileArrayLength-1; tileNum>=0; tileNum--)
|
||||
#endif
|
||||
{
|
||||
/* Cannot cast tileref to unsigned! */
|
||||
tileId = get_tile_id(tile[tileNum]);
|
||||
|
||||
/* Do not reboot local tile (or tiles residing on the same node) yet */
|
||||
#if defined(__XS2A__) || defined(__XS3A__)
|
||||
if((localTileNum | 1) != (tileNum | 1))
|
||||
|
||||
#else
|
||||
if(localTileNum != tileNum)
|
||||
#endif
|
||||
{
|
||||
reset_tile(tileId);
|
||||
}
|
||||
@@ -100,7 +71,6 @@ void device_reboot(void)
|
||||
|
||||
/* Finally reboot the node this tile resides on */
|
||||
reset_tile(localTileId);
|
||||
#endif
|
||||
|
||||
while (1);
|
||||
}
|
||||
|
||||
@@ -4,46 +4,14 @@
|
||||
#ifndef _UAC_HWRESOURCES_H_
|
||||
#define _UAC_HWRESOURCES_H_
|
||||
|
||||
#if XUA_USB_EN
|
||||
#include "xud.h" /* XMOS USB Device Layer defines and functions */
|
||||
#endif
|
||||
|
||||
#if ((XUD_SERIES_SUPPORT != XUD_U_SERIES) && (XUD_SERIES_SUPPORT != XUD_X200_SERIES))
|
||||
|
||||
/* XUD_L_SERIES and XUD_G_SERIES */
|
||||
|
||||
#if (AUDIO_IO_TILE == XUD_TILE)
|
||||
/* Note: L series ref clocked clocked from USB clock when USB enabled - use another clockblock for MIDI
|
||||
* if MIDI and XUD on same tile. See XUD documentation.
|
||||
*
|
||||
* This is a clash with S/PDIF Tx but simultaneous S/PDIF and MIDI not currently supported on single tile device
|
||||
*
|
||||
*/
|
||||
#define CLKBLK_MIDI XS1_CLKBLK_1;
|
||||
#else
|
||||
#define CLKBLK_MIDI XS1_CLKBLK_REF;
|
||||
#endif
|
||||
|
||||
#define CLKBLK_SPDIF_TX XS1_CLKBLK_1
|
||||
#define CLKBLK_SPDIF_RX XS1_CLKBLK_1
|
||||
#define CLKBLK_MCLK XS1_CLKBLK_2 /* Note, potentially used twice */
|
||||
#define CLKBLK_ADAT_RX XS1_CLKBLK_3
|
||||
#define CLKBLK_USB_RST XS1_CLKBLK_4 /* Clock block passed into L/G series XUD */
|
||||
#define CLKBLK_FLASHLIB XS1_CLKBLK_5 /* Clock block for use by flash lib */
|
||||
|
||||
#define CLKBLK_I2S_BIT XS1_CLKBLK_3
|
||||
|
||||
#else
|
||||
|
||||
/* XUD_U_SERIES, XUD_X200_SERIES */
|
||||
/* Note, U-series XUD uses clock blocks 4 and 5 - see XUD_Ports.xc */
|
||||
#define CLKBLK_MIDI XS1_CLKBLK_REF;
|
||||
#define CLKBLK_SPDIF_TX XS1_CLKBLK_1
|
||||
#define CLKBLK_SPDIF_RX XS1_CLKBLK_1
|
||||
#define CLKBLK_MCLK XS1_CLKBLK_2 /* Note, potentially used twice */
|
||||
#define CLKBLK_MCLK XS1_CLKBLK_2
|
||||
#define CLKBLK_FLASHLIB XS1_CLKBLK_3 /* Clock block for use by flash lib */
|
||||
#define CLKBLK_ADAT_RX XS1_CLKBLK_REF /* Use REF for ADAT_RX on U/x200 series */
|
||||
#define CLKBLK_I2S_BIT XS1_CLKBLK_3
|
||||
#endif
|
||||
|
||||
#endif /* _UAC_HWRESOURCES_H_ */
|
||||
|
||||
@@ -1,66 +1,60 @@
|
||||
// Copyright 2013-2021 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
/**
|
||||
* @brief Human Interface Device (HID) API
|
||||
*
|
||||
* This file defines the Application Programming Interface (API) used to record HID
|
||||
* events and retrieve a HID Report for sending to a host.
|
||||
* The using application has the responsibility to fulfill this API.
|
||||
* Document section numbers refer to the HID Device Class Definition, version 1.11.
|
||||
*/
|
||||
|
||||
#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;
|
||||
#include <stddef.h>
|
||||
|
||||
#define HID_DATA_BYTES 4
|
||||
/**
|
||||
* \brief HID event
|
||||
*
|
||||
* This struct identifies:
|
||||
* - the HID Report that reports an event, i.e., the ID,
|
||||
* - the location within the HID Report for the event, i.e., the byte and bit, and
|
||||
* - the value to report for that location (typically interpreted as a Boolean).
|
||||
* It assumes only single bit flags within the HID Report.
|
||||
*/
|
||||
typedef struct hidEvent_t {
|
||||
unsigned bit;
|
||||
unsigned byte;
|
||||
unsigned id;
|
||||
unsigned value;
|
||||
} hidEvent_t;
|
||||
|
||||
#define HID_MAX_DATA_BYTES ( 4 )
|
||||
#define HID_EVENT_INVALID_ID ( 0x100 )
|
||||
|
||||
#if( 0 < HID_CONTROLS )
|
||||
|
||||
/**
|
||||
* \brief Get the data for the next HID report
|
||||
* \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
|
||||
* \param[in] id The HID Report ID (see 5.6, 6.2.2.7, 8.1 and 8.2)
|
||||
* Set to zero if the application provides only one HID Report
|
||||
* which does not include a Report ID
|
||||
* \param[out] hidData The HID data
|
||||
* If using Report IDs, this function places the Report ID in
|
||||
* the first element; otherwise the first element holds the
|
||||
* first byte of HID event data.
|
||||
*
|
||||
* \returns The length of the HID Report in the \a hidData argument
|
||||
* \retval Zero means no new HID event data has been recorded for the given \a id
|
||||
*/
|
||||
void UserHIDGetData( unsigned char hidData[ HID_DATA_BYTES ]);
|
||||
size_t UserHIDGetData( const unsigned id, unsigned char hidData[ HID_MAX_DATA_BYTES ]);
|
||||
|
||||
/**
|
||||
* \brief Initialize HID processing
|
||||
@@ -70,17 +64,18 @@ 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
|
||||
* \param[in] hidEvent A list of events which have occurred.
|
||||
* Each element specifies a HID Report ID, a bit and byte
|
||||
* within the HID Report and the value for it.
|
||||
* Set the Report ID to zero if not using Report IDs
|
||||
* (see 5.6, 6.2.2.7, 8.1 and 8.2).
|
||||
* \param[in] hidEventCnt The length of the \a hidEvent 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.
|
||||
* \returns The index of the first unrecorded event in \a hidEvent
|
||||
* \retval Zero indicates no events were recorded
|
||||
* \retval \a hidEventCnt indicates all events were recorded
|
||||
*/
|
||||
void UserHIDRecordEvent( const hidEventId_t hidEventId, const int * hidEventData, const unsigned hidEventDataSize );
|
||||
size_t UserHIDRecordEvent( const hidEvent_t hidEvent[], const size_t hidEventCnt );
|
||||
|
||||
#endif /* ( 0 < HID_CONTROLS ) */
|
||||
#endif /* __USER_HID_H__ */
|
||||
|
||||
@@ -5,19 +5,18 @@
|
||||
#include <xs1.h>
|
||||
#include <platform.h>
|
||||
|
||||
#ifndef NO_USB
|
||||
#if XUA_USB_EN
|
||||
#include "xud_device.h"
|
||||
#include "dfu_types.h"
|
||||
#include "flash_interface.h"
|
||||
#include "dfu_interface.h"
|
||||
|
||||
#if (XUD_SERIES_SUPPORT==4)
|
||||
/* xCORE-200 */
|
||||
#if defined(__XS2A__)
|
||||
/* Note range 0x7FFC8 - 0x7FFFF guarenteed to be untouched by tools */
|
||||
#define FLAG_ADDRESS 0x7ffcc
|
||||
#else
|
||||
/* Note range 0x1FFC8 - 0x1FFFF guarenteed to be untouched by tools */
|
||||
#define FLAG_ADDRESS 0x1ffcc
|
||||
/* Note range 0xFFFC8 - 0xFFFFF guarenteed to be untouched by tools */
|
||||
#define FLAG_ADDRESS 0xfffcc
|
||||
#endif
|
||||
|
||||
/* Store Flag to fixed address */
|
||||
@@ -581,6 +580,6 @@ int DFUDeviceRequests(XUD_ep ep0_out, XUD_ep &?ep0_in, USB_SetupPacket_t &sp, ch
|
||||
}
|
||||
return returnVal;
|
||||
}
|
||||
#endif /* NO_USB */
|
||||
#endif /* XUA_USB_EN */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -90,9 +90,9 @@ int flash_cmd_enable_ports()
|
||||
|
||||
#ifdef DFU_FLASH_DEVICE
|
||||
#ifdef QUAD_SPI_FLASH
|
||||
result = fl_connectToDevice(&p_qflash, flash_devices, 1);
|
||||
result = fl_connectToDevice(&p_qflash, flash_devices, sizeof(flash_devices) / sizeof(fl_QuadDeviceSpec));
|
||||
#else
|
||||
result = fl_connectToDevice(&p_flash, flash_devices, 1);
|
||||
result = fl_connectToDevice(&p_flash, flash_devices, sizeof(flash_devices) / sizeof(fl_DeviceSpec));
|
||||
#endif
|
||||
#else
|
||||
/* Use default flash list */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2019-2021 XMOS LIMITED.
|
||||
// Copyright 2019-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include <stdint.h>
|
||||
#include <xs1.h>
|
||||
@@ -7,38 +7,19 @@
|
||||
#include "xud.h"
|
||||
#include "xud_std_requests.h"
|
||||
#include "xua_hid.h"
|
||||
#include "xua_hid_report.h"
|
||||
|
||||
#define DEBUG_UNIT HID_XC
|
||||
#define DEBUG_PRINT_ENABLE_HID_XC 0
|
||||
#include "debug_print.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,
|
||||
@@ -58,47 +39,28 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
return result;
|
||||
}
|
||||
|
||||
void HidClearChangePending( void )
|
||||
unsigned HidIsSetIdleSilenced( const unsigned id )
|
||||
{
|
||||
unsafe {
|
||||
*s_hidChangePendingPtr = 0U;
|
||||
}
|
||||
}
|
||||
unsigned isSilenced = hidIsIdleActive( id );
|
||||
|
||||
unsigned HidIsChangePending( void )
|
||||
{
|
||||
return( s_hidChangePending != 0 );
|
||||
}
|
||||
if( !isSilenced ) {
|
||||
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 = ( 0U == hidGetReportPeriod( id ) || ( timeafter( hidGetNextReportTime( id ), currentTime )));
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
return isSilenced;
|
||||
}
|
||||
|
||||
/**
|
||||
* \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
|
||||
* Interface Devices (HID) Version 1.11, 'currently executing period' and 'current period' have
|
||||
* been interpreted 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.
|
||||
*
|
||||
@@ -112,7 +74,7 @@ void HidSetChangePending( void )
|
||||
*/
|
||||
static unsigned HidCalcNewReportTime( const unsigned currentPeriod, const unsigned reportTime, const unsigned reportToSetIdleInterval, const unsigned newPeriod )
|
||||
{
|
||||
unsigned nextReportTime = 0;
|
||||
unsigned nextReportTime = 0U;
|
||||
|
||||
if( HidFindSetIdleActivationPoint( currentPeriod, reportToSetIdleInterval )) {
|
||||
/* Activate immediately after sending the next HID Report */
|
||||
@@ -171,6 +133,29 @@ static unsigned HidFindSetIdleActivationPoint( const unsigned currentPeriod, con
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configure a hid report's next report time and idle status based on a setidle request
|
||||
*
|
||||
* \param[in] reportId -- The report ID to modify
|
||||
* \param[in] reportDuration -- The duration of the setidle request
|
||||
*
|
||||
*/
|
||||
static void HidUpdateReportPeriod( unsigned reportId, unsigned reportDuration ) {
|
||||
unsigned currentPeriod = hidGetReportPeriod( reportId );
|
||||
|
||||
hidSetIdle( reportId, ( 0U == reportDuration ) || ( ENDPOINT_INT_INTERVAL_IN_HID < reportDuration ));
|
||||
|
||||
if( hidIsIdleActive( reportId )) {
|
||||
unsigned reportTime = hidGetReportTime( reportId );
|
||||
unsigned reportToSetIdleInterval = HidCalcReportToSetIdleInterval( reportTime );
|
||||
unsigned nextReportTime = HidCalcNewReportTime( currentPeriod, reportTime, reportToSetIdleInterval, reportDuration * MS_IN_TICKS );
|
||||
hidSetNextReportTime( reportId, nextReportTime );
|
||||
currentPeriod = reportDuration * MS_IN_TICKS;
|
||||
}
|
||||
|
||||
hidSetReportPeriod( reportId, currentPeriod );
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Process a Set Idle request
|
||||
*
|
||||
@@ -208,20 +193,24 @@ static XUD_Result_t HidProcessSetIdleRequest( XUD_ep c_ep0_out, XUD_ep c_ep0_in,
|
||||
|
||||
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( INTERFACE_NUMBER_HID == interfaceNum ) {
|
||||
if( hidIsReportIdValid( reportId ) ) {
|
||||
HidUpdateReportPeriod( reportId, 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 );
|
||||
}
|
||||
else if ( reportId == 0U ) {
|
||||
// Wildcard request - set all report IDs to idle
|
||||
unsigned startReportId = hidGetNextValidReportId(reportId);
|
||||
|
||||
result = XUD_DoSetRequestStatus( c_ep0_in );
|
||||
reportId = startReportId;
|
||||
do {
|
||||
HidUpdateReportPeriod( reportId, duration );
|
||||
reportId = hidGetNextValidReportId( reportId );
|
||||
} while( reportId != startReportId);
|
||||
|
||||
result = XUD_DoSetRequestStatus( c_ep0_in );
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
858
lib_xua/src/hid/hid_report.c
Normal file
858
lib_xua/src/hid/hid_report.c
Normal file
@@ -0,0 +1,858 @@
|
||||
// Copyright 2021-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
#include "xua_conf_full.h"
|
||||
#if( 0 < HID_CONTROLS )
|
||||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <xs1.h>
|
||||
|
||||
#include "descriptor_defs.h"
|
||||
#include "xua_hid_report.h"
|
||||
#include "hid_report_descriptor.h"
|
||||
#include "swlock.h"
|
||||
|
||||
|
||||
#define HID_REPORT_ITEM_LOCATION_SIZE ( 1 )
|
||||
#define HID_REPORT_DESCRIPTOR_ITEM_COUNT ( sizeof hidReportDescriptorItems / sizeof ( USB_HID_Short_Item_t* ))
|
||||
#define HID_REPORT_DESCRIPTOR_MAX_LENGTH ( HID_REPORT_DESCRIPTOR_ITEM_COUNT * \
|
||||
( sizeof ( USB_HID_Short_Item_t ) - HID_REPORT_ITEM_LOCATION_SIZE ))
|
||||
|
||||
swlock_t hidStaticVarLock = SWLOCK_INITIAL_VALUE;
|
||||
|
||||
/*
|
||||
* Each element in s_hidChangePending corresponds to an element in hidReports.
|
||||
*/
|
||||
|
||||
static unsigned s_hidChangePending[ HID_REPORT_COUNT ];
|
||||
static unsigned char s_hidReportDescriptor[ HID_REPORT_DESCRIPTOR_MAX_LENGTH ];
|
||||
static size_t s_hidReportDescriptorLength;
|
||||
static unsigned s_hidReportDescriptorPrepared;
|
||||
|
||||
static unsigned s_hidCurrentPeriod[ HID_REPORT_COUNT ];
|
||||
static unsigned s_hidIdleActive[ HID_REPORT_COUNT ];
|
||||
static unsigned s_hidNextReportTime[ HID_REPORT_COUNT ];
|
||||
static unsigned s_hidReportTime[ HID_REPORT_COUNT ];
|
||||
|
||||
/**
|
||||
* @brief Get the bit position from the location of a report element
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||
*
|
||||
* @return The bit position of the report element
|
||||
*/
|
||||
static unsigned hidGetElementBitLocation( const unsigned short location );
|
||||
|
||||
/**
|
||||
* @brief Get the byte position from the location of a report element
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||
*
|
||||
* @return The byte position of the report element within the HID report
|
||||
*/
|
||||
static unsigned hidGetElementByteLocation( const unsigned short location );
|
||||
|
||||
/**
|
||||
* @brief Get the report identifier from the location of a report element
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||
*
|
||||
* @return The report id of the report element within the HID report
|
||||
*/
|
||||
static unsigned hidGetElementReportId( const unsigned short location );
|
||||
|
||||
/**
|
||||
* @brief Get the report length from the location of a report element
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||
*
|
||||
* @return The length of the HID report
|
||||
*/
|
||||
static size_t hidGetElementReportLength( const unsigned short location );
|
||||
|
||||
/**
|
||||
* @brief Get the number of data bytes from the header of an Item
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] header The \c header field from a \c USB_HID_Short_Item
|
||||
*
|
||||
* @return The amount of data for the Item
|
||||
*/
|
||||
static unsigned hidGetItemSize( const unsigned char header );
|
||||
|
||||
/**
|
||||
* @brief Get the Tag from the header of an Item
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] header The \c header field from a \c USB_HID_Short_Item
|
||||
*
|
||||
* @return The Tag of the Item
|
||||
*/
|
||||
static unsigned hidGetItemTag( const unsigned char header );
|
||||
|
||||
/**
|
||||
* @brief Get the Type from the header of an Item
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] header The \c header field from a \c USB_HID_Short_Item
|
||||
*
|
||||
* @return The Type of the Item
|
||||
*/
|
||||
static unsigned hidGetItemType( const unsigned char header );
|
||||
|
||||
/**
|
||||
* @brief Get the Usage Page number for a given byte in the HID Report
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] id The HID Report ID for the Usage Page.
|
||||
* A value of zero means the application does not use Report IDs.
|
||||
*
|
||||
* @return The USB HID Usage Page code or zero if the \a id parameter is out-of-range
|
||||
*/
|
||||
static unsigned hidGetUsagePage( const unsigned id );
|
||||
|
||||
/**
|
||||
* @brief Translate an Item from the \c USB_HID_Short_Item format to raw bytes
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] inPtr A pointer to a \c USB_HID_Short_Item
|
||||
* @param[in,out] outPtrPtr A pointer to a pointer to the next available space in the raw
|
||||
* byte buffer. Passed as a pointer to a pointer to allow this
|
||||
* function to return the updated pointer to the raw byte buffer.
|
||||
*
|
||||
* @return The number of bytes placed in the raw byte buffer
|
||||
*/
|
||||
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr );
|
||||
|
||||
unsigned hidIsReportIdInUse ( void ) {
|
||||
return !hidIsReportIdValid(0U);
|
||||
}
|
||||
|
||||
void hidCalcNextReportTime( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidNextReportTime[ idx ] = s_hidReportTime[ idx ] + s_hidCurrentPeriod[ idx ];
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidCaptureReportTime( const unsigned id, const unsigned time )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidReportTime[ idx ] = time;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidClearChangePending( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if(( id == 0U ) || ( id == hidGetElementReportId( hidReports[ idx ]->location ))) {
|
||||
s_hidChangePending[ idx ] = 0U;
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
static unsigned hidGetElementBitLocation( const unsigned short location )
|
||||
{
|
||||
unsigned bBit = ( location & HID_REPORT_ELEMENT_LOC_BIT_MASK ) >> HID_REPORT_ELEMENT_LOC_BIT_SHIFT;
|
||||
return bBit;
|
||||
}
|
||||
|
||||
static unsigned hidGetElementByteLocation( const unsigned short location )
|
||||
{
|
||||
unsigned bByte = ( location & HID_REPORT_ELEMENT_LOC_BYTE_MASK ) >> HID_REPORT_ELEMENT_LOC_BYTE_SHIFT;
|
||||
return bByte;
|
||||
}
|
||||
|
||||
static unsigned hidGetElementReportId( const unsigned short location )
|
||||
{
|
||||
unsigned bReportId = ( location & HID_REPORT_ELEMENT_LOC_ID_MASK ) >> HID_REPORT_ELEMENT_LOC_ID_SHIFT;
|
||||
return bReportId;
|
||||
}
|
||||
|
||||
static size_t hidGetElementReportLength( const unsigned short location )
|
||||
{
|
||||
size_t bReportLen = (size_t)( location & HID_REPORT_ELEMENT_LOC_LEN_MASK ) >> HID_REPORT_ELEMENT_LOC_LEN_SHIFT;
|
||||
return bReportLen;
|
||||
}
|
||||
|
||||
static unsigned hidGetItemSize( const unsigned char header )
|
||||
{
|
||||
unsigned bSize = ( header & HID_REPORT_ITEM_HDR_SIZE_MASK ) >> HID_REPORT_ITEM_HDR_SIZE_SHIFT;
|
||||
return bSize;
|
||||
}
|
||||
|
||||
static unsigned hidGetItemTag( const unsigned char header )
|
||||
{
|
||||
unsigned bTag = ( header & HID_REPORT_ITEM_HDR_TAG_MASK ) >> HID_REPORT_ITEM_HDR_TAG_SHIFT;
|
||||
return bTag;
|
||||
}
|
||||
|
||||
static unsigned hidGetItemType( const unsigned char header )
|
||||
{
|
||||
unsigned bType = ( header & HID_REPORT_ITEM_HDR_TYPE_MASK ) >> HID_REPORT_ITEM_HDR_TYPE_SHIFT;
|
||||
return bType;
|
||||
}
|
||||
|
||||
unsigned hidGetNextReportTime( const unsigned id ) {
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
unsigned retVal = 0U;
|
||||
|
||||
for ( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = s_hidNextReportTime[ idx ];
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned char* hidGetReportDescriptor( void )
|
||||
{
|
||||
unsigned char* retVal = NULL;
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
|
||||
if( s_hidReportDescriptorPrepared ) {
|
||||
retVal = s_hidReportDescriptor;
|
||||
}
|
||||
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
size_t hidGetReportDescriptorLength( void )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
size_t retVal = ( s_hidReportDescriptorPrepared ) ? s_hidReportDescriptorLength : 0U;
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidGetReportIdLimit ( void ) {
|
||||
unsigned retVal = 0U;
|
||||
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
|
||||
if( reportId >= retVal ) {
|
||||
retVal = reportId + 1;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidGetNextValidReportId ( unsigned idPrev ) {
|
||||
size_t retIndex = 0;
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
|
||||
if( reportId == idPrev ) {
|
||||
retIndex = (idx + 1) % HID_REPORT_COUNT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned retVal = hidGetElementReportId( hidReports[ retIndex ]->location );
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
#define HID_CONFIGURABLE_ELEMENT_COUNT ( sizeof hidConfigurableElements / sizeof ( USB_HID_Report_Element_t* ))
|
||||
unsigned hidGetReportItem(
|
||||
const unsigned id,
|
||||
const unsigned byte,
|
||||
const unsigned bit,
|
||||
unsigned char* const page,
|
||||
unsigned char* const header,
|
||||
unsigned char data[]
|
||||
)
|
||||
{
|
||||
unsigned retVal = HID_STATUS_BAD_ID;
|
||||
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
|
||||
swlock_release(&hidStaticVarLock);
|
||||
|
||||
unsigned bBit = hidGetElementBitLocation( element.location );
|
||||
unsigned bByte = hidGetElementByteLocation( element.location );
|
||||
unsigned bId = hidGetElementReportId( element.location );
|
||||
|
||||
if( id == bId ) {
|
||||
retVal = HID_STATUS_BAD_LOCATION;
|
||||
|
||||
if(( bit == bBit ) && ( byte == bByte )) {
|
||||
*page = hidGetUsagePage( id );
|
||||
*header = element.item.header;
|
||||
|
||||
for( size_t dataIdx = 0U; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++data, ++dataIdx ) {
|
||||
*data = element.item.data[ dataIdx ];
|
||||
}
|
||||
|
||||
retVal = HID_STATUS_GOOD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
size_t hidGetReportLength( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
size_t retVal = 0U;
|
||||
if( s_hidReportDescriptorPrepared ) {
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = hidGetElementReportLength( hidReports[ idx ]->location );
|
||||
}
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidGetReportPeriod( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
unsigned retVal = 0U;
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = s_hidCurrentPeriod[ idx ];
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidGetReportTime( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
unsigned retVal = 0U;
|
||||
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = s_hidReportTime[ idx ];
|
||||
}
|
||||
}
|
||||
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static unsigned hidGetUsagePage( const unsigned id )
|
||||
{
|
||||
unsigned retVal = 0U;
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = hidReports[ idx ]->item.data[ 0 ];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidIsChangePending( const unsigned id )
|
||||
{
|
||||
unsigned retVal = 0U;
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = ( s_hidChangePending[ idx ] != 0U );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidIsIdleActive( const unsigned id )
|
||||
{
|
||||
unsigned retVal = 0U;
|
||||
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
retVal = ( s_hidIdleActive[ idx ] != 0U );
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidIsReportDescriptorPrepared( void )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
unsigned retVal = s_hidReportDescriptorPrepared;
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
unsigned hidIsReportIdValid ( unsigned id ) {
|
||||
size_t retVal = 0;
|
||||
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
|
||||
if( reportId == id ) {
|
||||
retVal = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
swlock_release(&hidStaticVarLock);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
void hidPrepareReportDescriptor( void )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
if( !s_hidReportDescriptorPrepared ) {
|
||||
s_hidReportDescriptorLength = 0U;
|
||||
unsigned char* ptr = s_hidReportDescriptor;
|
||||
|
||||
for( size_t idx = 0U; idx < HID_REPORT_DESCRIPTOR_ITEM_COUNT; ++idx ) {
|
||||
s_hidReportDescriptorLength += hidTranslateItem( hidReportDescriptorItems[ idx ], &ptr );
|
||||
}
|
||||
|
||||
s_hidReportDescriptorPrepared = 1U;
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidReportInit( void )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( unsigned idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
s_hidCurrentPeriod[ idx ] = ENDPOINT_INT_INTERVAL_IN_HID * MS_IN_TICKS * HID_REPORT_COUNT;
|
||||
}
|
||||
memset( s_hidIdleActive, 0, sizeof( s_hidIdleActive ) );
|
||||
memset( s_hidChangePending, 0, sizeof( s_hidChangePending ) );
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidResetReportDescriptor( void )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
s_hidReportDescriptorPrepared = 0U;
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidSetChangePending( const unsigned id )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidChangePending[ idx ] = 1U;
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidSetIdle( const unsigned id, const unsigned state )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidIdleActive[ idx ] = ( state != 0U );
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
void hidSetNextReportTime( const unsigned id, const unsigned time )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidNextReportTime[ idx ] = time;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
unsigned hidSetReportItem(
|
||||
const unsigned id,
|
||||
const unsigned byte,
|
||||
const unsigned bit,
|
||||
const unsigned char page,
|
||||
const unsigned char header,
|
||||
const unsigned char data[]
|
||||
)
|
||||
{
|
||||
unsigned retVal = HID_STATUS_IN_USE;
|
||||
|
||||
if( !s_hidReportDescriptorPrepared ) {
|
||||
retVal = HID_STATUS_BAD_ID;
|
||||
unsigned bSize = hidGetItemSize( header );
|
||||
unsigned bTag = hidGetItemTag ( header );
|
||||
unsigned bType = hidGetItemType( header );
|
||||
|
||||
if(( HID_REPORT_ITEM_MAX_SIZE < bSize ) ||
|
||||
( HID_REPORT_ITEM_USAGE_TAG != bTag ) ||
|
||||
( HID_REPORT_ITEM_USAGE_TYPE != bType )) {
|
||||
retVal = HID_STATUS_BAD_HEADER;
|
||||
} else {
|
||||
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
|
||||
swlock_release(&hidStaticVarLock);
|
||||
|
||||
unsigned bBit = hidGetElementBitLocation( element.location );
|
||||
unsigned bByte = hidGetElementByteLocation( element.location );
|
||||
unsigned bId = hidGetElementReportId( element.location );
|
||||
|
||||
if( id == bId ) {
|
||||
retVal = HID_STATUS_BAD_PAGE;
|
||||
unsigned pg = hidGetUsagePage( id );
|
||||
|
||||
if( page == pg ) {
|
||||
retVal = HID_STATUS_BAD_LOCATION;
|
||||
|
||||
if(( bit == bBit ) && ( byte == bByte )) {
|
||||
element.item.header = header;
|
||||
|
||||
for( size_t dataIdx = 0U; dataIdx < bSize; ++dataIdx ) {
|
||||
element.item.data[ dataIdx ] = data[ dataIdx ];
|
||||
}
|
||||
|
||||
for( size_t dataIdx = bSize; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++dataIdx ) {
|
||||
element.item.data[ dataIdx ] = 0U;
|
||||
}
|
||||
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
*hidConfigurableElements[ elementIdx ] = element;
|
||||
swlock_release(&hidStaticVarLock);
|
||||
retVal = HID_STATUS_GOOD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
void hidSetReportPeriod( const unsigned id, const unsigned period )
|
||||
{
|
||||
swlock_acquire(&hidStaticVarLock);
|
||||
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
|
||||
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||
s_hidCurrentPeriod[ idx ] = period;
|
||||
break;
|
||||
}
|
||||
}
|
||||
swlock_release(&hidStaticVarLock);
|
||||
}
|
||||
|
||||
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr )
|
||||
{
|
||||
size_t count = 0U;
|
||||
*(*outPtrPtr)++ = inPtr->header;
|
||||
++count;
|
||||
|
||||
unsigned dataLength = hidGetItemSize( inPtr->header );
|
||||
for( size_t idx = 0U; idx < dataLength; ++idx ) {
|
||||
*(*outPtrPtr)++ = inPtr->data[ idx ];
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// hid_report_descriptor.h validation functions for development purposes
|
||||
|
||||
/**
|
||||
* @brief Internal HID Report Descriptor validation state
|
||||
*/
|
||||
struct HID_validation_info {
|
||||
int collectionOpenedCount; //!< Current count of open collections (to track that they are all closed)
|
||||
int reportCount; //!< Current count of defined reports (to count them)
|
||||
|
||||
int currentReportIdx; //!< Index of current report in hidReports array
|
||||
int currentConfigurableElementIdx; //!< Index of current configurable element in hidConfigurableElements array
|
||||
|
||||
unsigned char reportIds[HID_REPORT_COUNT]; // Array of report IDs (for general validation & duplication detection)
|
||||
unsigned reportUsagePage[HID_REPORT_COUNT]; // Array of the usage page for each report (for general validation)
|
||||
|
||||
unsigned current_bit_size; // State tracker for the current set report bit width (todo: should technically be a stack)
|
||||
unsigned current_bit_count; // State tracker for the current set report count (todo: should technically be a stack)
|
||||
unsigned current_bit_offset; // Current bit offset into this report (for location validation)
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Validation step for hidReportValidate, checking the info struct to ensure correctness of Report IDs
|
||||
*
|
||||
* @param info The info struct that has been built by hidReportValidate to check
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateInfoStructReportIDs( struct HID_validation_info *info ) {
|
||||
if ( info->reportCount != HID_REPORT_COUNT) {
|
||||
if ( !( info->reportCount == 0 && HID_REPORT_COUNT == 1 ) ) {
|
||||
// (Only if report IDs are being used)
|
||||
printf("Error: The number of actual reports does not match HID_REPORT_COUNT.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
for ( size_t idx1 = 0; idx1 < HID_REPORT_COUNT; ++idx1 ) {
|
||||
for ( size_t idx2 = idx1 + 1; idx2 < HID_REPORT_COUNT; ++idx2 ) {
|
||||
if ( info->reportIds[idx1] == info->reportIds[idx2] ) {
|
||||
printf("Error: Duplicate report ID 0x%02x.\n", info->reportIds[idx1]);
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
}
|
||||
for ( size_t idx = 0; idx < HID_REPORT_COUNT; ++idx ) {
|
||||
if ( info->reportIds[idx] != hidGetElementReportId( hidReports[idx]->location ) ) {
|
||||
printf("Error: Report ID in descriptor does not match report ID in hidReports.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
if ( info->reportCount && info->reportIds[idx] == 0 ) {
|
||||
printf("Error: Report ID 0 is invalid.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Validation step for hidReportValidate, checking reports are the correct length specified in their location field
|
||||
*
|
||||
* @param info The info struct that has been built by hidReportValidate to check
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateInfoStructReportLength( struct HID_validation_info *info ) {
|
||||
if ( info->current_bit_offset % 8 ) {
|
||||
printf("Error: HID Report not byte aligned (%d bits).\n", info->current_bit_offset);
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
if ( ( info->current_bit_offset / 8 ) != hidGetElementReportLength( hidReports[info->currentReportIdx]->location ) ) {
|
||||
printf("Error: Actual report length does not match value in location field %d != %d.\n",
|
||||
( info->current_bit_offset / 8 ),
|
||||
hidGetElementReportLength( hidReports[info->currentReportIdx]->location ));
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Validation step for hidReportValidate, collections are correctly opened and closed
|
||||
*
|
||||
* @param info The info struct that has been built by hidReportValidate to check
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateInfoStructCollections( struct HID_validation_info *info ) {
|
||||
if ( info->collectionOpenedCount ) {
|
||||
printf("Error: Collections not equally opened and closed.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Validation step for hidReportValidate, High level - Checks the summarised information in the info struct by calling
|
||||
* the subroutines for checking.
|
||||
*
|
||||
* @param info The info struct that has been built by hidReportValidate to check
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateInfoStruct( struct HID_validation_info *info ) {
|
||||
unsigned status = hidReportValidateInfoStructCollections( info );
|
||||
if( status == HID_STATUS_GOOD ) {
|
||||
status = hidReportValidateInfoStructReportIDs( info );
|
||||
}
|
||||
if( status == HID_STATUS_GOOD ) {
|
||||
status = hidReportValidateInfoStructReportLength( info );
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Preparation step for hidReportValidate, Adds a report ID field into the information struct for validation
|
||||
*
|
||||
* @param info The info struct being built by hidReportValidate
|
||||
* @param item The ReportId item being added
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateAddReportId( struct HID_validation_info *info, const USB_HID_Short_Item_t *item ) {
|
||||
if ( info->reportCount == 0 ) {
|
||||
if ( info->current_bit_offset ) {
|
||||
printf("Error: Some elements not associated with report ID.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
info->reportUsagePage[0] = 0;
|
||||
} else {
|
||||
unsigned status = hidReportValidateInfoStructReportLength( info );
|
||||
if ( status ) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
if ( hidGetItemSize(item->header) != 1 ) {
|
||||
printf("Error: ReportId field has invalid length %d (expected 1)\n", hidGetItemSize(item->header));
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
info->reportIds[info->reportCount] = item->data[0];
|
||||
info->currentReportIdx = info->reportCount;
|
||||
info->reportCount += 1;
|
||||
info->current_bit_offset = 0;
|
||||
if ( info->reportCount > HID_REPORT_COUNT ) {
|
||||
printf("Error: HID_REPORT_COUNT does not match number of report IDs in descriptor.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Preparation step for hidReportValidate, Adds a Usage Page field into the information struct for validation
|
||||
*
|
||||
* @param info The info struct being built by hidReportValidate
|
||||
* @param item The UsagePage item being added
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateAddUsagePageItem( struct HID_validation_info *info, const USB_HID_Short_Item_t *item ) {
|
||||
|
||||
if ( info->collectionOpenedCount == 0 ) {
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
if ( info->reportUsagePage[info->currentReportIdx] ) {
|
||||
printf("Error: Multiple usage pages per report ID not supported by this implementation.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
switch (hidGetItemSize(item->header)){
|
||||
case 1:
|
||||
info->reportUsagePage[info->currentReportIdx] = item->data[0];
|
||||
break;
|
||||
case 2:
|
||||
info->reportUsagePage[info->currentReportIdx] = ((unsigned) item->data[1] << 8) + item->data[0];
|
||||
break;
|
||||
default:
|
||||
printf("Error: Invalid size for UsagePage report descriptor item.\n");
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Preparation step for hidReportValidate, Adds a Usage field into the information struct for validation
|
||||
*
|
||||
* @param info The info struct being built by hidReportValidate
|
||||
* @param item The Usage item being added
|
||||
* @return unsigned HID_STATUS value
|
||||
*/
|
||||
static unsigned hidReportValidateAddUsageItem( struct HID_validation_info *info, const USB_HID_Short_Item_t *item) {
|
||||
if ( ( info->currentConfigurableElementIdx < HID_CONFIGURABLE_ELEMENT_COUNT ) &&
|
||||
( &(hidConfigurableElements[info->currentConfigurableElementIdx]->item) == item ) ) {
|
||||
|
||||
USB_HID_Report_Element_t *element = hidConfigurableElements[info->currentConfigurableElementIdx];
|
||||
unsigned bBit = hidGetElementBitLocation( element->location );
|
||||
unsigned bByte = hidGetElementByteLocation( element->location );
|
||||
unsigned bReportId = hidGetElementReportId( element->location );
|
||||
|
||||
if ( bBit != ( info->current_bit_offset % 8 ) || bByte != ( info->current_bit_offset / 8 ) ) {
|
||||
printf("Error: Locator bit/byte setting incorrect for configurable element index %d.\n", info->currentConfigurableElementIdx);
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
if ( bReportId != info->reportIds[info->currentReportIdx] ) {
|
||||
printf("Error: Locator report ID setting incorrect for configurable element index %d.\n", info->currentConfigurableElementIdx);
|
||||
return HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
info->currentConfigurableElementIdx += 1;
|
||||
}
|
||||
return HID_STATUS_GOOD;
|
||||
}
|
||||
|
||||
unsigned hidReportValidate( void )
|
||||
{
|
||||
struct HID_validation_info info = {};
|
||||
unsigned status = HID_STATUS_GOOD;
|
||||
|
||||
// Fill in the validation info struct by iterating through the hid report items
|
||||
for ( size_t idx = 0; idx < HID_REPORT_DESCRIPTOR_ITEM_COUNT; ++idx ) {
|
||||
const USB_HID_Short_Item_t *item = hidReportDescriptorItems[idx];
|
||||
unsigned bTag = hidGetItemTag ( item->header );
|
||||
unsigned bType = hidGetItemType( item->header );
|
||||
|
||||
if ( bTag == HID_REPORT_ITEM_TAG_COLLECTION && bType == HID_REPORT_ITEM_TYPE_MAIN ) {
|
||||
info.collectionOpenedCount += 1;
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_END_COLLECTION && bType == HID_REPORT_ITEM_TYPE_MAIN ) {
|
||||
info.collectionOpenedCount -= 1;
|
||||
if ( info.collectionOpenedCount < 0 ) {
|
||||
printf("Error: Collection closed while there is no collection open.\n");
|
||||
status = HID_STATUS_BAD_REPORT_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_INPUT && bType == HID_REPORT_ITEM_TYPE_MAIN ) {
|
||||
info.current_bit_offset += (info.current_bit_size * info.current_bit_count);
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_REPORT_SIZE && bType == HID_REPORT_ITEM_TYPE_GLOBAL ) {
|
||||
info.current_bit_size = item->data[0];
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_REPORT_COUNT && bType == HID_REPORT_ITEM_TYPE_GLOBAL ) {
|
||||
info.current_bit_count = item->data[0];
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_REPORT_ID && bType == HID_REPORT_ITEM_TYPE_GLOBAL ) {
|
||||
status = hidReportValidateAddReportId( &info, item );
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_USAGE_PAGE && bType == HID_REPORT_ITEM_TYPE_GLOBAL ) {
|
||||
status = hidReportValidateAddUsagePageItem( &info, item );
|
||||
}
|
||||
else if ( bTag == HID_REPORT_ITEM_TAG_USAGE && bType == HID_REPORT_ITEM_TYPE_LOCAL ) {
|
||||
status = hidReportValidateAddUsageItem( &info, item );
|
||||
}
|
||||
|
||||
if ( status ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(status) {
|
||||
return status;
|
||||
} else {
|
||||
return hidReportValidateInfoStruct( &info );
|
||||
}
|
||||
}
|
||||
|
||||
#endif // ( 0 < HID_CONTROLS )
|
||||
@@ -1,6 +1,12 @@
|
||||
// Copyright 2019-2021 XMOS LIMITED.
|
||||
// Copyright 2019-2022 XMOS LIMITED.
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
/**
|
||||
* @brief Human Interface Device (HID) Class Request functions
|
||||
*
|
||||
* Document section numbers refer to the HID Device Class Definition, version 1.11.
|
||||
*/
|
||||
|
||||
#ifndef __XUA_HID_H__
|
||||
#define __XUA_HID_H__
|
||||
|
||||
@@ -9,49 +15,11 @@
|
||||
#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.
|
||||
*
|
||||
@@ -64,15 +32,15 @@ unsigned HidIsChangePending( void );
|
||||
* whether or not the time to send the next periodic HID Report has
|
||||
* elapsed.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* @param[in] id The identifier for the HID Report (see 5.6, 6.2.2.7, 8.1 and 8.2)
|
||||
* A value of zero means the application does not use Report IDs.
|
||||
*
|
||||
* \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 );
|
||||
unsigned HidIsSetIdleSilenced( const unsigned id );
|
||||
|
||||
#endif // __XUA_HID_H__
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user