summaryrefslogtreecommitdiffstats
path: root/firmware/upload.rb
diff options
context:
space:
mode:
authorJenna Fox <a@creativepony.com>2012-09-24 09:56:28 +1000
committerJenna Fox <a@creativepony.com>2012-09-24 09:56:28 +1000
commit7713be1d2555c1a0b1cb8b2dbc47682cadc840fb (patch)
tree44eeeef5b0f82770ac9af7414d5462c24dfafdd0 /firmware/upload.rb
parent9f99d9540e9992432d65c23d89432a387c1b0d54 (diff)
downloadmicronucleus-7713be1d2555c1a0b1cb8b2dbc47682cadc840fb.tar.gz
micronucleus-7713be1d2555c1a0b1cb8b2dbc47682cadc840fb.tar.bz2
micronucleus-7713be1d2555c1a0b1cb8b2dbc47682cadc840fb.zip
Trying to bring in lous' eraseApplication mechanism.
Diffstat (limited to 'firmware/upload.rb')
-rw-r--r--firmware/upload.rb12
1 files changed, 11 insertions, 1 deletions
diff --git a/firmware/upload.rb b/firmware/upload.rb
index e3b77b2..f49a94f 100644
--- a/firmware/upload.rb
+++ b/firmware/upload.rb
@@ -5,6 +5,7 @@ class MicroBoot
Functions = [
:get_info,
:write_page,
+ :erase_application,
:run_program
]
@@ -30,7 +31,7 @@ class MicroBoot
@info = {
flash_length: flash_length,
page_size: page_size,
- write_sleep: write_sleep.to_f / 1000.0,
+ write_sleep: 0.020, #write_sleep.to_f / 1000.0,
version: "#{@device.bcdDevice >> 8}.#{@device.bcdDevice & 0xFF}",
version_numeric: @device.bcdDevice
}
@@ -38,11 +39,20 @@ class MicroBoot
@info
end
+ def erase!
+ info = self.info
+ control_transfer(function: :erase_application)
+ sleep(info[:write_sleep] * ((info[:flash_length] / info[:page_size]) + 1)) # sleep for as many pages as the chip has
+ end
+
# upload a new program
def program= bytestring
+ info = self.info
raise "Program too long!" if bytestring.bytesize > info[:flash_length]
bytes = bytestring.bytes.to_a
+ erase!
+
address = 0
bytes.each_slice(info[:page_size]) do |bytes|
control_transfer(function: :write_page, wIndex: address, wValue: bytes.length, dataOut: bytes.pack('C*'))