1#!/usr/bin/env python 2 3import sys 4import os 5import getopt 6import obmc_system_config as System 7 8 9def printUsage(): 10 print '\nUsage:' 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)' 15 exit(1) 16 17 18 19if (len(sys.argv) < 2): 20 printUsage() 21 22# Pop the command name and point to the args 23sys.argv.pop(0) 24 25GPIO_SYSFS = '/sys/class/gpio/' 26 27class 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 90if __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'] 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'])) 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 163