source: azure_iot_hub_f767zi/trunk/asp_baseplatform/files/ff/sddiskio.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: 10.8 KB
Line 
1/*
2 * TOPPERS/JSP/ASP/FMP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just 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-2018 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/*
41 * このプログラムはITRON専用のFFドライバ・ソフトウェアである。
42 * SDカード専用ストレージ関数をサポートする
43 * 擬似的なストレージ関数郡であり、標準ライブラリィと分けての使用が望ましい。
44 * 1. sd_init この関数郡の初期化関数(bssがゼロ設定の場合この関数は不要)
45 * 2. sdcard_sense SD-CARDのセンスを行う
46 * 3. sdcard_diskstatus SD-CARDのステータス取得:なし
47 * 4. sdcard_diskread SD-CARDの読み込み:なし
48 * 5. sdcard_diskwrite SD-CARDの書き込み:なし
49 * 6. sdcard_iocil SD-CARDのIO制御:なし
50 *
51 */
52
53#include "kernel_impl.h"
54#include <stdlib.h>
55#include <string.h>
56#include <t_syslog.h>
57#include <t_stdlib.h>
58#include "fcntl.h"
59#include "device.h"
60#include "mcicmd.h"
61#include "storagedevice.h"
62#include "ff.h"
63#include "diskio.h"
64#include "sddiskio.h"
65
66static int sdcard_sense(void *psdev, BOOL on);
67static int sdcard_diskstatus(void *psdev);
68static int sdcard_diskread(void *pif, BYTE *Buffer, DWORD SectorNumber, BYTE SectorCount);
69static int sdcard_diskwrite(void *pif, const BYTE *Buffer, DWORD SectorNumber, BYTE SectorCount);
70static int sdcard_diskioctl(void *pif, BYTE Func, void* Buffer);
71
72static const StorageDeviceFunc_t fatfsSDeviceFunc = {
73 sdcard_sense,
74 sdcard_diskstatus,
75 sdcard_diskstatus,
76 (int (*)())sdcard_diskread,
77 (int (*)())sdcard_diskwrite,
78 (int (*)())sdcard_diskioctl
79};
80
81static MCIINFO SDCardInfo;
82static FATFS ActiveFatFsObj __attribute__ ((aligned (32)));
83
84#ifdef DMA_ALINE
85static unsigned int abuff[512/sizeof(unsigned int)];
86
87static void mem_cpy(unsigned char *d, unsigned char *s, int len)
88{
89 while(len > 0){
90 *d++ = *s++;
91 len--;
92 }
93}
94#endif
95
96/*
97 * FatFs用SDカードファイルドライバの初期化
98 */
99void sd_init(intptr_t exinf)
100{
101 StorageDevice_t *psdev;
102
103 SDMSetupDevice(SDCARD_DEVNO, &psdev);
104 psdev->pdevf = (StorageDeviceFunc_t *)&fatfsSDeviceFunc;
105 psdev->pdevff = (StorageDeviceFileFunc_t *)&fatfsSDeviceFileFunc;
106 psdev->_sdev_secsize = 512;
107 psdev->_sdev_port = SDCRAD_PORTID;
108#ifdef SDEV_INSWAIT_TIME
109 psdev->_sdev_inswait = SDEV_INSWAIT_TIME;
110#else
111 psdev->_sdev_inswait = 0;
112#endif
113 psdev->_sdev_attribute |= SDEV_INSERTCHK|SDEV_CHKREMOVE;
114 psdev->_sdev_local[0] = &ActiveFatFsObj;
115}
116
117/*
118 * SDCARDセンス関数
119 */
120static int sdcard_sense(void *pif, BOOL on)
121{
122 StorageDevice_t *psdev = pif;
123 bool_t exist = mci_ses_por(((StorageDevice_t *)psdev)->_sdev_port);
124 MCIPCB *pmci;
125 int result = FR_DISK_ERR;
126
127 pmci = psdev->_sdev_local[1];
128 if(on && !exist){
129 f_mount(psdev->_sdev_devno, 0);
130 psdev->_sdev_attribute &= ~SDEV_DEVERROR;
131 mci_cls_por(pmci);
132 return TRUE;
133 }
134 else if(!on && exist){
135 psdev->_sdev_instimer += SENSE_TIME;
136 if((psdev->_sdev_attribute & SDEV_ONEEXIT) != 0 && psdev->_sdev_instimer < psdev->_sdev_inswait)
137 return FALSE;
138 pmci = mci_opn_por(((StorageDevice_t *)psdev)->_sdev_port);
139 if(pmci == NULL)
140 return FALSE;
141 psdev->_sdev_local[1] = pmci;
142 if(MciCheckCID(pmci) != E_OK){
143 psdev->_sdev_attribute |= SDEV_DEVERROR;
144 return TRUE;
145 }
146 if(MciSetAddress(pmci) != E_OK){
147 psdev->_sdev_attribute |= SDEV_DEVERROR;
148 return TRUE;
149 }
150 if(MciSendCID(pmci) != E_OK){
151 psdev->_sdev_attribute |= SDEV_DEVERROR;
152 return TRUE;
153 }
154 if(MciGetCardInfo(pmci, &SDCardInfo) != E_OK)
155 psdev->_sdev_attribute |= SDEV_DEVERROR;
156 else{
157 psdev->_sdev_maxsec = SDCardInfo.maxsector;
158 if(MciSelectCard(pmci, (((uint32_t)SDCardInfo.RCA) << 16)) != E_OK)
159 psdev->_sdev_attribute |= SDEV_DEVERROR;
160 }
161 if(MciConfiguration(pmci) != E_OK)
162 psdev->_sdev_attribute |= SDEV_DEVERROR;
163 if(MciSetWideBus(pmci) != E_OK)
164 psdev->_sdev_attribute |= SDEV_DEVERROR;
165 if((psdev->_sdev_attribute & SDEV_DEVERROR) == 0)
166 result = f_mount(psdev->_sdev_devno, &ActiveFatFsObj);
167 if(result != FR_OK)
168 psdev->_sdev_attribute |= SDEV_DEVERROR;
169 else
170 psdev->_sdev_local[0] = &ActiveFatFsObj;
171#if 1
172 syslog_3(LOG_NOTICE, "## attr[%04x] max(%d) result(%d) ##", psdev->_sdev_attribute, psdev->_sdev_maxsec, result);
173#endif
174 return TRUE;
175 }
176 else
177 return FALSE;
178}
179
180/*
181 * FatFs用SDCARDステータス関数
182 */
183static int sdcard_diskstatus(void *pif)
184{
185 StorageDevice_t *psdev = pif;
186 MCIPCB *pmci;
187
188 if(psdev == NULL)
189 return STA_NODISK;
190 pmci = psdev->_sdev_local[1];
191 if((psdev->_sdev_attribute & (SDEV_EMPLOY|SDEV_NOTUSE)) != SDEV_EMPLOY || pmci == NULL)
192 return STA_NOINIT;
193 else if((pmci->status & SDMODE_PROTECT) != 0)
194 return STA_PROTECT;
195 else
196 return 0;
197}
198
199/*
200 * FatFs用SDCARD読み込み関数
201 */
202static int sdcard_diskread(void *pif, BYTE *Buffer, DWORD SectorNumber, BYTE SectorCount)
203{
204 StorageDevice_t *psdev = pif;
205 MCIPCB *pmci;
206 ER ercd = E_OK;
207 int retry = 0;
208#ifdef DMA_ALINE
209 unsigned int align = ((unsigned int)Buffer) & 3;
210 int i;
211#endif
212
213 pmci = psdev->_sdev_local[1];
214 if((psdev->_sdev_attribute & (SDEV_EMPLOY|SDEV_NOTUSE)) != SDEV_EMPLOY || pmci == NULL)
215 return RES_ERROR;
216#ifndef DMA_ALINE
217 do{
218 ercd = mci_red_blk(pmci, Buffer, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, SectorCount);
219 if(ercd == E_OK)
220 ercd = mci_wai_trn(pmci, 30*1000);
221 retry++;
222 }while(ercd != E_OK && retry < RETRY_COUNT);
223#else
224 if(align == 0){
225 do{
226 ercd = mci_red_blk(pmci, Buffer, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, SectorCount);
227 if(ercd == E_OK)
228 ercd = mci_wai_trn(pmci, 30*1000);
229 retry++;
230 }while(ercd != E_OK && retry < RETRY_COUNT);
231 }
232 else{
233 for(i = 0 ; i < SectorCount ; i++, SectorNumber++, Buffer += psdev->_sdev_secsize){
234 do{
235 ercd = mci_red_blk(pmci, abuff, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, 1);
236 if(ercd == E_OK)
237 ercd = mci_wai_trn(pmci, 30*1000);
238 retry++;
239 }while(ercd != E_OK && retry < RETRY_COUNT);
240 mem_cpy(Buffer, abuff, psdev->_sdev_secsize);
241 }
242 }
243#endif
244 if(ercd == E_OK)
245 return RES_OK;
246 else
247 return RES_ERROR;
248}
249
250/*
251 * FatFs用SDCARD書き込み関数
252 */
253static int sdcard_diskwrite(void *pif, const BYTE *Buffer, DWORD SectorNumber, BYTE SectorCount)
254{
255 StorageDevice_t *psdev = pif;
256 MCIPCB *pmci;
257 ER ercd = E_OK;
258 int retry = 0;
259#ifdef DMA_ALINE
260 unsigned int align = ((unsigned int)Buffer) & 3;
261 int i;
262#endif
263
264 pmci = psdev->_sdev_local[1];
265 if((psdev->_sdev_attribute & (SDEV_EMPLOY|SDEV_NOTUSE)) != SDEV_EMPLOY || pmci == NULL)
266 return RES_ERROR;
267#ifndef DMA_ALINE
268 do{
269 ercd = mci_wri_blk(pmci, (void *)Buffer, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, SectorCount);
270 if(ercd == E_OK)
271 ercd = mci_wai_trn(pmci, 30*1000);
272 retry++;
273 }while(ercd != E_OK && retry < RETRY_COUNT);
274#else
275 if(align == 0){
276 do{
277 ercd = mci_wri_blk(pmci, (void *)Buffer, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, SectorCount);
278 if(ercd == E_OK)
279 ercd = mci_wai_trn(pmci, 30*1000);
280 retry++;
281 }while(ercd != E_OK && retry < RETRY_COUNT);
282 }
283 else{
284 for(i = 0 ; i < SectorCount ; i++, SectorNumber++, Buffer += psdev->_sdev_secsize){
285 mem_cpy(abuff, Buffer, psdev->_sdev_secsize);
286 do{
287 ercd = mci_wri_blk(pmci, (void *)abuff, SectorNumber * psdev->_sdev_secsize, psdev->_sdev_secsize, 1);
288 if(ercd == E_OK)
289 ercd = mci_wai_trn(pmci, 30*1000);
290 retry++;
291 }while(ercd != E_OK && retry < RETRY_COUNT);
292 }
293 }
294#endif
295 if(ercd == E_OK)
296 return RES_OK;
297 else
298 return RES_ERROR;
299}
300
301
302/*
303 * FatFs用SDCARDIO制御関数
304 */
305static int sdcard_diskioctl(void *pif, BYTE Func, void* Buffer)
306{
307 StorageDevice_t *psdev = (StorageDevice_t *)pif;
308 DRESULT result;
309
310 if(psdev == NULL)
311 return RES_ERROR;
312 if((psdev->_sdev_attribute & (SDEV_EMPLOY|SDEV_NOTUSE)) != SDEV_EMPLOY)
313 return RES_ERROR;
314 switch(Func){
315 case CTRL_SYNC:
316 result = RES_OK; /* no action */
317 break;
318 case GET_SECTOR_COUNT:
319 *((DWORD *)Buffer) = psdev->_sdev_maxsec;
320 syslog_2(LOG_NOTICE, "ioctl notuse (%d)(%d) ", (int)Func, psdev->_sdev_maxsec);
321 result = RES_OK;
322 break;
323 case GET_BLOCK_SIZE:
324 *((DWORD *)Buffer) = 135; /* ERASE_BLK */
325 syslog_1(LOG_NOTICE, "call disk_ioctl(GET_BLOCK_SIZE, %08x)", (int)(*((DWORD *)Buffer)));
326 result = RES_OK;
327 break;
328 default:
329 syslog_2(LOG_NOTICE, "call disk_ioctl(%d, %08x)", (int)psdev->_sdev_devno, (int)Buffer);
330 slp_tsk();
331 result = RES_PARERR;
332 break;
333 }
334 return result;
335}
336
Note: See TracBrowser for help on using the repository browser.