TS-7400 V2 DIO
This board uses CPU DIO, typically there are 4 functions associated with each physical pin (I2C, PWM, SPI, DIO, etc). See the CPU manual for the complete listing and for information on how to control these DIO.
Note that most of the pins start in their "Function" mode and must be set to DIO mode to be able to be used as DIO. Be aware that doing this on a running system may have adverse effects if there are kernel drivers trying to use specific pins in their peripheral mode(s).
DIO numbers are referenced in bank_pin notation in the table below. This makes associating pins with DIO registers much simpler when looking at the manual. The example code below is also based around using the bank and pin notation.
DIO can be directly manipulated with tshwctl, for example:
tshwctl --setdio 3_25 #Set pin 1 of the 26 pin header high
tshwctl --clrdio 0_17 #Turn on the red LED by setting the pin low
tshwctl --getdio 1_16,1_17 #Get the input state of pin 1 and 3 of the 44 pin header
See the end of this section for example software to manipulate DIO pins.
Upper header pin-out (26-pin)
Pin # | Name | Function |
---|---|---|
1 | I2C_DAT | CPU DIO3_25 or I2C Data |
2 | M0_SW_CLK | Reserved |
3 | GND | Ground |
4 | M0_SW_DIO | Reserved |
5 | CPU DIO1_7 | CPU DIO1_7 |
6 | I2C_CLK | CPU DIO3_24 or I2C Clock |
7 | DEBUG_TXD | Debug UART TXD |
8 | DEBUG_RXD | Debug UART RX |
9 | SPI_MISO [1] | CPU DIO2_4 or SPI MISO |
10 | AUX 3.3V | 3.3V Output |
11 | CPU DIO1_8 | CPU DIO1_8 |
12 | SPI_MOSI [1] | CPU DIO2_06 or SPI MOSI |
13 | CPU DIO1_9 | CPU DIO1_9 |
14 | SPI_CLK [1] | CPU DIO2_07 or SPI clock |
15 | 5V | 5V regulated power input |
16 | HARD_REBOOT# | External reset switch input |
17 | CPU DIO1_10 | CPU DIO1_10 |
18 | GND | Ground |
19 | DIO_19 | CPU DIO1_24 |
20 | GND | Ground |
21 | CPU DIO1_11 | CPU DIO1_11 |
22 | USB_OTG_P | i.MX286 USB OTG data (host mode only) |
23 | CPU DIO1_12 | CPU DIO1_12 |
24 | USB_OTG_M | i.MX286 USB OTG data (most mode only) |
25 | DIO_25 | CPU DIO1_25(1.6v) |
26 | USB_SW_5V | Switched USB 5V power |
Lower header pin-put (40-pin)
Pin # | Name | Function |
---|---|---|
1 | DIO_00 | CPU DIO1_16 |
2 | 3.3V | 3.3V Output |
3 | DIO_01 | CPU DIO1_17 |
4 | DIO_02 | CPU DIO1_18 |
5 | DIO_03 | CPU DIO1_19 |
6 | DIO_04 | CPU DIO1_20 |
7 | DIO_05 | CPU DIO1_21 |
8 | DIO_06 | CPU DIO1_22 |
9 | DIO_07 | CPU DIO1_23 |
10 | DIO_08 | CPU DIO1_15 |
11 | DIO_09 | CPU DIO1_14 |
12 | GND | Ground |
13 | CAN_RX0 | CPU DIO0_23 or CAN RX0 |
14 | CAN_RX1 | CPU DIO0_19 or CAN RX1 |
15 | CAN_TX0 | CPU DIO0_22 or CAN TX0 |
16 | CAN_TX1 | CPU DIO0_18 or CAN TX1 |
17 | UART3_TXD | CPU DIO2_19 or UART3 |
18 | 5V | 5V regulated power input |
19 | DIO_15 | CPU DIO3_29 or PWM4 |
20 | UART2_RXD | CPU DIO2_16 or UART2 |
21 | UART2_TXD | CPU DIO2_17 or UART2 |
22 | UART0_TXD | CPU DIO3_01 or UART0 |
23 | UART0_RXD | CPU DIO3_00 or UART0 |
24 | UART1_RXD | CPU DIO3_04 or UART1 |
25 | UART1_TXD | CPU DIO3_05 or UART1 |
26 | UART3_RXD | CPU DIO2_18 or UART3 |
27 | ADC0 | i.MX286 ADC0 |
28 | ADC1 | i.MX286 ADC1 |
29 | ADC2 | i.MX286 ADC2 |
30 | ADC3 | i.MX283 ADC3 |
31 | GND | Ground |
32 | I2S_BIT_CLK | CPU DIO3_22 or I2S Clock |
33 | I2S_TXD | CPU DIO3_23 or I2S TXD |
34 | I2S_FRAME | CPU DIO3_21 or I2S Frame |
35 | I2S_MCLK | CPU DIO3_20 or I2S MCLK |
36 | I2S_RXD | CPU DIO3_26 or I2S RXD |
37 | SPI_MOSI [1] | CPU DIO2_06 or SPI MOSI |
38 | SPI_MISO [1] | CPU DIO2_04 or SPI MISO |
39 | SPI_CS# [1] | CPU DIO2_05 or SPI Chip select |
40 | SPI_CLK [1] | CPU DIO2_07 or SPI Clock |
Other
Name | DIO |
---|---|
GRN_LED# | CPU DIO0_28 |
RED_LED# | CPU DIO0_17 |
Example code for CPU DIO manipulation:
#include <assert.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define DIO_Z 2
volatile unsigned int *pinctl = NULL;
/*******************************************************************************
* setdiopin: accepts a DIO register and value to place in that DIO pin.
* Values can be 0 (low), 1 (high), or 2 (z - high impedance).
*******************************************************************************/
void setdiopin(int bank, int pin, int val)
{
if(val == 2) {
pinctl[((0xB00) + (0x10 * bank) + 0x8)/4] = (0x1 << pin);
} else {
pinctl[((0x700) + (0x10 * bank) + (0x8 / (val+1)))/4] =
(0x1 << pin);
pinctl[((0xB00) + (0x10 * bank) + 0x4)/4] = (0x1 << pin);
}
}
/*******************************************************************************
* getdiopin: accepts a DIO pin number and returns its value.
*******************************************************************************/
int getdiopin(int bank, int pin)
{
return (((pinctl[((0x900) + (0x10 * bank))/4]) >> pin) & 0x1);
}
/*******************************************************************************
* Main: accept input from the command line and act accordingly.
*******************************************************************************/
int main(int argc, char **argv)
{
int devmem = 0;
int pin, bank, reg = 0, muxpin;
int val;
int returnedValue;
// Check for invalid command line arguments
if ((argc > 4) | (argc < 3)) {
printf("Usage: %s bank pin [0|1|2]>\n", argv[0]);
return 1;
}
// We only want to get val if there are more than 3 command line arguments
if (argc == 3) {
bank = strtoul(argv[1], NULL, 0);
pin = strtoul(argv[2], NULL, 0);
val = 0;
}
else {
bank = strtoul(argv[1], NULL, 0);
pin = strtoul(argv[2], NULL, 0);
val = strtoul(argv[3], NULL, 0);
}
assert(bank >= 0 && bank < 5);
assert(pin >= 0 && pin < 32);
assert(val >=0 && val < 3);
devmem = open("/dev/mem", O_RDWR|O_SYNC);
pinctl = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, devmem, 0x80018000);
/* We determine what muxsel reg we need, and set the right pin to DIO*/
if(pin > 15) {
reg = 1;
muxpin = pin - 16;
} else muxpin = pin;
pinctl[((0x100) + (0x20 * bank) + (0x10 * reg) + 0x4)/4] = (0x3 << (muxpin * 2));
// Parse through the command line arguments, check for valid inputs, and exec
if (argc == 3) {
returnedValue = getdiopin(bank, pin);
printf("dio_%d_%d=%d\n", bank, pin, returnedValue);
} else if(argc == 4) {
setdiopin(bank, pin, val);
}
return 0;
}
tsctl can also be used to manipulate the DIO of the TS-7400_V2, a tarball of libtsctl can be found here. See the tsctl page for more information.