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