From b4090602ad2fd2d89ec1e8d22dd04c2a1c1a53ef Mon Sep 17 00:00:00 2001 From: xross Date: Thu, 29 Mar 2018 13:32:54 +0100 Subject: [PATCH] Added initial AN00247 --- .../AN00246_xua_example/doc/rst/AN00246.rst | 3 - .../AN00247_xua_example_spdif_tx/LICENSE.txt | 135 ++++++++++ .../AN00247_xua_example_spdif_tx/Makefile | 21 ++ .../AN00247_xua_example_spdif_tx/README.rst | 34 +++ .../doc/AN00246.rst | 240 ++++++++++++++++++ .../doc/rst/AN00247.rst | 240 ++++++++++++++++++ .../doc/rst/images/hw_setup.jpg | Bin 0 -> 77049 bytes .../doc/rst/xdoc.conf | 2 + .../src/app_xua_simple.xc | 103 ++++++++ .../AN00247_xua_example_spdif_tx/src/cs4384.h | 32 +++ .../AN00247_xua_example_spdif_tx/src/cs5368.h | 18 ++ .../src/hwsupport.xc | 135 ++++++++++ .../src/xk-audio-216-mc.xn | 88 +++++++ .../src/xua_conf.h | 30 +++ .../src/xud_conf.h | 7 + 15 files changed, 1085 insertions(+), 3 deletions(-) create mode 100644 examples/AN00247_xua_example_spdif_tx/LICENSE.txt create mode 100644 examples/AN00247_xua_example_spdif_tx/Makefile create mode 100644 examples/AN00247_xua_example_spdif_tx/README.rst create mode 100644 examples/AN00247_xua_example_spdif_tx/doc/AN00246.rst create mode 100644 examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247.rst create mode 100644 examples/AN00247_xua_example_spdif_tx/doc/rst/images/hw_setup.jpg create mode 100644 examples/AN00247_xua_example_spdif_tx/doc/rst/xdoc.conf create mode 100644 examples/AN00247_xua_example_spdif_tx/src/app_xua_simple.xc create mode 100644 examples/AN00247_xua_example_spdif_tx/src/cs4384.h create mode 100644 examples/AN00247_xua_example_spdif_tx/src/cs5368.h create mode 100644 examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc create mode 100644 examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn create mode 100644 examples/AN00247_xua_example_spdif_tx/src/xua_conf.h create mode 100644 examples/AN00247_xua_example_spdif_tx/src/xud_conf.h diff --git a/examples/AN00246_xua_example/doc/rst/AN00246.rst b/examples/AN00246_xua_example/doc/rst/AN00246.rst index 1c5b9ab9..7cf7df51 100644 --- a/examples/AN00246_xua_example/doc/rst/AN00246.rst +++ b/examples/AN00246_xua_example/doc/rst/AN00246.rst @@ -21,9 +21,6 @@ Block diagram Application block diagram -The application uses a single logical core which runs the application and makes -calls to the |I2C| master library functions as required. - How to use lib_xua ------------------ diff --git a/examples/AN00247_xua_example_spdif_tx/LICENSE.txt b/examples/AN00247_xua_example_spdif_tx/LICENSE.txt new file mode 100644 index 00000000..844e2bcc --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/LICENSE.txt @@ -0,0 +1,135 @@ +Software Release License Agreement + +Copyright (c) 2018, XMOS, All rights reserved. + +BY ACCESSING, USING, INSTALLING OR DOWNLOADING THE XMOS SOFTWARE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE, DO NOT ATTEMPT TO DOWNLOAD, ACCESS OR USE THE XMOS Software. + +Parties: + +(1) XMOS Limited, incorporated and registered in England and Wales with company number 5494985 whose registered office is 107 Cheapside, London, EC2V 6DN (XMOS). + +(2) An individual or legal entity exercising permissions granted by this License (Customer). + +If you are entering into this Agreement on behalf of another legal entity such as a company, partnership, university, college etc. (for example, as an employee, student or consultant), you warrant that you have authority to bind that entity. + +1. Definitions + +"License" means this Software License and any schedules or annexes to it. + +"License Fee" means the fee for the XMOS Software as detailed in any schedules or annexes to this Software License + +"Licensee Modifications" means all developments and modifications of the XMOS Software developed independently by the Customer. + +"XMOS Modifications" means all developments and modifications of the XMOS Software developed or co-developed by XMOS. + +"XMOS Hardware" means any XMOS hardware devices supplied by XMOS from time to time and/or the particular XMOS devices detailed in any schedules or annexes to this Software License. + +"XMOS Software" comprises the XMOS owned circuit designs, schematics, source code, object code, reference designs, (including related programmer comments and documentation, if any), error corrections, improvements, modifications (including XMOS Modifications) and updates. + +The headings in this License do not affect its interpretation. Save where the context otherwise requires, references to clauses and schedules are to clauses and schedules of this License. + +Unless the context otherwise requires: + +- references to XMOS and the Customer include their permitted successors and assigns; +- references to statutory provisions include those statutory provisions as amended or re-enacted; and +- references to any gender include all genders. + +Words in the singular include the plural and in the plural include the singular. + +2. License + +XMOS grants the Customer a non-exclusive license to use, develop, modify and distribute the XMOS Software with, or for the purpose of being used with, XMOS Hardware. + +Open Source Software (OSS) must be used and dealt with in accordance with any license terms under which OSS is distributed. + +3. Consideration + +In consideration of the mutual obligations contained in this License, the parties agree to its terms. + +4. Term + +Subject to clause 12 below, this License shall be perpetual. + +5. Restrictions on Use + +The Customer will adhere to all applicable import and export laws and regulations of the country in which it resides and of the United States and United Kingdom, without limitation. The Customer agrees that it is its responsibility to obtain copies of and to familiarise itself fully with these laws and regulations to avoid violation. + +6. Modifications + +The Customer will own all intellectual property rights in the Licensee Modifications but will undertake to provide XMOS with any fixes made to correct any bugs found in the XMOS Software on a non-exclusive, perpetual and royalty free license basis. + +XMOS will own all intellectual property rights in the XMOS Modifications. +The Customer may only use the Licensee Modifications and XMOS Modifications on, or in relation to, XMOS Hardware. + +7. Support + +Support of the XMOS Software may be provided by XMOS pursuant to a separate support agreement. + +8. Warranty and Disclaimer + +The XMOS Software is provided "AS IS" without a warranty of any kind. XMOS and its licensors' entire liability and Customer's exclusive remedy under this warranty to be determined in XMOS's sole and absolute discretion, will be either (a) the corrections of defects in media or replacement of the media, or (b) the refund of the license fee paid (if any). + +Whilst XMOS gives the Customer the ability to load their own software and applications onto XMOS devices, the security of such software and applications when on the XMOS devices is the Customer's own responsibility and any breach of security shall not be deemed a defect or failure of the hardware. XMOS shall have no liability whatsoever in relation to any costs, damages or other losses Customer may incur as a result of any breaches of security in relation to your software or applications. + +XMOS AND ITS LICENSORS DISCLAIM ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY/ SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID UNDER APPLICABLE LAW. + +9. High Risk Activities + +The XMOS Software is not designed or intended for use in conjunction with on-line control equipment in hazardous environments requiring fail-safe performance, including without limitation the operation of nuclear facilities, aircraft navigation or communication systems, air traffic control, life support machines, or weapons systems (collectively "High Risk Activities") in which the failure of the XMOS Software could lead directly to death, personal injury, or severe physical or environmental damage. XMOS and its licensors specifically disclaim any express or implied warranties relating to use of the XMOS Software in connection with High Risk Activities. + +10. Liability + +TO THE EXTENT NOT PROHIBITED BY APPLICABLE LAW, NEITHER XMOS NOR ITS LICENSORS SHALL BE LIABLE FOR ANY LOST REVENUE, BUSINESS, PROFIT, CONTRACTS OR DATA, ADMINISTRATIVE OR OVERHEAD EXPENSES, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THEORY OF LIABILITY ARISING OUT OF THIS LICENSE, EVEN IF XMOS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event shall XMOS's liability to the Customer whether in contract, tort (including negligence), or otherwise exceed the License Fee. + +Customer agrees to indemnify, hold harmless, and defend XMOS and its licensors from and against any claims or lawsuits, including attorneys' fees and any other liabilities, demands, proceedings, damages, losses, costs, expenses fines and charges which are made or brought against or incurred by XMOS as a result of your use or distribution of the Licensee Modifications or your use or distribution of XMOS Software, or any development of it, other than in accordance with the terms of this License. + +11. Ownership + +The copyrights and all other intellectual and industrial property rights for the protection of information with respect to the XMOS Software (including the methods and techniques on which they are based) are retained by XMOS and/or its licensors. Nothing in this Agreement serves to transfer such rights. Customer may not sell, mortgage, underlet, sublease, sublicense, lend or transfer possession of the XMOS Software in any way whatsoever to any third party who is not bound by this Agreement. + +12. Termination + +Either party may terminate this License at any time on written notice to the other if the other: + +- is in material or persistent breach of any of the terms of this License and either that breach is incapable of remedy, or the other party fails to remedy that breach within 30 days after receiving written notice requiring it to remedy that breach; or + +- is unable to pay its debts (within the meaning of section 123 of the Insolvency Act 1986), or becomes insolvent, or is subject to an order or a resolution for its liquidation, administration, winding-up or dissolution (otherwise than for the purposes of a solvent amalgamation or reconstruction), or has an administrative or other receiver, manager, trustee, liquidator, administrator or similar officer appointed over all or any substantial part of its assets, or enters into or proposes any composition or arrangement with its creditors generally, or is subject to any analogous event or proceeding in any applicable jurisdiction. + +Termination by either party in accordance with the rights contained in clause 12 shall be without prejudice to any other rights or remedies of that party accrued prior to termination. + +On termination for any reason: + +- all rights granted to the Customer under this License shall cease; +- the Customer shall cease all activities authorised by this License; +- the Customer shall immediately pay any sums due to XMOS under this License; and +- the Customer shall immediately destroy or return to the XMOS (at the XMOS's option) all copies of the XMOS Software then in its possession, custody or control and, in the case of destruction, certify to XMOS that it has done so. + +Clauses 5, 8, 9, 10 and 11 shall survive any effective termination of this Agreement. + +13. Third party rights + +No term of this License is intended to confer a benefit on, or to be enforceable by, any person who is not a party to this license. + +14. Confidentiality and publicity + +Each party shall, during the term of this License and thereafter, keep confidential all, and shall not use for its own purposes nor without the prior written consent of the other disclose to any third party any, information of a confidential nature (including, without limitation, trade secrets and information of commercial value) which may become known to such party from the other party and which relates to the other party, unless such information is public knowledge or already known to such party at the time of disclosure, or subsequently becomes public knowledge other than by breach of this license, or subsequently comes lawfully into the possession of such party from a third party. + +The terms of this license are confidential and may not be disclosed by the Customer without the prior written consent of XMOS. +The provisions of clause 14 shall remain in full force and effect notwithstanding termination of this license for any reason. + +15. Entire agreement + +This License and the documents annexed as appendices to this License or otherwise referred to herein contain the whole agreement between the parties relating to the subject matter hereof and supersede all prior agreements, arrangements and understandings between the parties relating to that subject matter. + +16. Assignment + +The Customer shall not assign this License or any of the rights granted under it without XMOS's prior written consent. + +17. Governing law and jurisdiction + +This License shall be governed by and construed in accordance with English law and each party hereby submits to the non-exclusive jurisdiction of the English courts. + +This License has been entered into on the date stated at the beginning of it. + +Schedule +XMOS lib_xua software diff --git a/examples/AN00247_xua_example_spdif_tx/Makefile b/examples/AN00247_xua_example_spdif_tx/Makefile new file mode 100644 index 00000000..a6733f6d --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/Makefile @@ -0,0 +1,21 @@ +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 + +# 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. +USED_MODULES = lib_xua lib_device_control lib_xud lib_spdif module_i2c_shared module_i2c_single_port module_locks + +#============================================================================= +# The following part of the Makefile includes the common build infrastructure +# for compiling XMOS applications. You should not need to edit below here. + +XMOS_MAKE_PATH ?= ../.. +include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common + diff --git a/examples/AN00247_xua_example_spdif_tx/README.rst b/examples/AN00247_xua_example_spdif_tx/README.rst new file mode 100644 index 00000000..ef159ebf --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/README.rst @@ -0,0 +1,34 @@ + +Simple USB Audio Device using lib_xua +===================================== + +.. version:: 0.1.0 + +Summary +------- + +Required tools and libraries +............................ + +.. appdeps:: + +Required hardware +................. + +The example code provided with the application has been implemented +and tested on the xCORE-200 Multi-channel Audio Board + +Prerequisites +............. + + * This document assumes familiarity with the XMOS xCORE architecture, + the XMOS tool chain and the xC language. Documentation related to these + aspects which are not specific to this application note are linked to in + the references appendix. + + * For a description of XMOS related terms found in this document + please see the XMOS Glossary [#]_. + +.. [#] http://www.xmos.com/published/glossary + + diff --git a/examples/AN00247_xua_example_spdif_tx/doc/AN00246.rst b/examples/AN00247_xua_example_spdif_tx/doc/AN00246.rst new file mode 100644 index 00000000..89267983 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/doc/AN00246.rst @@ -0,0 +1,240 @@ +.. include:: ../../README.rst + +|newpage| + +Overview +-------- + +Introduction +............ + +The XMOS USB Audio (XUA) library provides an implemention of USB Audio Class 2.0 + +This application note demonstrates the implementation of a basic USB Audio Device on +the xCORE-200 MC Audio board. + +Block diagram +............. + +.. figure:: images/block_diagram.* + :width: 80% + + Application block diagram + +The application uses a single logical core which runs the application and makes +calls to the |I2C| master library functions as required. + +How to use lib_xua +------------------ + +The Makefile +............ + +To start using the lib_xua, you need to add ``lib_xua`` to your Makefile:: + + USED_MODULES = .. lib_xua ... + +This demo also uses the XMOS USB Device library (``lib_xud``) for low-level USB connectivity. +The Makefile also includes:: + + USED_MODULES = .. lib_xud .. + +``lib_xud`` library requires some flags for correct operation. Firstly the +tile on which ``lib_xud`` will be execute, for example:: + + XCC_FLAGS = .. -DUSB_TILE=tile[1] .. + +Secondly, the architecture of the target device, for example:: + + XCC_FLAGS = .. -DXUD_SERIES_SUPPORT=XUD_X200_SERIES .. + +Includes +........ + +This application requires the system header that defines XMOS xCORE specific +defines for declaring and initialising hardware: + +.. literalinclude:: app_xua_simple.xc + :start-on: include + :end-before: include "xua.h" + +The XUA library functions are defined in ``xua.h``. This header must +be included in your code to use the library. + +.. literalinclude:: app_xua_simple.xc + :start-on: include "xua.h" + :end-on: include "xud_device.h" + +Allocating hardware resources +............................. + +A most basic implementation of a USB Audio device (i.e. simple stereo input and output via I2S) +using ``lib_xua`` requires the follow pins: + + - I2S Bit Clock (from xCORE to DAC) + - I2S L/R clock (from xCORE to DAC) + - I2S Data line (from xCORE to DAC) + - I2S Data line (from ADC to xCORE) + - Audio Master clock (from clock source to xCORE) + +.. note:: + + ANOO246 assumes xCORE is I2S bus master + +On an xCORE the pins are controlled by ``ports``. The application therefore declares various ``ports`` +for this purpose: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Port declaration + :end-on: /* Clock-block + +In addition to ``port`` resources two clock-block resources are also required: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Clock-block + :end-on: /* clock clk_audio_mclk + +Other declarations +.................. + +``lib_xua`` currently requires the manual declaration of tables for the endpoint types for +``lib_xud`` and the calling the main XUD funtion in a par (``XUD_Main()``). + +For a simple application the following endpoints are required: + + - ``Control`` enpoint zero + - ``Isochonous`` endpoint for each direction for audio data to/from the USB host + +These are declared as follows: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Endpoint type tables + :end-on: /* XUD_EpType epTypeTableIn + +The application main() function +............................... + +The ``main()`` function sets up the tasks in the application. + +Various channels are required in order to allow the required tasks to communcate. +These must be declared": + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Channels for lib_xud + :end-on: /* chan c_aud_ctl + +The rest of the ``main()`` function starts all the tasks in parallel +using the xC ``par`` construct: + +.. literalinclude:: app_xua_simple.xc + :start-on: par + :end-before: return 0 + +This code starts the low-level USB task, an Endpoint 0 task, an Audio buffering task and a task to handle +the audio I/O (i.e. I2S signalling). + +Configuration +............. + +``lib_xua`` has many parameters than can be configured at build time, some examples include: + + - Sample-rates + - Channel counts + - Audio Class version + - Product/Vendor ID's + - Various product strings + - Master clock frequency + +These parameters are set via defines in an optional ``xua_conf.h`` header file. + +|appendix| +|newpage| + +Demo Hardware Setup +------------------- + +To run the demo, connect a USB cable to power the xCORE-200 MC Audio board +and plug the xTAG to the board and connect the xTAG USB cable to your +development machine. + +.. figure:: images/hw_setup.* + :width: 80% + + Hardware setup + +|newpage| + +Launching the demo application +------------------------------ + +Once the demo example has been built either from the command line using xmake or +via the build mechanism of xTIMEcomposer studio it can be executed on the xCORE-200 +MC Audio board. + +Once built there will be a ``bin/`` directory within the project which contains +the binary for the xCORE device. The xCORE binary has a XMOS standard .xe extension. + +Launching from the command line +............................... + +From the command line you use the ``xrun`` tool to download and run the code +on the xCORE device:: + + xrun --xscope bin/app_xua_simple.xe + +Once this command has executed the application will be running on the +xCORE-200 MC Audio Board + +Launching from xTIMEcomposer Studio +................................... + +From xTIMEcomposer Studio use the run mechanism to download code to xCORE device. +Select the xCORE binary from the ``bin/`` directory, right click and go to Run +Configurations. Double click on xCORE application to create a new run configuration, +enable the xSCOPE I/O mode in the dialog box and then +select Run. + +Once this command has executed the application will be running on the +xCORE-200 MC Audio board. + +Running the application +....................... + +Once running the device will be detected as a USB Audio device - note, Windows operating +systems may require a third party driver for correct operation + +|newpage| + +References +---------- + +.. nopoints:: + + * XMOS Tools User Guide + + http://www.xmos.com/published/xtimecomposer-user-guide + + * XMOS xCORE Programming Guide + + http://www.xmos.com/published/xmos-programming-guide + + * XMOS lib_xua Library + + http://www.xmos.com/support/libraries/lib_xua + + * XMOS lib_xud Library + + http://www.xmos.com/support/libraries/lib_xud + +|newpage| + +Full source code listing +------------------------ + +Source code for main.xc +....................... + +.. literalinclude:: app_xua_simple.xc + :largelisting: + +|newpage| diff --git a/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247.rst b/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247.rst new file mode 100644 index 00000000..721103b9 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/doc/rst/AN00247.rst @@ -0,0 +1,240 @@ +.. include:: ../../README.rst + +|newpage| + +Overview +-------- + +Introduction +............ + +The XMOS USB Audio (XUA) library provides an implemention of USB Audio Class 2.0. + +This application note demonstrates the implementation of a basic USB Audio Device with +S/PDIF transmit functionality the xCORE-200 MC Audio board. + +To reduce complexity this application note does not enable any other audio interfaces other that S/PDIF transmit +(i.e. no I2S). Readers are encouraged to read applicaition note AN00246 in conjunction with this application +note + +Block diagram +............. + +.. figure:: images/block_diagram.* + :width: 80% + + Application block diagram + +How to use lib_xua +------------------ + +The Makefile +............ + +To start using the lib_xua, you need to add ``lib_xua`` and ``lib_spdif`` to your Makefile:: + + USED_MODULES = .. lib_xua lib_spdif ... + +This demo also uses the XMOS USB Device library (``lib_xud``) for low-level USB connectivity. +The Makefile also includes:: + + USED_MODULES = .. lib_xud .. + +``lib_xud`` library requires some flags for correct operation. Firstly the +tile on which ``lib_xud`` will be execute, for example:: + + XCC_FLAGS = .. -DUSB_TILE=tile[1] .. + +Secondly, the architecture of the target device, for example:: + + XCC_FLAGS = .. -DXUD_SERIES_SUPPORT=XUD_X200_SERIES .. + +Includes +........ + +This application requires the system header that defines XMOS xCORE specific +defines for declaring and initialising hardware: + +.. literalinclude:: app_xua_simple.xc + :start-on: include + :end-before: include "xua.h" + +The XUA library functions are defined in ``xua.h``. This header must +be included in your code to use the library. + +.. literalinclude:: app_xua_simple.xc + :start-on: include "xua.h" + :end-on: include "xud_device.h" + +The application uses the S/PDIF transmitter from ``lib_spdif``. This header +must be inluced in your code to the library. + +.. literalinclude:: app_xua_simple.xc + :start-on: /* From lib_spdif + :end-on: include "spdif.h" + +Allocating hardware resources for lib_xua +......................................... + +A most basic implementation of a USB Audio device with no I2S functionalilty. +using ``lib_xua`` requires the follow pins: + + - Audio Master clock (from clock source to xCORE) + +On an xCORE the pins are controlled by ``ports``. The application therefore declares various ``ports`` +for this purpose: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Lib_xua port declaration + :end-on: /* Clock-block + +In addition to ``port`` resources two clock-block resources are also required: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Clock-block + :end-on: /* clock clk_audio_mclk + +Allocating hardware resources for lib_spdif +........................................... + +The S/PDIF transmitter requires a single (buffered) 1-bit port: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Lib_spdif port + :end-on: /* buffered out port + +This port must be clocked from the audio master clock. + +Other declarations +.................. + +``lib_xua`` currently requires the manual declaration of tables for the endpoint types for +``lib_xud`` and the calling the main XUD funtion in a par (``XUD_Main()``). + +For a simple application the following endpoints are required: + + - ``Control`` enpoint zero + - ``Isochonous`` endpoint for each direction for audio data to/from the USB host + +These are declared as follows: + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Endpoint type tables + :end-on: /* XUD_EpType epTypeTableIn + +The application main() function +............................... + +The ``main()`` function sets up the tasks in the application. + +Various channels are required in order to allow the required tasks to communcate. +These must be declared": + +.. literalinclude:: app_xua_simple.xc + :start-on: /* Channels for lib_xud + :end-on: /* chan c_aud_ctl + +The rest of the ``main()`` function starts all the tasks in parallel +using the xC ``par`` construct: + +.. literalinclude:: app_xua_simple.xc + :start-on: par + :end-before: return 0 + +This code starts the low-level USB task, an Endpoint 0 task, an Audio buffering task and a task to handle +the audio I/O (i.e. I2S signalling). In addition the ``spdif_tx()`` task is also run. + +Configuration +............. + +|appendix| +|newpage| + +Demo Hardware Setup +------------------- + +To run the demo, connect a USB cable to power the xCORE-200 MC Audio board +and plug the xTAG to the board and connect the xTAG USB cable to your +development machine. + +.. figure:: images/hw_setup.* + :width: 80% + + Hardware setup + +|newpage| + +Launching the demo application +------------------------------ + +Once the demo example has been built either from the command line using xmake or +via the build mechanism of xTIMEcomposer studio it can be executed on the xCORE-200 +MC Audio board. + +Once built there will be a ``bin/`` directory within the project which contains +the binary for the xCORE device. The xCORE binary has a XMOS standard .xe extension. + +Launching from the command line +............................... + +From the command line you use the ``xrun`` tool to download and run the code +on the xCORE device:: + + xrun --xscope bin/app_xua_simple.xe + +Once this command has executed the application will be running on the +xCORE-200 MC Audio Board + +Launching from xTIMEcomposer Studio +................................... + +From xTIMEcomposer Studio use the run mechanism to download code to xCORE device. +Select the xCORE binary from the ``bin/`` directory, right click and go to Run +Configurations. Double click on xCORE application to create a new run configuration, +enable the xSCOPE I/O mode in the dialog box and then +select Run. + +Once this command has executed the application will be running on the +xCORE-200 MC Audio board. + +Running the application +....................... + +Once running the device will be detected as a USB Audio device - note, Windows operating +systems may require a third party driver for correct operation + +|newpage| + +References +---------- + +.. nopoints:: + + * XMOS Tools User Guide + + http://www.xmos.com/published/xtimecomposer-user-guide + + * XMOS xCORE Programming Guide + + http://www.xmos.com/published/xmos-programming-guide + + * XMOS lib_xua Library + + http://www.xmos.com/support/libraries/lib_xua + + * XMOS lib_xud Library + + http://www.xmos.com/support/libraries/lib_xud + +|newpage| + +Full source code listing +------------------------ + +Source code for main.xc +....................... + +.. literalinclude:: app_xua_simple.xc + :largelisting: + +|newpage| diff --git a/examples/AN00247_xua_example_spdif_tx/doc/rst/images/hw_setup.jpg b/examples/AN00247_xua_example_spdif_tx/doc/rst/images/hw_setup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8998805d678adf3cad2223f5c0dc6a8c53b637d7 GIT binary patch literal 77049 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

fcX60cP-UVTAyhi<4|Tj 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 agICqcjH%+e*rdo9tqATIC +#include + +#include "xua.h" +#include "xud_device.h" + +/* From lib_spdif */ +#include "spdif.h" + +/* Lib_spdif port declarations. Note, the defines come from the xn file */ +buffered out port:32 p_spdif_tx2 = PORT_SPDIF_OUT; /* SPDIF transmit port */ + +/* Lib_xua port declarations. Note, the defines come from the xn file */ +in port p_mclk_in = PORT_MCLK_IN; /* Master clock for the audio IO tile */ + +/* Resources for USB feedback */ +in port p_for_mclk_count = PORT_MCLK_COUNT; /* Extra port for counting master clock ticks */ +in port p_mclk_in_usb = PORT_MCLK_IN_USB; /* Extra master clock input for the USB tile */ + +/* Clock-block declarations */ +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 */ + +/* Endpoint type tables - informs XUD what the transfer types for each Endpoint in use and also + * if the endpoint wishes to be informed of USB bus resets */ +XUD_EpType epTypeTableOut[] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, XUD_EPTYPE_ISO}; +XUD_EpType epTypeTableIn[] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, XUD_EPTYPE_ISO}; + +int main() +{ + /* Channels for lib_xud */ + chan c_ep_out[2]; + chan c_ep_in[2]; + + /* Channel for communicating SOF notifications from XUD to the Buffering cores */ + chan c_sof; + + /* 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; + + /* Channel for communication between AudioHub and S/PDIF transmitter */ + chan c_spdif_tx; + + 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); + + /* 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); + + /* 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 */ + start_clock(clk_audio_mclk_usb); /* Set the clock off running */ + + 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_tx2, clk_audio_mclk, p_mclk_in, 7); + + par + { + while(1) + { + /* Run the S/PDIF transmitter task */ + spdif_tx(p_spdif_tx2, 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; +} + + diff --git a/examples/AN00247_xua_example_spdif_tx/src/cs4384.h b/examples/AN00247_xua_example_spdif_tx/src/cs4384.h new file mode 100644 index 00000000..98defbe3 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/cs4384.h @@ -0,0 +1,32 @@ +// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved +#ifndef CS4384_H_ +#define CS4384_H_ + +//Address on I2C bus +#define CS4384_I2C_ADDR (0x18) + +//Register Addresess +#define CS4384_CHIP_REV 0x01 +#define CS4384_MODE_CTRL 0x02 +#define CS4384_PCM_CTRL 0x03 +#define CS4384_DSD_CTRL 0x04 +#define CS4384_FLT_CTRL 0x05 +#define CS4384_INV_CTRL 0x06 +#define CS4384_GRP_CTRL 0x07 +#define CS4384_RMP_MUTE 0x08 +#define CS4384_MUTE_CTRL 0x09 +#define CS4384_MIX_PR1 0x0a +#define CS4384_VOL_A1 0x0b +#define CS4384_VOL_B1 0x0c +#define CS4384_MIX_PR2 0x0d +#define CS4384_VOL_A2 0x0e +#define CS4384_VOL_B2 0x0f +#define CS4384_MIX_PR3 0x10 +#define CS4384_VOL_A3 0x11 +#define CS4384_VOL_B3 0x12 +#define CS4384_MIX_PR4 0x13 +#define CS4384_VOL_A4 0x14 +#define CS4384_VOL_B4 0x15 +#define CS4384_CM_MODE 0x16 + +#endif /* CS4384_H_ */ diff --git a/examples/AN00247_xua_example_spdif_tx/src/cs5368.h b/examples/AN00247_xua_example_spdif_tx/src/cs5368.h new file mode 100644 index 00000000..945ae536 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/cs5368.h @@ -0,0 +1,18 @@ +// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved +#ifndef _CS5368_H_ +#define _CS5368_H_ + +//Address on I2C bus +#define CS5368_I2C_ADDR (0x4C) + +//Register Addresess +#define CS5368_CHIP_REV 0x00 +#define CS5368_GCTL_MDE 0x01 +#define CS5368_OVFL_ST 0x02 +#define CS5368_OVFL_MSK 0x03 +#define CS5368_HPF_CTRL 0x04 +#define CS5368_PWR_DN 0x06 +#define CS5368_MUTE_CTRL 0x08 +#define CS5368_SDO_EN 0x0a + +#endif /* _CS5368_H_ */ diff --git a/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc b/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc new file mode 100644 index 00000000..ad53b961 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/hwsupport.xc @@ -0,0 +1,135 @@ +// Copyright (c) 2016-2018, XMOS Ltd, All rights reserved + +#include +#include + +#include "xua.h" +#include "i2c_shared.h" + +#include "cs5368.h" +#include "cs4384.h" + +on tile [0] : struct r_i2c r_i2c = {XS1_PORT_4A}; + + +/* General output port bit definitions */ +#define P_GPIO_DSD_MODE (1 << 0) /* DSD mode select 0 = 8i/8o I2S, 1 = 8o DSD*/ +#define P_GPIO_DAC_RST_N (1 << 1) +#define P_GPIO_USB_SEL0 (1 << 2) +#define P_GPIO_USB_SEL1 (1 << 3) +#define P_GPIO_VBUS_EN (1 << 4) +#define P_GPIO_PLL_SEL (1 << 5) /* 1 = CS2100, 0 = Phaselink clock source */ +#define P_GPIO_ADC_RST_N (1 << 6) +#define P_GPIO_MCLK_FSEL (1 << 7) /* Select frequency on Phaselink clock. 0 = 24.576MHz for 48k, 1 = 22.5792MHz for 44.1k.*/ + +#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);} + +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 */ + if (mClk == MCLK_441) + { + gpioVal = P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1; + } + else + { + gpioVal = P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1 | P_GPIO_MCLK_FSEL; + } + + p_gpio <: gpioVal; + + /* Allow MCLK to settle */ + delay_microseconds(20000); + + /* Take ADC out of reset */ + gpioVal |= P_GPIO_ADC_RST_N; + p_gpio <: gpioVal; + + /* Configure ADC for I2S slave mode via I2C */ + unsigned dif = 0, mode = 0; + dif = 0x01; /* I2S */ + mode = 0x03; /* Slave mode all speeds */ + + /* 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 + * Bit[3:2]: DIF[1:0]: Data Format: 0x01 for I2S, 0x02 for TDM + * Bit[1:0]: MODE[1:0]: Mode: 0x11 for slave mode + */ + ADC_REGWRITE(CS5368_GCTL_MDE, 0b10010000 | (dif << 2) | mode); + + /* Reg 0x06: (PDN) Power Down Register */ + /* Bit[7:6]: Reserved + * Bit[5]: PDN-BG: When set, this bit powers-own the bandgap reference + * Bit[4]: PDM-OSC: Controls power to internal oscillator core + * Bit[3:0]: PDN: When any bit is set all clocks going to that channel pair are turned off + */ + ADC_REGWRITE(CS5368_PWR_DN, 0b00000000); + + /* Configure DAC with PCM values. Note 2 writes to mode control to enable/disable freeze/power down */ + /* Take DAC out of reset */ + gpioVal |= P_GPIO_DAC_RST_N; + p_gpio <: gpioVal; + + delay_microseconds(500); + + /* Mode Control 1 (Address: 0x02) */ + /* bit[7] : Control Port Enable (CPEN) : Set to 1 for enable + * bit[6] : Freeze controls (FREEZE) : Set to 1 for freeze + * bit[5] : PCM/DSD Selection (DSD/PCM) : Set to 0 for PCM + * bit[4:1] : DAC Pair Disable (DACx_DIS) : All Dac Pairs enabled + * 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 + * bit[1:0] : Functional Mode (FM) : 0x00 - single-speed mode (4-50kHz) + * : 0x01 - double-speed mode (50-100kHz) + * : 0x10 - quad-speed mode (100-200kHz) + * : 0x11 - auto-speed detect (32 to 200kHz) + * (note, some Mclk/SR ratios not supported in auto) + * + */ + unsigned char regVal = 0; + if(samFreq < 50000) + regVal = 0b00010100; + else if(samFreq < 100000) + regVal = 0b00010101; + else //if(samFreq < 200000) + regVal = 0b00010110; + + DAC_REGWRITE(CS4384_PCM_CTRL, regVal); + + /* Mode Control 1 (Address: 0x02) */ + /* bit[7] : Control Port Enable (CPEN) : Set to 1 for enable + * bit[6] : Freeze controls (FREEZE) : Set to 0 for freeze + * bit[5] : PCM/DSD Selection (DSD/PCM) : Set to 0 for PCM + * bit[4:1] : DAC Pair Disable (DACx_DIS) : All Dac Pairs enabled + * bit[0] : Power Down (PDN) : Not powered down + */ + DAC_REGWRITE(CS4384_MODE_CTRL, 0b10000000); + + return; +} + +void AudioHwInit() +{ + /* Set USB Mux to micro-b */ + /* ADC and DAC in reset */ + p_gpio <: P_GPIO_USB_SEL0 | P_GPIO_USB_SEL1; + + /* Init the i2c module */ + i2c_shared_master_init(r_i2c); +} + diff --git a/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn b/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn new file mode 100644 index 00000000..c2e90f16 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/xk-audio-216-mc.xn @@ -0,0 +1,88 @@ + + + Board + XS2 MC Audio + + tileref tile[2] + tileref usb_tile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --> + --> + + + + + + + + + + --> + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h b/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h new file mode 100644 index 00000000..d83f5a2e --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/xua_conf.h @@ -0,0 +1,30 @@ +// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved + +#ifndef _XUA_CONF_H_ +#define _XUA_CONF_H_ + +#define NUM_USB_CHAN_OUT 2 +#define NUM_USB_CHAN_IN 0 +#define I2S_CHANS_DAC 0 +#define I2S_CHANS_ADC 0 +#define MCLK_441 (512 * 44100) +#define MCLK_48 (512 * 48000) +#define MIN_FREQ 48000 +#define MAX_FREQ 48000 + +#define EXCLUDE_USB_AUDIO_MAIN + +#define XUA_SPDIF_TX_EN 1 +#define SPDIF_TX_INDEX 0 +#define VENDOR_STR "XMOS" +#define VENDOR_ID 0x20B1 +#define PRODUCT_STR_A2 "XUA SPDIF Example" +#define PRODUCT_STR_A1 "XUA SPDIF Example" +#define PID_AUDIO_1 1 +#define PID_AUDIO_2 2 +#define AUDIO_CLASS 2 +#define AUDIO_CLASS_FALLBACK 0 +#define BCD_DEVICE 0x1234 +#define XUA_DFU_EN 0 + +#endif diff --git a/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h b/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h new file mode 100644 index 00000000..c14d64a8 --- /dev/null +++ b/examples/AN00247_xua_example_spdif_tx/src/xud_conf.h @@ -0,0 +1,7 @@ +// Copyright (c) 2017-2018, XMOS Ltd, All rights reserved + +#include "xua_conf.h" + +/* TODO */ +#define XUD_UAC_NUM_USB_CHAN_OUT NUM_USB_CHAN_OUT +#define XUD_UAC_NUM_USB_CHAN_IN NUM_USB_CHAN_IN