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)
|