TS-7400 V2 DIO: Difference between revisions
No edit summary |
|||
Line 284: | Line 284: | ||
<references/> | <references/> | ||
Example code for DIO manipulation: | Example code for CPU DIO manipulation: | ||
<source lang="c"> | <source lang="c"> | ||
#include <assert.h> | #include <assert.h> |
Revision as of 19:33, 14 January 2014
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.
Upper header pin-out (26-pin)
Pin # | Name | Function |
---|---|---|
1 | I2C_DAT | CPU DIO3_25 or I2C Data |
2 | SD_BOOT# | Boot mode pin (SD or NAND) |
3 | GND | Ground |
4 | GND | Ground |
5 | FPGA_DIO_0 | DIO (Will change in next rev) |
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_04 or SPI MISO |
10 | 3.3V | 3.3V Output |
11 | FPGA_DIO_1 | DIO (Will change in next rev) |
12 | SPI_MOSI [1] | CPU DIO2_06 or SPI MOSI |
13 | FPGA_DIO_2 | DIO (Will change in next rev) |
14 | SPI_CLK [1] | CPU DIO2_07 or SPI clock |
15 | 5V | 5V regulated power input |
16 | HARD_REBOOT# | External reset input |
17 | FPGA_DIO_3 | DIO (Will change in next rev) |
18 | GND | Ground |
19 | DIO_19 | CPU DIO1_24 |
20 | GND | Ground |
21 | FPGA_DIO_04 | DIO (Will change in next rev) |
22 | USB_OTG_P | i.MX286 USB OTG data |
23 | FPGA_DIO_5 | DIO (Will change in next rev) |
24 | USB_OTG_M | i.MX286 USB OTG data |
25 | DIO_25 | CPU DIO1_25 |
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 DIO3_13 or CAN RX0 |
14 | CAN_RX1 | CPU DIO3_15 or CAN RX1 |
15 | CAN_TX0 | CPU DIO3_12 or CAN TX0 |
16 | CAN_TX1 | CPU DIO3_14 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 |
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.