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() : register value is valid, tested, and implemented I() : register value is implemented but needs testing U() : 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)