TS-7840 FPGA GPIO Core

From embeddedTS Manuals

This FPGA includes two banks of GPIO with atomic set/clr for data and output enable, as well as level based IRQs. Under Linux this is exposed as /dev/gpiochip2 and /dev/gpiochip3. These character devices are normally accessed with libgpiod. The utilities from libgpiod are included in our shipping image and allow accessing GPIO from the shell prompt.

See gpioinfo for a list of all usable GPIO:

gpioinfo /dev/gpiochip2 /dev/gpiochip3 /dev/gpiochip4

Returns:

gpiochip2 - 32 lines:
	line   0:  "uart0_irq"       unused   input  active-high 
	line   1:  "uart1_irq"       unused   input  active-high 
	line   2:  "uart2_irq"       unused   input  active-high 
	line   3:  "uart3_irq"       unused   input  active-high 
	line   4:  "uart4_irq"       unused   input  active-high 
	line   5:  "uart5_irq"       unused   input  active-high 
	line   6:  "uart6_irq"       unused   input  active-high 
	line   7:  "uart7_irq"       unused   input  active-high 
	line   8:  "uart8_irq"       unused   input  active-high 
	line   9:      unnamed       unused   input  active-high 
	line  10:    "can_irq"       unused   input  active-high 
	line  11:    "spi_irq"  "interrupt"   input  active-high [used]
	line  12:      unnamed       unused   input  active-high 
	line  13:      unnamed       unused   input  active-high 
	line  14:   "sdio_irq"       unused   input  active-high 
	line  15:    "sd_busy"       unused   input  active-high 
	line  16: "power_fail_3v_pad" unused input active-high 
	line  17: "detect_9478_pad" unused input active-high 
	line  18: "cpu_access_fpga_flash" unused input active-high 
	line  19: "magjack_1_led_padn" "right-green-led" output active-low [used]
	line  20: "blu_led_padn" "right-red-led" output active-low [used]
	line  21: "right_grn_led_padn" "middle-green-led" output active-low [used]
	line  22: "right_red_led_padn" "middle-yellow-led" output active-low [used]
	line  23: "middle_grn_led_padn" "left-green-led" output active-low [used]
	line  24: "middle_yel_led_padn" "left-yellow-led" output active-low [used]
	line  25: "left_grn_led_padn" unused input active-high 
	line  26: "left_yel_led_padn" "phy-0-led" output active-low [used]
	line  27:  "bt_en_pad"       unused   input  active-high 
	line  28: "wifi_en_pad" unused output active-high 
	line  29: "prog_silab_clk_padn" unused input active-high 
	line  30: "prog_silab_data_pad" unused input active-high 
	line  31: "cpu_push_sw_padn" unused input active-high 
gpiochip3 - 32 lines:
	line   0:   "DIG_IO_1"       unused   input  active-high 
	line   1:   "DIG_IO_2"       unused   input  active-high 
	line   2:   "DIG_IO_3"       unused   input  active-high 
	line   3: "en_hs_sw_pad" unused input active-high 
	line   4: "mikro_pwm_pad" unused input active-high 
	line   5: "dio_fault_3v_padn" unused input active-high 
	line   6: "en_poe_padn" unused input active-high 
	line   7: "i2c_poe_clk_pad" "scl" input active-high [used]
	line   8: "i2c_poe_dat" "sda" input active-high [used]
	line   9: "spi_0_fpga_cs3_pad" unused input active-high 
	line  10: "cage1_sda_pad" "sda" input active-high [used]
	line  11: "cage1_scl_pad" "scl" input active-high [used]
	line  12: "cage1_present_padn" unused input active-high 
	line  13: "cage2_present_padn" unused input active-high 
	line  14: "cage2_sda_pad" "sda" input active-high [used]
	line  15: "cage2_scl_pad" "scl" input active-high [used]
	line  16: "en_nimbel_4v_pad" unused input active-high 
	line  17: "en_nimbel_3v3_pad" unused input active-high 
	line  18: "en_emmc_3v3_pad" unused input active-high 
	line  19: "en_modem_5v_pad" unused input active-high 
	line  20: "en_usb_5v_pad" unused output active-high 
	line  21: "disable_nim_usb_pad" unused input active-high 
	line  22: "mini_pcie_reset_padn" unused output active-high 
	line  23: "ssd_present_padn" unused input active-high 
	line  24: "en_xbee_usb_padn" unused input active-high 
	line  25: "aux_i2c_dat_pad" "sda" input active-high [used]
	line  26: "aux_i2c_clk_pad" "scl" input active-high [used]
	line  27:      unnamed       unused   input  active-high 
	line  28:      unnamed       unused   input  active-high 
	line  29:      unnamed       unused   input  active-high 
	line  30:      unnamed       unused   input  active-high 
	line  31:      unnamed       unused   input  active-high 
gpiochip4 - 32 lines:
	line   0: "ird_network_rdy_pad" unused input active-high 
	line   1: "ird_modem_on_pad" unused input active-high 
	line   2: "eth_100_act_padn" unused input active-high 
	line   3: "eth_100_speed_padn" unused input active-high 
	line   4: "ssd_act_padn" unused input active-high 
	line   5: "mini_sr_latch_pad" unused input active-high 
	line   6:      unnamed       unused   input  active-high 
	line   7:      unnamed       unused   input  active-high 
	line   8:      unnamed       unused   input  active-high 
	line   9:      unnamed       unused   input  active-high 
	line  10: "mikro_int_pad" unused input active-high 
	line  11: "mikro_reset_padn" unused input active-high 
	line  12: "mikro_an_3v_pad" unused input active-high 
	line  13: "mikro_i2c_clk_pad" "scl" input active-high [used]
	line  14: "mikro_i2c_dat_pad" "sda" input active-high [used]
	line  15: "alt_mikro_pwm_pad" unused input active-high 
	line  16: "mikro_an_pwm_pad" unused input active-high 
	line  17:   "comp_pad"       unused   input  active-high 
	line  18: "mikro_180_pad" unused input active-high 
	line  19: "en_mini_5v_pad" unused input active-high 
	line  20: "magjack_0_led_padn" "phy-1-led" output active-low [used]
	line  21: "hd10_2_pad"       unused   input  active-high 
	line  22: "hd10_4_pad"       unused   input  active-high 
	line  23: "hd10_5_pad"       unused   input  active-high 
	line  24: "hd10_6_pad"       unused   input  active-high 
	line  25: "hd10_8_pad"       unused   input  active-high 
	line  26:   "jp1_padn"       unused   input  active-high 
	line  27:   "jp2_padn"       unused   input  active-high 
	line  28:      unnamed       unused   input  active-high 
	line  29:      unnamed       unused   input  active-high 
	line  30:      unnamed       unused   input  active-high 
	line  31:      unnamed       unused   input  active-high 

From here, commands such as gpioget and gpioset can be used:

gpioget /dev/gpiochip2 31 # Get cpu_push_sw_padn
# Returns 1 when not pressed, 0 when pressed

gpioset /dev/gpiochip3 21=0 # Set en_usb_5v_pad to 0, turning off USB 5V
gpioset /dev/gpiochip3 21=1 # Re-enable USB

These driver interfaces should be used in most cases, but the register documentation is provided for driver writers or for those with reasons to go directly to the hardware:

GPIO Read Decodes
Offset Description
0x00 Output Enable [1]
0x04 Output Data
0x0C Data In
0x10 IRQ Enable [2]
0x14 IRQ Status [3]
0x18 IRQ nPOL [4]
GPIO Write Decodes
Offset Description
0x00 Output Enable Set
0x04 Output Enable Clear
0x08 Output Data Set
0x0c Output Data Clear
0x10 IRQ Enable
0x18 IRQ nPOL
  1. Output when 1, input when 0
  2. IRQ Enabled when 1, input when 0
  3. IRQ triggered when 1. The PCIe interrupt is only triggered if IRQ Enable is set, but this status will reflect changes whether or not the enable is on.
  4. IRQ active high when 0, active low when 1