blob: 8056096f116c8298877d553df818557d5db6c7f6 [file] [log] [blame]
Richard Burtoncefc7e12023-12-06 17:13:10 +00001#!/usr/bin/env python3
2# SPDX-FileCopyrightText: Copyright 2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import logging
18import vsi_video
19
20## Set verbosity level
21#verbosity = logging.DEBUG
22verbosity = logging.ERROR
23
24# [debugging] Verbosity settings
25level = { 10: "DEBUG", 20: "INFO", 30: "WARNING", 40: "ERROR" }
26logging.basicConfig(format='Py: VSI5: [%(levelname)s]\t%(message)s', level = verbosity)
27logging.info("Verbosity level is set to " + level[verbosity])
28
29
30# Video Server configuration
31server_address = ('127.0.0.1', 6001)
32server_authkey = 'vsi_video'
33
34
35# IRQ registers
36IRQ_Status = 0
37
38# Timer registers
39Timer_Control = 0
40Timer_Interval = 0
41
42# Timer Control register definitions
43Timer_Control_Run_Msk = 1<<0
44Timer_Control_Periodic_Msk = 1<<1
45Timer_Control_Trig_IRQ_Msk = 1<<2
46Timer_Control_Trig_DMA_Msk = 1<<3
47
48# DMA registers
49DMA_Control = 0
50
51# DMA Control register definitions
52DMA_Control_Enable_Msk = 1<<0
53DMA_Control_Direction_Msk = 1<<1
54DMA_Control_Direction_P2M = 0<<1
55DMA_Control_Direction_M2P = 1<<1
56
57# User registers
58Regs = [0] * 64
59
60# Data buffer
61Data = bytearray()
62
63
64## Initialize
65# @return None
66def init():
67 logging.info("Python function init() called")
68 vsi_video.init(server_address, server_authkey)
69
70
71## Read interrupt request (the VSI IRQ Status Register)
72# @return value value read (32-bit)
73def rdIRQ():
74 global IRQ_Status
75 logging.info("Python function rdIRQ() called")
76
77 value = IRQ_Status
78 logging.debug("Read interrupt request: {}".format(value))
79
80 return value
81
82
83## Write interrupt request (the VSI IRQ Status Register)
84# @param value value to write (32-bit)
85# @return value value written (32-bit)
86def wrIRQ(value):
87 global IRQ_Status
88 logging.info("Python function wrIRQ() called")
89
90 value = vsi_video.wrIRQ(IRQ_Status, value)
91 IRQ_Status = value
92 logging.debug("Write interrupt request: {}".format(value))
93
94 return value
95
96
97## Write Timer registers (the VSI Timer Registers)
98# @param index Timer register index (zero based)
99# @param value value to write (32-bit)
100# @return value value written (32-bit)
101def wrTimer(index, value):
102 global Timer_Control, Timer_Interval
103 logging.info("Python function wrTimer() called")
104
105 if index == 0:
106 Timer_Control = value
107 logging.debug("Write Timer_Control: {}".format(value))
108 elif index == 1:
109 Timer_Interval = value
110 logging.debug("Write Timer_Interval: {}".format(value))
111
112 return value
113
114
115## Timer event (called at Timer Overflow)
116# @return None
117def timerEvent():
118 global IRQ_Status
119
120 logging.info("Python function timerEvent() called")
121
122 IRQ_Status = vsi_video.timerEvent(IRQ_Status)
123
124
125## Write DMA registers (the VSI DMA Registers)
126# @param index DMA register index (zero based)
127# @param value value to write (32-bit)
128# @return value value written (32-bit)
129def wrDMA(index, value):
130 global DMA_Control
131 logging.info("Python function wrDMA() called")
132
133 if index == 0:
134 DMA_Control = value
135 logging.debug("Write DMA_Control: {}".format(value))
136
137 return value
138
139
140## Read data from peripheral for DMA P2M transfer (VSI DMA)
141# @param size size of data to read (in bytes, multiple of 4)
142# @return data data read (bytearray)
143def rdDataDMA(size):
144 global Data
145 logging.info("Python function rdDataDMA() called")
146
147 Data = vsi_video.rdDataDMA(size)
148
149 n = min(len(Data), size)
150 data = bytearray(size)
151 data[0:n] = Data[0:n]
152 logging.debug("Read data ({} bytes)".format(size))
153
154 return data
155
156
157## Write data to peripheral for DMA M2P transfer (VSI DMA)
158# @param data data to write (bytearray)
159# @param size size of data to write (in bytes, multiple of 4)
160# @return None
161def wrDataDMA(data, size):
162 global Data
163 logging.info("Python function wrDataDMA() called")
164
165 Data = data
166 logging.debug("Write data ({} bytes)".format(size))
167
168 vsi_video.wrDataDMA(data, size)
169
170 return
171
172
173## Read user registers (the VSI User Registers)
174# @param index user register index (zero based)
175# @return value value read (32-bit)
176def rdRegs(index):
177 global Regs
178 logging.info("Python function rdRegs() called")
179
180 if index <= vsi_video.REG_IDX_MAX:
181 Regs[index] = vsi_video.rdRegs(index)
182
183 value = Regs[index]
184 logging.debug("Read user register at index {}: {}".format(index, value))
185
186 return value
187
188
189## Write user registers (the VSI User Registers)
190# @param index user register index (zero based)
191# @param value value to write (32-bit)
192# @return value value written (32-bit)
193def wrRegs(index, value):
194 global Regs
195 logging.info("Python function wrRegs() called")
196
197 if index <= vsi_video.REG_IDX_MAX:
198 value = vsi_video.wrRegs(index, value)
199
200 Regs[index] = value
201 logging.debug("Write user register at index {}: {}".format(index, value))
202
203 return value
204
205
206## @}
207