blob: fbd4a2fd82430e08abc6fa359300aea76f840f85 [file] [log] [blame]
#! /usr/bin/env python
import string
import sys
import mmap
import argparse
import struct
import time
import array
# optimus: gpio's are 1 bit
width = 1
mask = (1 << width) - 1
addr = 0x90470000
output = 0x0
input = 0x10
direction = 0x4
button = "6"
blue = "12"
red = "13"
debug = 0
simulated = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
simulated[direction] = 0x1800f800
simulated[input] = 0xbdffccbf
simulated[output] = 0x1800c800
# start
if len(sys.argv) > 1 and sys.argv[1] == "-d":
debug = 1
sys.argv.pop(1)
if len(sys.argv) == 1:
print "Usage:", sys.argv[0], "[-d)ebug] [loop=10 ... end] [n] [n=v] [n=input|output] [delay=msecs] [status]"
print " n is 0-31 (gpio index)"
print " v is 0-1 (gpio value)"
print " leave out = to print value"
print " Ex:", sys.argv[0], "loop=10 red=1 delay=100 red=0 delay=100 end"
sys.exit(1)
if not debug:
f = open("/dev/mem", "r+b")
mm = mmap.mmap(f.fileno(), 0x20, offset=addr)
# read/write a register
def getReg(offset):
if debug:
return simulated[offset]
mm.seek(offset)
str = mm.read(4)
r = struct.unpack("L", str)
reg = r[0]
return reg
def setReg(offset, v):
if debug:
simulated[offset] = v
return
str = struct.pack("L", v)
mm.seek(offset)
mm.write(str)
# read/write a bit in a register
def getBit(offset, n):
reg = getReg(offset)
v = ((reg & (1 << n * width)) >> (n * width)) & mask
return v
def setBit(offset, n, v):
# read, and, or, write
reg = getReg(offset)
reg &= ~(mask << n)
reg |= (v & mask) << n
setReg(offset, reg)
# get/set direction
def getDirection(n):
return getBit(direction, n)
def setDirection(n, v):
setBit(direction, n, v)
# read/write a gpio
def getGPIO(n):
isOutput = getDirection(n)
if isOutput:
return getBit(output, n)
else:
return getBit(input, n)
def setGPIO(n, v):
isOutput = getDirection(n)
if isOutput:
setBit(output, n, v)
#
i = 1
loops = [ ]
while i < len(sys.argv):
cmd = sys.argv[i]
kv = string.split(cmd, "=", 2)
k = kv[0]
if k == "status":
print "direction=%08x input=%08x output=%08x" % (getReg(direction), getReg(input), getReg(output))
i += 1
continue
if k == "red":
k = red
elif k == "blue":
k = blue
elif k == "button":
k = button
if len(kv) == 1: # no =
if k == "end":
(start, count) = loops.pop()
count = count - 1
if count <= 0:
i += 1
else:
loops.append([start, count])
i = start
continue
# read gpio
k = int(k)
if k >= 0 and k < 32:
v = getGPIO(k)
print v
i += 1
continue
print "unknown command '" + cmd + "'"
break
v = kv[1]
if v == "input" or v == "in":
setDirection(k, 0)
elif v == "output" or v == "out":
setDirection(k, 1)
else:
v = int(kv[1])
if k == "loop":
loops.append([i + 1, v])
elif k == "delay":
time.sleep(v/1000.0)
else:
k = int(k)
if k >= 0 and k < 32:
setGPIO(k, v)
i += 1