OSDN Git Service

ファイル名~Init.c/hを~.c/hに変更
[mochi/master.git] / src / lib / libMk / MkIoPort.c
1 /******************************************************************************/
2 /*                                                                            */
3 /* src/lib/libMk/MkIoPort.c                                                   */
4 /*                                                                 2019/07/24 */
5 /* Copyright (C) 2018-2019 Mochi.                                             */
6 /*                                                                            */
7 /******************************************************************************/
8 /******************************************************************************/
9 /* インクルード                                                               */
10 /******************************************************************************/
11 /* 標準ヘッダ */
12 #include <stdint.h>
13
14 /* 共通ヘッダ */
15 #include <kernel/ioport.h>
16
17
18 /******************************************************************************/
19 /* グローバル関数宣言                                                         */
20 /******************************************************************************/
21 /******************************************************************************/
22 /**
23  * @brief       I/Oポート入力(1バイト単位)
24  * @details     指定したポート番号から1バイトのデータを指定回数分入力する。
25  *
26  * @param[in]   portNo ポート番号
27  * @param[out]  *pData データ格納先
28  * @param[in]   count  読込み回数
29  * @param[out]  *pErrNo エラー番号
30  *                  - MK_IOPORT_ERR_NONE         エラー無し
31  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
32  *
33  * @return      処理結果を返す。
34  * @retval      MK_IOPORT_RET_SUCCESS 成功
35  * @retval      MK_IOPORT_RET_FAILURE 失敗
36  */
37 /******************************************************************************/
38 int32_t MkIoPortInByte( uint16_t portNo,
39                         void     *pData,
40                         size_t   count,
41                         uint32_t *pErrNo )
42 {
43     volatile MkIoPortParam_t param;
44
45     /* パラメータ設定 */
46     param.funcId = MK_IOPORT_FUNCID_IN_BYTE;
47     param.errNo  = MK_IOPORT_ERR_NONE;
48     param.ret    = MK_IOPORT_RET_FAILURE;
49     param.portNo = portNo;
50     param.pData  = pData;
51     param.count  = count;
52
53     /* カーネルコール */
54     __asm__ __volatile__ ( "mov esi, %0\n"
55                            "int %1"
56                            :
57                            : "a" ( &param                 ),
58                              "i" ( MK_CONFIG_INTNO_IOPORT )
59                            : "esi"                           );
60
61     /* エラー番号設定要否判定 */
62     if ( pErrNo != NULL ) {
63         /* 必要 */
64
65         /* エラー番号設定 */
66         *pErrNo = param.errNo;
67     }
68
69     return param.ret;
70 }
71
72
73 /******************************************************************************/
74 /**
75  * @brief       I/Oポート入力(4バイト単位)
76  * @details     指定したポート番号から4バイトのデータを指定回数分入力する。
77  *
78  * @param[in]   portNo ポート番号
79  * @param[out]  *pData データ格納先
80  * @param[in]   count  読込み回数
81  * @param[out]  *pErrNo エラー番号
82  *                  - MK_IOPORT_ERR_NONE         エラー無し
83  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
84  *
85  * @return      処理結果を返す。
86  * @retval      MK_IOPORT_RET_SUCCESS 成功
87  * @retval      MK_IOPORT_RET_FAILURE 失敗
88  */
89 /******************************************************************************/
90 int32_t MkIoPortInDWord( uint16_t portNo,
91                          void     *pData,
92                          size_t   count,
93                          uint32_t *pErrNo )
94 {
95     volatile MkIoPortParam_t param;
96
97     /* パラメータ設定 */
98     param.funcId = MK_IOPORT_FUNCID_IN_DWORD;
99     param.errNo  = MK_IOPORT_ERR_NONE;
100     param.ret    = MK_IOPORT_RET_FAILURE;
101     param.portNo = portNo;
102     param.pData  = pData;
103     param.count  = count;
104
105     /* カーネルコール */
106     __asm__ __volatile__ ( "mov esi, %0\n"
107                            "int %1"
108                            :
109                            : "a" ( &param                 ),
110                              "i" ( MK_CONFIG_INTNO_IOPORT )
111                            : "esi"                           );
112
113     /* エラー番号設定要否判定 */
114     if ( pErrNo != NULL ) {
115         /* 必要 */
116
117         /* エラー番号設定 */
118         *pErrNo = param.errNo;
119     }
120
121     return param.ret;
122 }
123
124
125 /******************************************************************************/
126 /**
127  * @brief       I/Oポート入力(2バイト単位)
128  * @details     指定したポート番号から2バイトのデータを指定回数分入力する。
129  *
130  * @param[in]   portNo ポート番号
131  * @param[out]  *pData データ格納先
132  * @param[in]   count  読込み回数
133  * @param[out]  *pErrNo エラー番号
134  *                  - MK_IOPORT_ERR_NONE         エラー無し
135  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
136  *
137  * @return      処理結果を返す。
138  * @retval      MK_IOPORT_RET_SUCCESS 成功
139  * @retval      MK_IOPORT_RET_FAILURE 失敗
140  */
141 /******************************************************************************/
142 int32_t MkIoPortInWord( uint16_t portNo,
143                         void     *pData,
144                         size_t   count,
145                         uint32_t *pErrNo )
146 {
147     volatile MkIoPortParam_t param;
148
149     /* パラメータ設定 */
150     param.funcId = MK_IOPORT_FUNCID_IN_WORD;
151     param.errNo  = MK_IOPORT_ERR_NONE;
152     param.ret    = MK_IOPORT_RET_FAILURE;
153     param.portNo = portNo;
154     param.pData  = pData;
155     param.count  = count;
156
157     /* カーネルコール */
158     __asm__ __volatile__ ( "mov esi, %0\n"
159                            "int %1"
160                            :
161                            : "a" ( &param                 ),
162                              "i" ( MK_CONFIG_INTNO_IOPORT )
163                            : "esi"                           );
164
165     /* エラー番号設定要否判定 */
166     if ( pErrNo != NULL ) {
167         /* 必要 */
168
169         /* エラー番号設定 */
170         *pErrNo = param.errNo;
171     }
172
173     return param.ret;
174 }
175
176
177 /******************************************************************************/
178 /**
179  * @brief       I/Oポート出力(1バイト単位)
180  * @details     指定したポート番号に1バイトのデータを指定回数分出力する。
181  *
182  * @param[in]   portNo ポート番号
183  * @param[out]  *pData データ格納先
184  * @param[in]   count  読込み回数
185  * @param[out]  *pErrNo エラー番号
186  *                  - MK_IOPORT_ERR_NONE         エラー無し
187  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
188  *
189  * @return      処理結果を返す。
190  * @retval      MK_IOPORT_RET_SUCCESS 成功
191  * @retval      MK_IOPORT_RET_FAILURE 失敗
192  */
193 /******************************************************************************/
194 int32_t MkIoPortOutByte( uint16_t portNo,
195                          void     *pData,
196                          size_t   count,
197                          uint32_t *pErrNo )
198 {
199     volatile MkIoPortParam_t param;
200
201     /* パラメータ設定 */
202     param.funcId = MK_IOPORT_FUNCID_OUT_BYTE;
203     param.errNo  = MK_IOPORT_ERR_NONE;
204     param.ret    = MK_IOPORT_RET_FAILURE;
205     param.portNo = portNo;
206     param.pData  = pData;
207     param.count  = count;
208
209     /* カーネルコール */
210     __asm__ __volatile__ ( "mov esi, %0\n"
211                            "int %1"
212                            :
213                            : "a" ( &param                 ),
214                              "i" ( MK_CONFIG_INTNO_IOPORT )
215                            : "esi"                           );
216
217     /* エラー番号設定要否判定 */
218     if ( pErrNo != NULL ) {
219         /* 必要 */
220
221         /* エラー番号設定 */
222         *pErrNo = param.errNo;
223     }
224
225     return param.ret;
226 }
227
228
229 /******************************************************************************/
230 /**
231  * @brief       I/Oポート出力(4バイト単位)
232  * @details     指定したポート番号に4バイトのデータを指定回数分出力する。
233  *
234  * @param[in]   portNo ポート番号
235  * @param[out]  *pData データ格納先
236  * @param[in]   count  読込み回数
237  * @param[out]  *pErrNo エラー番号
238  *                  - MK_IOPORT_ERR_NONE         エラー無し
239  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
240  *
241  * @return      処理結果を返す。
242  * @retval      MK_IOPORT_RET_SUCCESS 成功
243  * @retval      MK_IOPORT_RET_FAILURE 失敗
244  */
245 /******************************************************************************/
246 int32_t MkIoPortOutDWord( uint16_t portNo,
247                           void     *pData,
248                           size_t   count,
249                           uint32_t *pErrNo )
250 {
251     volatile MkIoPortParam_t param;
252
253     /* パラメータ設定 */
254     param.funcId = MK_IOPORT_FUNCID_OUT_DWORD;
255     param.errNo  = MK_IOPORT_ERR_NONE;
256     param.ret    = MK_IOPORT_RET_FAILURE;
257     param.portNo = portNo;
258     param.pData  = pData;
259     param.count  = count;
260
261     /* カーネルコール */
262     __asm__ __volatile__ ( "mov esi, %0\n"
263                            "int %1"
264                            :
265                            : "a" ( &param                 ),
266                              "i" ( MK_CONFIG_INTNO_IOPORT )
267                            : "esi"                           );
268
269     /* エラー番号設定要否判定 */
270     if ( pErrNo != NULL ) {
271         /* 必要 */
272
273         /* エラー番号設定 */
274         *pErrNo = param.errNo;
275     }
276
277     return param.ret;
278 }
279
280
281 /******************************************************************************/
282 /**
283  * @brief       I/Oポート出力(2バイト単位)
284  * @details     指定したポート番号に2バイトのデータを指定回数分出力する。
285  *
286  * @param[in]   portNo ポート番号
287  * @param[out]  *pData データ格納先
288  * @param[in]   count  読込み回数
289  * @param[out]  *pErrNo エラー番号
290  *                  - MK_IOPORT_ERR_NONE         エラー無し
291  *                  - MK_IOPORT_ERR_UNAUTHORIZED 権限無し
292  *
293  * @return      処理結果を返す。
294  * @retval      MK_IOPORT_RET_SUCCESS 成功
295  * @retval      MK_IOPORT_RET_FAILURE 失敗
296  */
297 /******************************************************************************/
298 int32_t MkIoPortOutWord( uint16_t portNo,
299                          void     *pData,
300                          size_t   count,
301                          uint32_t *pErrNo )
302 {
303     volatile MkIoPortParam_t param;
304
305     /* パラメータ設定 */
306     param.funcId = MK_IOPORT_FUNCID_OUT_WORD;
307     param.errNo  = MK_IOPORT_ERR_NONE;
308     param.ret    = MK_IOPORT_RET_FAILURE;
309     param.portNo = portNo;
310     param.pData  = pData;
311     param.count  = count;
312
313     /* カーネルコール */
314     __asm__ __volatile__ ( "mov esi, %0\n"
315                            "int %1"
316                            :
317                            : "a" ( &param                 ),
318                              "i" ( MK_CONFIG_INTNO_IOPORT )
319                            : "esi"                           );
320
321     /* エラー番号設定要否判定 */
322     if ( pErrNo != NULL ) {
323         /* 必要 */
324
325         /* エラー番号設定 */
326         *pErrNo = param.errNo;
327     }
328
329     return param.ret;
330 }
331
332
333 /******************************************************************************/