DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to read (1..128) */ ) { //tty_printf("Reading LBA %d, %d sectors\n\r", sector, count); DRESULT res; sd_rl(1); switch (pdrv) { case ATA : return RES_PARERR; case MMC : if (count == 1) { res = sd_readblock(buff, sector); } else { res = sd_readblocks(buff, sector, count); } sd_rl(0); return res; case USB : return RES_PARERR; } return RES_PARERR; }
static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) { int i; struct dfs_partition *part = (struct dfs_partition *)dev->user_data; if ( dev == RT_NULL ) { rt_set_errno(-DFS_STATUS_EINVAL); return 0; } /* read all sectors */ for (i = 0; i < size; i ++) { rt_sem_take(part->lock, RT_WAITING_FOREVER); sd_readblock((part->offset + i + pos)*SECTOR_SIZE, (rt_uint8_t*)((rt_uint8_t*)buffer + i * SECTOR_SIZE)); rt_sem_release(part->lock); } /* the length of reading must align to SECTOR SIZE */ return size; }
s24 sd_fatlib_read( u32 sector, u8 *buffer) { return( sd_readblock( sector, buffer ) == SD_ERR_OK ); }
void rt_hw_sdcard_init() { rt_uint8_t i, status; rt_uint8_t *sector; char dname[4]; char sname[8]; /* Enable PCLK into SDI Block */ CLKCON |= 1 << 9; /* Setup GPIO as SD and SDCMD, SDDAT[3:0] Pull up En */ GPEUP = GPEUP & (~(0x3f << 5)) | (0x01 << 5); GPECON = GPECON & (~(0xfff << 10)) | (0xaaa << 10); RCA = 0; if (sd_init() == RT_EOK) { /* get the first sector to read partition table */ sector = (rt_uint8_t*) rt_malloc (512); if (sector == RT_NULL) { rt_kprintf("allocate partition sector buffer failed\n"); return; } status = sd_readblock(0, sector); if (status == RT_EOK) { for(i=0; i<4; i++) { /* get the first partition */ status = dfs_filesystem_get_partition(&part[i], sector, i); if (status == RT_EOK) { rt_snprintf(dname, 4, "sd%d", i); rt_snprintf(sname, 8, "sem_sd%d", i); part[i].lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); /* register sdcard device */ sdcard_device[i].type = RT_Device_Class_Block; sdcard_device[i].init = rt_sdcard_init; sdcard_device[i].open = rt_sdcard_open; sdcard_device[i].close = rt_sdcard_close; sdcard_device[i].read = rt_sdcard_read; sdcard_device[i].write = rt_sdcard_write; sdcard_device[i].control = rt_sdcard_control; sdcard_device[i].user_data = &part[i]; rt_device_register(&sdcard_device[i], dname, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); } else { if(i == 0) { /* there is no partition table */ part[0].offset = 0; part[0].size = 0; part[0].lock = rt_sem_create("sem_sd0", 1, RT_IPC_FLAG_FIFO); /* register sdcard device */ sdcard_device[0].type = RT_Device_Class_Block; sdcard_device[0].init = rt_sdcard_init; sdcard_device[0].open = rt_sdcard_open; sdcard_device[0].close = rt_sdcard_close; sdcard_device[0].read = rt_sdcard_read; sdcard_device[0].write = rt_sdcard_write; sdcard_device[0].control = rt_sdcard_control; sdcard_device[0].user_data = &part[0]; rt_device_register(&sdcard_device[0], "sd0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); break; } } } } else { rt_kprintf("read sdcard first sector failed\n"); } /* release sector buffer */ rt_free(sector); return; } else { rt_kprintf("sdcard init failed\n"); } }