Hi Alberto, > This command is part of the write LBA sector sequence performed by > rkdeveloptool
You mentioned the LBA sector and the need of erasing it. AFAIK, block devices (eMMC) perform internally erase on write. Is this protocol also supposed to work with NAND flash? If yes, please adjust the patch description. Also, please extend the README.rockusb file. > > Signed-off-by: Alberto Panizzo <albe...@amarulasolutions.com> > --- > arch/arm/include/asm/arch-rockchip/f_rockusb.h | 1 + > drivers/usb/gadget/f_rockusb.c | 46 > ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) > > diff --git a/arch/arm/include/asm/arch-rockchip/f_rockusb.h > b/arch/arm/include/asm/arch-rockchip/f_rockusb.h index > f04d401..77c3a87 100644 --- > a/arch/arm/include/asm/arch-rockchip/f_rockusb.h +++ > b/arch/arm/include/asm/arch-rockchip/f_rockusb.h @@ -62,6 +62,7 @@ > K_FW_LOW_FORMAT = 0x1C, K_FW_SET_RESET_FLAG = 0x1E, > K_FW_SPI_READ_10 = 0x21, > K_FW_SPI_WRITE_10 = 0x22, > +K_FW_LBA_ERASE_10 = 0x25, > > K_FW_SESSION = 0X30, > K_FW_RESET = 0xff, > diff --git a/drivers/usb/gadget/f_rockusb.c > b/drivers/usb/gadget/f_rockusb.c index dbf31cb..230fbec 100644 > --- a/drivers/usb/gadget/f_rockusb.c > +++ b/drivers/usb/gadget/f_rockusb.c > @@ -693,6 +693,48 @@ static void cb_write_lba(struct usb_ep *ep, > struct usb_request *req) } > } > > +static void cb_erase_lba(struct usb_ep *ep, struct usb_request *req) > +{ > + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, > + sizeof(struct fsg_bulk_cb_wrap)); > + struct f_rockusb *f_rkusb = get_rkusb(); > + int sector_count, lba, blks; > + > + memcpy((char *)cbw, req->buf, USB_BULK_CB_WRAP_LEN); > + sector_count = (int)get_unaligned_be16(&cbw->CDB[7]); > + lba = get_unaligned_be32(&cbw->CDB[2]); > + f_rkusb->tag = cbw->tag; > + debug("require erase %x sectors from lba %x\n", > + sector_count, lba); > + > + if (!f_rkusb->desc) { > + char *type = f_rkusb->dev_type; > + int index = f_rkusb->dev_index; > + > + f_rkusb->desc = blk_get_dev(type, index); > + if (!f_rkusb->desc || > + f_rkusb->desc->type == DEV_TYPE_UNKNOWN) { > + puts("invalid mmc device\n"); > + rockusb_tx_write_csw(f_rkusb->tag, > + cbw->data_transfer_length, CSW_FAIL, > + USB_BULK_CS_WRAP_LEN); > + return; > + } > + } > + blks = blk_derase(f_rkusb->desc, lba, sector_count); > + if (blks != sector_count) { > + printf("failed erasing device %s: %d\n", > f_rkusb->dev_type, > + f_rkusb->dev_index); > + rockusb_tx_write_csw(f_rkusb->tag, > + cbw->data_transfer_length, CSW_FAIL, > + USB_BULK_CS_WRAP_LEN); > + return; > + } > + > + rockusb_tx_write_csw(cbw->tag, cbw->data_transfer_length, > CSW_GOOD, > + USB_BULK_CS_WRAP_LEN); > +} > + > void __weak rkusb_set_reboot_flag(int flag) > { > struct f_rockusb *f_rkusb = get_rkusb(); > @@ -825,6 +867,10 @@ static const struct cmd_dispatch_info > cmd_dispatch_info[] = { .cb = cb_not_support, > }, > { > + .cmd = K_FW_LBA_ERASE_10, > + .cb = cb_erase_lba, > + }, > + { > .cmd = K_FW_SESSION, > .cb = cb_not_support, > }, Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
pgpslGHggRdB_.pgp
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot