mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 06:31:31 +00:00
usb: ums: code refactoring to improve reusability on other boards.
This patch introduces some cleanups to ums code. Changes: ums common: - introduce UMS_START_SECTOR and UMS_NUM_SECTORS as defined in usb_mass_storage.h both default values as 0 if board config doesn't define them common cleanup changes: - change name of struct "ums_board_info" to "ums" - "ums_device" fields are moved to struct ums and "dev_num" is removed - change function name: board_ums_init to ums_init - remove "extern" prefixes from usb_mass_storage.h cmd_usb_mass_storage: - change error() to printf() if need to print info message - change return values to command_ret_t type at ums command code - add command usage string Changes v2: ums common: - always returns number of read/write sectors - coding style clean-up ums gadget: - calculate amount of read/write from device returned value. Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> Cc: Marek Vasut <marek.vasut@gmail.com>
This commit is contained in:
parent
2cee0408e5
commit
93c813b3ac
5 changed files with 74 additions and 85 deletions
|
@ -774,63 +774,54 @@ void init_panel_info(vidinfo_t *vid)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USB_GADGET_MASS_STORAGE
|
#ifdef CONFIG_USB_GADGET_MASS_STORAGE
|
||||||
static int ums_read_sector(struct ums_device *ums_dev,
|
static int ums_read_sector(struct ums *ums_dev,
|
||||||
ulong start, lbaint_t blkcnt, void *buf)
|
ulong start, lbaint_t blkcnt, void *buf)
|
||||||
{
|
{
|
||||||
if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num,
|
block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
|
||||||
start + ums_dev->offset, blkcnt, buf) != blkcnt)
|
lbaint_t blkstart = start + ums_dev->offset;
|
||||||
return -1;
|
int dev_num = block_dev->dev;
|
||||||
|
|
||||||
return 0;
|
return block_dev->block_read(dev_num, blkstart, blkcnt, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ums_write_sector(struct ums_device *ums_dev,
|
static int ums_write_sector(struct ums *ums_dev,
|
||||||
ulong start, lbaint_t blkcnt, const void *buf)
|
ulong start, lbaint_t blkcnt, const void *buf)
|
||||||
{
|
{
|
||||||
if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num,
|
block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
|
||||||
start + ums_dev->offset, blkcnt, buf) != blkcnt)
|
lbaint_t blkstart = start + ums_dev->offset;
|
||||||
return -1;
|
int dev_num = block_dev->dev;
|
||||||
|
|
||||||
return 0;
|
return block_dev->block_write(dev_num, blkstart, blkcnt, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ums_get_capacity(struct ums_device *ums_dev,
|
static void ums_get_capacity(struct ums *ums_dev, long long int *capacity)
|
||||||
long long int *capacity)
|
|
||||||
{
|
{
|
||||||
long long int tmp_capacity;
|
long long int tmp_capacity;
|
||||||
|
|
||||||
tmp_capacity = (long long int) ((ums_dev->offset + ums_dev->part_size)
|
tmp_capacity = (long long int)((ums_dev->offset + ums_dev->part_size)
|
||||||
* SECTOR_SIZE);
|
* SECTOR_SIZE);
|
||||||
*capacity = ums_dev->mmc->capacity - tmp_capacity;
|
*capacity = ums_dev->mmc->capacity - tmp_capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ums_board_info ums_board = {
|
static struct ums ums_dev = {
|
||||||
.read_sector = ums_read_sector,
|
.read_sector = ums_read_sector,
|
||||||
.write_sector = ums_write_sector,
|
.write_sector = ums_write_sector,
|
||||||
.get_capacity = ums_get_capacity,
|
.get_capacity = ums_get_capacity,
|
||||||
.name = "TRATS UMS disk",
|
.name = "UMS disk",
|
||||||
.ums_dev = {
|
.offset = UMS_START_SECTOR,
|
||||||
.mmc = NULL,
|
.part_size = UMS_NUM_SECTORS,
|
||||||
.dev_num = 0,
|
|
||||||
.offset = 0,
|
|
||||||
.part_size = 0.
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset,
|
struct ums *ums_init(unsigned int dev_num)
|
||||||
unsigned int part_size)
|
|
||||||
{
|
{
|
||||||
struct mmc *mmc;
|
struct mmc *mmc = NULL;
|
||||||
|
|
||||||
mmc = find_mmc_device(dev_num);
|
mmc = find_mmc_device(dev_num);
|
||||||
if (!mmc)
|
if (!mmc)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ums_board.ums_dev.mmc = mmc;
|
ums_dev.mmc = mmc;
|
||||||
ums_board.ums_dev.dev_num = dev_num;
|
|
||||||
ums_board.ums_dev.offset = offset;
|
|
||||||
ums_board.ums_dev.part_size = part_size;
|
|
||||||
|
|
||||||
return &ums_board;
|
return &ums_dev;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,28 +22,26 @@ int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
|
||||||
|
|
||||||
unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,
|
unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,
|
||||||
NULL, 0));
|
NULL, 0));
|
||||||
if (dev_num) {
|
if (dev_num)
|
||||||
error("Set eMMC device to 0! - e.g. ums 0");
|
return CMD_RET_USAGE;
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int controller_index = (unsigned int)(simple_strtoul(
|
unsigned int controller_index = (unsigned int)(simple_strtoul(
|
||||||
usb_controller, NULL, 0));
|
usb_controller, NULL, 0));
|
||||||
if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
|
if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
|
||||||
error("Couldn't init USB controller.");
|
error("Couldn't init USB controller.");
|
||||||
goto fail;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ums_board_info *ums_info = board_ums_init(dev_num, 0, 0);
|
struct ums *ums = ums_init(dev_num);
|
||||||
if (!ums_info) {
|
if (!ums) {
|
||||||
error("MMC: %d -> NOT available", dev_num);
|
printf("MMC: %u no such device\n", dev_num);
|
||||||
goto fail;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rc = fsg_init(ums_info);
|
int rc = fsg_init(ums);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error("fsg_init failed");
|
error("fsg_init failed");
|
||||||
goto fail;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_dnl_register("ums");
|
g_dnl_register("ums");
|
||||||
|
@ -62,13 +60,10 @@ int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
g_dnl_unregister();
|
g_dnl_unregister();
|
||||||
return 0;
|
return CMD_RET_SUCCESS;
|
||||||
|
|
||||||
fail:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
|
U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
|
||||||
"Use the UMS [User Mass Storage]",
|
"Use the UMS [User Mass Storage]",
|
||||||
"<USB_controller> <mmc_dev>"
|
"ums <USB_controller> <mmc_dev> e.g. ums 0 0"
|
||||||
);
|
);
|
||||||
|
|
|
@ -441,7 +441,7 @@ static void set_bulk_out_req_length(struct fsg_common *common,
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
struct ums_board_info *ums_info;
|
struct ums *ums;
|
||||||
struct fsg_common *the_fsg_common;
|
struct fsg_common *the_fsg_common;
|
||||||
|
|
||||||
static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep)
|
static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep)
|
||||||
|
@ -757,14 +757,14 @@ static int do_read(struct fsg_common *common)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform the read */
|
/* Perform the read */
|
||||||
nread = 0;
|
rc = ums->read_sector(ums,
|
||||||
rc = ums_info->read_sector(&(ums_info->ums_dev),
|
file_offset / SECTOR_SIZE,
|
||||||
file_offset / SECTOR_SIZE,
|
amount / SECTOR_SIZE,
|
||||||
amount / SECTOR_SIZE,
|
(char __user *)bh->buf);
|
||||||
(char __user *)bh->buf);
|
if (!rc)
|
||||||
if (rc)
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
nread = amount;
|
|
||||||
|
nread = rc * SECTOR_SIZE;
|
||||||
|
|
||||||
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
||||||
(unsigned long long) file_offset,
|
(unsigned long long) file_offset,
|
||||||
|
@ -931,13 +931,13 @@ static int do_write(struct fsg_common *common)
|
||||||
amount = bh->outreq->actual;
|
amount = bh->outreq->actual;
|
||||||
|
|
||||||
/* Perform the write */
|
/* Perform the write */
|
||||||
rc = ums_info->write_sector(&(ums_info->ums_dev),
|
rc = ums->write_sector(ums,
|
||||||
file_offset / SECTOR_SIZE,
|
file_offset / SECTOR_SIZE,
|
||||||
amount / SECTOR_SIZE,
|
amount / SECTOR_SIZE,
|
||||||
(char __user *)bh->buf);
|
(char __user *)bh->buf);
|
||||||
if (rc)
|
if (!rc)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
nwritten = amount;
|
nwritten = rc * SECTOR_SIZE;
|
||||||
|
|
||||||
VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
|
VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
|
||||||
(unsigned long long) file_offset,
|
(unsigned long long) file_offset,
|
||||||
|
@ -959,6 +959,8 @@ static int do_write(struct fsg_common *common)
|
||||||
|
|
||||||
/* If an error occurred, report it and its position */
|
/* If an error occurred, report it and its position */
|
||||||
if (nwritten < amount) {
|
if (nwritten < amount) {
|
||||||
|
printf("nwritten:%d amount:%d\n", nwritten,
|
||||||
|
amount);
|
||||||
curlun->sense_data = SS_WRITE_ERROR;
|
curlun->sense_data = SS_WRITE_ERROR;
|
||||||
curlun->info_valid = 1;
|
curlun->info_valid = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -1045,14 +1047,13 @@ static int do_verify(struct fsg_common *common)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform the read */
|
/* Perform the read */
|
||||||
nread = 0;
|
rc = ums->read_sector(ums,
|
||||||
rc = ums_info->read_sector(&(ums_info->ums_dev),
|
file_offset / SECTOR_SIZE,
|
||||||
file_offset / SECTOR_SIZE,
|
amount / SECTOR_SIZE,
|
||||||
amount / SECTOR_SIZE,
|
(char __user *)bh->buf);
|
||||||
(char __user *)bh->buf);
|
if (!rc)
|
||||||
if (rc)
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
nread = amount;
|
nread = rc * SECTOR_SIZE;
|
||||||
|
|
||||||
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
||||||
(unsigned long long) file_offset,
|
(unsigned long long) file_offset,
|
||||||
|
@ -1100,7 +1101,7 @@ static int do_inquiry(struct fsg_common *common, struct fsg_buffhd *bh)
|
||||||
buf[4] = 31; /* Additional length */
|
buf[4] = 31; /* Additional length */
|
||||||
/* No special options */
|
/* No special options */
|
||||||
sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id ,
|
sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id ,
|
||||||
ums_info->name, (u16) 0xffff);
|
ums->name, (u16) 0xffff);
|
||||||
|
|
||||||
return 36;
|
return 36;
|
||||||
}
|
}
|
||||||
|
@ -2753,9 +2754,9 @@ int fsg_add(struct usb_configuration *c)
|
||||||
return fsg_bind_config(c->cdev, c, fsg_common);
|
return fsg_bind_config(c->cdev, c, fsg_common);
|
||||||
}
|
}
|
||||||
|
|
||||||
int fsg_init(struct ums_board_info *ums)
|
int fsg_init(struct ums *ums_dev)
|
||||||
{
|
{
|
||||||
ums_info = ums;
|
ums = ums_dev;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,6 @@ struct rw_semaphore { int i; };
|
||||||
#define ETOOSMALL 525
|
#define ETOOSMALL 525
|
||||||
|
|
||||||
#include <usb_mass_storage.h>
|
#include <usb_mass_storage.h>
|
||||||
extern struct ums_board_info *ums_info;
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -581,7 +580,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
|
||||||
/* R/W if we can, R/O if we must */
|
/* R/W if we can, R/O if we must */
|
||||||
ro = curlun->initially_ro;
|
ro = curlun->initially_ro;
|
||||||
|
|
||||||
ums_info->get_capacity(&(ums_info->ums_dev), &size);
|
ums->get_capacity(ums, &size);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
printf("unable to find file size: %s\n", filename);
|
printf("unable to find file size: %s\n", filename);
|
||||||
rc = (int) size;
|
rc = (int) size;
|
||||||
|
|
|
@ -9,32 +9,35 @@
|
||||||
#define __USB_MASS_STORAGE_H__
|
#define __USB_MASS_STORAGE_H__
|
||||||
|
|
||||||
#define SECTOR_SIZE 0x200
|
#define SECTOR_SIZE 0x200
|
||||||
|
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
#include <linux/usb/composite.h>
|
#include <linux/usb/composite.h>
|
||||||
|
|
||||||
struct ums_device {
|
#ifndef UMS_START_SECTOR
|
||||||
|
#define UMS_START_SECTOR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UMS_NUM_SECTORS
|
||||||
|
#define UMS_NUM_SECTORS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct ums {
|
||||||
|
int (*read_sector)(struct ums *ums_dev,
|
||||||
|
ulong start, lbaint_t blkcnt, void *buf);
|
||||||
|
int (*write_sector)(struct ums *ums_dev,
|
||||||
|
ulong start, lbaint_t blkcnt, const void *buf);
|
||||||
|
void (*get_capacity)(struct ums *ums_dev,
|
||||||
|
long long int *capacity);
|
||||||
|
const char *name;
|
||||||
struct mmc *mmc;
|
struct mmc *mmc;
|
||||||
int dev_num;
|
|
||||||
int offset;
|
int offset;
|
||||||
int part_size;
|
int part_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ums_board_info {
|
extern struct ums *ums;
|
||||||
int (*read_sector)(struct ums_device *ums_dev,
|
|
||||||
ulong start, lbaint_t blkcnt, void *buf);
|
|
||||||
int (*write_sector)(struct ums_device *ums_dev,
|
|
||||||
ulong start, lbaint_t blkcnt, const void *buf);
|
|
||||||
void (*get_capacity)(struct ums_device *ums_dev,
|
|
||||||
long long int *capacity);
|
|
||||||
const char *name;
|
|
||||||
struct ums_device ums_dev;
|
|
||||||
};
|
|
||||||
|
|
||||||
int fsg_init(struct ums_board_info *);
|
int fsg_init(struct ums *);
|
||||||
void fsg_cleanup(void);
|
void fsg_cleanup(void);
|
||||||
struct ums_board_info *board_ums_init(unsigned int, unsigned int,
|
struct ums *ums_init(unsigned int);
|
||||||
unsigned int);
|
|
||||||
int fsg_main_thread(void *);
|
int fsg_main_thread(void *);
|
||||||
|
|
||||||
#ifdef CONFIG_USB_GADGET_MASS_STORAGE
|
#ifdef CONFIG_USB_GADGET_MASS_STORAGE
|
||||||
|
|
Loading…
Add table
Reference in a new issue