| Index: gpio_setup.py
|
| diff --git a/gpio_setup.py b/gpio_setup.py
|
| deleted file mode 100644
|
| index 3c71b755bdf5bb587bcc6b0d71fbff90b65faedf..0000000000000000000000000000000000000000
|
| --- a/gpio_setup.py
|
| +++ /dev/null
|
| @@ -1,230 +0,0 @@
|
| -#!/usr/bin/python
|
| -
|
| -# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""A script to create symlinks to platform specific GPIO pins.
|
| -
|
| -This script creates a set of symlinks pointing at the sys fs files returning
|
| -the appropriate GPIO pin values. Each symlink is named to represent the actual
|
| -GPIO pin function.
|
| -
|
| -The location of the symlinks generated by this script can be specified using
|
| -the --symlink_root command line option. By default /home/gpio directory is
|
| -used. The symlink directory must exist before this script is run.
|
| -
|
| -The GPIO pins' values are available through a GPIO device present in sys fs.
|
| -The device is identified by its PCI bus address. The default PCI address of
|
| -the GPIO device (set to 0:0:1f.0), can be changed using the --pci_address
|
| -command line option.
|
| -
|
| -The platform specific bit usage of the GPIO device is derived from the ACPI,
|
| -also using files found in a fixed location in sys fs. The default location of
|
| -/sys/bus/platform/devices/chromeos_acpi could be changed using the --acpi_root
|
| -command line option.
|
| -
|
| -Each GPIO pin is represented through ACPI as a subdirectory with several files
|
| -in it. A typical name of the GPIO pin file looks as follows:
|
| -
|
| -<acpi_root>/GPIO.<instance>/GPIO.[0-3]
|
| -
|
| -where <instance> is a zero based number assigned to this GPIO pin by the BIOS.
|
| -
|
| -In particular, file GPIO.0 represents encoded pin signal type (from which the
|
| -symlink name is derived), and file GPIO.2 represents the actual zero based
|
| -GPIO pin number within this GPIO device range.
|
| -
|
| -This script reads the ACPI provided mapping, enables the appropriate GPIO pins
|
| -and creates symlinks mapping these GPIOs' values.
|
| -"""
|
| -
|
| -__author__ = 'The Chromium OS Authors'
|
| -
|
| -import glob
|
| -import os
|
| -import optparse
|
| -import sys
|
| -
|
| -GPIO_ROOT = '/sys/class/gpio'
|
| -GPIO_DEVICE_ROOT = GPIO_ROOT + '/gpiochip'
|
| -GPIO_ENABLE_FILE = '/sys/class/gpio/' + 'export'
|
| -
|
| -# Can be changed using --pci_address command line option.
|
| -GPIO_DEVICE_PCI_ADDRESS = '0000:00:1f.0'
|
| -
|
| -# Can be changed using --acpi_root command line option.
|
| -ACPI_ROOT = '/sys/bus/platform/devices/chromeos_acpi'
|
| -GPIO_SIGNAL_TYPE_EXTENSION = '0'
|
| -GPIO_PIN_NUMBER_EXTENSION = '2'
|
| -
|
| -# can be changed using --symlink_root command line option.
|
| -DEFAULT_SYMLINK_ROOT = '/home/gpio'
|
| -
|
| -# This dictionary maps GPIO signal types codes into their actual names.
|
| -GPIO_SIGNAL_TYPES = {
|
| - 1: 'recovery_button',
|
| - 2: 'developer_switch',
|
| - 3: 'write_protect'
|
| - }
|
| -
|
| -# Debug header signal type codes are offset by 0x100, the tuple below
|
| -# represents the range of valid codes for the debug header. The range starts
|
| -# at 0x100 and is 0x100 wide.
|
| -GPIO_DEBUG_HEADER_RANGE = (0x100, 0x100)
|
| -
|
| -# This is used to prepare the option parser: each element is a tuple of
|
| -# strings, including the option name and the option default value.
|
| -option_list = (('symlink_root', DEFAULT_SYMLINK_ROOT),
|
| - ('pci_address', GPIO_DEVICE_PCI_ADDRESS),
|
| - ('acpi_root', ACPI_ROOT))
|
| -
|
| -# This becomes the option object after the command line is parsed.
|
| -cmd_line_options = None
|
| -
|
| -class GpioSetupError(Exception):
|
| - pass
|
| -
|
| -
|
| -class GpioChip(object):
|
| - """Represent GPIO chip available through sys fs.
|
| -
|
| - Attributes:
|
| - pci_address: a string, PCI address of this GPIO device
|
| - base: a number, base global GPIO number of this device (mapped to pin zero
|
| - in the device range)
|
| - capacity: a number, shows the number of GPIO pins of this device.
|
| - description: a multiline string description of this device, initialized
|
| - after the device is attached. Can be used to dump device
|
| - information.
|
| - """
|
| -
|
| - def __init__(self, pci_address):
|
| - self.pci_address = pci_address
|
| - self.base = 0
|
| - self.capacity = 0
|
| - self.description = 'not attached'
|
| -
|
| - def Attach(self):
|
| - for f in glob.glob(GPIO_DEVICE_ROOT + '*/label'):
|
| - label = open(f).read().strip()
|
| - if label == self.pci_address:
|
| - break
|
| - else:
|
| - raise GpioSetupError(
|
| - 'could not find GPIO PCI device %s' % self.pci_address)
|
| - directory = os.path.dirname(f)
|
| - self.base = int(open(directory + '/base').read())
|
| - self.capacity = int(open(directory + '/ngpio').read())
|
| - self.description = '\n'.join(['GPIO device at PCI address %s' %
|
| - self.pci_address,
|
| - 'Base gpio pin %d' % self.base,
|
| - 'Capacity %d' % self.capacity])
|
| -
|
| - def EnablePin(self, pin):
|
| - """Enable a certain GPIO pin.
|
| -
|
| - To enable the pin one needs to write its global GPIO number into
|
| - /sys/class/gpio/export, if this pin has not been enabled yet.
|
| -
|
| - Inputs:
|
| - pin: a number, zero based pin number within this device's range.
|
| - """
|
| -
|
| - if pin >= self.capacity:
|
| - raise GpioSetupError('pin %d exceeds capacity of %d' % (
|
| - pin, self.capacity))
|
| - global_gpio_number = self.base + pin
|
| - if not os.path.exists('%s/gpio%d' % (GPIO_ROOT, global_gpio_number)):
|
| - open(GPIO_ENABLE_FILE, 'w').write('%d' % (global_gpio_number))
|
| -
|
| - def __str__(self):
|
| - return self.description
|
| -
|
| -
|
| -def ParseAcpiMappings():
|
| - """Scan ACPI information about GPIO and generate a mapping.
|
| -
|
| - Returns: a list of tuples, each tuple consisting of a string representing
|
| - the GPIO pin name and a number, representing the GPIO pin within
|
| - the GPIO device space.
|
| - """
|
| - acpi_gpio_mapping = []
|
| - for d in glob.glob('%s/GPIO.[0-9]*' % cmd_line_options.acpi_root):
|
| - signal_type = int(open('%s/GPIO.%s' % (
|
| - d, GPIO_SIGNAL_TYPE_EXTENSION)).read())
|
| -
|
| - pin_number = int(open('%s/GPIO.%s' % (
|
| - d, GPIO_PIN_NUMBER_EXTENSION)).read())
|
| -
|
| - if signal_type in GPIO_SIGNAL_TYPES:
|
| - acpi_gpio_mapping.append((GPIO_SIGNAL_TYPES[signal_type], pin_number))
|
| - continue
|
| -
|
| - # This is not a specific signal, could be a debug header pin.
|
| - debug_header = signal_type - GPIO_DEBUG_HEADER_RANGE[0]
|
| - if debug_header >= 0 and debug_header < GPIO_DEBUG_HEADER_RANGE[1]:
|
| - acpi_gpio_mapping.append(('debug_header_%d' % debug_header, pin_number))
|
| - continue
|
| -
|
| - # Unrecognized mapping, could happen if BIOS version is ahead of this
|
| - # script.
|
| - print 'unknown signal type encoding %d in %d' % (signal_type, d)
|
| -
|
| - if not acpi_gpio_mapping:
|
| - raise GpioSetupError('no gpio mapping found. Is ACPI driver installed?')
|
| -
|
| - return acpi_gpio_mapping
|
| -
|
| -
|
| -def CreateGpioSymlinks(mappings, gpio, symlink_root):
|
| - if not os.path.exists(symlink_root):
|
| - raise GpioSetupError('%s does not exist' % symlink_root)
|
| -
|
| - if not os.path.isdir(symlink_root):
|
| - raise GpioSetupError('%s is not a directory' % symlink_root)
|
| -
|
| - if not os.access(symlink_root, os.W_OK):
|
| - raise GpioSetupError('%s is not writable' % symlink_root)
|
| -
|
| - try:
|
| - os.chdir(symlink_root)
|
| - except OSError:
|
| - raise GpioSetupError('failed to change directory to %s' % symlink_root)
|
| -
|
| - for (symlink, pin) in mappings:
|
| - gpio.EnablePin(pin)
|
| - source_file = '%s/gpio%d/value' % (GPIO_ROOT, pin + gpio.base)
|
| - if not os.path.exists(symlink):
|
| - os.symlink(source_file, symlink)
|
| - continue
|
| - if not os.path.islink(symlink):
|
| - raise GpioSetupError(
|
| - '%s exists but is not a symlink' % os.path.abspath(symlink))
|
| - if os.readlink(symlink) != source_file:
|
| - raise GpioSetupError(
|
| - '%s points to a wrong file' % os.path.abspath(symlink))
|
| -
|
| -
|
| -def ProcessOptions():
|
| - global cmd_line_options
|
| - parser = optparse.OptionParser()
|
| - for (name, default_value) in option_list:
|
| - parser.add_option('--' + name, dest=name, default=default_value)
|
| - (cmd_line_options, _) = parser.parse_args()
|
| -
|
| -
|
| -def main():
|
| - ProcessOptions()
|
| - gpioc = GpioChip(cmd_line_options.pci_address)
|
| - gpioc.Attach()
|
| - CreateGpioSymlinks(ParseAcpiMappings(), gpioc, cmd_line_options.symlink_root)
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - try:
|
| - main()
|
| - except GpioSetupError, e:
|
| - print >> sys.stderr, '%s: %s' % (sys.argv[0].split('/')[-1], e)
|
| - sys.exit(1)
|
| - sys.exit(0)
|
|
|