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: 29251 $
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 /*! :private
134     @brief      DSP-Wram アドレスおよび連続領域アドレスの仮想アドレスを取得します。
135     @param[in]  physicalAddress     物理アドレス。
136     @param[out] pVirtualAddress     仮想アドレスの格納先。
137     @return     処理の結果が返ります。
138  */
139 nn::Result GetVirtualAddress(uptr physicalAddress, uptr * pVirtualAddress);
140 
141 /*! :private
142     @brief      DSP-Wram アドレスおよび連続領域アドレスの物理アドレスを取得します。
143     @param[in]  virtualAddress      仮想アドレス。
144     @param[out] pPhysicalAddress    物理アドレスの格納先。
145     @return     処理の結果が返ります。
146  */
147 nn::Result GetPhysicalAddress(uptr address, uptr * pPhysicalAddress);
148 
149 /*! :private
150     @brief      DSP 環境におけるアドレスを、CPU 環境におけるアドレスに変換します。
151     @param[in]  addressOnDsp        DSP 環境におけるアドレス。
152     @param[out] pAddressOnHost      CPU 環境におけるアドレスの格納先。
153     @return     処理の結果が返ります。
154  */
155 nn::Result ConvertProcessAddressFromDspDram(uptr addressOnDsp, uptr * pAddressOnHost);
156 
157 /*!
158     @brief      DSP pipe からデータを読みます。
159     @param[in]  port        ポート番号。
160     @param[in]  buffer      データを読み込むバッファのアドレス。
161     @param[in]  length      読み込みデータ長。
162     @param[out] pLengthRead 実際に読み込まれたデータ長の格納先。
163     @return     処理の結果が返ります。
164  */
165 nn::Result ReadPipeIfPossible( int port, void* buffer, u16 length, u16* pLengthRead );
166 
167 /*!
168     @brief      DSP pipe へデータを書きます。
169     @param[in]  port        ポート番号。
170     @param[in]  buffer      データを書き込むバッファのアドレス。
171     @param[in]  length      書き込みデータ長。
172     @return     処理の結果が返ります。
173  */
174 nn::Result WriteProcessPipe( int port, const void *buffer, u32 length );
175 
176 /*!
177     @brief      セマフォのリクエストを取得します。
178     @param[in]  pIsRequested        リクエストの有無。
179     @return     処理の結果が返ります。
180  */
181 nn::Result CheckSemaphoreRequest( bool* pIsRequested );
182 
183 /*!
184     @brief      セマフォをクリアします。
185     @param[in]  mask        マスク。
186     @return     処理の結果が返ります。
187  */
188 nn::Result ClearSemaphore( u16 mask );
189 
190 /*!
191     @brief      セマフォのマスクを設定します。
192     @param[in]  mask        マスク。
193     @return     処理の結果が返ります。
194  */
195 nn::Result MaskSemaphore( u16 mask );
196 
197 /*!
198     @brief      セマフォの値を取得します。
199     @param[in]  pMask       値の格納先。
200     @return     処理の結果が返ります。
201  */
202 nn::Result GetSemaphore( u16* pMask );
203 
204 /*!
205     @brief      セマフォの値を設定します。
206     @param[in]  mask        マスク。
207     @return     処理の結果が返ります。
208  */
209 nn::Result SetSemaphore( u16 mask );
210 
211 /*!
212     :private
213     @brief      セマフォイベントのハンドルを取得します。
214     @param[out] pHandle     値の格納先。
215     @return     処理の結果が返ります。
216  */
217 nn::Result GetSemaphoreEventHandle ( nn::Handle *);
218 
219 /*!
220     :private
221     @brief      セマフォイベントで設定するマスクの値を設定します。
222     @param[in]  mask        設定するマスクの値。
223     @return     処理の結果が返ります。
224  */
225 nn::Result SetSemaphoreEventMask ( bit16 );
226 
227 /*!
228     @}
229  */
230 
231 /*!
232     @brief      指定された範囲のデータをキャッシュからメモリに書き戻し、キャッシュを無効にします。
233     @param[in]  addr        先頭アドレス。
234     @param[in]  size        サイズ。
235     @return     処理の結果が返ります。
236  */
237 nn::Result FlushDataCache( uptr addr, size_t size );
238 
239 /*! :private
240     @brief      指定された範囲のキャッシュを無効にします。
241     @param[in]  addr        先頭アドレス。
242     @param[in]  size        サイズ。
243     @return     処理の結果が返ります。
244  */
245 nn::Result InvalidateDataCache( uptr addr, size_t size );
246 
247 /*! :private
248     @brief      DSP にコンポーネントがロードされているかどうかを確認します。
249     @return     ロードされていれば true を、されていなければ false を返します。
250  */
251 bool IsComponentLoaded(void);
252 
253 /*!
254     @brief      DSP で行っている処理を一時中断し、終了処理を行います。
255     @return     実際にスリープ処理が行われば場合は true を、何もしなかった場合は false を返します。
256  */
257 bool Sleep(void);
258 
259 /*!
260     @brief      一時中断した DSP の処理を復元します。
261     @brief      なし。
262  */
263 void WakeUp(void);
264 
265 /*! :private
266     @brief      システムのスリープから復帰します。
267  */
268 void Awake();
269 
270 /*! :private
271     @brief      終了処理のための準備を行います。
272  */
273 void OrderToWaitForFinalize();
274 
275 /*! :private
276     @brief      Sleep, WakeUp, OrderToWaitForFinalize 時に呼ばれるコールバックを設定します。
277     @param[in]  sleepCallback                   Sleep 時のコールバック
278     @param[in]  wakeUpCallback                  WakeUp 時のコールバック
279     @param[in]  orderToWaitForFinalizeCallback  OrderToWaitForFinalize 時のコールバック
280     @return     コールバックの設定に成功したら true を、失敗したら false を返します。
281  */
282 bool RegisterSleepWakeUpCallback(
283     void (*sleepCallback)(),
284     void (*wakeUpCallback)(),
285     void (*orderToWaitForFinalizeCallback)() = NULL
286 );
287 
288 /*! :private
289     @brief      Sleep, WakeUp, OrderToWaitForFinalize 時に呼ばれるコールバックを無効にします。
290     @param[in]  sleepCallback                   Sleep 時のコールバック
291     @param[in]  wakeUpCallback                  WakeUp 時のコールバック
292     @param[in]  orderToWaitForFinalizeCallback  OrderToWaitForFinalize 時のコールバック
293     @return     コールバックの無効化に成功したら true を、失敗したら false を返します。
294  */
295 bool ClearSleepWakeUpCallback(
296     void (*sleepCallback)(),
297     void (*wakeUpCallback)(),
298     void (*orderToWaitForFinalizeCallback)() = NULL
299 );
300 
301 /*!
302     @brief      ヘッドホンの挿入状態を取得します。
303     @param[out] isConnected     挿入されていれば true が返ってきます。
304     @return     処理の結果が返ります。
305  */
306 nn::Result GetHeadphoneStatus(bool* isConnected);
307 
308 /*! :private
309     @brief      蓋閉じ時に強制的にヘッドフォン出力にするかどうかを設定します。
310     @param[in]  forceout        true なら強制ヘッドフォン出力とします。
311     @return     処理の結果が返ります。
312  */
313 Result ForceHeadphoneOut(bool forceout);
314 
315 /*!
316     :private
317     @brief      DSP が占有状態を取得します。
318     @return     占有されていれば true を、そうでなければ false を返します。
319  */
320 bool IsDspOccupied(void);
321 
322 } // namespace CTR {
323 } // namespace dsp {
324 } // namespace nn  {
325 
326 #endif  // ifndef NN_DSP_CTR_DSP_API_H_
327