TS-7400 V2 DIO

From embeddedTS Manuals

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 (host 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 / CPU DIO2_21
14 CAN_RX1 CPU DIO0_19 or CAN RX1 / CPU DIO3_02
15 CAN_TX0 CPU DIO0_22 or CAN TX0 / CPU DIO2_20
16 CAN_TX1 CPU DIO0_18 or CAN TX1 / CPU DIO3_03
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 LRADC_ADC1 i.MX28 LRADC 1
28 LRADC_ADC2 i.MX28 LRADC 2
29 LRADC_ADC3 i.MX28 LRADC 3
30 HSADC i.MX28 HSADC
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
EN_ETH_POWER# CPU DIO0_6
EN_USB_5V CPU DIO1_27
EN_CAN# CPU DIO3_30


  1. 1.0 1.1 1.2 1.3 1.4 1.5 1.6 These two SPI ports are electrically connected and are the same interface

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;
}