Framework for Maintaining Common National Instruments Terminal/Signal names

The contents of this directory are primarily for maintaining and formatting all
known valid signal routes for various National Instruments devices.

Some background:
  There have been significant confusions over the past many years for users
  when trying to understand how to connect to/from signals and terminals on
  NI hardware using comedi.  The major reason for this is that the actual
  register values were exposed and required to be used by users.  Several
  major reasons exist why this caused major confusion for users:

  1) The register values are _NOT_ in user documentation, but rather in
    arcane locations, such as a few register programming manuals that are
    increasingly hard to find and the NI-MHDDK (comments in in example code).
    There is no one place to find the various valid values of the registers.

  2) The register values are _NOT_ completely consistent.  There is no way to
    gain any sense of intuition of which values, or even enums one should use
    for various registers.  There was some attempt in prior use of comedi to
    name enums such that a user might know which enums should be used for
    varying purposes, but the end-user had to gain a knowledge of register
    values to correctly wield this approach.

  3) The names for signals and registers found in the various register level
    programming manuals and vendor-provided documentation are _not_ even
    close to the same names that are in the end-user documentation.

  4) The sets of routes that are valid are not consistent from device to device.
    One additional major challenge is that this information does not seem to be
    obtainable in any programmatic fashion, neither through the proprietary
    NIDAQmx(-base) c-libraries, nor with register level programming, _nor_
    through any documentation.  In fact, the only consistent source of this
    information is through the proprietary NI-MAX software, which currently only
    runs on Windows platforms.  A further challenge is that this information
    cannot be exported from NI-MAX, except by screenshot.



The content of this directory is part of an effort to greatly simplify the use
of signal routing capabilities of National Instruments data-acquisition and
control hardware.  In order to facilitate the transfer of register-level
information _and_ the knowledge of valid routes per device, a few specific
choices were made:


1) The names of the National Instruments signals/terminals that are used in this
  directory are chosen to be consistent with (a) the NI's user level
  documentation, (b) NI's user-level code, (c) the information as provided by
  the proprietary NI-MAX software, and (d) the user interface code provided by
  the user-land comedilib library.

  The impact of this choice implies that one allows the use of CamelScript names
  in the kernel.  In short, the choice to use CamelScript and the exact names
  below is for maintainability, clarity, similarity to manufacturer's
  documentation, _and_ a mitigation for confusion that has plagued the use of
  these drivers for years!

2) The bulk of the real content for this directory is stored in two separate
  collections (i.e. sub-directories) of tables stored in c source files:

  (a) ni_route_values/ni_[series-label]series.c

        This data represents all the various register values to use for the
        multiple different signal MUXes for the specific device families.

        The values are all wrapped in one of three macros to help document and
        track which values have been implemented and tested.
        These macros are:
          V(<value>) : register value is valid, tested, and implemented
          I(<value>) : register value is implemented but needs testing
          U(<value>) : register value is not implemented

        The actual function of these macros will depend on whether the code is
        compiled in the kernel or whether it is compiled into the conversion
        tools.  For the conversion tools, it can be used to indicate the status
        of the register value.  For the kernel, V() and I() both perform the
        same function and prepare data to be used; U() zeroes out the value to
        ensure that it cannot be used.

        *** It would be a great help for users to test these values such that
        these files can be correctly marked/documented ***

  (b) ni_device_routes/[board-name].c

        This data represents the known set of valid signal routes that are
        possible for each specific board.  Although the family defines the
        register values to use for a particular signal MUX, not all possible
        signals are actually available on each board.

        In order for a particular board to take advantage of the effort to
        simplify/clarify signal routing on NI devices, a corresponding
        [board-name].c file must be created.  This file should reflect the known
        valid _direct_ routing capabilities of the board.

        As noted above, the only known consistent source of information for
        valid device routes comes from the proprietary National Instruments
        Windows software, NI-MAX.  Also, as noted above, this information can
        only be visually conveyed from NI-MAX to other media.  To make this
        easier, the naming conventions used in the [board-name].c file are
        similar to the naming conventions as presented by NI-MAX.


3) Two other files aggregate the above data to integrate it into comedi:
    ni_route_values.c
    ni_device_routes.c

  When adding a new [board-name].c file, be sure to also add in the line in
  ni_device_routes.c to include this information into comedi.


4) Several tools have been included to convert from/to the c file formats.
  These tools are best used/demonstrated via the included Makefile targets:
  (a) `make csv-files`
     Creates new csv-files using content of c-files of existing
     ni_routing/* content.  New csv files are placed in csv
     sub-directory.

     As noted above, the only consistent source of information of valid
     device routes comes from the proprietary National Instruments Windows
     software, NI-MAX.  Also, as noted above, this information can only be
     visually conveyed from NI-MAX to other media.  This make target creates
     spreadsheet representations of the routing data.  The choice of using a
     spreadsheet (ala CSV) to copy this information allows for easy direct
     visual comparison to the NI-MAX "Valid Routes" tables.

     Furthermore, the register-level information is much easier to identify and
     correct when entire families of NI devices are shown side by side in table
     format.  This is made easy by using a file-storage format that can be
     loaded into a spreadsheet application.

     Finally, .csv content is very easy to edit and read using a variety of
     tools, including spreadsheets or various other scripting languages.  In
     fact, the tools provided here enable quick conversion of the
     spreadsheet-like .csv format to c-files that follow the kernel coding
     conventions.


  (b) `make c-files`
     Creates new c-files using content of csv sub-directory.  These
     new c-files can be compared to the active content in the
     ni_routing directory.
  (c) `make csv-blank`
     Create a new blank csv file.  This is useful for establishing a
     new data table for either a device family (less likely) or a
     specific board of an existing device family (more likely).
  (d) `make clean`
     Remove all generated files/directories.
  (e) `make everything`
     Build all csv-files, then all new c-files.




In summary, similar confusion about signal routing configuration, albeit less,
plagued NI's previous version of their own proprietary drivers.  Earlier than
2003, NI greatly simplified the situation for users by releasing a new API that
abstracted the names of signals/terminals to a common and intuitive set of
names.  In addition, this new API provided a much more common interface to use
for most of NI hardware.

Comedi already provides such a common interface for data-acquisition and control
hardware.  This effort complements comedi's abstraction layers by further
abstracting much more of the use cases for NI hardware, but allowing users _and_
developers to directly refer to NI documentation (user-level, register-level,
and the register-level examples of the NI-MHDDK).



--------------------------------------------------------------------------------
Various naming conventions and relations:
--------------------------------------------------------------------------------
These are various notes that help to relate the naming conventions used in the
NI-STC with those naming conventions used here.
--------------------------------------------------------------------------------

  Signal sources for most signals-destinations are given a specific naming
  convention, although the register values are not consistent.  This next table
  shows the mapping between the names used in comedi for NI and those names
  typically used within the NI-STC documentation.

  (comedi)                      (NI-STC input or output)    (NOTE)
  ------------------------------------------------------------------------------
  TRIGGER_LINE(i)               RTSI_Trig_i_Output_Select   i in range [0..7]
  NI_AI_STOP                    AI_STOP
  NI_AI_SampleClock             AI_START_Select
  NI_AI_SampleClockTimebase     AI_SI                       If internal sample
                                                            clock signal is used
  NI_AI_StartTrigger            AI_START1_Select
  NI_AI_ReferenceTrigger        AI_START2_Select            for pre-triggered
                                                            acquisition---not
                                                            currently supported
                                                            in comedi
  NI_AI_ConvertClock            AI_CONVERT_Source_Select
  NI_AI_ConvertClockTimebase    AI_SI2                      If internal convert
                                                            signal is used
  NI_AI_HoldCompleteEvent
  NI_AI_PauseTrigger            AI_External_Gate
  NI_AO_SampleClock             AO_UPDATE
  NI_AO_SampleClockTimebase     AO_UI
  NI_AO_StartTrigger            AO_START1
  NI_AO_PauseTrigger            AO_External_Gate
  NI_DI_SampleClock
  NI_DO_SampleClock
  NI_MasterTimebase
  NI_20MHzTimebase              TIMEBASE 1 && TIMEBASE 3 if no higher clock exists
  NI_80MHzTimebase              TIMEBASE 3
  NI_100kHzTimebase             TIMEBASE 2
  NI_10MHzRefClock
  PXI_Clk10
  NI_CtrOut(0)                  GPFO_0                      external ctr0out pin
  NI_CtrOut(1)                  GPFO_1                      external ctr1out pin
  NI_CtrSource(0)
  NI_CtrSource(1)
  NI_CtrGate(0)
  NI_CtrGate(1)
  NI_CtrInternalOutput(0)       G_OUT0, G0_TC               for Ctr1Source, Ctr1Gate
  NI_CtrInternalOutput(1)       G_OUT1, G1_TC               for Ctr0Source, Ctr0Gate
  NI_RGOUT0                     RGOUT0                      internal signal
  NI_FrequencyOutput
  #NI_FrequencyOutputTimebase
  NI_ChangeDetectionEvent
  NI_RTSI_BRD(0)
  NI_RTSI_BRD(1)
  NI_RTSI_BRD(2)
  NI_RTSI_BRD(3)
  #NI_SoftwareStrobe
  NI_LogicLow
  NI_CtrA(0)                    G0_A_Select                 see M-Series user
                                                            manual (371022K-01)
  NI_CtrA(1)                    G1_A_Select                 see M-Series user
                                                            manual (371022K-01)
  NI_CtrB(0)                    G0_B_Select, up/down        see M-Series user
                                                            manual (371022K-01)
  NI_CtrB(1)                    G1_B_Select, up/down        see M-Series user
                                                            manual (371022K-01)
  NI_CtrZ(0)                                                see M-Series user
                                                            manual (371022K-01)
  NI_CtrZ(1)                                                see M-Series user
                                                            manual (371022K-01)
