| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python | 
|  | 2 |  | 
|  | 3 | import sys | 
|  | 4 | import os | 
|  | 5 | import getopt | 
| Brad Bishop | 0b380f7 | 2016-06-10 00:29:50 -0400 | [diff] [blame] | 6 | import obmc_system_config as System | 
| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 7 |  | 
|  | 8 |  | 
|  | 9 | def printUsage(): | 
|  | 10 | print '\nUsage:' | 
| Brad Bishop | 0b380f7 | 2016-06-10 00:29:50 -0400 | [diff] [blame] | 11 | print 'gpioutil -n GPIO_NAME  [-v value]' | 
|  | 12 | print 'gpioutil -i GPIO_NUM  -d <DIRECTION = in,out,falling,rising,both> [-v value]' | 
|  | 13 | print 'gpioutil -p PIN_NAME  -d <DIRECTION = in,out,falling,rising,both> [-v value]' | 
|  | 14 | print 'gpioutil -l PIN_NAME     (lookup pin name only)' | 
| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 15 | exit(1) | 
|  | 16 |  | 
|  | 17 |  | 
|  | 18 |  | 
| Brad Bishop | 0b380f7 | 2016-06-10 00:29:50 -0400 | [diff] [blame] | 19 | if (len(sys.argv) < 2): | 
| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 20 | printUsage() | 
|  | 21 |  | 
| Adriana Kobylak | ff47af2 | 2016-06-16 09:27:37 -0500 | [diff] [blame] | 22 | # Pop the command name and point to the args | 
|  | 23 | sys.argv.pop(0) | 
|  | 24 |  | 
| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 25 | GPIO_SYSFS = '/sys/class/gpio/' | 
|  | 26 |  | 
|  | 27 | class Gpio: | 
|  | 28 | def __init__(self,gpio_num): | 
|  | 29 | self.gpio_num = str(gpio_num) | 
|  | 30 | self.direction = '' | 
|  | 31 | self.interrupt = '' | 
|  | 32 | self.exported = False | 
|  | 33 |  | 
|  | 34 | def getPath(self,name): | 
|  | 35 | return GPIO_SYSFS+'gpio'+self.gpio_num+'/'+name | 
|  | 36 |  | 
|  | 37 | def export(self): | 
|  | 38 | if (os.path.exists(GPIO_SYSFS+'export') == False): | 
|  | 39 | raise Exception("ERROR - GPIO_SYSFS path does not exist.  Does this platform support GPIOS?") | 
|  | 40 | if (os.path.exists(GPIO_SYSFS+'gpio'+self.gpio_num) == False): | 
|  | 41 | self.write(GPIO_SYSFS+'export',self.gpio_num) | 
|  | 42 |  | 
|  | 43 | self.exported = True | 
|  | 44 |  | 
|  | 45 | def setDirection(self,dir): | 
|  | 46 | if (self.exported == False): | 
|  | 47 | raise Exception("ERROR - Not exported: "+self.getPath()) | 
|  | 48 |  | 
|  | 49 | self.direction = '' | 
|  | 50 | self.interrupt = '' | 
|  | 51 | if (dir == 'in' or dir == 'out'): | 
|  | 52 | self.direction = dir | 
|  | 53 | elif (dir == 'rising' or | 
|  | 54 | dir == 'falling' or | 
|  | 55 | dir == 'both'): | 
|  | 56 | self.direction = 'in' | 
|  | 57 | self.interrupt = dir | 
|  | 58 | self.write(self.getPath('edge'),self.interrupt) | 
|  | 59 | else: | 
|  | 60 | raise Exception("ERROR - Invalid Direction: "+dir) | 
|  | 61 |  | 
|  | 62 |  | 
|  | 63 | self.write(self.getPath('direction'),self.direction) | 
|  | 64 |  | 
|  | 65 | def setValue(self,value): | 
|  | 66 | if (value == '0'): | 
|  | 67 | self.write(self.getPath('value'),'0') | 
|  | 68 | elif (value == '1'): | 
|  | 69 | self.write(self.getPath('value'),'1') | 
|  | 70 | else: | 
|  | 71 | raise Exception("ERROR - Invalid value: "+value) | 
|  | 72 |  | 
|  | 73 | def getValue(self): | 
|  | 74 | return self.read(self.getPath('value')) | 
|  | 75 |  | 
|  | 76 | def write(self,path,data): | 
|  | 77 | f = open(path,'w') | 
|  | 78 | f.write(data) | 
|  | 79 | f.close() | 
|  | 80 |  | 
|  | 81 |  | 
|  | 82 | def read(self,path): | 
|  | 83 | f = open(path,'r') | 
|  | 84 | data = f.readline() | 
|  | 85 | f.close() | 
|  | 86 | return data | 
|  | 87 |  | 
|  | 88 |  | 
|  | 89 |  | 
|  | 90 | if __name__ == '__main__': | 
|  | 91 |  | 
|  | 92 | try: | 
|  | 93 | opts, args = getopt.getopt(sys.argv,"hn:i:d:v:p:l:") | 
|  | 94 | except getopt.GetoptError: | 
|  | 95 | printUsage() | 
|  | 96 |  | 
|  | 97 |  | 
|  | 98 |  | 
|  | 99 | lookup = False | 
|  | 100 | gpio_name = "" | 
|  | 101 | value = "" | 
|  | 102 | direction = "" | 
|  | 103 | for opt, arg in opts: | 
|  | 104 | if opt == '-h': | 
|  | 105 | printUsage() | 
|  | 106 |  | 
|  | 107 | elif opt in ("-n"): | 
|  | 108 | gpio_name = arg | 
|  | 109 | lookup = True | 
|  | 110 | elif opt in ("-i"): | 
|  | 111 | gpio_name = arg | 
|  | 112 | elif opt in ("-d"): | 
|  | 113 | direction = arg | 
|  | 114 | elif opt in ("-v"): | 
|  | 115 | value = arg | 
|  | 116 | elif opt in ("-p"): | 
|  | 117 | gpio_name = System.convertGpio(arg) | 
|  | 118 | elif opt in ("-l"): | 
|  | 119 | gpio_name = System.convertGpio(arg) | 
|  | 120 | print gpio_name | 
|  | 121 | exit(0) | 
|  | 122 |  | 
|  | 123 | gpio_info = {} | 
|  | 124 | if (lookup == True): | 
|  | 125 | if (System.GPIO_CONFIG.has_key(gpio_name) == False): | 
|  | 126 | print "ERROR - GPIO Name doesn't exist" | 
|  | 127 | print "Valid names: " | 
|  | 128 | for n in System.GPIO_CONFIG: | 
|  | 129 | print "\t"+n | 
|  | 130 | exit(0) | 
|  | 131 | gpio_info = System.GPIO_CONFIG[gpio_name] | 
|  | 132 | direction = gpio_info['direction'] | 
| Norman James | 0db7297 | 2015-10-28 13:07:04 -0500 | [diff] [blame] | 133 | if (gpio_info.has_key('gpio_num')): | 
|  | 134 | gpio_name = str(gpio_info['gpio_num']) | 
|  | 135 | else: | 
|  | 136 | gpio_name = str(System.convertGpio(gpio_info['gpio_pin'])) | 
| Norman James | 6bbe0b5 | 2015-10-27 09:18:05 -0500 | [diff] [blame] | 137 | print "GPIO ID: "+gpio_name+"; DIRECTION: "+direction | 
|  | 138 |  | 
|  | 139 |  | 
|  | 140 | ## Rules | 
|  | 141 | if (gpio_name == ""): | 
|  | 142 | print "ERROR - Gpio not specified" | 
|  | 143 | printUsage() | 
|  | 144 |  | 
|  | 145 | if (direction == "in" and value != ""): | 
|  | 146 | print "ERROR - Value cannot be specified when direction = in" | 
|  | 147 | printUsage() | 
|  | 148 |  | 
|  | 149 | gpio = Gpio(gpio_name) | 
|  | 150 | try: | 
|  | 151 | gpio.export() | 
|  | 152 | if (direction != ""): | 
|  | 153 | gpio.setDirection(direction) | 
|  | 154 |  | 
|  | 155 | if (value == ""): | 
|  | 156 | print gpio.getValue() | 
|  | 157 | else: | 
|  | 158 | gpio.setValue(value) | 
|  | 159 |  | 
|  | 160 | except Exception as e: | 
|  | 161 | print e | 
|  | 162 |  |