53 #define DISKIO_DEBUG 0
57 #define PRINTF(...) printf(__VA_ARGS__)
63 #define DISKIO_RW_RETRIES 150
65 #define DISKIO_RW_DELAY_MS 10
70 static int diskio_rw_op(
struct diskio_device_info *dev, uint32_t block_start_address, uint32_t num_blocks, uint8_t *buffer, uint8_t op);
75 printf(
"DiskIO Device Info\n");
78 switch (dev->
type & 0x7F) {
79 case DISKIO_DEVICE_TYPE_SD_CARD:
82 case DISKIO_DEVICE_TYPE_GENERIC_FLASH:
83 printf(
"Generic_Flash");
86 printf(
"Unknown: %d", dev->
type & 0x7F);
90 if (dev->
type & DISKIO_DEVICE_TYPE_PARTITION) {
91 printf(
" (Partition)");
95 printf(
"\tnumber = %d\n", dev->
number);
96 printf(
"\tpartition = %d\n", dev->
partition);
105 return diskio_rw_op(dev, block_address, 1, buffer, DISKIO_OP_READ_BLOCK);
111 return diskio_rw_op(dev, block_start_address, num_blocks, buffer, DISKIO_OP_READ_BLOCKS);
117 return diskio_rw_op(dev, block_address, 1, buffer, DISKIO_OP_WRITE_BLOCK);
123 return diskio_rw_op(dev, block_start_address, num_blocks,
NULL, DISKIO_OP_WRITE_BLOCKS_START);
129 return diskio_rw_op(dev, 0, 1, buffer, DISKIO_OP_WRITE_BLOCKS_NEXT);
135 return diskio_rw_op(dev, 0, 0,
NULL, DISKIO_OP_WRITE_BLOCKS_DONE);
139 diskio_rw_op(
struct diskio_device_info *dev, uint32_t block_start_address, uint32_t num_blocks, uint8_t *buffer, uint8_t op)
141 static uint32_t multi_block_nr = 0;
144 if (default_device == 0) {
145 PRINTF(
"\nNo default device");
146 return DISKIO_ERROR_NO_DEVICE_SELECTED;
148 dev = default_device;
153 uint8_t ret_code = 0;
154 uint8_t tries = 0, reinit = 0;
158 case DISKIO_DEVICE_TYPE_SD_CARD:
160 case DISKIO_OP_READ_BLOCK:
161 #ifndef DISKIO_OLD_STYLE
162 for (tries = 0; tries < DISKIO_RW_RETRIES; tries++) {
163 ret_code = SD_READ_BLOCK(block_start_address, buffer);
165 return DISKIO_SUCCESS;
170 #ifdef FAT_COOPERATIVE
171 if (!coop_step_allowed) {
172 next_step_type = READ;
175 coop_step_allowed = 0;
178 _delay_ms(DISKIO_RW_DELAY_MS);
182 if ((reinit == 0) && (tries == DISKIO_RW_RETRIES - 1)) {
189 PRINTF(
"\ndiskion_rw_op(): Unrecoverable Read Error!");
190 return DISKIO_ERROR_INTERNAL_ERROR;
192 if (SD_READ_BLOCK(block_start_address, buffer) == 0) {
193 return DISKIO_SUCCESS;
195 return DISKIO_ERROR_TRY_AGAIN;
199 case DISKIO_OP_READ_BLOCKS:
200 return DISKIO_ERROR_TO_BE_IMPLEMENTED;
203 case DISKIO_OP_WRITE_BLOCK:
204 #ifndef DISKIO_OLD_STYLE
205 for (tries = 0; tries < DISKIO_RW_RETRIES; tries++) {
206 ret_code = SD_WRITE_BLOCK(block_start_address, buffer);
208 return DISKIO_SUCCESS;
211 #ifdef FAT_COOPERATIVE
212 if (!coop_step_allowed) {
213 next_step_type = WRITE;
216 coop_step_allowed = 0;
219 _delay_ms(DISKIO_RW_DELAY_MS);
221 if ((reinit == 0) && (tries == DISKIO_RW_RETRIES - 1)) {
228 PRINTF(
"\ndiskion_rw_op(): Unrecoverable Write Error!");
229 return DISKIO_ERROR_INTERNAL_ERROR;
231 if (SD_WRITE_BLOCK(block_start_address, buffer) == 0) {
232 return DISKIO_SUCCESS;
234 return DISKIO_ERROR_TRY_AGAIN;
238 case DISKIO_OP_WRITE_BLOCKS_START:
239 ret_code = SD_WRITE_BLOCKS_START(block_start_address, num_blocks);
241 return DISKIO_SUCCESS;
243 return DISKIO_ERROR_INTERNAL_ERROR;
247 case DISKIO_OP_WRITE_BLOCKS_NEXT:
248 ret_code = SD_WRITE_BLOCKS_NEXT(buffer);
250 return DISKIO_SUCCESS;
252 return DISKIO_ERROR_INTERNAL_ERROR;
256 case DISKIO_OP_WRITE_BLOCKS_DONE:
257 ret_code = SD_WRITE_BLOCKS_DONE();
259 return DISKIO_SUCCESS;
261 return DISKIO_ERROR_INTERNAL_ERROR;
266 return DISKIO_ERROR_OPERATION_NOT_SUPPORTED;
273 case DISKIO_DEVICE_TYPE_GENERIC_FLASH:
275 case DISKIO_OP_READ_BLOCK:
276 FLASH_READ_BLOCK(block_start_address, 0, buffer, 512);
277 return DISKIO_SUCCESS;
279 case DISKIO_OP_READ_BLOCKS:
280 return DISKIO_ERROR_TO_BE_IMPLEMENTED;
282 case DISKIO_OP_WRITE_BLOCK:
283 FLASH_WRITE_BLOCK(block_start_address, 0, buffer, 512);
284 return DISKIO_SUCCESS;
287 case DISKIO_OP_WRITE_BLOCKS_START:
288 if (multi_block_nr != 0) {
289 return DISKIO_ERROR_INTERNAL_ERROR;
291 multi_block_nr = block_start_address;
292 return DISKIO_SUCCESS;
294 case DISKIO_OP_WRITE_BLOCKS_NEXT:
295 FLASH_WRITE_BLOCK(multi_block_nr, 0, buffer, 512);
297 return DISKIO_SUCCESS;
298 case DISKIO_OP_WRITE_BLOCKS_DONE:
300 return DISKIO_SUCCESS;
303 return DISKIO_ERROR_OPERATION_NOT_SUPPORTED;
311 return DISKIO_ERROR_NO_DEVICE_SELECTED;
313 return DISKIO_SUCCESS;
319 default_device = dev;
333 int i = 0, index = 0;
338 #ifndef FLASH_ARCH_NUM_SECTORS
340 #define FLASH_ARCH_NUM_SECTORS 4096
342 #ifndef FLASH_ARCH_SECTOR_SIZE
344 #define FLASH_ARCH_SECTOR_SIZE 512
348 if (FLASH_INIT() == 0) {
349 devices[index].
type = DISKIO_DEVICE_TYPE_GENERIC_FLASH;
350 devices[index].
number = dev_num;
351 devices[index].
num_sectors = FLASH_ARCH_NUM_SECTORS;
352 devices[index].
sector_size = FLASH_ARCH_SECTOR_SIZE;
359 if (SD_INIT() == 0) {
360 devices[index].
type = DISKIO_DEVICE_TYPE_SD_CARD;
361 devices[index].
number = dev_num;
366 goto end_of_function;
373 for (i = 0; i < 4; ++i) {
375 devices[index].
type = DISKIO_DEVICE_TYPE_SD_CARD | DISKIO_DEVICE_TYPE_PARTITION;
376 devices[index].
number = dev_num;
393 return DISKIO_FAILURE;
396 return DISKIO_SUCCESS;