forked from mit-pdos/xv6-riscv
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsd_disk.c
71 lines (61 loc) · 1.56 KB
/
sd_disk.c
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
#include "types.h"
#include "riscv.h"
#include "defs.h"
#include "param.h"
#include "spinlock.h"
#include "sleeplock.h"
#include "fs.h"
#include "buf.h"
#include "sdcard.h"
struct sd_disk {
int initialized;
struct spinlock lock;
} sddisk;
void sd_disk_init(void)
{
// Initialize lock.
initlock(&sddisk.lock, "sd_disk");
if(sd_init(1, VF2_SD_CS, VF2_SD_MISO, VF2_SD_CLK, VF2_SD_MOSI) != 0) {
sd_deinit();
panic("sd_disk: sd_init failed");
}
sddisk.initialized = 1;
}
//
// sd_disk_rw: Perform a read or write operation using the SD card.
//
// b: pointer to the buffer structure (including b->blockno and b->data),
// write: nonzero for write, 0 for read.
//
// Since the SD card operates on 512-byte blocks, we need to read/write
// two blocks for each buffer operation.
void sd_disk_rw(struct buf *b, int write)
{
uint32 blockno = b->blockno;
int ret;
acquire(&sddisk.lock);
if(!sddisk.initialized)
panic("sd_disk_rw: disk not initialized");
if(write) {
for(int i=0; i<BSIZE/SD_BSIZE; i++) {
ret = sd_write_block(blockno*(BSIZE/SD_BSIZE)+i, b->data+i*SD_BSIZE);
if(ret != 0) {
release(&sddisk.lock);
panic("sd_disk_rw: SD card write operation failed");
}
}
} else {
for(int i=0; i<BSIZE/SD_BSIZE; i++) {
ret = sd_read_block(blockno*(BSIZE/SD_BSIZE)+i, b->data+i*SD_BSIZE);
if(ret != 0) {
release(&sddisk.lock);
panic("sd_disk_rw: SD card read operation failed");
}
}
}
__sync_synchronize();
// buffer done
b->disk = 0;
wakeup(b);
release(&sddisk.lock);
}