Difference between revisions of "Application note - GPIO on fitlet2 with FC-SCG running Linux"

From fit-PC wiki
Jump to: navigation, search
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
fitlet2 supports I2C GPIO extender if configured with the [http://fit-pc.com/wiki/index.php/Fitlet2_FACET_Cards#FC-SCG FC-SCG FACET]
+
* This application note applies to fitlet2 with [http://fit-pc.com/wiki/index.php/Fitlet2_FACET_Cards#FC-SCG FC-SCG] FACET-Card running Linux.
 +
* It provides an example of how to use the supported I2C GPIO extender feature of FC-SCG under Linux.
  
==I2c gpio extender binding and usage==
+
==I2C GPIO extender binding and usage==
  
 
1. Make sure that the kernel you use supports the necessary driver.  
 
1. Make sure that the kernel you use supports the necessary driver.  
 
<br>Check the following entries in the kernel config:
 
<br>Check the following entries in the kernel config:
 +
<pre>
 +
CONFIG_GPIO_PCA953X=[y]
 +
CONFIG_I2C=y
 +
CONFIG_I2C_CHARDEV=y
 +
</pre>
 +
2. Make sure that the appropriate I2C bus is enabled in BIOS settings: <br>
 +
Chipset -> South Cluster Configuration -> LPSS Configuration LPSS I2C #[1-8] Support is set to ACPI mode or PCI mode Set LPSS I2C #[1-8] Speed is set to Standard Mode of Fast Mode
 +
<br>'''NOTE:''' It’s strongly recommended that all buses are enabled in the range of 1-7
  
CONFIG_GPIO_PCA953X=[y]
+
3.Find the GPIO extender on an I2C bus:
CONFIG_I2C=y
+
<pre>
CONFIG_I2C_CHARDEV=y
+
readonly dev_func='17.2'  
 
+
busnum=$(ls -l /sys/bus/i2c/devices/ | sed -ne
2. Make sure that the appropriate I2C bus is enabled in BIOS settings:
+
"/${dev_func}\/i2c_designware/ s/^.*i2c-\([[:digit:]]\{1,2\}\)$/\1/p")
Chipset -> South Cluster Configuration -> LPSS Configuration
+
busaddr=$(i2cdetect -y -r $busnum | sed -ne
'''LPSS I2C #[1-8]''' Support is set to '''ACPI mode or PCI mode
+
's/^.*\(\(27\|4e\)\).*$/0x\1/Ip')
Set LPSS I2C #[1-8] Speed''' is set to '''Standard Mode''' of '''Fast Mode'''
+
busaddr=$((busaddr))
 
+
printf "Device found @ 0x%x on bus %i\n" $busaddr $busnum
'''NOTE:''' All buses must be enabled in the range 1-7, not only I2C-7
+
</pre>
 
+
'''Note:''' PCA9335 chip should be found at address 0x27, whereas XRA1201 chip at 0x4e
 
+
3. Determine the type of the GPIO extender chip. Possible options are:
+
 
+
* PCA9335
+
* XRA1201 For this purpose i2cdetect utility may be used:
+
 
+
i2cdetect -y -r 7
+
 
+
PCA9335 chip should be found at address 0x27, whereas XRA1201 chip at 0x4e
+
 
+
 
+
4. Issue the following command (superuser privileges are necessary)
+
 
+
echo pca9535 0x27> /sys/bus/i2c/devices/i2c-7/new_device
+
 
+
in case  pca9535 chip found
+
 
+
or
+
 
+
echo pca9535 0x4e> /sys/bus/i2c/devices/i2c-7/new_device
+
 
+
and check the kernel debug messages for a line like that:
+
  
 +
4. Bind the above found device to driver (superuser privileges are necessary)
 +
<pre>
 +
echo pca9535 $busaddr >/sys/bus/i2c/devices/i2c-${busnum}/new_device
 +
</pre>
 +
Then check the kernel debug messages for a line like the following:
 +
<pre>
 
i2c i2c-7: new_device: Instantiated device pca9535 at 0x27
 
i2c i2c-7: new_device: Instantiated device pca9535 at 0x27
 +
</pre>
 +
5. To find the appropriate GPIO, issue the command:
 +
<pre>
 +
ls /sys/bus/i2c/drivers/pca953x/
 +
</pre>
 +
Then look the output for a line like:
 +
<pre>
 +
7-0027
 +
</pre>
 +
And then issue the command:
 +
<pre>
 +
ls /sys/class/gpio/gpiochip*/device -l
 +
</pre>
 +
Afterwards, look at the output for a line like the following:
 +
<pre>
 +
/sys/class/gpio/gpiochip251/device -> ../../../7-0027
 +
</pre>
  
 +
The bus number and address has to be the same in both cases (7 and 27 in the example).
 +
Hence, the gpiochip251 is to be sought; the individual GPIO line number are from 251 to 251+15
  
5. To find the appropriate GPIO issue the command:
+
6. The GPIO found may be operated over sysfs interface in the following way:
 
+
issue the commands:
ls /sys/bus/i2c/drivers/pca953x/
+
<pre>
 
+
export n=251 # desired GPIO number
and look the output for a line like this:
+
echo $n >/sys/class/gpio/export
 
+
echo out >/sys/class/gpio/gpio$n/direction # desired direction in/out
'''7-0027'''
+
cat /sys/class/gpio/gpio$n/value # read the input value
 
+
echo 1 > /sys/class/gpio/gpio$n/value # write a value for output
and then issue the command:
+
</pre>
 
+
ls /sys/class/gpio/gpiochip*/device -l
+
 
+
and look the output for a line like this:
+
 
+
/sys/class/gpio/gpiochip251/device -> ../../../'''7-0027'''
+
 
+
The bus number and address have to be the same in the both cases (7 and 27 in the example).
+
Hence, the gpiochip251 is the sought; the individual GPIO line number are from 251 to 251+15
+
 
+
 
+
6. The found GPIO may be operated over sysfs interface in the following way:
+
<b>issue the commands:
+
  
export n=251 # desired GPIO number
+
[[category: fitlet2]]
echo $n >/sys/class/gpio/export
+
[[category: software]]
echo out >/sys/class/gpio/gpio$n/direction # desired direction in/out
+
[[category: Extension boards]]
cat /sys/class/gpio/gpio$n/value # read the input value
+
[[category: application notes]]
echo 1 > /sys/class/gpio/gpio$n/value # write a value for output
+

Latest revision as of 14:35, 5 March 2019

  • This application note applies to fitlet2 with FC-SCG FACET-Card running Linux.
  • It provides an example of how to use the supported I2C GPIO extender feature of FC-SCG under Linux.

I2C GPIO extender binding and usage

1. Make sure that the kernel you use supports the necessary driver.
Check the following entries in the kernel config:

CONFIG_GPIO_PCA953X=[y]
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y

2. Make sure that the appropriate I2C bus is enabled in BIOS settings:
Chipset -> South Cluster Configuration -> LPSS Configuration LPSS I2C #[1-8] Support is set to ACPI mode or PCI mode Set LPSS I2C #[1-8] Speed is set to Standard Mode of Fast Mode
NOTE: It’s strongly recommended that all buses are enabled in the range of 1-7

3.Find the GPIO extender on an I2C bus:

readonly dev_func='17.2' 
busnum=$(ls -l /sys/bus/i2c/devices/ | sed -ne 
"/${dev_func}\/i2c_designware/ s/^.*i2c-\([[:digit:]]\{1,2\}\)$/\1/p") 
busaddr=$(i2cdetect -y -r $busnum | sed -ne 
's/^.*\(\(27\|4e\)\).*$/0x\1/Ip') 
busaddr=$((busaddr)) 
printf "Device found @ 0x%x on bus %i\n" $busaddr $busnum 

Note: PCA9335 chip should be found at address 0x27, whereas XRA1201 chip at 0x4e

4. Bind the above found device to driver (superuser privileges are necessary)

echo pca9535 $busaddr >/sys/bus/i2c/devices/i2c-${busnum}/new_device

Then check the kernel debug messages for a line like the following:

i2c i2c-7: new_device: Instantiated device pca9535 at 0x27

5. To find the appropriate GPIO, issue the command:

ls /sys/bus/i2c/drivers/pca953x/

Then look the output for a line like:

7-0027

And then issue the command:

ls /sys/class/gpio/gpiochip*/device -l

Afterwards, look at the output for a line like the following:

/sys/class/gpio/gpiochip251/device -> ../../../7-0027

The bus number and address has to be the same in both cases (7 and 27 in the example). Hence, the gpiochip251 is to be sought; the individual GPIO line number are from 251 to 251+15

6. The GPIO found may be operated over sysfs interface in the following way: issue the commands:

export n=251 # desired GPIO number
echo $n >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio$n/direction # desired direction in/out
cat /sys/class/gpio/gpio$n/value # read the input value
echo 1 > /sys/class/gpio/gpio$n/value # write a value for output