From 46e93c4d18db338e23aa075dd88a662b3289f5c4 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 3 Apr 2014 21:40:24 -0700 Subject: [PATCH 1/3] Updated paths for BeagleBone Black + Kernel 3.1.13. Added support for reading analog inputs. --- beaglebone.rb | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/beaglebone.rb b/beaglebone.rb index 720c52e..1548df5 100644 --- a/beaglebone.rb +++ b/beaglebone.rb @@ -1,7 +1,10 @@ module Beagle EXPORTS = {} + PATHS = { - :gpio => 'tmp/sys/class/gpio', + :gpio => '/sys/class/gpio', + :capemgr => '/sys/devices/bone_capemgr.9', + :analog => '/sys/devices/ocp.3/helper.15', :omap_mux => '/sys/kernel/debug/omap_mux' } @@ -87,7 +90,7 @@ def needs_export? def export puts "exporting #{self.to_s}" - File.open(File.join(PATHS[:gpio], 'exports'), 'w') do |exports| + File.open(File.join(PATHS[:gpio], 'export'), 'w') do |exports| exports << @pin end Beagle::EXPORTS[@pin] = @options @@ -101,4 +104,40 @@ def to_s end end + class Analog + @@ENABLED = false + + def initialize(pin) + @pin = parse(pin) + enable if need_enabling? + end + + def parse(pin) + p = pin.to_i + raise ArgumentError.new("Bad analog pin #{p}") unless p.between?(0,7) + p + end + + def need_enabling? + !@@ENABLED + end + + def enable + puts "enabling analog pins" + File.open(File.join(PATHS[:capemgr], 'slots'), 'w') do |slots| + slots << "cape-bone-iio\n" + end + @@ENABLED = true + end + + def value + val = -1 + File.open(File.join(PATHS[:analog], "AIN#{@pin.to_s}"), 'r') do |analog_value| + val = analog_value.read + end + val = val.to_i + raise RangeError.new("Failed to read from pin #{@pin}") unless val.between?(0,4096) + val + end + end end \ No newline at end of file From 14e7a9741a102fd07fbe36faa726d0b40ae59730 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 4 Apr 2014 21:42:16 -0700 Subject: [PATCH 2/3] Added basic support for PWM pins. --- beaglebone.rb | 67 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/beaglebone.rb b/beaglebone.rb index 1548df5..faf5212 100644 --- a/beaglebone.rb +++ b/beaglebone.rb @@ -1,10 +1,12 @@ module Beagle - EXPORTS = {} + GPIOEXPORTS = {} + PWMEXPORTS = {} PATHS = { :gpio => '/sys/class/gpio', :capemgr => '/sys/devices/bone_capemgr.9', :analog => '/sys/devices/ocp.3/helper.15', + :pwm =>'/sys/devices/ocp.3/', :omap_mux => '/sys/kernel/debug/omap_mux' } @@ -85,15 +87,15 @@ def value end def needs_export? - !Beagle::EXPORTS.keys.include?(@pin) + !Beagle::GPIOEXPORTS.keys.include?(@pin) end def export - puts "exporting #{self.to_s}" + puts "exporting GPIO pin #{self.to_s}" File.open(File.join(PATHS[:gpio], 'export'), 'w') do |exports| exports << @pin end - Beagle::EXPORTS[@pin] = @options + Beagle::GPIOEXPORTS[@pin] = @options end def to_s @@ -140,4 +142,61 @@ def value val end end + + + class PWM + attr_accessor :duty, :period, :run + + def initialize(pin) + @pin = parse(pin) + export if needs_export? + end + + def parse(pin) + p = pin.to_s + p + end + + def needs_export? + !Beagle::PWMEXPORTS.keys.include?(@pin) + end + + def export + puts "exporting PWM pin #{self.to_s}" + File.open(File.join(PATHS[:capemgr], 'slots'), 'w') do |slots| + slots << "am33xx_pwm\n" + end + + File.open(File.join(PATHS[:capemgr], 'slots'), 'w') do |slots| + slots << "bone_pwm_P#{self.to_s}""\n" + end + Beagle::PWMEXPORTS[@pin] = Dir.glob(File.join(PATHS[:pwm], "pwm_test_P#{self.to_s}.*")).first + end + + def duty=(v) + v = v.to_i + File.open(File.join(Beagle::PWMEXPORTS[@pin], "duty"), 'w') do |f| + f << "#{v}\n" + end + end + + def period=(v) + v = v.to_i + File.open(File.join(Beagle::PWMEXPORTS[@pin], "period"), 'w') do |f| + f << "#{v}\n" + end + end + + def run=(v) + v = v.to_i + raise ArgumentError.new("Bad run value #{v}") unless v.between?(0,1) + File.open(File.join(Beagle::PWMEXPORTS[@pin], "run"), 'w') do |f| + f << "#{v}\n" + end + end + + def to_s + @pin.to_s + end + end end \ No newline at end of file From 4ca744c5f25ca533f0e2712554a696d7a5ee07cc Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 10 Apr 2014 21:54:13 -0700 Subject: [PATCH 3/3] Added polarity setter since on my BBB the polarity appears to be reversed by default. --- beaglebone.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/beaglebone.rb b/beaglebone.rb index faf5212..ed3c8fb 100644 --- a/beaglebone.rb +++ b/beaglebone.rb @@ -180,6 +180,14 @@ def duty=(v) end end + def polarity=(v) + v = v.to_i + raise ArgumentError.new("Bad run value #{v}") unless v.between?(0,1) + File.open(File.join(Beagle::PWMEXPORTS[@pin], "polarity"), 'w') do |f| + f << "#{v}\n" + end + end + def period=(v) v = v.to_i File.open(File.join(Beagle::PWMEXPORTS[@pin], "period"), 'w') do |f|