origen_arm_debug 0.10.1 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,47 @@
1
+ require 'origen_arm_debug/dp_controller'
2
+ module OrigenARMDebug
3
+ class SW_DPController
4
+ include Origen::Controller
5
+ include Helpers
6
+ include DPController
7
+
8
+ def write_register(reg, options = {})
9
+ unless reg.writable?
10
+ fail "The :#{reg.name} register is not writeable!"
11
+ end
12
+
13
+ if reg.owner == model
14
+ log "Write SW-DP register #{reg.name.to_s.upcase}: #{reg.data.to_hex}" do
15
+ dut.swd.write_dp(reg)
16
+ end
17
+ else
18
+ unless reg.owner.is_a?(AP)
19
+ fail 'The SW-DP can only write to DP or AP registers!'
20
+ end
21
+
22
+ select_ap_reg(reg)
23
+ dut.swd.write_ap(reg, options)
24
+ end
25
+ end
26
+
27
+ def read_register(reg, options = {})
28
+ unless reg.readable?
29
+ fail "The :#{reg.name} register is not readable!"
30
+ end
31
+
32
+ if reg.owner == model
33
+ log "Read SW-DP register #{reg.name.to_s.upcase}: #{Origen::Utility.read_hex(reg)}" do
34
+ dut.swd.read_dp(reg)
35
+ end
36
+ else
37
+ unless reg.owner.is_a?(AP)
38
+ fail 'The SW-DP can only write to DP or AP registers!'
39
+ end
40
+
41
+ select_ap_reg(reg)
42
+ dut.swd.read_ap(address: reg.address)
43
+ dut.swd.read_dp(reg, options.merge(address: rdbuff.address))
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,4 +1,4 @@
1
- module OrigenARMDebug
1
+ module OrigenARMDebugDev
2
2
  # This is a dummy DUT model which is used
3
3
  # to instantiate and test the ARMDebug locally
4
4
  # during development.
@@ -11,27 +11,23 @@ module OrigenARMDebug
11
11
  # Initializes simple dut model with test register and required jtag/swd pins
12
12
  #
13
13
  # @example
14
- # $dut = OrigenARMDebug::DUT.new
14
+ # $dut = OrigenARMDebugDev::DUT.new
15
15
  #
16
16
  def initialize
17
- add_reg :dap, 0x0, 35, data: { pos: 0, bits: 35 }
17
+ add_reg :test, 0
18
18
 
19
- add_reg :test, 0x0, 32, data: { pos: 0, bits: 32 },
20
- bit: { pos: 0 }
21
-
22
- sub_block :arm_debug, class_name: 'OrigenARMDebug::Driver', aps: { mem_ap: 0x00000000, mdm_ap: 0x01000000 }, latency: 2
23
- arm_debug.add_mem_ap('alt_ahbapi', 0x02000000)
24
-
25
- # arm_debug.add_mem_ap('mem_ap', 0x00000000)
26
- # arm_debug.add_mem_ap('mdm_ap', 0x01000000)
27
- # arm_debug.add_mem_ap('alt_ahbapi', 0x02000000)
19
+ reg :test2, 0 do |reg|
20
+ reg.bit 31, :msb
21
+ reg.bit 30..1, :data
22
+ reg.bit 0, :lsb
23
+ end
28
24
  end
29
25
 
30
26
  # Add any custom startup business here.
31
27
  #
32
28
  # @param [Hash] options Options to customize the operation
33
29
  def startup(options)
34
- $tester.set_timeset('arm_debug', 40)
30
+ tester.set_timeset('arm_debug', 40)
35
31
  end
36
32
 
37
33
  # Read data from a register
@@ -39,7 +35,7 @@ module OrigenARMDebug
39
35
  # @param [Register] reg Register name or address value
40
36
  # @param [Hash] options Options to customize the operation
41
37
  def read_register(reg, options = {})
42
- arm_debug.read_register(reg, options)
38
+ arm_debug.mem_ap.read_register(reg, options)
43
39
  end
44
40
 
45
41
  # Write data to a register
@@ -47,7 +43,7 @@ module OrigenARMDebug
47
43
  # @param [Register] reg Register name or address value
48
44
  # @param [Hash] options Options to customize the operation
49
45
  def write_register(reg, options = {})
50
- arm_debug.write_register(reg, options)
46
+ arm_debug.mem_ap.write_register(reg, options)
51
47
  end
52
48
  end
53
49
  end
@@ -0,0 +1,32 @@
1
+ module OrigenARMDebugDev
2
+ # Simple JTAG-specific dut model that inherits from protocol-agnostic DUT model
3
+ class JTAG_DUT < DUT
4
+ include OrigenJTAG
5
+
6
+ # Adds jtag-required pins to the simple dut model
7
+ # Returns nothing.
8
+ def initialize
9
+ super
10
+ add_pin :tclk
11
+ add_pin :tdi
12
+ add_pin :tdo
13
+ add_pin :tms
14
+ add_pin :trst
15
+ add_pin :swd_clk
16
+ add_pin :swd_dio
17
+
18
+ # Specify (customize) ARM Debug implementation details
19
+ sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP',
20
+ mem_aps: {
21
+ mem_ap: {
22
+ base_address: 0x00000000,
23
+ latency: 16,
24
+ apreg_access_wait: 8,
25
+ apmem_access_wait: 8,
26
+ csw_reset: 0x23000040
27
+ },
28
+ mdm_ap: 0x01000000
29
+ }
30
+ end
31
+ end
32
+ end
@@ -1,4 +1,4 @@
1
- module OrigenARMDebug
1
+ module OrigenARMDebugDev
2
2
  # Simple SWD-specific dut model that inherits from protocol-agnostic DUT model
3
3
  class SWD_DUT < DUT
4
4
  include OrigenSWD
@@ -14,6 +14,12 @@ module OrigenARMDebug
14
14
  add_pin :trst
15
15
  add_pin :swd_clk
16
16
  add_pin :swd_dio
17
+
18
+ sub_block :arm_debug, class_name: 'OrigenARMDebug::DAP',
19
+ mem_aps: {
20
+ mem_ap: { base_address: 0x00000000, csw_reset: 0x23000042 },
21
+ mdm_ap: 0x01000000
22
+ }
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,61 @@
1
+ Pattern.create name: "workout_#{dut.arm_debug.dp.name}" do
2
+
3
+ ss "Tests of direct DP API"
4
+ dp = dut.arm_debug.dp
5
+
6
+ dp.idcode.partno.read!(0x12)
7
+
8
+ dp.ctrlstat.write!(0x50000000)
9
+ dp.ctrlstat.read!(0xF0000000)
10
+
11
+ dp.select.apbanksel.write!(0xF)
12
+
13
+ dp.abort.dapabort.write!(1)
14
+
15
+ ss "Tests of direct AP API"
16
+ ap = dut.arm_debug.mem_ap
17
+
18
+ ap.tar.write!(0x1234_0000)
19
+
20
+ ap.tar.read!
21
+
22
+ ss "Tests of high-level register API"
23
+
24
+ ss "Test write register, should write value 0xFF01"
25
+ dut.reg(:test).write!(0x0000FF01)
26
+
27
+ ss "Test write register with overlay, no subroutine"
28
+ dut.reg(:test).overlay('write_overlay')
29
+ dut.reg(:test).write!(0x0000FF01, no_subr: true)
30
+ dut.reg(:test).overlay(nil)
31
+
32
+ ss "Test write register with overlay, use subroutine if available"
33
+ dut.reg(:test).overlay('write_overlay_subr')
34
+ dut.reg(:test).write!(0x0000FF01)
35
+ dut.reg(:test).overlay(nil)
36
+
37
+ ss "Test read register, should read value 0x0000FF01"
38
+ dut.reg(:test).read!
39
+
40
+ ss "Test read register, with overlay, no subroutine, should read value 0x0000FF01"
41
+ dut.reg(:test).overlay('read_overlay')
42
+ dut.reg(:test).read!(no_subr: true)
43
+ dut.reg(:test).overlay(nil)
44
+
45
+ ss "Test read register, with overlay, use subroutine if available"
46
+ dut.reg(:test).overlay('read_overlay_subr')
47
+ dut.reg(:test).read!
48
+ dut.reg(:test).overlay(nil)
49
+
50
+ ss "Test read register with mask, should read value 0xXXXxxx1"
51
+ dut.reg(:test).read!(mask: 0x0000_000F)
52
+
53
+ ss "Test read register with store"
54
+ dut.reg(:test).store!
55
+
56
+ ss "Test bit level read, should read value 0xXXXxxx1"
57
+ dut.reg(:test).reset
58
+ dut.reg(:test).data = 0x0000FF01
59
+ dut.reg(:test)[0].read!
60
+
61
+ end
@@ -6,7 +6,7 @@
6
6
 
7
7
  ### Purpose
8
8
 
9
- This library provides register and memory read/write and debug control capability via the ARM debug protocol.
9
+ This library provides register and memory read/write and debug control capability via the ARM Debug Interface v5 Spec.
10
10
 
11
11
  ### How To Import
12
12
 
@@ -57,24 +57,36 @@ class DUT
57
57
  reg.bits 7..0, :lower_byte
58
58
  end
59
59
 
60
- sub_block :arm_debug, class_name: "OrigenARMDebug::Driver", aps: { mem_ap: 0x00000000, mdmap: 0x01000000 }
60
+ sub_block :arm_debug, class_name: "OrigenARMDebug::DAP", mem_aps: { mem_ap: 0x00000000, mem2_ap: 0x01000000 }
61
61
  end
62
62
 
63
63
  # Hook the ARMDebug module into the register API, any register read
64
64
  # requests will use the ARM Debug protocol by default
65
65
  def read_register(reg, options={})
66
- arm_debug.read_register(reg, options)
66
+ arm_debug.mem_ap.read_register(reg, options)
67
67
  end
68
68
 
69
69
  # As above for write requests
70
70
  def write_register(reg, options={})
71
- arm_debug.write_register(reg, options)
71
+ arm_debug.mem_apwrite_register(reg, options)
72
72
  end
73
73
  end
74
74
 
75
75
  DUT.new.myreg.write!(0x55AA) # => Will generate the required vectors using the ARM debug protocol
76
76
  ~~~
77
77
 
78
+ You can also access the lower-level API using conventional Origen register transactions:
79
+
80
+ ~~~ruby
81
+ arm_debug.sw_dp.idcode.read!(0x2BA01477)
82
+ arm_debug.sw_dp.ctrlstat.write!(0x5000_0000) # Power-up
83
+ arm_debug.sw_dp.ctrlstat.read!(0xF0000000) # Verify
84
+ arm_debug.ahb_ap.idr.read!(0x24770011)
85
+ arm_debug.sw_dp.select.write!(0) # Select AHB-AP, bank 0
86
+
87
+ # Set the SIZE field of CSW to 0x2 (32-bit transfers) + AddrInc=1
88
+ arm_debug.ahb_ap.csw.write!(0x23000052)
89
+ ~~~
78
90
 
79
91
  ### How To Setup a Development Environment
80
92
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_arm_debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 1.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronnie Lajaunie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-13 00:00:00.000000000 Z
11
+ date: 2017-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.7'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.7.36
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,62 +27,43 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0.7'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.7.36
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: origen_jtag
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: 0.12.0
39
+ version: 0.15.0
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - ">="
39
45
  - !ruby/object:Gem::Version
40
- version: 0.12.0
46
+ version: 0.15.0
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: origen_swd
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 0.5.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
51
+ - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: 0.5.0
55
- - !ruby/object:Gem::Dependency
56
- name: origen_doc_helpers
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
53
+ version: '1'
59
54
  - - ">="
60
55
  - !ruby/object:Gem::Version
61
- version: 0.2.0
62
- type: :development
56
+ version: 1.1.0
57
+ type: :runtime
63
58
  prerelease: false
64
59
  version_requirements: !ruby/object:Gem::Requirement
65
60
  requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 0.2.0
69
- - !ruby/object:Gem::Dependency
70
- name: origen_testers
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
61
+ - - "~>"
74
62
  - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
63
+ version: '1'
80
64
  - - ">="
81
65
  - !ruby/object:Gem::Version
82
- version: '0'
66
+ version: 1.1.0
83
67
  description:
84
68
  email:
85
69
  - ronnie.lajaunie@nxp.com
@@ -88,21 +72,28 @@ extensions: []
88
72
  extra_rdoc_files: []
89
73
  files:
90
74
  - config/application.rb
75
+ - config/boot.rb
91
76
  - config/commands.rb
92
- - config/development.rb
93
- - config/environment.rb
94
- - config/users.rb
95
77
  - config/version.rb
96
78
  - lib/origen_arm_debug.rb
97
- - lib/origen_arm_debug/driver.rb
98
- - lib/origen_arm_debug/dut.rb
99
- - lib/origen_arm_debug/dut_jtag.rb
100
- - lib/origen_arm_debug/dut_swd.rb
79
+ - lib/origen_arm_debug/ap.rb
80
+ - lib/origen_arm_debug/ap_controller.rb
81
+ - lib/origen_arm_debug/dap.rb
82
+ - lib/origen_arm_debug/dap_controller.rb
83
+ - lib/origen_arm_debug/dp_controller.rb
84
+ - lib/origen_arm_debug/helpers.rb
85
+ - lib/origen_arm_debug/jtag_ap.rb
86
+ - lib/origen_arm_debug/jtag_ap_controller.rb
87
+ - lib/origen_arm_debug/jtag_dp.rb
88
+ - lib/origen_arm_debug/jtag_dp_controller.rb
101
89
  - lib/origen_arm_debug/mem_ap.rb
102
- - lib/origen_arm_debug/swj_dp.rb
103
- - pattern/read_write_reg.rb
104
- - pattern/read_write_reg_jtag.rb
105
- - pattern/read_write_reg_swd.rb
90
+ - lib/origen_arm_debug/mem_ap_controller.rb
91
+ - lib/origen_arm_debug/sw_dp.rb
92
+ - lib/origen_arm_debug/sw_dp_controller.rb
93
+ - lib/origen_arm_debug_dev/dut.rb
94
+ - lib/origen_arm_debug_dev/dut_jtag.rb
95
+ - lib/origen_arm_debug_dev/dut_swd.rb
96
+ - pattern/workout.rb
106
97
  - templates/web/index.md.erb
107
98
  - templates/web/layouts/_basic.html.erb
108
99
  - templates/web/partials/_navbar.html.erb
@@ -127,10 +118,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
118
  version: 1.8.11
128
119
  requirements: []
129
120
  rubyforge_project:
130
- rubygems_version: 2.6.2
121
+ rubygems_version: 2.6.7
131
122
  signing_key:
132
123
  specification_version: 4
133
- summary: Provides a Origen API to perform register read and write operations via the
134
- ARM_DEBUG protocol.
124
+ summary: Provides an Origen API to perform register read and write operations via
125
+ the ARM_DEBUG protocol.
135
126
  test_files: []
136
- has_rdoc:
@@ -1,17 +0,0 @@
1
- # This file is similar to environment.rb and will be loaded
2
- # automatically at the start of each invocation of Origen.
3
- #
4
- # However the major difference is that it will not be loaded
5
- # if the application is imported by a 3rd party app - in that
6
- # case only environment.rb is loaded.
7
- #
8
- # Therefore this file should be used to load anything you need
9
- # to setup a development environment for this app, normally
10
- # this would be used to define some dummy classes to instantiate
11
- # your objects so that they can be tested and/or interacted with
12
- # in the console.
13
- module OrigenARMDebug
14
- autoload :DUT, "origen_arm_debug/dut"
15
- autoload :JTAG_DUT, "origen_arm_debug/dut_jtag"
16
- autoload :SWD_DUT, "origen_arm_debug/dut_swd"
17
- end
@@ -1,3 +0,0 @@
1
- require "origen_arm_debug"
2
-
3
-