1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: dsp_Api.h
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 25972 $
14 *---------------------------------------------------------------------------*/
15
16 /*! @file
17 @brief DSP ライブラリの初期化、終了を行う API です。
18 */
19 #ifndef NN_DSP_CTR_DSP_API_H_
20 #define NN_DSP_CTR_DSP_API_H_
21
22 #include <nn/Handle.h>
23
24 namespace nn {
25 namespace dsp {
26 namespace CTR {
27
28 namespace detail
29 {
30 nn::Result InitializeBase(Handle* pSession, const char* name);
31 nn::Result FinalizeBase (Handle* pSession);
32 }
33
34 namespace
35 {
36 const char PORT_NAME_DSP[] = "dsp::DSP";
37 }
38
InitializeIpc(Handle * pSession)39 inline nn::Result InitializeIpc(Handle* pSession) { return detail::InitializeBase(pSession, PORT_NAME_DSP); }
FinalizeIpc(Handle * pSession)40 inline nn::Result FinalizeIpc (Handle* pSession) { return detail::FinalizeBase (pSession); }
41
42 /*!
43 @name Initialize/Finalize
44 @{
45 */
46
47 /*!
48 @brief DSP ライブラリの初期化を行い、DSP プロセスとのセッションを確立します。
49 @return 処理の結果が返ります。
50 */
51 nn::Result Initialize( void );
52
53 /*!
54 @brief DSP ライブラリを終了します。
55 @return なし。
56 */
57 void Finalize( void );
58
59 /*!
60 @brief DSP コンポーネントファイルをロードし、DSP を起動します。
61 @param[in] pComponent コンポーネントファイルのアドレス。
62 @param[in] size コンポーネントファイルのサイズ。
63 @param[in] maskPram 使用する DSP-Pram ブロックを指定します。LSB からMSB 方向にブロック0、1、...、7 を表します。8〜15 ビットは無効です。
64 @param[in] maskDram 使用する DSP-Dram ブロックを指定します。maskDram を参照。
65 @return 処理の結果が返ります。
66 */
67 nn::Result LoadComponent( const u8 pComponent[], size_t size, bit16 maskPram = 0xff, bit16 maskDram = 0xff ) ;
68 nn::Result LoadComponentCore( const u8 pComponent[], size_t size, bit16 maskPram = 0xff, bit16 maskDram = 0xff ) ;
69
70 /*!
71 @brief デフォルトの DSP コンポーネントファイル(サウンド)をロードし、DSP を起動します。
72 @return 処理の結果が返ります。
73 */
74 nn::Result LoadDefaultComponent( void );
75
76 /*!
77 @brief DSP を停止します。
78 @return 処理の結果が返ります。
79 */
80 nn::Result UnloadComponent( void );
81 nn::Result UnloadComponentCore( void );
82
83 /*!
84 @}
85 */
86
87 /*!
88 @name CPU-DSP 間通信
89 @{
90 */
91
92 /*!
93 @brief DSP 割り込みを受信するためのイベントハンドルを DSP プロセスに登録します。
94 @param[in] handle イベントオブジェクトのハンドル。
95 @param[in] type 割り込みタイプ。
96 @param[in] port PIPE のポート番号(type が PIPE の場合のみ有効)。
97 @return 処理の結果が返ります。
98 */
99 nn::Result RegisterInterruptEvents(nn::Handle handle, s32 type, s32 port = 0);
100
101 /*!
102 @brief リプライレジスタの値を取得します。
103 @param[in] regNo リプライレジスタ番号。
104 @param[out] pValue 値を格納するアドレス。
105 @return 処理の結果が返ります。
106 */
107 nn::Result RecvData( u16 regNo, u16 *pValue );
108
109 /*!
110 @brief コマンドレジスタに値を設定します。
111 @param[in] regNo コマンドレジスタ番号。
112 @param[in] value 設定する値。
113 @return 処理の結果が返ります。
114 */
115 nn::Result SendData( u16 regNo, u16 value );
116
117 /*!
118 @brief リプライレジスタに値が書き込まれているかどうかを確認します。
119 @param[in] regNo リプライレジスタ番号。
120 @param[out] pStatus 状態を格納するアドレス。
121 @return 処理の結果が返ります。
122 */
123 nn::Result RecvDataIsReady( u16 regNo, bool* pStatus );
124
125 /*!
126 @brief コマンドレジスタが読み込まれたかどうかを確認します。
127 @param[in] regNo コマンドレジスタ番号。
128 @param[out] pStatus 状態を格納するアドレス。
129 @return 処理の結果が返ります。
130 */
131 nn::Result SendDataIsEmpty( u16 regNo, bool * pStatus );
132
133 /*!
134 :private
135 @brief DSP-Wram アドレスおよび連続領域アドレスの仮想アドレスを取得します。
136 @param[in] physicalAddress 物理アドレス。
137 @param[out] pVirtualAddress 仮想アドレスの格納先。
138 @return 処理の結果が返ります。
139 */
140 nn::Result GetVirtualAddress(uptr physicalAddress, uptr * pVirtualAddress);
141
142 /*!
143 :private
144 @brief DSP-Wram アドレスおよび連続領域アドレスの物理アドレスを取得します。
145 @param[in] virtualAddress 仮想アドレス。
146 @param[out] pPhysicalAddress 物理アドレスの格納先。
147 @return 処理の結果が返ります。
148 */
149 nn::Result GetPhysicalAddress(uptr address, uptr * pPhysicalAddress);
150
151 /*!
152 :private
153 @brief DSP 環境におけるアドレスを、CPU 環境におけるアドレスに変換します。
154 @param[in] addressOnDsp DSP 環境におけるアドレス。
155 @param[out] pAddressOnHost CPU 環境におけるアドレスの格納先。
156 @return 処理の結果が返ります。
157 */
158 nn::Result ConvertProcessAddressFromDspDram(uptr addressOnDsp, uptr * pAddressOnHost);
159
160 /*!
161 @brief DSP pipe からデータを読みます。
162 @param[in] port ポート番号。
163 @param[in] buffer データを読み込むバッファのアドレス。
164 @param[in] length 読み込みデータ長。
165 @param[out] pLengthRead 実際に読み込まれたデータ長の格納先。
166 @return 処理の結果が返ります。
167 */
168 nn::Result ReadPipeIfPossible( int port, void* buffer, u16 length, u16* pLengthRead );
169
170 /*!
171 @brief DSP pipe へデータを書きます。
172 @param[in] port ポート番号。
173 @param[in] buffer データを書き込むバッファのアドレス。
174 @param[in] length 書き込みデータ長。
175 @return 処理の結果が返ります。
176 */
177 nn::Result WriteProcessPipe( int port, const void *buffer, u32 length );
178
179 /*!
180 @brief セマフォのリクエストを取得します。
181 @param[in] pIsRequested リクエストの有無。
182 @return 処理の結果が返ります。
183 */
184 nn::Result CheckSemaphoreRequest( bool* pIsRequested );
185
186 /*!
187 @brief セマフォをクリアします。
188 @param[in] mask マスク。
189 @return 処理の結果が返ります。
190 */
191 nn::Result ClearSemaphore( u16 mask );
192
193 /*!
194 @brief セマフォのマスクを設定します。
195 @param[in] mask マスク。
196 @return 処理の結果が返ります。
197 */
198 nn::Result MaskSemaphore( u16 mask );
199
200 /*!
201 @brief セマフォの値を取得します。
202 @param[in] pMask 値の格納先。
203 @return 処理の結果が返ります。
204 */
205 nn::Result GetSemaphore( u16* pMask );
206
207 /*!
208 @brief セマフォの値を設定します。
209 @param[in] mask マスク。
210 @return 処理の結果が返ります。
211 */
212 nn::Result SetSemaphore( u16 mask );
213
214 /*!
215 :private
216 @brief セマフォイベントのハンドルを取得します。
217 @param[out] pHandle 値の格納先。
218 @return 処理の結果が返ります。
219 */
220 nn::Result GetSemaphoreEventHandle ( nn::Handle *);
221
222 /*!
223 :private
224 @brief セマフォイベントで設定するマスクの値を設定します。
225 @param[in] mask 設定するマスクの値。
226 @return 処理の結果が返ります。
227 */
228 nn::Result SetSemaphoreEventMask ( bit16 );
229
230 /*!
231 @}
232 */
233
234 /*!
235 @brief 指定された範囲のデータをキャッシュからメモリに書き戻し、キャッシュを無効にします。
236 @param[in] addr 先頭アドレス。
237 @param[in] size サイズ。
238 @return 処理の結果が返ります。
239 */
240 nn::Result FlushDataCache( uptr addr, size_t size );
241
242 /*!
243 @brief 指定された範囲のキャッシュを無効にします。
244 @param[in] addr 先頭アドレス。
245 @param[in] size サイズ。
246 @return 処理の結果が返ります。
247 */
248 nn::Result InvalidateDataCache( uptr addr, size_t size );
249
250 /*!
251 :private
252 @brief DSP にコンポーネントがロードされているかどうかを確認します。
253 @return ロードされていれば true を、されていなければ false を返します。
254 */
255 bool IsComponentLoaded(void);
256
257 /*!
258 @brief DSP で行っている処理を一時中断し、終了処理を行います。
259 @return 実際にスリープ処理が行われば場合は true を、何もしなかった場合は false を返します。
260 */
261 bool Sleep(void);
262
263 /*!
264 @brief 一時中断した DSP の処理を復元します。
265 @brief なし。
266 */
267 void WakeUp(void);
268
269 /*! :private
270 @brief 終了処理のための準備を行います。
271 */
272 void OrderToWaitForFinalize();
273
274 /*! :private
275 @brief Sleep, WakeUp, OrderToWaitForFinalize 時に呼ばれるコールバックを設定します。
276 @param[in] sleepCallback Sleep 時のコールバック
277 @param[in] wakeUpCallback WakeUp 時のコールバック
278 @param[in] orderToWaitForFinalizeCallback OrderToWaitForFinalize 時のコールバック
279 @return コールバックの設定に成功したら true を、失敗したら false を返します。
280 */
281 bool RegisterSleepWakeUpCallback(
282 void (*sleepCallback)(),
283 void (*wakeUpCallback)(),
284 void (*orderToWaitForFinalizeCallback)() = NULL
285 );
286
287 /*! :private
288 @brief Sleep, WakeUp, OrderToWaitForFinalize 時に呼ばれるコールバックを無効にします。
289 @param[in] sleepCallback Sleep 時のコールバック
290 @param[in] wakeUpCallback WakeUp 時のコールバック
291 @param[in] orderToWaitForFinalizeCallback OrderToWaitForFinalize 時のコールバック
292 @return コールバックの無効化に成功したら true を、失敗したら false を返します。
293 */
294 bool ClearSleepWakeUpCallback(
295 void (*sleepCallback)(),
296 void (*wakeUpCallback)(),
297 void (*orderToWaitForFinalizeCallback)() = NULL
298 );
299
300 /*!
301 @brief ヘッドホンの挿入状態を取得します。
302 @param[out] isConnected 挿入されていれば true が返ってきます。
303 @return 処理の結果が返ります。
304 */
305 nn::Result GetHeadphoneStatus(bool* isConnected);
306
307 /*!
308 :private
309 @brief DSP が占有状態を取得します。
310 @return 占有されていれば true を、そうでなければ false を返します。
311 */
312 bool IsDspOccupied(void);
313
314 } // namespace CTR {
315 } // namespace dsp {
316 } // namespace nn {
317
318 #endif // ifndef NN_DSP_CTR_DSP_API_H_
319