14.9.1 デバイスリセット動作のフック

DSTREAM クラスデバイスでは、システムリセット要求のデフォルトの操作は JTAG コネクタ上で nSRST を駆動することです。一部のプラットフォームではこのピンが JTAG コネクタ上にないため、他のメソッドを使用してリセットする必要があります。システムリセットコントローラデバイスなど、別のシステムコンポーネントに書き込んでリセットを行う場合もあります。これを使用できない場合は別の方法として、システムのウォッチドッグタイムアウトを発生させてシステムを順にリセットします。どちらの方法でも、デフォルトのリセット動作を変更する必要があります。
以下のコードシーケンスはこの例です。
1.from com.arm.debug.dtsl.components import ConnectableDevice
2.[snip]
3.class ResetHookedDevice(ConnectableDevice):
4.def __init__(self, root, devNo, name):
5.ConnectableDevice.__init__(self, root, devNo, name)
6.self.parent = root
7.
8.def systemReset(self, resetType):
9.ConnectableDevice.systemReset(self, resetType)
10.# Notify root configuration
11.self.parent.postReset()
12.
13.class DSTREAMDebugAndTrace(DTSLv1):
15.'''A top level configuration class which supports debug and trace'''
16.
17.[snip]
18.
19.def setupPinMUXForTrace(self):
20.'''Sets up the IO Pin MUX to select 4 bit TPIU trace'''
21.addrDBGMCU_CR = 0xE0042004
22.value = self.readMem(addrDBGMCU_CR)
23.value |=  0xE0 # TRACE_MODE=11 (4 bit port), TRACE_IOEN=1
24.self.writeMem(addrDBGMCU_CR, value)
25.
26.def enableSystemTrace(self):
27.'''Sets up the system to enable trace
28.For a Cortex-M3 system we must make sure that the
29.TRCENA bit (24) in the DEMCR registers is set.
30.NOTE: This bit is normally set by the DSTREAM Cortex-M3
31.template - but we set it ourselves here in case
32.no one connects to the Cortex-M3 device.
33.'''
34.addrDEMCR = 0xE000EDFC
35.bitTRCENA = 0x01000000
36.value = self.readMem(addrDEMCR)
37.value |= bitTRCENA
38.self.writeMem(addrDEMCR, value)
39.
40.def postReset(self):
41.'''Makes sure the debug configuration is re-instated
42.following a reset event
43.'''
44.if self.getOptionValue("options.traceBuffer.traceCaptureDevice") == "DSTREAM":
45.self.setupPinMUXForTrace()
46.self.enableSystemTrace()
行 3 は ResetHookedDevice という Jython クラスを宣言します。これは標準的な DTSL Java Device クラスから派生しています。ConnectableDevice クラスは IDevice インタフェースを実装します。IDevice インタフェースのメソッドの 1 つが systemReset(): です。
/**
 * Reset system
 * @param resetType
 *            one of the following values
 *            <ul>
 *              <li>{@link RDDI#RDDI_RST_PERFORM}</li>
 *              <li>{@link RDDI#RDDI_RST_ASSERT}</li>
 *              <li>{@link RDDI#RDDI_RST_DEASSERT}</li>
 *            </ul>
 *
 * @throws DTSLException On error
 */
public abstract void systemReset(int resetType) throws DTSLException;
ResetHookedDevice クラスには systemReset メソッドの新しい実装が用意されています。DTSL コンフィギュレーションクラスが ConnectableDevice クラスのインスタンスではなく ResetHookedDevice クラスを DTSL に指定した場合、DS-5デバッガによって systemReset メソッドが呼び出された場合は、古いメソッドではなく新しいメソッドが呼び出されます。
# create core
devID = self.findDevice("Cortex-M3")
self.cortexM3 = ResetHookedDevice(self, devID, "Cortex-M3")
self.addDeviceInterface(self.cortexM3)
コードシーケンスは ResetHookedDevice インスタンスを作成し、「Cortex-M3」という名前を付けます。デバッガが DTSL に「Cortex-M3」デバイスを要求すると、ResetHookedDevice インスタンスが与えられます。このデバイスは Device から派生しているため、Device クラスが実装するすべてのメソッドを取得しますが、古い systemReset メソッドは新しいメソッドと置換されます。
既存のクラスから新しいクラスが派生すると、任意の数の IDevice メソッドを置換できます。IDevice メソッドの新しい実装では、ConnectableDevice.<method-name>() を呼び出すことによって、ConnectableDevice オブジェクト内の既存の実装を呼び出すことができます。
すべての IDevice ドキュメントについては、DTSL Java docs を参照して下さい。
ResetHookedDevice クラスのコンストラクタは、それを作成した DTSL コンフィギュレーションへの参照を格納します。リセットが要求されると既存の ConnectableDevice リセットコードが呼び出され、親コンフィギュレーションにリセットを行うように指示します。この場合、コンフィギュレーションはデバイスのピンマルチプレクサ設定を再構成して外部トレースが有効であることを確認します。
関連する概念
14.5.2 DTSL デバイスオブジェクト
非機密扱いPDF file icon PDF 版ARM DUI0446VJ
Copyright © 2010-2015 ARM.All rights reserved.