source: azure_iot_hub_f767zi/trunk/asp_baseplatform/files/storagedevice.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 5.7 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2016 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
13 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
34 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
35 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 *
37 * @(#) $Id$
38 */
39
40#include <stdlib.h>
41#include <string.h>
42#include "kernel_cfg.h"
43#include "storagedevice.h"
44
45#define SENSE_DEVICE (SDEV_ACTIVE|SDEV_INSERTCHK)
46
47/*
48 * Storage Device Mnanagerの全体定義
49 */
50StorageDeviceHead_t SDeviceHead;
51
52/*
53 * デバイス単位の構造体領域定義
54 */
55static StorageDevice_t SDevice[NUM_STORAGEDEVICE];
56
57
58
59void sdev_init(intptr_t exinf)
60{
61 unsigned int no;
62
63 for(no = 0 ; no < NUM_STORAGEDEVICE ; no++){
64 memset(&SDevice[no], 0, sizeof(StorageDevice_t));
65 }
66 memset(&SDeviceHead, 0, sizeof(StorageDeviceHead_t));
67 SDeviceHead._psd = &SDevice[0];
68 SDeviceHead._default_device = DEFAULT_DEVNO;
69 SDeviceHead._sdev_active = true;
70}
71
72void sdev_terminate(void)
73{
74 SDeviceHead._sdev_active = false;
75}
76
77ER SDMSetupDevice(int16_t devno, StorageDevice_t **ppsdev)
78{
79 StorageDevice_t *psdev;
80 unsigned int no;
81
82 if(devno < MINIMUM_DEVNO || devno > MAXIMUM_DEVNO)
83 return E_ID;
84 if(SDeviceHead._num_activedev >= NUM_STORAGEDEVICE)
85 return E_OBJ;
86 for(no = 0, psdev = SDeviceHead._psd ; no < SDeviceHead._num_activedev ; no++, psdev++){
87 if(devno == psdev->_sdev_devno)
88 return E_ID;
89 }
90 psdev->_sdev_attribute = SDEV_ACTIVE;
91 psdev->_sdev_devno = devno;
92 *ppsdev = psdev;
93 SDeviceHead._num_activedev++;
94 return E_OK;
95}
96
97ER_ID SDMGetDeviceNo(const char **ppathname)
98{
99 ER_ID devno = DEFAULT_DEVNO;
100 const char *p = *ppathname;
101
102 if(*p >= '0'&& *p <= '9'){
103 devno = *p++ - '0';
104 while(*p >= '0' && *p <= '9'){
105 devno *= 10;
106 devno = *p++ - '0';
107 }
108 if(devno < MINIMUM_DEVNO || devno > MAXIMUM_DEVNO)
109 devno = E_ID;
110 }
111 if(*p == ':')
112 p++;
113 *ppathname = p;
114 return devno;
115}
116
117StorageDevice_t *SDMGetStorageDevice(int devno)
118{
119 StorageDevice_t *psdev = SDeviceHead._psd;
120 unsigned int no;
121
122 for(no = 0 ; no < SDeviceHead._num_activedev ; no++){
123 if((psdev->_sdev_attribute & SDEV_ACTIVE) != 0
124 && psdev->_sdev_devno == devno)
125 return psdev;
126 psdev++;
127 }
128 return NULL;
129}
130
131ER SDMEmploy(StorageDevice_t *psdev, bool_t sw)
132{
133 if(psdev == 0)
134 return E_PAR;
135 if((psdev->_sdev_attribute & SDEV_ACTIVE) == 0)
136 return E_PAR;
137 if(sw)
138 psdev->_sdev_attribute |= SDEV_EMPLOY;
139 else
140 psdev->_sdev_attribute &= ~SDEV_EMPLOY;
141 return E_OK;
142}
143
144void SDMSence_task(intptr_t exinf)
145{
146 StorageDevice_t *psdev;
147 unsigned int dno;
148 bool_t employ;
149
150 while(SDeviceHead._sdev_active == true){
151 psdev = SDeviceHead._psd;
152 for(dno = 0 ; dno < SDeviceHead._num_activedev ; dno++, psdev++){
153 if((psdev->_sdev_attribute & SENSE_DEVICE) == SENSE_DEVICE){
154 employ = (psdev->_sdev_attribute & SDEV_EMPLOY) != 0;
155 if(!employ && psdev->pdevf->_sdevf_sense(psdev, employ) != 0){
156 psdev->_sdev_attribute |= SDEV_EMPLOY;
157 if(psdev->_sdev_notice)
158 psdev->_sdev_notice(psdev, true);
159 }
160 else if((psdev->_sdev_attribute & SDEV_CHKREMOVE) != 0 && employ){
161 if(psdev->pdevf->_sdevf_sense(psdev, employ) != 0){
162 psdev->_sdev_attribute &= ~SDEV_EMPLOY;
163 psdev->_sdev_attribute |= SDEV_ONEEXIT;
164 psdev->_sdev_instimer = 0;
165 if(psdev->_sdev_notice)
166 psdev->_sdev_notice(psdev, false);
167 }
168 }
169 }
170 }
171 dly_tsk(SENSE_TIME);
172#ifdef SDEV_SENSE_ONETIME
173 break;
174#endif
175 }
176}
177
178
Note: See TracBrowser for help on using the repository browser.