2013-10-23 21:30:45 +09:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2013 Samsung Electronics
|
|
|
|
* Lukasz Majewski <l.majewski@samsung.com>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
|
|
|
#include <usb_mass_storage.h>
|
2014-05-06 01:40:11 +09:00
|
|
|
#include <mmc.h>
|
2013-10-23 21:30:45 +09:00
|
|
|
#include <part.h>
|
|
|
|
|
|
|
|
static int ums_read_sector(struct ums *ums_dev,
|
|
|
|
ulong start, lbaint_t blkcnt, void *buf)
|
|
|
|
{
|
2014-05-06 01:40:11 +09:00
|
|
|
block_dev_desc_t *block_dev = ums_dev->block_dev;
|
2013-10-23 21:30:45 +09:00
|
|
|
lbaint_t blkstart = start + ums_dev->start_sector;
|
|
|
|
int dev_num = block_dev->dev;
|
|
|
|
|
|
|
|
return block_dev->block_read(dev_num, blkstart, blkcnt, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int ums_write_sector(struct ums *ums_dev,
|
|
|
|
ulong start, lbaint_t blkcnt, const void *buf)
|
|
|
|
{
|
2014-05-06 01:40:11 +09:00
|
|
|
block_dev_desc_t *block_dev = ums_dev->block_dev;
|
2013-10-23 21:30:45 +09:00
|
|
|
lbaint_t blkstart = start + ums_dev->start_sector;
|
|
|
|
int dev_num = block_dev->dev;
|
|
|
|
|
|
|
|
return block_dev->block_write(dev_num, blkstart, blkcnt, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct ums ums_dev = {
|
|
|
|
.read_sector = ums_read_sector,
|
|
|
|
.write_sector = ums_write_sector,
|
|
|
|
.name = "UMS disk",
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct ums *ums_disk_init(struct mmc *mmc)
|
|
|
|
{
|
2014-05-06 01:40:11 +09:00
|
|
|
ums_dev.block_dev = &mmc->block_dev;
|
2014-05-06 01:40:12 +09:00
|
|
|
ums_dev.start_sector = 0;
|
2014-05-06 01:40:13 +09:00
|
|
|
ums_dev.num_sectors = mmc->capacity / SECTOR_SIZE;
|
2013-10-23 21:30:45 +09:00
|
|
|
|
|
|
|
printf("UMS: disk start sector: %#x, count: %#x\n",
|
|
|
|
ums_dev.start_sector, ums_dev.num_sectors);
|
|
|
|
|
|
|
|
return &ums_dev;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ums *ums_init(unsigned int dev_num)
|
|
|
|
{
|
2014-04-29 04:13:26 +09:00
|
|
|
struct mmc *mmc = find_mmc_device(dev_num);
|
2013-10-23 21:30:45 +09:00
|
|
|
|
2014-04-29 04:13:26 +09:00
|
|
|
if (!mmc || mmc_init(mmc))
|
2013-10-23 21:30:45 +09:00
|
|
|
return NULL;
|
|
|
|
return ums_disk_init(mmc);
|
|
|
|
}
|