-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdiskio.c
More file actions
159 lines (125 loc) · 4.66 KB
/
diskio.c
File metadata and controls
159 lines (125 loc) · 4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs (C)ChaN, 2019 */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be */
/* attached to the FatFs via a glue function rather than modifying it. */
/* This is an example of glue functions to attach various exsisting */
/* storage control modules to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/
#include <pico/stdlib.h>
#include <ff.h> // Obtains integer types
#include <diskio.h> // Declarations of disk functions
#include <glue.h> // Declarations of SD card functions
#include "usb_diskio.h" // Declarations of USB MSD functions
// Definitions of physical drive number for each drive
#define DEV_SD 0 // Map MMC/SD card to physical drive 0
#define DEV_USB 1 // Map USB MSD to physical drive 1
/*-----------------------------------------------------------------------*/
/* Get Drive Status */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status(
BYTE pdrv // Physical drive number to identify the drive
) {
switch (pdrv) {
case DEV_SD:
return sd_disk_status(DEV_SD);
#ifdef MEDIUM_USB
case DEV_USB:
return usb_disk_status(DEV_USB);
#endif
default:
return STA_NOINIT;
}
}
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize(
BYTE pdrv // Physical drive number to identify the drive
) {
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
switch (pdrv) {
case DEV_SD:
return sd_disk_initialize(DEV_SD);
#ifdef MEDIUM_USB
case DEV_USB:
return usb_disk_initialize(DEV_USB);
#endif
default:
return STA_NOINIT;
}
}
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_read(
BYTE pdrv, // Physical drive number to identify the drive
BYTE *buff, // Data buffer to store read data
LBA_t sector, // Start sector in LBA
UINT count // Number of sectors to read
) {
DRESULT result;
gpio_put(PICO_DEFAULT_LED_PIN, true);
switch (pdrv) {
case DEV_SD:
result = sd_disk_read(DEV_SD, buff, sector, count);
break;
#ifdef MEDIUM_USB
case DEV_USB:
result = usb_disk_read(DEV_USB, buff, sector, count);
break;
#endif
default:
result = RES_PARERR;
}
gpio_put(PICO_DEFAULT_LED_PIN, false);
return result;
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
#if FF_FS_READONLY == 0
DRESULT disk_write(
BYTE pdrv, // Physical drive number to identify the drive
const BYTE *buff, // Data to be written
LBA_t sector, // Start sector in LBA
UINT count // Number of sectors to write
) {
DRESULT result;
gpio_put(PICO_DEFAULT_LED_PIN, true);
switch (pdrv) {
case DEV_SD:
result = sd_disk_write(DEV_SD, buff, sector, count);
break;
#ifdef MEDIUM_USB
case DEV_USB:
result = usb_disk_write(DEV_USB, buff, sector, count);
break;
#endif
default:
result = RES_PARERR;
}
gpio_put(PICO_DEFAULT_LED_PIN, false);
return result;
}
#endif
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl(
BYTE pdrv, // Physical drive number to identify the drive
BYTE cmd, // Control code
void *buff // Buffer to send/receive control data
) {
switch (pdrv) {
case DEV_SD:
return sd_disk_ioctl(DEV_SD, cmd, buff);
#ifdef MEDIUM_USB
case DEV_USB:
return usb_disk_ioctl(DEV_USB, cmd, buff);
#endif
default:
return RES_PARERR;
}
}