1 /******************************************************************************/
3 /* src/lib/libMk/MkIoPort.c */
5 /* Copyright (C) 2018-2019 Mochi. */
7 /******************************************************************************/
8 /******************************************************************************/
10 /******************************************************************************/
15 #include <kernel/ioport.h>
18 /******************************************************************************/
20 /******************************************************************************/
21 /******************************************************************************/
23 * @brief I/Oポート入力(1バイト単位)
24 * @details 指定したポート番号から1バイトのデータを指定回数分入力する。
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 権限無し
34 * @retval MK_IOPORT_RET_SUCCESS 成功
35 * @retval MK_IOPORT_RET_FAILURE 失敗
37 /******************************************************************************/
38 int32_t MkIoPortInByte( uint16_t portNo,
43 volatile MkIoPortParam_t param;
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;
54 __asm__ __volatile__ ( "mov esi, %0\n"
58 "i" ( MK_CONFIG_INTNO_IOPORT )
62 if ( pErrNo != NULL ) {
66 *pErrNo = param.errNo;
73 /******************************************************************************/
75 * @brief I/Oポート入力(4バイト単位)
76 * @details 指定したポート番号から4バイトのデータを指定回数分入力する。
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 権限無し
86 * @retval MK_IOPORT_RET_SUCCESS 成功
87 * @retval MK_IOPORT_RET_FAILURE 失敗
89 /******************************************************************************/
90 int32_t MkIoPortInDWord( uint16_t portNo,
95 volatile MkIoPortParam_t param;
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;
106 __asm__ __volatile__ ( "mov esi, %0\n"
110 "i" ( MK_CONFIG_INTNO_IOPORT )
114 if ( pErrNo != NULL ) {
118 *pErrNo = param.errNo;
125 /******************************************************************************/
127 * @brief I/Oポート入力(2バイト単位)
128 * @details 指定したポート番号から2バイトのデータを指定回数分入力する。
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 権限無し
138 * @retval MK_IOPORT_RET_SUCCESS 成功
139 * @retval MK_IOPORT_RET_FAILURE 失敗
141 /******************************************************************************/
142 int32_t MkIoPortInWord( uint16_t portNo,
147 volatile MkIoPortParam_t param;
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;
158 __asm__ __volatile__ ( "mov esi, %0\n"
162 "i" ( MK_CONFIG_INTNO_IOPORT )
166 if ( pErrNo != NULL ) {
170 *pErrNo = param.errNo;
177 /******************************************************************************/
179 * @brief I/Oポート出力(1バイト単位)
180 * @details 指定したポート番号に1バイトのデータを指定回数分出力する。
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 権限無し
190 * @retval MK_IOPORT_RET_SUCCESS 成功
191 * @retval MK_IOPORT_RET_FAILURE 失敗
193 /******************************************************************************/
194 int32_t MkIoPortOutByte( uint16_t portNo,
199 volatile MkIoPortParam_t param;
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;
210 __asm__ __volatile__ ( "mov esi, %0\n"
214 "i" ( MK_CONFIG_INTNO_IOPORT )
218 if ( pErrNo != NULL ) {
222 *pErrNo = param.errNo;
229 /******************************************************************************/
231 * @brief I/Oポート出力(4バイト単位)
232 * @details 指定したポート番号に4バイトのデータを指定回数分出力する。
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 権限無し
242 * @retval MK_IOPORT_RET_SUCCESS 成功
243 * @retval MK_IOPORT_RET_FAILURE 失敗
245 /******************************************************************************/
246 int32_t MkIoPortOutDWord( uint16_t portNo,
251 volatile MkIoPortParam_t param;
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;
262 __asm__ __volatile__ ( "mov esi, %0\n"
266 "i" ( MK_CONFIG_INTNO_IOPORT )
270 if ( pErrNo != NULL ) {
274 *pErrNo = param.errNo;
281 /******************************************************************************/
283 * @brief I/Oポート出力(2バイト単位)
284 * @details 指定したポート番号に2バイトのデータを指定回数分出力する。
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 権限無し
294 * @retval MK_IOPORT_RET_SUCCESS 成功
295 * @retval MK_IOPORT_RET_FAILURE 失敗
297 /******************************************************************************/
298 int32_t MkIoPortOutWord( uint16_t portNo,
303 volatile MkIoPortParam_t param;
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;
314 __asm__ __volatile__ ( "mov esi, %0\n"
318 "i" ( MK_CONFIG_INTNO_IOPORT )
322 if ( pErrNo != NULL ) {
326 *pErrNo = param.errNo;
333 /******************************************************************************/