Change logSoftware for the AX10410

I decided not to write a device driver, because that will cause to much overhead. To access the I/O space I used the Linux ioperm function and the macro's in asm/io.h. Although this is very fast, it has a drawback: only root (or suid root) programs may call ioperm. (As a kind of workaround I wrote the CtrlUnlock program.) I also decided not to use any kind of synchronization or protection, also to keep the speed as high as possible. The accompanying drawback is that all accesses should take place in one thread, to avoid problems with concurrent accesses.

After some experiments I made 5 functions:

int CtrlInit(void)
This function checks the presence of the AX10410 card and the jumper/switch settings as far as possible. It expects the AX10410 to be set at I/O base 0x310, 16-channel, unipolar analog input mode. If anything is wrong, it reports an error on stderr and returns -1. When everything is OK, it returns 0.
int CtrlAin(int channel)
This functions reads the specified analog input channel. The channel parameter must between 0 and 15 (including 0 and 15). It returns a integer where 0 represents 0 Volt and 4095 represents 10 Volts. If the channel parameter is out of bounds, the function returns -1. After conversion, the result is checked. If something went wrong, an error is reported on stderr and the function returns -1.
int CtrlAout(int channel, int value)
This functions sets the value of an analog output. The channel parameter must be 0 or 1, the value parameter must be between 0 and 4095 (representing 0 and 10 Volts). If the channel parameter is out of bounds the function returns -1. If the value parameter is out of bounds, the value is set to the appropriate limit. If no errors occured, the function returns the value as written to the analog output.
int CtrlDin(int bitmask)
This function returns TRUE if any of the digital inputs in parameter bitmask is   active, else it returns FALSE (0). The least significant bit in bitmask represents digital input 0.
int CtrlDout(int bitmask, int value)
The digital outputs are set to parameter value. Outputs with corresponding bits clear in parameter bitmask are not affected. In boolean terms that is : new_outputs = (old_outputs AND NOT(bitmask)) OR (value AND bitmask). The function returns the new value of all outputs.

Change logThe CtrlUnlock program

Because it isn't feasable to run every program as root, I wrote CtrlUnlock. This executable must be installed SETUID root. You must specify a program to run on the CtrlUnlock command-line. This program will be given access to the AX10410 I/O space. Subprocesses started by the program will not get access. All arguments after the program to run will be passed to the program. An example:

    ./CtrlUnlock wish

will start wish with access to the I/O space. In wish the Ctrl* routines can be used now (again: not in any subprocesses started by wish!).

Change logThe sources and installation

The current version is 1.1 of 21 June 1999. The sources are distributed as one gzipped tar file: ctrl-1.1.tar.gz. Unpacking it will create a subdirectory ctrl. Included in the distribution is a Makefile to compile c.q. build the object file with the routines and the CtrlUnlock program. Any user may do this. To make CtrlUnlock SETUID, root must run make install. To use the Ctrl* routines, just link your program with the Ctrl.o object file.