origen_arm_debug 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e004df0c8d145be274dae133a25750de5d4775d
4
- data.tar.gz: 661b0086a39ef3e4287cd97e7c551ee35f81fc01
3
+ metadata.gz: 528eb3303524b33d1916c73c72a003e9ab5b2880
4
+ data.tar.gz: fb08b4c3360b61dc8732ad9bcf6065896fc638c3
5
5
  SHA512:
6
- metadata.gz: f3b76b470b1247868e15f9fafd851401fa747b504df323ffb3d9c593c18401ce8ad69da7b4b92c4f38a994b7483d78c22a1c37b6d2a81f0368ce4e327244d043
7
- data.tar.gz: b09cb03684e736f2f7f9adc80ae8dc05f35ae03771b4bbcabca4aebfc04442daf8532a9eb4e97cb1dfca95c69466c0034317f579188cbb9690b16e652dbc8127
6
+ metadata.gz: 19abcb44c8b1fed4d00f1cab8828dccd640b2ee2bdf0f903867fd179e720e5d1ada1fcaf57691735238e606eac71237ee0cbc0f0991840b533e82433b4005345
7
+ data.tar.gz: a8daf8a46d1d3f2c9c68bc66a1ab94aa828c074e24e7d05e26749cd774bca47a30b8fc57bda31b08614a05e05925b2639efb080408fb8afa02c7c90b5f304d1b
@@ -30,7 +30,7 @@ class OrigenARMDebugApplication < Origen::Application
30
30
 
31
31
  # Ensure that all tests pass before allowing a release to continue
32
32
  def validate_release
33
- if !system("origen examples") #|| !system("origen specs")
33
+ if !system("origen examples") || !system("origen specs")
34
34
  puts "Sorry but you can't release with failing tests, please fix them and try again."
35
35
  exit 1
36
36
  else
data/config/commands.rb CHANGED
@@ -17,6 +17,10 @@ aliases ={
17
17
  # Now branch to the specific task code
18
18
  case @command
19
19
 
20
+ when "specs"
21
+ require "rspec"
22
+ exit RSpec::Core::Runner.run(['spec'])
23
+
20
24
  when "examples"
21
25
  Origen.load_application
22
26
  status = 0
@@ -49,6 +53,7 @@ when "examples"
49
53
  # before handing control back to Origen. Un-comment the example below to get started.
50
54
  else
51
55
  @application_commands = <<-EOT
56
+ specs Run the specs (unit tests), -c will enable coverage
52
57
  examples Run the examples (tests), -c will enable coverage
53
58
  EOT
54
59
 
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenARMDebug
2
2
  MAJOR = 0
3
- MINOR = 6
3
+ MINOR = 7
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
 
@@ -56,7 +56,12 @@ module OrigenARMDebug
56
56
  # the cycles corresponding to those bits only (don't care cycles will be generated for the others).
57
57
  # @param [Hash] options Options to customize the operation
58
58
  def read_register(reg_or_val, options = {})
59
- mem_ap.read(reg_or_val.address, size: reg_or_val.size, compare_data: reg_or_val.data)
59
+ if options[:ap].nil?
60
+ ap = mem_ap # default to 'mem_ap' if no AP is specified as an option
61
+ else
62
+ ap = options[:ap]
63
+ end
64
+ ap.read_register(reg_or_val, options)
60
65
  end
61
66
 
62
67
  # Write data to a MEM-AP register
@@ -67,7 +72,16 @@ module OrigenARMDebug
67
72
  # the cycles corresponding to those bits only (don't care cycles will be generated for the others).
68
73
  # @param [Hash] options Options to customize the operation
69
74
  def write_register(reg_or_val, options = {})
70
- mem_ap.write(reg_or_val.address, reg_or_val.data, size: reg_or_val.size)
75
+ if options[:ap].nil?
76
+ ap = mem_ap # default to 'mem_ap' if no AP is specified as an option
77
+ else
78
+ ap = options[:ap]
79
+ end
80
+ ap.write_register(reg_or_val, options)
81
+ end
82
+
83
+ def inspect_driver
84
+ Origen.log.info "ARM Debug Driver = #{arm_debug_driver}"
71
85
  end
72
86
 
73
87
  private
@@ -65,6 +65,55 @@ module OrigenARMDebug
65
65
  # -----------------------------------------------------------------------------
66
66
  # User API
67
67
  # -----------------------------------------------------------------------------
68
+ def read_register(reg_or_val, options = {})
69
+ if reg_or_val.respond_to?(:data)
70
+ addr = reg_or_val.addr
71
+ options = { reg: reg_or_val }.merge(options)
72
+ else
73
+ addr = reg_or_val # if not a register, use the 'val' as target addr
74
+ end
75
+
76
+ options = { size: 32 }.merge(options)
77
+ options = { r_mask: 'mask', r_attempts: 1 }.merge(options)
78
+ msg = 'Arm Debug: Shift out data for reading'
79
+ options = { arm_debug_comment: msg }.merge(options)
80
+ size = options[:size]
81
+
82
+ set_size(size)
83
+ set_addr(addr)
84
+ debug_port.read_ap(drw_reg_addr, options)
85
+ rdata = get_rdata(size, addr, rdata)
86
+ increment_addr
87
+
88
+ cc "MEM-AP(#{@name}): R-#{size.to_s(10)}: "\
89
+ "addr=0x#{addr.to_s(16).rjust(size / 4, '0')}"
90
+ end
91
+
92
+ def write_register(reg_or_val, options = {});
93
+ if reg_or_val.respond_to?(:data)
94
+ addr = reg_or_val.addr
95
+ wdata = reg_or_val.data
96
+ options = { reg: reg_or_val }.merge(options)
97
+ else
98
+ addr = reg_or_val # if not a register, use the 'val' as target addr
99
+ wdata = options[:wdata]
100
+ end
101
+ options = { size: 32 }.merge(options)
102
+ options = { w_attempts: 1 }.merge(options)
103
+ msg = "Arm Debug: Shift in data to write: #{wdata.to_hex}"
104
+ options = { arm_debug_comment: msg }.merge(options)
105
+ size = options[:size]
106
+
107
+ set_size(size)
108
+ set_addr(addr)
109
+ wdata = get_wdata(size, addr, wdata)
110
+ debug_port.write_ap(drw_reg_addr, wdata, options)
111
+ increment_addr
112
+
113
+ cc "MEM-AP(#{@name}): WR-#{size.to_s(10)}: "\
114
+ "addr=0x#{addr.to_s(16).rjust(size / 4, '0')}, "\
115
+ "data=0x#{wdata.to_s(16).rjust(size / 4, '0')}"
116
+ end
68
117
 
69
118
  # Method to read from a mem_ap register
70
119
  #
@@ -34,10 +34,7 @@ module OrigenARMDebug
34
34
  @imp = implementation
35
35
  else
36
36
  msg = "SWJ-DP: '#{implementation}' implementation not supported. JTAG and SWD only"
37
- Origen.log.error msg
38
-
39
- # Just default to jtag for now
40
- @imp = :jtag
37
+ fail msg
41
38
  end
42
39
 
43
40
  @write_ap_dly = 8
@@ -145,7 +142,7 @@ module OrigenARMDebug
145
142
  # Create another copy of options with select keys removed.
146
143
  # This first read is junk so we do not want to store it or compare it.
147
144
  junk_options = options.clone.delete_if do |key, val|
148
- (key.eql?(:r_mask) && val.eql?('store')) || key.eql?(:compare_data)
145
+ (key.eql?(:r_mask) && val.eql?('store')) || key.eql?(:compare_data) || key.eql?(:reg)
149
146
  end
150
147
 
151
148
  apacc_access(addr, rwb, random, 0, junk_options)
@@ -165,7 +162,7 @@ module OrigenARMDebug
165
162
  # @param [Hash] options Options to customize the operation
166
163
  def read_expect_ap(addr, edata, options = {})
167
164
  options[:edata] = edata
168
- read_ap(name, options)
165
+ read_ap(addr, options)
169
166
  end
170
167
  alias_method :wait_read_expect_ap, :read_expect_ap
171
168
 
@@ -339,9 +336,9 @@ module OrigenARMDebug
339
336
  # @param [Hash] options Options to customize the operation
340
337
  def acc_access(addr, rwb, ap_dp, wdata, options = {})
341
338
  if @imp == :swd
342
- acc_access_swd(addr, rwb, ap_dp, wdata, options = {})
339
+ acc_access_swd(addr, rwb, ap_dp, wdata, options)
343
340
  else
344
- acc_access_jtag(addr, rwb, ap_dp, wdata, options = {})
341
+ acc_access_jtag(addr, rwb, ap_dp, wdata, options)
345
342
  end
346
343
  end
347
344
 
@@ -354,7 +351,13 @@ module OrigenARMDebug
354
351
  # @param [Hash] options Options to customize the operation
355
352
  def acc_access_swd(addr, rwb, ap_dp, wdata, options = {})
356
353
  if (rwb == 1)
357
- swd.read(ap_dp, addr, options)
354
+ if options[:reg].nil?
355
+ swd.read(ap_dp, addr, options)
356
+ else
357
+ # make sure reg.addr = addr
358
+ Origen.log.error 'SWJ_DP ERROR: In acc_access_swd, addr does not match options[:reg].addr'
359
+ swd.read(ap_dp, options[:reg], options)
360
+ end
358
361
  else
359
362
  swd.write(ap_dp, addr, wdata, options)
360
363
  end
@@ -379,12 +382,27 @@ module OrigenARMDebug
379
382
  end
380
383
 
381
384
  attempts.times do
382
- if name == 'RDBUFF'
383
- r = $dut.reg(:dap)
384
- if options[:r_mask] == 'store'
385
- r.bits(3..34).store
386
- elsif options.key?(:compare_data)
387
- r.bits(3..34).data = options[:compare_data]
385
+ if rwb == 1
386
+ if options[:reg].nil?
387
+ r = $dut.reg(:dap)
388
+ if options[:r_mask] == 'store'
389
+ r.bits(3..34).store
390
+ elsif options.key?(:compare_data)
391
+ r.bits(3..34).data = options[:compare_data]
392
+ elsif options.key?(:edata)
393
+ options[:compare_data] = options[:edata]
394
+ r.bits(3..34).data = options[:edata]
395
+ end
396
+ else
397
+ r = $dut.reg(:dap)
398
+ r.reset
399
+ r.bits(3..34).data = options[:reg].data
400
+ (3..34).each do |i|
401
+ r.bits(i).read if options[:reg].bits(i - 3).is_to_be_read?
402
+ end
403
+ (3..34).each do |i|
404
+ r.bits(i).store if options[:reg].bits(i - 3).is_to_be_stored?
405
+ end
388
406
  end
389
407
 
390
408
  options = options.merge(size: r.size)
@@ -1,17 +1,29 @@
1
1
  Pattern.create do
2
2
 
3
3
  ss "Test write register, should write value 0xFF01"
4
- $dut.reg(:test).write!(0xFF01)
5
- ss "Test read register, should read value 0xFF01"
4
+ $dut.reg(:test).write!(0x0000FF01)
5
+
6
+ ss "Test read register, should read value 0x0000FF01"
6
7
  $dut.reg(:test).read!
8
+
9
+ ss "Test read register with mask, should read value 0xXXXxxx1"
10
+ $dut.reg(:test).read!(mask: 0x0000_000F)
11
+
12
+ ss "Test read register with store"
13
+ $dut.reg(:test).store!
14
+
7
15
  ss "Test bit level read, should read value 0xXXXxxx1"
16
+ $dut.reg(:test).reset
17
+ $dut.reg(:test).data = 0x0000FF01
8
18
  $dut.reg(:test).bit(:bit).read!
9
19
 
10
-
20
+ ss "Test read register"
11
21
  $dut.read_register($dut.reg(:test))
12
- $dut.write_register($dut.reg(:test), 0xFF02)
13
22
 
14
- $dut.arm_debug.mem_ap.R(0x10000004, 0x00000000)
23
+ ss "Test write register"
24
+ $dut.write_register($dut.reg(:test))
25
+
26
+ $dut.arm_debug.mem_ap.R(0x10000004, 0x00000000, compare_data: 0x00000000)
15
27
  $dut.arm_debug.mem_ap.W(0x10000004, 0x55555555)
16
28
  $dut.arm_debug.mem_ap.WR(0x10000004, 0x55555555)
17
29
 
@@ -5,6 +5,6 @@ Pattern.create do
5
5
  $dut_jtag.arm_debug.swj_dp.write_read_dp("CTRL/STAT", 0x50000000, edata: 0xf0000000)
6
6
  $dut_jtag.arm_debug.swj_dp.read_ap(0x010000FC)
7
7
  $dut_jtag.arm_debug.swj_dp.write_read_ap(0x01000004, 0x10101010)
8
- #$dut_jtag.arm_debug.swj_dp.read_expect_ap(0x01000004, 0x10101010)
8
+ $dut_jtag.arm_debug.swj_dp.read_expect_ap(0x01000004, 0x10101010)
9
9
 
10
10
  end
@@ -5,6 +5,6 @@ Pattern.create do
5
5
  $dut_swd.arm_debug.swj_dp.write_read_dp("CTRL/STAT", 0x50000000, edata: 0xf0000000)
6
6
  $dut_swd.arm_debug.swj_dp.read_ap(0x010000FC)
7
7
  $dut_swd.arm_debug.swj_dp.write_read_ap(0x01000004, 0x10101010)
8
- #$dut_swd.arm_debug.swj_dp.read_expect_ap(0x01000004, 0x10101010)
8
+ $dut_swd.arm_debug.swj_dp.read_expect_ap(0x01000004, 0x10101010)
9
9
 
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_arm_debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronnie Lajaunie