From d9d3a81b236449c8b94e8f2ed59dd7d06b6a877c Mon Sep 17 00:00:00 2001 From: mgreiff <marcusgreiff.93@hotmail.com> Date: Thu, 24 Aug 2017 01:41:23 +0200 Subject: [PATCH] Add functional GPIO code for writing high/low to any pin --- src/BeagleBone/BeagleBone.jl | 3 +- src/BeagleBone/GPIO.jl | 84 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/BeagleBone/GPIO.jl diff --git a/src/BeagleBone/BeagleBone.jl b/src/BeagleBone/BeagleBone.jl index 56d2799..a6a0150 100644 --- a/src/BeagleBone/BeagleBone.jl +++ b/src/BeagleBone/BeagleBone.jl @@ -3,9 +3,10 @@ # read(::T, identifier) include("SysLED.jl") +include("GPIO.jl") #List of available devices and their constructors -const DEVICES = Dict("sysled" => SysLED()) +const DEVICES = Dict("sysled" => SysLED(), "gpio" => GPIO()) """ dev = getdev(devname) diff --git a/src/BeagleBone/GPIO.jl b/src/BeagleBone/GPIO.jl new file mode 100644 index 0000000..e1d748a --- /dev/null +++ b/src/BeagleBone/GPIO.jl @@ -0,0 +1,84 @@ +""" +Lowest form of communication woth the GPIO pins. The available pins are +listed in the "channel" parameter, and appear as directories in /sys/class. +Any of these GPIOs can be run in various ways, with any operation specified +by a sequence of three entries + + (channel, operation, entry) = (int32, int32, String) + +For instance, if the GPIO "gpio30" is to be configured as a output pin and set +to high, the following two writes aould be done. + + write!(GPIO, 14, 2, "out") + write!(GPIO, 14, 1, "1") + +""" +struct GPIO +end + +writeOperations = [ + Dict("dir" => "value", "entries"=>["1", "0"]) + Dict("dir" => "direction", "entries"=>["in", "out"]) +] + +readOperations = [ + "value" + "direction" + "edge" +] + +channels =[ + "gpio112" + "gpio114" + "gpio115" + "gpio116" + "gpio14" + "gpio15" + "gpio2" + "gpio20" + "gpio22" + "gpio23" + "gpio26" + "gpio27" + "gpio3" + "gpio30" + "gpio31" + "gpio4" + "gpio44" + "gpio45" + "gpio46" + "gpio47" + "gpio48" + "gpio49" + "gpio5" + "gpio50" + "gpio51" + "gpio60" + "gpio61" + "gpio65" + "gpio66" + "gpio67" + "gpio68" + "gpio69" + "gpio7" +] + +function write!(::GPIO, index::Int32, operation::Int32, entry::Bool) + (index <= 0 || index > length(channels)) && error("Invalid GPIO index: $index") + (operation <= 0 || operation > length(writeOperations)) && error("Invalid GPIO operation: $operation") + filename = "/sys/class/gpio/$(channels[index])/$(writeOperations[operation]["dir"])" + + value = writeOperations[operation]["entries"][entry ? 1 : 2] + file = open(filename, "r+") + + write(file, "$(value)") + close(file) + return +end + +#function Base.read(::SysLED, ind::Int32) +# (ind < 0 || ind > length(channels)) && error("Invalid SysLEND ind: $ind") +# println("not yet supported") +# l = 0 +# return l == "1" +#end -- GitLab