TS-7400 V2 DIO: Difference between revisions
No edit summary |
(Update CPU manual URL) |
||
(16 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
This board uses CPU DIO, typically there are 4 functions associated with each physical pin (I2C, PWM, SPI, DIO, etc). See the [ | This board uses CPU DIO, typically there are 4 functions associated with each physical pin (I2C, PWM, SPI, DIO, etc). See the [https://www.nxp.com/docs/en/reference-manual/MCIMX28RM.pdf CPU manual] for the complete listing and for information on how to control these DIO.<br><br> | ||
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).<br><br> | 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).<br><br> | ||
DIO numbers are referenced in | DIO numbers are referenced in <source inline><bank>_<pin></source> 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 <source inline>tshwctl</source>, for example: | |||
<source lang=bash> | |||
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 | |||
</source> | |||
See the end of this section for example software to manipulate DIO pins. | |||
<br> | |||
<br> | <br> | ||
==Upper header pin-out (26-pin)== | ===Upper header pin-out (26-pin)=== | ||
{| | |||
| | |||
{| class="zebra wikitable sortable" | {| class="zebra wikitable sortable" | ||
! Pin # | ! Pin # | ||
Line 15: | Line 26: | ||
|- | |- | ||
| 2 | | 2 | ||
| | | M0_SW_CLK | ||
| | | Reserved | ||
|- | |- | ||
| 3 | | 3 | ||
Line 23: | Line 34: | ||
|- | |- | ||
| 4 | | 4 | ||
| | | M0_SW_DIO | ||
| | | Reserved | ||
|- | |- | ||
| 5 | | 5 | ||
| | | CPU DIO1_7 | ||
| DIO | | [[#DIO|CPU DIO1_7]] | ||
|- | |- | ||
| 6 | | 6 | ||
Line 44: | Line 55: | ||
| 9 | | 9 | ||
| SPI_MISO <ref name="spiconn">These two SPI ports are electrically connected and are the same interface</ref> | | SPI_MISO <ref name="spiconn">These two SPI ports are electrically connected and are the same interface</ref> | ||
| [[#DIO|CPU | | [[#DIO|CPU DIO2_4]] or [[#SPI|SPI MISO]] | ||
|- | |- | ||
| 10 | | 10 | ||
| 3.3V | | AUX 3.3V | ||
| 3.3V Output | | 3.3V Output | ||
|- | |- | ||
| 11 | | 11 | ||
| | | CPU DIO1_8 | ||
| DIO | | [[#DIO|CPU DIO1_8]] | ||
|- | |- | ||
| 12 | | 12 | ||
Line 59: | Line 70: | ||
|- | |- | ||
| 13 | | 13 | ||
| | | CPU DIO1_9 | ||
| DIO | | [[#DIO|CPU DIO1_9]] | ||
|- | |- | ||
| 14 | | 14 | ||
Line 72: | Line 83: | ||
| 16 | | 16 | ||
| HARD_REBOOT# | | HARD_REBOOT# | ||
| External reset input | | External reset switch input | ||
|- | |- | ||
| 17 | | 17 | ||
| | | CPU DIO1_10 | ||
| DIO | | [[#DIO|CPU DIO1_10]] | ||
|- | |- | ||
| 18 | | 18 | ||
Line 91: | Line 102: | ||
|- | |- | ||
| 21 | | 21 | ||
| | | CPU DIO1_11 | ||
| DIO | | [[#DIO|CPU DIO1_11]] | ||
|- | |- | ||
| 22 | | 22 | ||
| USB_OTG_P | | USB_OTG_P | ||
| i.MX286 USB OTG data | | i.MX286 USB OTG data (host mode only) | ||
|- | |- | ||
| 23 | | 23 | ||
| | | CPU DIO1_12 | ||
| DIO | | [[#DIO|CPU DIO1_12]] | ||
|- | |- | ||
| 24 | | 24 | ||
| USB_OTG_M | | USB_OTG_M | ||
| i.MX286 USB OTG data | | i.MX286 USB OTG data (host mode only) | ||
|- | |- | ||
| 25 | | 25 | ||
| DIO_25 | | DIO_25 | ||
| [[#DIO|CPU DIO1_25]] | | [[#DIO|CPU DIO1_25]](1.6v) | ||
|- | |- | ||
| 26 | | 26 | ||
| USB_SW_5V | | USB_SW_5V | ||
| Switched USB 5V power | | Switched USB 5V power | ||
|} | |||
| [[File:TS-7400_V2_26_Pin.png|400px]] | |||
|} | |} | ||
==Lower header pin-put (40-pin)== | ===Lower header pin-put (40-pin)=== | ||
{| | |||
| | |||
{| class="zebra wikitable sortable" | {| class="zebra wikitable sortable" | ||
! Pin # | ! Pin # | ||
Line 171: | Line 186: | ||
| 13 | | 13 | ||
| CAN_RX0 | | CAN_RX0 | ||
| [[#DIO|CPU | | [[#DIO|CPU DIO0_23]] or [[#CAN|CAN RX0]] / [[#DIO|CPU DIO2_21]] | ||
|- | |- | ||
| 14 | | 14 | ||
| CAN_RX1 | | CAN_RX1 | ||
| [[#DIO|CPU | | [[#DIO|CPU DIO0_19]] or [[#CAN|CAN RX1]] / [[#DIO|CPU DIO3_02]] | ||
|- | |- | ||
| 15 | | 15 | ||
| CAN_TX0 | | CAN_TX0 | ||
| [[#DIO|CPU | | [[#DIO|CPU DIO0_22]] or [[#CAN|CAN TX0]] / [[#DIO|CPU DIO2_20]] | ||
|- | |- | ||
| 16 | | 16 | ||
| CAN_TX1 | | CAN_TX1 | ||
| [[#DIO|CPU | | [[#DIO|CPU DIO0_18]] or [[#CAN|CAN TX1]] / [[#DIO|CPU DIO3_03]] | ||
|- | |- | ||
| 17 | | 17 | ||
Line 226: | Line 241: | ||
|- | |- | ||
| 27 | | 27 | ||
| | | LRADC_ADC1 | ||
| [[#ADC|i. | | [[#ADC|i.MX28 LRADC 1]] | ||
|- | |- | ||
| 28 | | 28 | ||
| | | LRADC_ADC2 | ||
| [[#ADC|i. | | [[#ADC|i.MX28 LRADC 2]] | ||
|- | |- | ||
| 29 | | 29 | ||
| | | LRADC_ADC3 | ||
| [[#ADC|i. | | [[#ADC|i.MX28 LRADC 3]] | ||
|- | |- | ||
| 30 | | 30 | ||
| | | HSADC | ||
| [[#ADC|i. | | [[#ADC|i.MX28 HSADC]] | ||
|- | |- | ||
| 31 | | 31 | ||
Line 281: | Line 296: | ||
| [[#DIO|CPU DIO2_07]] or [[#SPI|SPI Clock]] | | [[#DIO|CPU DIO2_07]] or [[#SPI|SPI Clock]] | ||
|} | |} | ||
| [[File:TS-7400_V2_40_Pin.png|400px]] | |||
|} | |||
===Other=== | |||
{| class="zebra wikitable sortable" | |||
!Name | |||
!DIO | |||
|- | |||
| GRN_LED# | |||
| [[#DIO|CPU DIO0_28]] | |||
|- | |||
| RED_LED# | |||
| [[#DIO | CPU DIO0_17]] | |||
|- | |||
| EN_ETH_POWER# | |||
| [[#DIO | CPU DIO0_6]] | |||
|- | |||
| EN_USB_5V | |||
| [[#DIO | CPU DIO1_27]] | |||
|- | |||
| EN_CAN# | |||
| [[#DIO | CPU DIO3_30]] | |||
|} | |||
<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> | ||
Line 373: | Line 412: | ||
} | } | ||
</source><br> | </source><br> | ||
Latest revision as of 17:14, 29 June 2020
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)
|
Lower header pin-put (40-pin)
|
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 |
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;
}