introduce Rockchip rockusb
Subsystems (3)
v3 cover introduce Rockchip rockusb
rockusb is a protocol run between host pc and device. it help people get device info, flash image to device. this patch implement rockusb on device side
Changes in v3:
-switch back to use g_dnl code
-address comment from Lukasz and Simon
-fix checkpatch error
Changes in v2:
-switch to use usb masstorage framework
-add readme for rockusb
Eddie Cai (4):
usb: rockchip: add the rockusb gadget
usb: rockchip: add rockusb command rockchip:usb: add a simple readme for rockusb
rockchip: usb: enable rockusb on rk3288 based board
arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ cmd/Kconfig | 11 + cmd/Makefile | 1 + cmd/rockusb.c | 74 +++ configs/evb-rk3288_defconfig | 3 + configs/fennec-rk3288_defconfig | 2 + configs/firefly-rk3288_defconfig | 2 + configs/miqi-rk3288_defconfig | 2 + configs/popmetal-rk3288_defconfig | 2 + configs/rock2_defconfig | 3 + configs/sandbox_defconfig | 3 +- configs/tinker-rk3288_defconfig | 2 + doc/README.rockusb | 37 ++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 15 files changed, 970 insertions(+), 1 deletion(-) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 cmd/rockusb.c create mode 100644 doc/README.rockusb create mode 100644 drivers/usb/gadget/f_rockusb.c
Signature · 1 line
1.9.1
PATCH v3 1/4 usb: rockchip: add the rockusb gadget
this patch implement rockusb protocol on the device side. this is based on USB download gadget infrastructure. the rockusb function implements the rd, wl, rid commands. it can work with rkdeveloptool.
Changes in v3:
-split the macro to f_rockusb.h
-use ALLOC_CACHE_ALIGN_BUFFER to define cache safe struct inside the function. -fix checkpatch error
--- arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 3 files changed, 829 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 drivers/usb/gadget/f_rockusb.c
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +104 -0
@@ -0,0 +1,104 @@ +/* +* (C) Copyright 2017 +* +* Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef __F_ROCKUSB_H +#define __F_ROCKUSB_H +#define ROCKUSB_VERSION "0.1" + +#define ROCKUSB_INTERFACE_CLASS 0xff +#define ROCKUSB_INTERFACE_SUB_CLASS 0x06 +#define ROCKUSB_INTERFACE_PROTOCOL 0x05 + +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_2_0 (0x0200) +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1 (0x0040) +#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040) + +#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size +* (64 or 512 or 1024), else we break on certain controllers like DWC3 +* that expect bulk OUT requests to be divisible by maxpacket size. +*/ + +#define CONFIG_ROCKUSB_BUF_ADDR CONFIG_SYS_LOAD_ADDR +#define CONFIG_ROCKUSB_BUF_SIZE 0x08000000 + +#define RKUSB_STATUS_IDLE 0 +#define RKUSB_STATUS_CMD 1 +#define RKUSB_STATUS_RXDATA 2 +#define RKUSB_STATUS_TXDATA 3 +#define RKUSB_STATUS_CSW 4 +#define RKUSB_STATUS_RXDATA_PREPARE 5 +#define RKUSB_STATUS_TXDATA_PREPARE 6 + +enum { +TEST_UNIT_READY =0 , +READ_FLASH_ID =0x01 , +TEST_BAD_BLOCK =0x03 , +READ_SECTOR =0x04 , +WRITE_SECTOR =0x05 , +ERASE_NORMAL =0x06 , +ERASE_FORCE =0x0B , +READ_LBA =0x14 , +WRITE_LBA =0x15 , +ERASE_SYSTEMDISK =0x16 , +READ_SDRAM =0x17 , +WRITE_SDRAM =0x18 , +EXECUTE_SDRAM =0x19 , +READ_FLASH_INFO =0x1A , +READ_CHIP_INFO =0x1B , +SET_RESET_FLAG =0x1E , +WRITE_EFUSE =0x1F , +READ_EFUSE =0x20 , +READ_SPI_FLASH =0x21 , +WRITE_SPI_FLASH =0x22 , +WRITE_NEW_EFUSE =0x23 , +READ_NEW_EFUSE =0x24 , +DEVICE_RESET =0xFF +}USB_OPERATION_CODE ; + +#define K_FW_TEST_UNIT_READY 0x00 +#define K_FW_READ_FLASH_ID 0x01 +#define K_FW_SET_DEVICE_ID 0x02 +#define K_FW_TEST_BAD_BLOCK 0x03 +#define K_FW_READ_10 0x04 +#define K_FW_WRITE_10 0x05 +#define K_FW_ERASE_10 0x06 +#define K_FW_WRITE_SPARE 0x07 +#define K_FW_READ_SPARE 0x08 + +#define K_FW_ERASE_10_FORCE 0x0b +#define K_FW_GET_VERSION 0x0c + +#define K_FW_LBA_READ_10 0x14 +#define K_FW_LBA_WRITE_10 0x15 +#define K_FW_ERASE_SYS_DISK 0x16 +#define K_FW_SDRAM_READ_10 0x17 +#define K_FW_SDRAM_WRITE_10 0x18 +#define K_FW_SDRAM_EXECUTE 0x19 +#define K_FW_READ_FLASH_INFO 0x1A +#define K_FW_GET_CHIP_VER 0x1B +#define K_FW_LOW_FORMAT 0x1C +#define K_FW_SET_RESET_FLAG 0x1E +#define K_FW_SPI_READ_10 0x21 +#define K_FW_SPI_WRITE_10 0x22 + +#define K_FW_SESSION 0X30 +#define K_FW_RESET 0xff + +#define CBW_DIRECTION_OUT 0x00 +#define CBW_DIRECTION_IN 0x80 + +struct cmd_dispatch_info { +int cmd; +void (*cb)(struct usb_ep *ep,struct usb_request *req); +}; + +void rockusb_dev_init (char *dev_type,int dev_index); +#endif /* __F_ROCKUSB_H */ +
drivers/usb/gadget/Makefile +1 -0
@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o obj-$(CONFIG_USB_FUNCTION_DFU) += f_dfu.o obj-$(CONFIG_USB_FUNCTION_MASS_STORAGE) += f_mass_storage.o obj-$(CONFIG_USB_FUNCTION_FASTBOOT) += f_fastboot.o +obj-$(CONFIG_USB_FUNCTION_ROCKUSB) += f_rockusb.o endif endif ifdef CONFIG_USB_ETHER
drivers/usb/gadget/f_rockusb.c new file +724 -0
724 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v3 1/4 usb: rockchip: add the rockusb gadget
Hi Eddie,
Quoted 78 lines · Eddie Cai
this patch implement rockusb protocol on the device side. this is based on USB download gadget infrastructure. the rockusb function implements the rd, wl, rid commands. it can work with rkdeveloptool.
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-4-split the macro to f_rockusb.h -use ALLOC_CACHE_ALIGN_BUFFER to define cache safe struct inside the function. -fix checkpatch error --- arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 3 files changed, 829 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 drivers/usb/gadget/f_rockusb.carch/arm/include/asm/arch-rockchip/f_rockusb.h new file +53
-0@@ -0,0 +1,104 @@ +/* +* (C) Copyright 2017 +* +* Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef __F_ROCKUSB_H +#define __F_ROCKUSB_H +#define ROCKUSB_VERSION "0.1" + +#define ROCKUSB_INTERFACE_CLASS 0xff +#define ROCKUSB_INTERFACE_SUB_CLASS 0x06 +#define ROCKUSB_INTERFACE_PROTOCOL 0x05 + +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_2_0 (0x0200) +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1 (0x0040) +#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040) + +#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size +* (64 or 512 or 1024), else we break on certain controllers like DWC3 +* that expect bulk OUT requests to be divisible by maxpacket size. +*/ + +#define CONFIG_ROCKUSB_BUF_ADDR CONFIG_SYS_LOAD_ADDR +#define CONFIG_ROCKUSB_BUF_SIZE 0x08000000 + +#define RKUSB_STATUS_IDLE 0 +#define RKUSB_STATUS_CMD 1 +#define RKUSB_STATUS_RXDATA 2 +#define RKUSB_STATUS_TXDATA 3 +#define RKUSB_STATUS_CSW 4 +#define RKUSB_STATUS_RXDATA_PREPARE 5 +#define RKUSB_STATUS_TXDATA_PREPARE 6 + +enum { +TEST_UNIT_READY =0 , +READ_FLASH_ID =0x01 , +TEST_BAD_BLOCK =0x03 , +READ_SECTOR =0x04 , +WRITE_SECTOR =0x05 , +ERASE_NORMAL =0x06 , +ERASE_FORCE =0x0B , +READ_LBA =0x14 , +WRITE_LBA =0x15 , +ERASE_SYSTEMDISK =0x16 , +READ_SDRAM =0x17 , +WRITE_SDRAM =0x18 , +EXECUTE_SDRAM =0x19 , + READ_FLASH_INFO = 0x1A,
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 63
Quoted 10 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +10
-0+READ_CHIP_INFO =0x1B , +SET_RESET_FLAG =0x1E , +WRITE_EFUSE =0x1F , +READ_EFUSE =0x20 , +READ_SPI_FLASH =0x21 , +WRITE_SPI_FLASH =0x22 , +WRITE_NEW_EFUSE =0x23 , +READ_NEW_EFUSE =0x24 , +DEVICE_RESET =0xFF +} USB_OPERATION_CODE;
Do you mean to declare a variable? Perhaps instead:
enum op_code {
...
};
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 65
Quoted 2 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +2
-0+ +#define K_FW_TEST_UNIT_READY 0x00
Can these be an enum also?
Quoted 23 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +23
-0+#define K_FW_READ_FLASH_ID 0x01 +#define K_FW_SET_DEVICE_ID 0x02 +#define K_FW_TEST_BAD_BLOCK 0x03 +#define K_FW_READ_10 0x04 +#define K_FW_WRITE_10 0x05 +#define K_FW_ERASE_10 0x06 +#define K_FW_WRITE_SPARE 0x07 +#define K_FW_READ_SPARE 0x08 + +#define K_FW_ERASE_10_FORCE 0x0b +#define K_FW_GET_VERSION 0x0c + +#define K_FW_LBA_READ_10 0x14 +#define K_FW_LBA_WRITE_10 0x15 +#define K_FW_ERASE_SYS_DISK 0x16 +#define K_FW_SDRAM_READ_10 0x17 +#define K_FW_SDRAM_WRITE_10 0x18 +#define K_FW_SDRAM_EXECUTE 0x19 +#define K_FW_READ_FLASH_INFO 0x1A +#define K_FW_GET_CHIP_VER 0x1B +#define K_FW_LOW_FORMAT 0x1C +#define K_FW_SET_RESET_FLAG 0x1E +#define K_FW_SPI_READ_10 0x21
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 98
Quoted 10 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +10
-0+#define K_FW_SPI_WRITE_10 0x22 + +#define K_FW_SESSION 0X30 +#define K_FW_RESET 0xff + +#define CBW_DIRECTION_OUT 0x00 +#define CBW_DIRECTION_IN 0x80 + +struct cmd_dispatch_info { +int cmd;
enum
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 99
Quoted 1 line
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +1
-0+void (*cb)(struct usb_ep *ep,struct usb_request *req);
Function comment
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 102
Quoted 3 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +3
-0+}; + +void rockusb_dev_init (char *dev_type,int dev_index);
Function comment
Quoted 103 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +2
-0+#endif /* __F_ROCKUSB_H */ +drivers/usb/gadget/Makefile +1
-0@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o obj-$(CONFIG_USB_FUNCTION_DFU) += f_dfu.o obj-$(CONFIG_USB_FUNCTION_MASS_STORAGE) += f_mass_storage.o obj-$(CONFIG_USB_FUNCTION_FASTBOOT) += f_fastboot.o +obj-$(CONFIG_USB_FUNCTION_ROCKUSB) += f_rockusb.o endif endif ifdef CONFIG_USB_ETHERdrivers/usb/gadget/f_rockusb.c new file +83
-0@@ -0,0 +1,724 @@ +/* +* (C) Copyright 2017 +* +* Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <config.h> +#include <common.h> +#include <errno.h> +#include <malloc.h> +#include <memalign.h> +#include <linux/usb/ch9.h> +#include <linux/usb/gadget.h> +#include <linux/usb/composite.h> +#include <linux/compiler.h> +#include <version.h> +#include <g_dnl.h> +#include <asm/arch/f_rockusb.h> + +struct f_rockusb { +struct usb_function usb_function; +/* IN/OUT EP's and corresponding requests */ +struct usb_ep *in_ep, *out_ep; +struct usb_request *in_req, *out_req; +}; + +static inline struct f_rockusb *func_to_rockusb (struct usb_function *f) +{ + return container_of(f, struct f_rockusb, usb_function); +} + +static struct f_rockusb *rockusb_func; + +static struct usb_endpoint_descriptor fs_ep_in = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_IN , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (64 ), +}; + +static struct usb_endpoint_descriptor fs_ep_out = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_OUT , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (64 ), +}; + +static struct usb_endpoint_descriptor hs_ep_in = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_IN , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (512 ), +}; + +static struct usb_endpoint_descriptor hs_ep_out = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_OUT , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (512 ), +}; + +static struct usb_interface_descriptor interface_desc = { + .bLength =USB_DT_INTERFACE_SIZE , + .bDescriptorType =USB_DT_INTERFACE , + .bInterfaceNumber =0x00 , + .bAlternateSetting =0x00 , + .bNumEndpoints =0x02 , + .bInterfaceClass =ROCKUSB_INTERFACE_CLASS , + .bInterfaceSubClass =ROCKUSB_INTERFACE_SUB_CLASS , + .bInterfaceProtocol =ROCKUSB_INTERFACE_PROTOCOL , +}; + +static struct usb_descriptor_header *rkusb_fs_function[] = { + (struct usb_descriptor_header *)&interface_desc, + (struct usb_descriptor_header *)&fs_ep_in, + (struct usb_descriptor_header *)&fs_ep_out, +};
drivers/usb/gadget/f_rockusb.c line 93
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ +static struct usb_descriptor_header *rkusb_hs_function[] = { + (struct usb_descriptor_header *)&interface_desc, + (struct usb_descriptor_header *)&hs_ep_in, + (struct usb_descriptor_header *)&hs_ep_out, +NULL , +}; + +static struct usb_endpoint_descriptor * +rkusb_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs,
Can you put the function name on the same line as the * ?
Quoted 16 lines
drivers/usb/gadget/f_rockusb.c new file +16
-0+ struct usb_endpoint_descriptor *hs) +{ +if (gadget_is_dualspeed (g) && g->speed ==USB_SPEED_HIGH ) +return hs; +return fs; +} + +/* +* static strings, in UTF-8 +*/ +static const char rkusb_name[] ="Rockchip Rockusb" ; + +static struct usb_string rkusb_string_defs[] = { + [0 ].s = rkusb_name, + { }/* end of list */ +};
drivers/usb/gadget/f_rockusb.c line 119
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ +static struct usb_gadget_strings stringtab_rkusb = { + .language =0x0409 ,/* en-us */ + .strings = rkusb_string_defs, +}; + +static struct usb_gadget_strings *rkusb_strings[] = { + &stringtab_rkusb, +NULL , +};
Can you put all data declarations together at the top of the file?
drivers/usb/gadget/f_rockusb.c line 132
Quoted 13 lines
drivers/usb/gadget/f_rockusb.c new file +13
-0+ +static void rx_handler_command (struct usb_ep *ep,struct usb_request *req); +static int rockusb_tx_write_csw (u32 tag,int residue,u8 status,int size); + +static void rockusb_complete (struct usb_ep *ep,struct usb_request *req) +{ +int status = req->status; +if (!status) +return ; +debug ("status: %d ep '%s' trans: %d\n" , status, ep->name, req->actual); +} + +static int rockusb_bind (struct usb_configuration *c,struct usb_function *f)
Function comment
Quoted 36 lines
drivers/usb/gadget/f_rockusb.c new file +36
-0+{ +int id; +struct usb_gadget *gadget = c->cdev->gadget; +struct f_rockusb *f_rkusb =func_to_rockusb (f); +const char *s; + + id =usb_interface_id (c, f); +if (id <0 ) +return id; + interface_desc.bInterfaceNumber = id; + + id =usb_string_id (c->cdev); +if (id <0 ) +return id; + + rkusb_string_defs[0 ].id = id; + interface_desc.iInterface = id; + + f_rkusb->in_ep =usb_ep_autoconfig (gadget, &fs_ep_in); +if (!f_rkusb->in_ep) +return -ENODEV ; + f_rkusb->in_ep->driver_data = c->cdev; + + f_rkusb->out_ep =usb_ep_autoconfig (gadget, &fs_ep_out); +if (!f_rkusb->out_ep) +return -ENODEV ; + f_rkusb->out_ep->driver_data = c->cdev; + + f->descriptors = rkusb_fs_function; + +if (gadget_is_dualspeed (gadget)) { + hs_ep_in.bEndpointAddress = fs_ep_in.bEndpointAddress; + hs_ep_out.bEndpointAddress = fs_ep_out.bEndpointAddress; + f->hs_descriptors = rkusb_hs_function; + } +
drivers/usb/gadget/f_rockusb.c line 178
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ s =getenv ("serial#" ); +if (s) +g_dnl_set_serialnumber ((char *)s); + +return 0 ; +} + +static void rockusb_unbind (struct usb_configuration *c,struct usb_function *f) +{ +memset (rockusb_func,0 ,sizeof (*rockusb_func));
Why do you zero it? Can you add a comment?
Quoted 27 lines
drivers/usb/gadget/f_rockusb.c new file +27
-0+} + +static void rockusb_disable (struct usb_function *f) +{ +struct f_rockusb *f_rkusb =func_to_rockusb (f); + +usb_ep_disable (f_rkusb->out_ep); +usb_ep_disable (f_rkusb->in_ep); + +if (f_rkusb->out_req) { +free (f_rkusb->out_req->buf); +usb_ep_free_request (f_rkusb->out_ep, f_rkusb->out_req); + f_rkusb->out_req =NULL ; + } +if (f_rkusb->in_req) { +free (f_rkusb->in_req->buf); +usb_ep_free_request (f_rkusb->in_ep, f_rkusb->in_req); + f_rkusb->in_req =NULL ; + } +} + +static struct usb_request *rockusb_start_ep (struct usb_ep *ep) +{ +struct usb_request *req; + + req =usb_ep_alloc_request (ep,0 ); +if (!req)
drivers/usb/gadget/f_rockusb.c line 215
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+return NULL ; + + req->length =EP_BUFFER_SIZE ; + req->buf =memalign (CONFIG_SYS_CACHELINE_SIZE ,EP_BUFFER_SIZE ); +if (!req->buf) { +usb_ep_free_request (ep, req); +return NULL ; + } + +memset (req->buf,0 , req->length);
blank line before return
Quoted 15 lines
drivers/usb/gadget/f_rockusb.c new file +15
-0+return req; +} + +static int rockusb_set_alt (struct usb_function *f, +unsigned interface,unsigned alt) +{ +int ret; +struct usb_composite_dev *cdev = f->config->cdev; +struct usb_gadget *gadget = cdev->gadget; +struct f_rockusb *f_rkusb =func_to_rockusb (f); +const struct usb_endpoint_descriptor *d; + +debug ("%s: func: %s intf: %d alt: %d\n" , + __func__, f->name, interface, alt); +
drivers/usb/gadget/f_rockusb.c line 240
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ d =rkusb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); + ret =usb_ep_enable (f_rkusb->out_ep, d); +if (ret) { +puts ("failed to enable out ep\n" ); +return ret; + } + + f_rkusb->out_req =rockusb_start_ep (f_rkusb->out_ep); +if (!f_rkusb->out_req) { +puts ("failed to alloc out req\n" );
printf() instead of puts()
Quoted 53 lines
drivers/usb/gadget/f_rockusb.c new file +53
-0+ ret = -EINVAL ; + goto err; + } + f_rkusb->out_req->complete = rx_handler_command; + + d =rkusb_ep_desc (gadget, &fs_ep_in, &hs_ep_in); + ret =usb_ep_enable (f_rkusb->in_ep, d); +if (ret) { +puts ("failed to enable in ep\n" ); + goto err; + } + + f_rkusb->in_req =rockusb_start_ep (f_rkusb->in_ep); +if (!f_rkusb->in_req) { +puts ("failed alloc req in\n" ); + ret = -EINVAL ; + goto err; + } + f_rkusb->in_req->complete = rockusb_complete; + + ret =usb_ep_queue (f_rkusb->out_ep, f_rkusb->out_req,0 ); +if (ret) + goto err; + +return 0 ; +err: +rockusb_disable (f); +return ret; +} + +static int rockusb_add (struct usb_configuration *c) +{ +struct f_rockusb *f_rkusb = rockusb_func; +int status; + +debug ("%s: cdev: 0x%p\n" , __func__, c->cdev); + +if (!f_rkusb) { + f_rkusb =memalign (CONFIG_SYS_CACHELINE_SIZE ,sizeof (*f_rkusb)); +if (!f_rkusb) +return -ENOMEM ; + + rockusb_func = f_rkusb; +memset (f_rkusb,0 ,sizeof (*f_rkusb)); + } + + f_rkusb->usb_function.name ="f_rockusb" ; + f_rkusb->usb_function.bind = rockusb_bind; + f_rkusb->usb_function.unbind = rockusb_unbind; + f_rkusb->usb_function.set_alt = rockusb_set_alt; + f_rkusb->usb_function.disable = rockusb_disable; + f_rkusb->usb_function.strings = rkusb_strings; +
drivers/usb/gadget/f_rockusb.c line 303
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ status =usb_add_function (c, &f_rkusb->usb_function); +if (status) { +free (f_rkusb); + rockusb_func = f_rkusb; + } +return status; +} + +char *rockusb_dev_type =0 ; +int rockusb_dev_index =0 ;
Move to top
I wonder if you should group all your data in a struct?
Quoted 57 lines
drivers/usb/gadget/f_rockusb.c new file +57
-0+ +void rockusb_dev_init (char *dev_type,int dev_index) +{ + rockusb_dev_type = dev_type; + rockusb_dev_index = dev_index; +} + +DECLARE_GADGET_BIND_CALLBACK (usb_dnl_rockusb, rockusb_add); + +static int rockusb_tx_write (const char *buffer,unsigned int buffer_size) +{ +struct usb_request *in_req = rockusb_func->in_req; +int ret; + +memcpy (in_req->buf, buffer, buffer_size); + in_req->length = buffer_size; +usb_ep_dequeue (rockusb_func->in_ep, in_req); + ret =usb_ep_queue (rockusb_func->in_ep, in_req,0 ); +if (ret) +printf ("Error %d on queue\n" , ret); +return 0 ; +} + +static int rockusb_tx_write_str (const char *buffer) +{ +return rockusb_tx_write (buffer,strlen (buffer)); +} + +/* Bulk-only data structures */ + +/* Command Block Wrapper */ +struct fsg_bulk_cb_wrap { +__le32 signature;/* Contains 'USBC' */ +u32 tag;/* Unique per command id */ +__le32 data_transfer_length;/* Size of the data */ +u8 flags;/* Direction in bit 7 */ +u8 lun;/* lun (normally 0) */ +u8 length;/* Of the CDB, <= MAX_COMMAND_SIZE */ +u8 CDB[16 ];/* Command Data Block */ +}; + +#define USB_BULK_CB_WRAP_LEN 31 +#define USB_BULK_CB_SIG 0x43425355/* Spells out USBC */ +#define USB_BULK_IN_FLAG 0x80 + +/* Command status Wrapper */ +struct bulk_cs_wrap { +__le32 signature;/* Should = 'USBS' */ +u32 tag;/* Same as original command */ +__le32 residue;/* Amount not transferred */ +u8 status;/* See below */ +}; + +#define USB_BULK_CS_WRAP_LEN 13 +#define USB_BULK_CS_SIG 0x53425355/* Spells out 'USBS' */ +#define USB_STATUS_PASS 0 +#define USB_STATUS_FAIL 1
drivers/usb/gadget/f_rockusb.c line 370
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+#define USB_STATUS_PHASE_ERROR 2 + +#define CSW_GOOD 0x00 +#define CSW_FAIL 0x01 + +#ifdef DEBUG +static void printcbw (char *buf) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap));
Does this need to be aligned if you are just using it for debug?
Quoted 58 lines
drivers/usb/gadget/f_rockusb.c new file +58
-0+ +memcpy ((char *)cbw, buf,USB_BULK_CB_WRAP_LEN ); + +debug ("cbw: signature:%x\n" , cbw->signature); +debug ("cbw: tag=%x\n" , cbw->tag); +debug ("cbw: data_transfer_length=%d\n" , cbw->data_transfer_length); +debug ("cbw: flags=%x\n" , cbw->flags); +debug ("cbw: lun=%d\n" , cbw->lun); +debug ("cbw: length=%d\n" , cbw->length); +debug ("cbw: ucOperCode=%x\n" , cbw->CDB[0 ]); +debug ("cbw: ucReserved=%x\n" , cbw->CDB[1 ]); +debug ("cbw: dwAddress:%x %x %x %x\n" , cbw->CDB[5 ], cbw->CDB[4 ], + cbw->CDB[3 ], cbw->CDB[2 ]); +debug ("cbw: ucReserved2=%x\n" , cbw->CDB[6 ]); +debug ("cbw: uslength:%x %x\n" , cbw->CDB[8 ], cbw->CDB[7 ]); +} + +static void printcsw (char *buf) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct bulk_cs_wrap, csw, + sizeof(struct bulk_cs_wrap)); +memcpy ((char *)csw, buf,USB_BULK_CS_WRAP_LEN ); +debug ("csw: signature:%x\n" , csw->signature); +debug ("csw: tag:%x\n" , csw->tag); +debug ("csw: residue:%x\n" , csw->residue); +debug ("csw: status:%x\n" , csw->status); +} +#endif + +static int rockusb_tx_write_csw (u32 tag,int residue,u8 status,int size) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct bulk_cs_wrap, csw, + sizeof(struct bulk_cs_wrap)); + csw->signature =cpu_to_le32 (USB_BULK_CS_SIG ); + csw->tag = tag; + csw->residue =cpu_to_be32 (residue); + csw->status = status; +#ifdef DEBUG +printcsw ((char *)&csw); +#endif +return rockusb_tx_write ((char *)csw, size); +} + +static unsigned int download_tag; +static unsigned int download_lba; +static unsigned int download_size; +static unsigned int download_bytes; +struct blk_desc *download_desc =0 ; + +static unsigned int rx_bytes_expected (struct usb_ep *ep) +{ +int rx_remain = download_size - download_bytes; +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 ) +return 0 ; +else if (rx_remain >EP_BUFFER_SIZE )
drivers/usb/gadget/f_rockusb.c line 438
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+return EP_BUFFER_SIZE ; + + rem = rx_remain % maxpacket; +if (rem >0 ) + rx_remain = rx_remain + (maxpacket - rem); + +return rx_remain; +} + +static void rx_handler_dl_image (struct usb_ep *ep,struct usb_request *req)
Function comments
Quoted 287 lines
drivers/usb/gadget/f_rockusb.c new file +286
-1+{ +unsigned int transfer_size = download_size - download_bytes; +const unsigned char *buffer = req->buf; +unsigned int buffer_size = req->actual; + +if (!download_desc) { +printf ("rx_handler_dl_image blk_get_dev\n" ); + download_desc =blk_get_dev (rockusb_dev_type, + rockusb_dev_index); +if (!download_desc || + download_desc->type ==DEV_TYPE_UNKNOWN ) { +error ("invalid mmc device\n" ); +rockusb_tx_write_csw (download_tag,0 ,CSW_FAIL , +USB_BULK_CS_WRAP_LEN ); +return ; + } + } + +if (req->status !=0 ) { +printf ("Bad status: %d\n" , req->status); +rockusb_tx_write_csw (download_tag,0 , +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +return ; + } + +if (buffer_size < transfer_size) + transfer_size = buffer_size; + +memcpy ((void *)CONFIG_ROCKUSB_BUF_ADDR + download_bytes, + buffer, transfer_size); + download_bytes += transfer_size; + +/* Check if transfer is done */ +if (download_bytes >= download_size) { +int blks =0 , blkcnt = download_size/512 ; +printf ("download %d bytes finished, start writing to lba %x\n" , + download_bytes, download_lba); + blks =blk_dwrite (download_desc, download_lba, blkcnt, + (char *)CONFIG_ROCKUSB_BUF_ADDR ); +if (blks != blkcnt) { +error ("failed writing to device %s: %d\n" , + rockusb_dev_type, rockusb_dev_index); +rockusb_tx_write_csw (download_tag,0 , +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +return ; + } + + req->complete = rx_handler_command; + req->length =EP_BUFFER_SIZE ; + download_size =0 ; +printf ("done\n" ); +rockusb_tx_write_csw (download_tag,0 ,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); + }else { + req->length =rx_bytes_expected (ep); + } + + req->actual =0 ; +usb_ep_queue (ep, req,0 ); +} + +static void cb_test_unit_ready (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length, +CSW_GOOD ,USB_BULK_CS_WRAP_LEN ); +} + +static void cb_read_storage_id (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); +char emmc_id[] ="EMMC " ; + +printf ("cb_read_storage_id\n" ); +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +rockusb_tx_write_str (emmc_id); +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); +} + +static void cb_write_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)); +int sector_count; + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + sector_count = (int )get_unaligned_be16 (&cbw->CDB[7 ]); + download_lba =get_unaligned_be32 (&cbw->CDB[2 ]); + download_size = sector_count *512 ; + download_bytes =0 ; + download_tag = cbw->tag; +if ((0 == download_size) || (download_size >CONFIG_ROCKUSB_BUF_SIZE )) { +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length, +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); + }else { + req->complete = rx_handler_dl_image; + req->length =rx_bytes_expected (ep); + } +} + +static int reboot_flag; + +int __weak rkusb_set_reboot_flag (int flag) +{ +printf ("rkusb_set_reboot_flag: %d\n" , reboot_flag); +return -ENOSYS ; +} + +static void compl_do_reset (struct usb_ep *ep,struct usb_request *req) +{ +rkusb_set_reboot_flag (reboot_flag); +do_reset (NULL ,0 ,0 ,NULL ); +} + +static void cb_reboot (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + reboot_flag =0 ; +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + reboot_flag = cbw->CDB[1 ]; + rockusb_func->in_req->complete = compl_do_reset; +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); +} + +static void cb_not_support (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +printf ("Rockusb command %x not support yet\n" , cbw->CDB[0 ]); +rockusb_tx_write_csw (cbw->tag,0 ,CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +} + +static const struct cmd_dispatch_info cmd_dispatch_info[] = { + { + .cmd =K_FW_TEST_UNIT_READY , + .cb = cb_test_unit_ready, + }, + { + .cmd =K_FW_READ_FLASH_ID , + .cb = cb_read_storage_id, + }, + { + .cmd =K_FW_SET_DEVICE_ID , + .cb = cb_not_support, + }, + { + .cmd =K_FW_TEST_BAD_BLOCK , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_ERASE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_WRITE_SPARE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_SPARE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_ERASE_10_FORCE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_GET_VERSION , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LBA_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LBA_WRITE_10 , + .cb = cb_write_lba, + }, + { + .cmd =K_FW_ERASE_SYS_DISK , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_EXECUTE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_FLASH_INFO , + .cb = cb_not_support, + }, + { + .cmd =K_FW_GET_CHIP_VER , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LOW_FORMAT , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SET_RESET_FLAG , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SPI_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SPI_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SESSION , + .cb = cb_not_support, + }, + { + .cmd =K_FW_RESET , + .cb = cb_reboot, + }, +}; + +static void rx_handler_command (struct usb_ep *ep,struct usb_request *req) +{ +void (*func_cb)(struct usb_ep *ep,struct usb_request *req) =NULL ; + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); +char *cmdbuf = req->buf; +int i; + +if (req->status || req->length ==0 ) +return ; + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +#ifdef DEBUG +printcbw (req->buf); +#endif + +for (i =0 ; i <ARRAY_SIZE (cmd_dispatch_info); i++) { +if (cmd_dispatch_info[i].cmd == cbw->CDB[0 ]) { + func_cb = cmd_dispatch_info[i].cb; +break ; + } + } + +if (!func_cb) { +error ("unknown command: %s" , (char *)req->buf); +rockusb_tx_write_str ("FAILunknown command" ); + }else { +if (req->actual < req->length) { +u8 *buf = (u8 *)req->buf; + buf[req->actual] =0 ; +func_cb (ep, req); + }else { +error ("buffer overflow" ); +rockusb_tx_write_str ("FAILbuffer overflow" ); + } + } + + *cmdbuf ='\0' ; + req->actual =0 ; +usb_ep_queue (ep, req,0 ); +} --
Quoted 2 lines
1.9.1
Regards,
Simon
PATCH v3 1/4 usb: rockchip: add the rockusb gadget
Hi Simon
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 94 lines
Hi Eddie,
Quoted 78 lines · Eddie Cai
this patch implement rockusb protocol on the device side. this is based on USB download gadget infrastructure. the rockusb function implements the rd, wl, rid commands. it can work with rkdeveloptool.
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-4-split the macro to f_rockusb.h -use ALLOC_CACHE_ALIGN_BUFFER to define cache safe struct inside the function. -fix checkpatch error --- arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 3 files changed, 829 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 drivers/usb/gadget/f_rockusb.carch/arm/include/asm/arch-rockchip/f_rockusb.h new file +53
-0@@ -0,0 +1,104 @@ +/* +* (C) Copyright 2017 +* +* Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef __F_ROCKUSB_H +#define __F_ROCKUSB_H +#define ROCKUSB_VERSION "0.1" + +#define ROCKUSB_INTERFACE_CLASS 0xff +#define ROCKUSB_INTERFACE_SUB_CLASS 0x06 +#define ROCKUSB_INTERFACE_PROTOCOL 0x05 + +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_2_0 (0x0200) +#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1 (0x0040) +#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040) + +#define EP_BUFFER_SIZE 4096 +/* +* EP_BUFFER_SIZE must always be an integral multiple of maxpacket size +* (64 or 512 or 1024), else we break on certain controllers like DWC3 +* that expect bulk OUT requests to be divisible by maxpacket size. +*/ + +#define CONFIG_ROCKUSB_BUF_ADDR CONFIG_SYS_LOAD_ADDR +#define CONFIG_ROCKUSB_BUF_SIZE 0x08000000 + +#define RKUSB_STATUS_IDLE 0 +#define RKUSB_STATUS_CMD 1 +#define RKUSB_STATUS_RXDATA 2 +#define RKUSB_STATUS_TXDATA 3 +#define RKUSB_STATUS_CSW 4 +#define RKUSB_STATUS_RXDATA_PREPARE 5 +#define RKUSB_STATUS_TXDATA_PREPARE 6 + +enum { +TEST_UNIT_READY =0 , +READ_FLASH_ID =0x01 , +TEST_BAD_BLOCK =0x03 , +READ_SECTOR =0x04 , +WRITE_SECTOR =0x05 , +ERASE_NORMAL =0x06 , +ERASE_FORCE =0x0B , +READ_LBA =0x14 , +WRITE_LBA =0x15 , +ERASE_SYSTEMDISK =0x16 , +READ_SDRAM =0x17 , +WRITE_SDRAM =0x18 , +EXECUTE_SDRAM =0x19 , + READ_FLASH_INFO = 0x1A,arch/arm/include/asm/arch-rockchip/f_rockusb.h line 63
Quoted 10 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +10
-0+READ_CHIP_INFO =0x1B , +SET_RESET_FLAG =0x1E , +WRITE_EFUSE =0x1F , +READ_EFUSE =0x20 , +READ_SPI_FLASH =0x21 , +WRITE_SPI_FLASH =0x22 , +WRITE_NEW_EFUSE =0x23 , +READ_NEW_EFUSE =0x24 , +DEVICE_RESET =0xFF +} USB_OPERATION_CODE;Do you mean to declare a variable? Perhaps instead:
Quoted 1 line
enum
op_code{
OK
Quoted 7 lines
...
};arch/arm/include/asm/arch-rockchip/f_rockusb.h line 65
Quoted 2 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +2
-0+ +#define K_FW_TEST_UNIT_READY 0x00Can these be an enum also?
OK
Quoted 28 lines
Quoted 28 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +27
-0+#define K_FW_READ_FLASH_ID 0x01 +#define K_FW_SET_DEVICE_ID 0x02 +#define K_FW_TEST_BAD_BLOCK 0x03 +#define K_FW_READ_10 0x04 +#define K_FW_WRITE_10 0x05 +#define K_FW_ERASE_10 0x06 +#define K_FW_WRITE_SPARE 0x07 +#define K_FW_READ_SPARE 0x08 + +#define K_FW_ERASE_10_FORCE 0x0b +#define K_FW_GET_VERSION 0x0c + +#define K_FW_LBA_READ_10 0x14 +#define K_FW_LBA_WRITE_10 0x15 +#define K_FW_ERASE_SYS_DISK 0x16 +#define K_FW_SDRAM_READ_10 0x17 +#define K_FW_SDRAM_WRITE_10 0x18 +#define K_FW_SDRAM_EXECUTE 0x19 +#define K_FW_READ_FLASH_INFO 0x1A +#define K_FW_GET_CHIP_VER 0x1B +#define K_FW_LOW_FORMAT 0x1C +#define K_FW_SET_RESET_FLAG 0x1E +#define K_FW_SPI_READ_10 0x21 +#define K_FW_SPI_WRITE_10 0x22 + +#define K_FW_SESSION 0X30 +#define K_FW_RESET 0xff
Quoted 8 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 98
Quoted 6 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +6
-0+ +#define CBW_DIRECTION_OUT 0x00 +#define CBW_DIRECTION_IN 0x80 + +struct cmd_dispatch_info { +int cmd;enum
OK
Quoted 4 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 99
Quoted 2 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +1
-0+void (*cb)(struct usb_ep *ep,struct usb_request *req);Function comment
OK
Quoted 6 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h line 102
Quoted 4 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +3
-0+}; + +void rockusb_dev_init (char *dev_type,int dev_index);Function comment
OK
Quoted 108 lines
Quoted 108 lines
arch/arm/include/asm/arch-rockchip/f_rockusb.h new file +2
-0+#endif /* __F_ROCKUSB_H */ +drivers/usb/gadget/Makefile +1
-0@@ -28,6 +28,7 @@ obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o obj-$(CONFIG_USB_FUNCTION_DFU) += f_dfu.o obj-$(CONFIG_USB_FUNCTION_MASS_STORAGE) += f_mass_storage.o obj-$(CONFIG_USB_FUNCTION_FASTBOOT) += f_fastboot.o +obj-$(CONFIG_USB_FUNCTION_ROCKUSB) += f_rockusb.o endif endif ifdef CONFIG_USB_ETHERdrivers/usb/gadget/f_rockusb.c new file +87
-0@@ -0,0 +1,724 @@ +/* +* (C) Copyright 2017 +* +* Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <config.h> +#include <common.h> +#include <errno.h> +#include <malloc.h> +#include <memalign.h> +#include <linux/usb/ch9.h> +#include <linux/usb/gadget.h> +#include <linux/usb/composite.h> +#include <linux/compiler.h> +#include <version.h> +#include <g_dnl.h> +#include <asm/arch/f_rockusb.h> + +struct f_rockusb { +struct usb_function usb_function; +/* IN/OUT EP's and corresponding requests */ +struct usb_ep *in_ep, *out_ep; +struct usb_request *in_req, *out_req; +}; + +static inline struct f_rockusb *func_to_rockusb (struct usb_function *f) +{ + return container_of(f, struct f_rockusb, usb_function); +} + +static struct f_rockusb *rockusb_func; + +static struct usb_endpoint_descriptor fs_ep_in = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_IN , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (64 ), +}; + +static struct usb_endpoint_descriptor fs_ep_out = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_OUT , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (64 ), +}; + +static struct usb_endpoint_descriptor hs_ep_in = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_IN , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (512 ), +}; + +static struct usb_endpoint_descriptor hs_ep_out = { + .bLength =USB_DT_ENDPOINT_SIZE , + .bDescriptorType =USB_DT_ENDPOINT , + .bEndpointAddress =USB_DIR_OUT , + .bmAttributes =USB_ENDPOINT_XFER_BULK , + .wMaxPacketSize =cpu_to_le16 (512 ), +}; + +static struct usb_interface_descriptor interface_desc = { + .bLength =USB_DT_INTERFACE_SIZE , + .bDescriptorType =USB_DT_INTERFACE , + .bInterfaceNumber =0x00 , + .bAlternateSetting =0x00 , + .bNumEndpoints =0x02 , + .bInterfaceClass =ROCKUSB_INTERFACE_CLASS , + .bInterfaceSubClass =ROCKUSB_INTERFACE_SUB_CLASS , + .bInterfaceProtocol =ROCKUSB_INTERFACE_PROTOCOL , +}; + +static struct usb_descriptor_header *rkusb_fs_function[] = { + (struct usb_descriptor_header *)&interface_desc, + (struct usb_descriptor_header *)&fs_ep_in, + (struct usb_descriptor_header *)&fs_ep_out, +}; + +static struct usb_descriptor_header *rkusb_hs_function[] = { + (struct usb_descriptor_header *)&interface_desc, + (struct usb_descriptor_header *)&hs_ep_in,
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 93
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+ (struct usb_descriptor_header *)&hs_ep_out, + NULL, +}; + +static struct usb_endpoint_descriptor * +rkusb_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs,Can you put the function name on the same line as the * ?
OK
Quoted 21 lines
Quoted 21 lines
drivers/usb/gadget/f_rockusb.c new file +20
-0+ struct usb_endpoint_descriptor *hs) +{ +if (gadget_is_dualspeed (g) && g->speed ==USB_SPEED_HIGH ) +return hs; +return fs; +} + +/* +* static strings, in UTF-8 +*/ +static const char rkusb_name[] ="Rockchip Rockusb" ; + +static struct usb_string rkusb_string_defs[] = { + [0 ].s = rkusb_name, + { }/* end of list */ +}; + +static struct usb_gadget_strings stringtab_rkusb = { + .language =0x0409 ,/* en-us */ + .strings = rkusb_string_defs,
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 119
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+}; + +static struct usb_gadget_strings *rkusb_strings[] = { + &stringtab_rkusb, +NULL , +};Can you put all data declarations together at the top of the file?
OK
Quoted 17 lines
Quoted 5 lines
drivers/usb/gadget/f_rockusb.c new file +3
-0+ +static void rx_handler_command (struct usb_ep *ep,struct usb_request *req); +static int rockusb_tx_write_csw (u32 tag,int residue,u8 status,int size);drivers/usb/gadget/f_rockusb.c line 132
Quoted 10 lines
drivers/usb/gadget/f_rockusb.c new file +10
-0+ +static void rockusb_complete (struct usb_ep *ep,struct usb_request *req) +{ +int status = req->status; +if (!status) +return ; +debug ("status: %d ep '%s' trans: %d\n" , status, ep->name, req->actual); +} + +static int rockusb_bind (struct usb_configuration *c,struct usb_function *f)Function comment
OK
Quoted 41 lines
Quoted 41 lines
drivers/usb/gadget/f_rockusb.c new file +40
-0+{ +int id; +struct usb_gadget *gadget = c->cdev->gadget; +struct f_rockusb *f_rkusb =func_to_rockusb (f); +const char *s; + + id =usb_interface_id (c, f); +if (id <0 ) +return id; + interface_desc.bInterfaceNumber = id; + + id =usb_string_id (c->cdev); +if (id <0 ) +return id; + + rkusb_string_defs[0 ].id = id; + interface_desc.iInterface = id; + + f_rkusb->in_ep =usb_ep_autoconfig (gadget, &fs_ep_in); +if (!f_rkusb->in_ep) +return -ENODEV ; + f_rkusb->in_ep->driver_data = c->cdev; + + f_rkusb->out_ep =usb_ep_autoconfig (gadget, &fs_ep_out); +if (!f_rkusb->out_ep) +return -ENODEV ; + f_rkusb->out_ep->driver_data = c->cdev; + + f->descriptors = rkusb_fs_function; + +if (gadget_is_dualspeed (gadget)) { + hs_ep_in.bEndpointAddress = fs_ep_in.bEndpointAddress; + hs_ep_out.bEndpointAddress = fs_ep_out.bEndpointAddress; + f->hs_descriptors = rkusb_hs_function; + } + + s =getenv ("serial#" ); +if (s) +g_dnl_set_serialnumber ((char *)s); +
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 178
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+return 0 ; +} + +static void rockusb_unbind (struct usb_configuration *c,struct usb_function *f) +{ +memset (rockusb_func,0 ,sizeof (*rockusb_func));Why do you zero it? Can you add a comment?
OK
Quoted 33 lines
Quoted 33 lines
drivers/usb/gadget/f_rockusb.c new file +31
-0+} + +static void rockusb_disable (struct usb_function *f) +{ +struct f_rockusb *f_rkusb =func_to_rockusb (f); + +usb_ep_disable (f_rkusb->out_ep); +usb_ep_disable (f_rkusb->in_ep); + +if (f_rkusb->out_req) { +free (f_rkusb->out_req->buf); +usb_ep_free_request (f_rkusb->out_ep, f_rkusb->out_req); + f_rkusb->out_req =NULL ; + } +if (f_rkusb->in_req) { +free (f_rkusb->in_req->buf); +usb_ep_free_request (f_rkusb->in_ep, f_rkusb->in_req); + f_rkusb->in_req =NULL ; + } +} + +static struct usb_request *rockusb_start_ep (struct usb_ep *ep) +{ +struct usb_request *req; + + req =usb_ep_alloc_request (ep,0 ); +if (!req) +return NULL ; + + req->length =EP_BUFFER_SIZE ; + req->buf =memalign (CONFIG_SYS_CACHELINE_SIZE ,EP_BUFFER_SIZE );
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 215
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+if (!req->buf) { +usb_ep_free_request (ep, req); +return NULL ; + } + +memset (req->buf,0 , req->length);blank line before return
OK
Quoted 20 lines
Quoted 20 lines
drivers/usb/gadget/f_rockusb.c new file +19
-0+return req; +} + +static int rockusb_set_alt (struct usb_function *f, +unsigned interface,unsigned alt) +{ +int ret; +struct usb_composite_dev *cdev = f->config->cdev; +struct usb_gadget *gadget = cdev->gadget; +struct f_rockusb *f_rkusb =func_to_rockusb (f); +const struct usb_endpoint_descriptor *d; + +debug ("%s: func: %s intf: %d alt: %d\n" , + __func__, f->name, interface, alt); + + d =rkusb_ep_desc (gadget, &fs_ep_out, &hs_ep_out); + ret =usb_ep_enable (f_rkusb->out_ep, d); +if (ret) { +puts ("failed to enable out ep\n" );
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 240
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+return ret; + } + + f_rkusb->out_req =rockusb_start_ep (f_rkusb->out_ep); +if (!f_rkusb->out_req) { +puts ("failed to alloc out req\n" );
printf()instead ofputs()
OK
Quoted 58 lines
Quoted 58 lines
drivers/usb/gadget/f_rockusb.c new file +57
-0+ ret = -EINVAL ; + goto err; + } + f_rkusb->out_req->complete = rx_handler_command; + + d =rkusb_ep_desc (gadget, &fs_ep_in, &hs_ep_in); + ret =usb_ep_enable (f_rkusb->in_ep, d); +if (ret) { +puts ("failed to enable in ep\n" ); + goto err; + } + + f_rkusb->in_req =rockusb_start_ep (f_rkusb->in_ep); +if (!f_rkusb->in_req) { +puts ("failed alloc req in\n" ); + ret = -EINVAL ; + goto err; + } + f_rkusb->in_req->complete = rockusb_complete; + + ret =usb_ep_queue (f_rkusb->out_ep, f_rkusb->out_req,0 ); +if (ret) + goto err; + +return 0 ; +err: +rockusb_disable (f); +return ret; +} + +static int rockusb_add (struct usb_configuration *c) +{ +struct f_rockusb *f_rkusb = rockusb_func; +int status; + +debug ("%s: cdev: 0x%p\n" , __func__, c->cdev); + +if (!f_rkusb) { + f_rkusb =memalign (CONFIG_SYS_CACHELINE_SIZE ,sizeof (*f_rkusb)); +if (!f_rkusb) +return -ENOMEM ; + + rockusb_func = f_rkusb; +memset (f_rkusb,0 ,sizeof (*f_rkusb)); + } + + f_rkusb->usb_function.name ="f_rockusb" ; + f_rkusb->usb_function.bind = rockusb_bind; + f_rkusb->usb_function.unbind = rockusb_unbind; + f_rkusb->usb_function.set_alt = rockusb_set_alt; + f_rkusb->usb_function.disable = rockusb_disable; + f_rkusb->usb_function.strings = rkusb_strings; + + status =usb_add_function (c, &f_rkusb->usb_function); +if (status) { +free (f_rkusb); + rockusb_func = f_rkusb;
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 303
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+ } +return status; +} + +char *rockusb_dev_type =0 ; +int rockusb_dev_index =0 ;Move to top
OK
Quoted 2 lines
I wonder if you should group all your data in a struct?
this data is useless if we just want to talk to cpu, get cpu info etc. So no need to group
it in a struct. i will make it static to avoid other module use it
Quoted 62 lines
Quoted 62 lines
drivers/usb/gadget/f_rockusb.c new file +61
-0+ +void rockusb_dev_init (char *dev_type,int dev_index) +{ + rockusb_dev_type = dev_type; + rockusb_dev_index = dev_index; +} + +DECLARE_GADGET_BIND_CALLBACK (usb_dnl_rockusb, rockusb_add); + +static int rockusb_tx_write (const char *buffer,unsigned int buffer_size) +{ +struct usb_request *in_req = rockusb_func->in_req; +int ret; + +memcpy (in_req->buf, buffer, buffer_size); + in_req->length = buffer_size; +usb_ep_dequeue (rockusb_func->in_ep, in_req); + ret =usb_ep_queue (rockusb_func->in_ep, in_req,0 ); +if (ret) +printf ("Error %d on queue\n" , ret); +return 0 ; +} + +static int rockusb_tx_write_str (const char *buffer) +{ +return rockusb_tx_write (buffer,strlen (buffer)); +} + +/* Bulk-only data structures */ + +/* Command Block Wrapper */ +struct fsg_bulk_cb_wrap { +__le32 signature;/* Contains 'USBC' */ +u32 tag;/* Unique per command id */ +__le32 data_transfer_length;/* Size of the data */ +u8 flags;/* Direction in bit 7 */ +u8 lun;/* lun (normally 0) */ +u8 length;/* Of the CDB, <= MAX_COMMAND_SIZE */ +u8 CDB[16 ];/* Command Data Block */ +}; + +#define USB_BULK_CB_WRAP_LEN 31 +#define USB_BULK_CB_SIG 0x43425355/* Spells out USBC */ +#define USB_BULK_IN_FLAG 0x80 + +/* Command status Wrapper */ +struct bulk_cs_wrap { +__le32 signature;/* Should = 'USBS' */ +u32 tag;/* Same as original command */ +__le32 residue;/* Amount not transferred */ +u8 status;/* See below */ +}; + +#define USB_BULK_CS_WRAP_LEN 13 +#define USB_BULK_CS_SIG 0x53425355/* Spells out 'USBS' */ +#define USB_STATUS_PASS 0 +#define USB_STATUS_FAIL 1 +#define USB_STATUS_PHASE_ERROR 2 + +#define CSW_GOOD 0x00 +#define CSW_FAIL 0x01
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 370
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+ +#ifdef DEBUG +static void printcbw (char *buf) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap));Does this need to be aligned if you are just using it for debug?
Yes, fsg_bulk_cb_wrap needs to be aligned.
Quoted 63 lines
Quoted 63 lines
drivers/usb/gadget/f_rockusb.c new file +62
-0+ +memcpy ((char *)cbw, buf,USB_BULK_CB_WRAP_LEN ); + +debug ("cbw: signature:%x\n" , cbw->signature); +debug ("cbw: tag=%x\n" , cbw->tag); +debug ("cbw: data_transfer_length=%d\n" , cbw->data_transfer_length); +debug ("cbw: flags=%x\n" , cbw->flags); +debug ("cbw: lun=%d\n" , cbw->lun); +debug ("cbw: length=%d\n" , cbw->length); +debug ("cbw: ucOperCode=%x\n" , cbw->CDB[0 ]); +debug ("cbw: ucReserved=%x\n" , cbw->CDB[1 ]); +debug ("cbw: dwAddress:%x %x %x %x\n" , cbw->CDB[5 ], cbw->CDB[4 ], + cbw->CDB[3 ], cbw->CDB[2 ]); +debug ("cbw: ucReserved2=%x\n" , cbw->CDB[6 ]); +debug ("cbw: uslength:%x %x\n" , cbw->CDB[8 ], cbw->CDB[7 ]); +} + +static void printcsw (char *buf) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct bulk_cs_wrap, csw, + sizeof(struct bulk_cs_wrap)); +memcpy ((char *)csw, buf,USB_BULK_CS_WRAP_LEN ); +debug ("csw: signature:%x\n" , csw->signature); +debug ("csw: tag:%x\n" , csw->tag); +debug ("csw: residue:%x\n" , csw->residue); +debug ("csw: status:%x\n" , csw->status); +} +#endif + +static int rockusb_tx_write_csw (u32 tag,int residue,u8 status,int size) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct bulk_cs_wrap, csw, + sizeof(struct bulk_cs_wrap)); + csw->signature =cpu_to_le32 (USB_BULK_CS_SIG ); + csw->tag = tag; + csw->residue =cpu_to_be32 (residue); + csw->status = status; +#ifdef DEBUG +printcsw ((char *)&csw); +#endif +return rockusb_tx_write ((char *)csw, size); +} + +static unsigned int download_tag; +static unsigned int download_lba; +static unsigned int download_size; +static unsigned int download_bytes; +struct blk_desc *download_desc =0 ; + +static unsigned int rx_bytes_expected (struct usb_ep *ep) +{ +int rx_remain = download_size - download_bytes; +unsigned int rem; +unsigned int maxpacket = ep->maxpacket; + +if (rx_remain <=0 ) +return 0 ; +else if (rx_remain >EP_BUFFER_SIZE ) +return EP_BUFFER_SIZE ; + + rem = rx_remain % maxpacket; +if (rem >0 )
Quoted 8 lines
drivers/usb/gadget/f_rockusb.c line 438
Quoted 6 lines
drivers/usb/gadget/f_rockusb.c new file +6
-0+ rx_remain = rx_remain + (maxpacket - rem); + +return rx_remain; +} + +static void rx_handler_dl_image (struct usb_ep *ep,struct usb_request *req)Function comments
OK
Quoted 293 lines
Quoted 288 lines
drivers/usb/gadget/f_rockusb.c new file +286
-1+{ +unsigned int transfer_size = download_size - download_bytes; +const unsigned char *buffer = req->buf; +unsigned int buffer_size = req->actual; + +if (!download_desc) { +printf ("rx_handler_dl_image blk_get_dev\n" ); + download_desc =blk_get_dev (rockusb_dev_type, + rockusb_dev_index); +if (!download_desc || + download_desc->type ==DEV_TYPE_UNKNOWN ) { +error ("invalid mmc device\n" ); +rockusb_tx_write_csw (download_tag,0 ,CSW_FAIL , +USB_BULK_CS_WRAP_LEN ); +return ; + } + } + +if (req->status !=0 ) { +printf ("Bad status: %d\n" , req->status); +rockusb_tx_write_csw (download_tag,0 , +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +return ; + } + +if (buffer_size < transfer_size) + transfer_size = buffer_size; + +memcpy ((void *)CONFIG_ROCKUSB_BUF_ADDR + download_bytes, + buffer, transfer_size); + download_bytes += transfer_size; + +/* Check if transfer is done */ +if (download_bytes >= download_size) { +int blks =0 , blkcnt = download_size/512 ; +printf ("download %d bytes finished, start writing to lba %x\n" , + download_bytes, download_lba); + blks =blk_dwrite (download_desc, download_lba, blkcnt, + (char *)CONFIG_ROCKUSB_BUF_ADDR ); +if (blks != blkcnt) { +error ("failed writing to device %s: %d\n" , + rockusb_dev_type, rockusb_dev_index); +rockusb_tx_write_csw (download_tag,0 , +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +return ; + } + + req->complete = rx_handler_command; + req->length =EP_BUFFER_SIZE ; + download_size =0 ; +printf ("done\n" ); +rockusb_tx_write_csw (download_tag,0 ,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); + }else { + req->length =rx_bytes_expected (ep); + } + + req->actual =0 ; +usb_ep_queue (ep, req,0 ); +} + +static void cb_test_unit_ready (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length, +CSW_GOOD ,USB_BULK_CS_WRAP_LEN ); +} + +static void cb_read_storage_id (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); +char emmc_id[] ="EMMC " ; + +printf ("cb_read_storage_id\n" ); +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +rockusb_tx_write_str (emmc_id); +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); +} + +static void cb_write_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)); +int sector_count; + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + sector_count = (int )get_unaligned_be16 (&cbw->CDB[7 ]); + download_lba =get_unaligned_be32 (&cbw->CDB[2 ]); + download_size = sector_count *512 ; + download_bytes =0 ; + download_tag = cbw->tag; +if ((0 == download_size) || (download_size >CONFIG_ROCKUSB_BUF_SIZE )) { +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length, +CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); + }else { + req->complete = rx_handler_dl_image; + req->length =rx_bytes_expected (ep); + } +} + +static int reboot_flag; + +int __weak rkusb_set_reboot_flag (int flag) +{ +printf ("rkusb_set_reboot_flag: %d\n" , reboot_flag); +return -ENOSYS ; +} + +static void compl_do_reset (struct usb_ep *ep,struct usb_request *req) +{ +rkusb_set_reboot_flag (reboot_flag); +do_reset (NULL ,0 ,0 ,NULL ); +} + +static void cb_reboot (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + reboot_flag =0 ; +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); + reboot_flag = cbw->CDB[1 ]; + rockusb_func->in_req->complete = compl_do_reset; +rockusb_tx_write_csw (cbw->tag, cbw->data_transfer_length,CSW_GOOD , +USB_BULK_CS_WRAP_LEN ); +} + +static void cb_not_support (struct usb_ep *ep,struct usb_request *req) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +printf ("Rockusb command %x not support yet\n" , cbw->CDB[0 ]); +rockusb_tx_write_csw (cbw->tag,0 ,CSW_FAIL ,USB_BULK_CS_WRAP_LEN ); +} + +static const struct cmd_dispatch_info cmd_dispatch_info[] = { + { + .cmd =K_FW_TEST_UNIT_READY , + .cb = cb_test_unit_ready, + }, + { + .cmd =K_FW_READ_FLASH_ID , + .cb = cb_read_storage_id, + }, + { + .cmd =K_FW_SET_DEVICE_ID , + .cb = cb_not_support, + }, + { + .cmd =K_FW_TEST_BAD_BLOCK , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_ERASE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_WRITE_SPARE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_SPARE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_ERASE_10_FORCE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_GET_VERSION , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LBA_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LBA_WRITE_10 , + .cb = cb_write_lba, + }, + { + .cmd =K_FW_ERASE_SYS_DISK , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SDRAM_EXECUTE , + .cb = cb_not_support, + }, + { + .cmd =K_FW_READ_FLASH_INFO , + .cb = cb_not_support, + }, + { + .cmd =K_FW_GET_CHIP_VER , + .cb = cb_not_support, + }, + { + .cmd =K_FW_LOW_FORMAT , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SET_RESET_FLAG , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SPI_READ_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SPI_WRITE_10 , + .cb = cb_not_support, + }, + { + .cmd =K_FW_SESSION , + .cb = cb_not_support, + }, + { + .cmd =K_FW_RESET , + .cb = cb_reboot, + }, +}; + +static void rx_handler_command (struct usb_ep *ep,struct usb_request *req) +{ +void (*func_cb)(struct usb_ep *ep,struct usb_request *req) =NULL ; + ALLOC_CACHE_ALIGN_BUFFER(struct fsg_bulk_cb_wrap, cbw, + sizeof(struct fsg_bulk_cb_wrap)); +char *cmdbuf = req->buf; +int i; + +if (req->status || req->length ==0 ) +return ; + +memcpy ((char *)cbw, req->buf,USB_BULK_CB_WRAP_LEN ); +#ifdef DEBUG +printcbw (req->buf); +#endif + +for (i =0 ; i <ARRAY_SIZE (cmd_dispatch_info); i++) { +if (cmd_dispatch_info[i].cmd == cbw->CDB[0 ]) { + func_cb = cmd_dispatch_info[i].cb; +break ; + } + } + +if (!func_cb) { +error ("unknown command: %s" , (char *)req->buf); +rockusb_tx_write_str ("FAILunknown command" ); + }else { +if (req->actual < req->length) { +u8 *buf = (u8 *)req->buf; + buf[req->actual] =0 ; +func_cb (ep, req); + }else { +error ("buffer overflow" ); +rockusb_tx_write_str ("FAILbuffer overflow" ); + } + } + + *cmdbuf ='\0' ; + req->actual =0 ; +usb_ep_queue (ep, req,0 ); +} --Quoted 2 lines
1.9.1
Regards,
Simon
PATCH v3 1/4 usb: rockchip: add the rockusb gadget
Hi Eddie,
Quoted 25 lines · Eddie Cai
Hi Simon
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 21 lines
Hi Eddie,
Quoted 18 lines · Eddie Cai
this patch implement rockusb protocol on the device side. this is based on USB download gadget infrastructure. the rockusb function implements the rd, wl, rid commands. it can work with rkdeveloptool.
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-4-split the macro to f_rockusb.h -use ALLOC_CACHE_ALIGN_BUFFER to define cache safe struct inside the function. -fix checkpatch error --- arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 3 files changed, 829 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 drivers/usb/gadget/f_rockusb.c
[..]
Quoted 10 lines
Quoted 4 lines
drivers/usb/gadget/f_rockusb.c line 303
Quoted 2 lines
drivers/usb/gadget/f_rockusb.c new file +2
-0+char *rockusb_dev_type =0 ; +int rockusb_dev_index =0 ;Move to top
OK
Quoted 2 lines
I wonder if you should group all your data in a struct?
this data is useless if we just want to talk to cpu, get cpu info etc. So no need to group
it in a struct. i will make it static to avoid other module use it
The thing is that we should convert USB gadgets to driver model at some point. When we do, we cannot have static local data - it all needs to go into a driver-model struct.
So I think it is better to do this now, and have a single static struct locally, then pass it around between the functions in this file. That way we have less work to do with DM conversion.
Regards,
Simon
PATCH v3 1/4 usb: rockchip: add the rockusb gadget
2017-05-09 0:38 GMT+08:00 Simon Glass <[email protected]>:
Quoted 43 lines
Hi Eddie,
Quoted 25 lines · Eddie Cai
Hi Simon
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 21 lines
Hi Eddie,
Quoted 18 lines · Eddie Cai
this patch implement rockusb protocol on the device side. this is based on USB download gadget infrastructure. the rockusb function implements the rd, wl, rid commands. it can work with rkdeveloptool.
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-4-split the macro to f_rockusb.h -use ALLOC_CACHE_ALIGN_BUFFER to define cache safe struct inside the function. -fix checkpatch error --- arch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724 +++++++++++++++++++++++++ 3 files changed, 829 insertions(+) create mode 100644 arch/arm/include/asm/arch-rockchip/f_rockusb.h create mode 100644 drivers/usb/gadget/f_rockusb.c[..]
Quoted 10 lines
Quoted 4 lines
drivers/usb/gadget/f_rockusb.c line 303
Quoted 2 lines
drivers/usb/gadget/f_rockusb.c new file +2
-0+char *rockusb_dev_type =0 ; +int rockusb_dev_index =0 ;Move to top
OK
Quoted 2 lines
I wonder if you should group all your data in a struct?
this data is useless if we just want to talk to cpu, get cpu info etc. So no need to group
it in a struct. i will make it static to avoid other module use it
Quoted 7 lines
The thing is that we should convert USB gadgets to driver model at some point. When we do, we cannot have static local data - it all needs to go into a driver-model struct.
So I think it is better to do this now, and have a single static struct locally, then pass it around between the functions in this file. That way we have less work to do with DM conversion.
OK, i will do it in next version
Quoted 3 lines
Regards,
Simon
PATCH v3 2/4 usb: rockchip: add rockusb command
In reply to Eddie Caithis patch add rockusb command. the usage is rockusb <USB_controller> <devtype> <dev[:part]> e.g. rockusb 0 mmc 0
Changes in v3:
-fix comment from Simon and Lukasz
-fix checkpactch error
--- cmd/Kconfig | 11 +++++++++ cmd/Makefile | 1 + cmd/rockusb.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 cmd/rockusb.c
cmd/Kconfig +11 -0
@@ -509,6 +509,17 @@ config CMD_DFU Enables the command "dfu" which is used to have U-Boot create a DFU class device via USB. +config CMD_ROCKUSB + bool "rockusb" + select USB_FUNCTION_ROCKUSB + help + enables the rockusb command + +config USB_FUNCTION_ROCKUSB + bool "Enable USB rockusb gadget" + help + This enables the USB part of the rockusb gadget. + config CMD_USB_MASS_STORAGE bool "UMS usb mass storage" help
cmd/Makefile +1 -0
@@ -109,6 +109,7 @@ obj-$(CONFIG_CMD_READ) += read.o obj-$(CONFIG_CMD_REGINFO) += reginfo.o obj-$(CONFIG_CMD_REISER) += reiser.o obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o +obj-$(CONFIG_CMD_ROCKUSB) += rockusb.o obj-$(CONFIG_SANDBOX) += host.o obj-$(CONFIG_CMD_SATA) += sata.o obj-$(CONFIG_CMD_SF) += sf.o
cmd/rockusb.c new file +74 -0
74 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v3 2/4 usb: rockchip: add rockusb command
Hi Eddie,
Quoted 7 lines · Eddie Cai
this patch add rockusb command. the usage is rockusb <
USB_controller> <devtype> <dev[:part]> e.g. rockusb 0 mmc 0Signed-off-by Eddie Cai <[email protected]>Changes in v3:
Review
Quoted 9 lines
(quoted diff) +0
-3-fix comment from Simon and Lukasz -fix checkpactch error --- cmd/Kconfig | 11 +++++++++ cmd/Makefile | 1 + cmd/rockusb.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 cmd/rockusb.c
Nits below
Quoted 6 lines
cmd/Kconfig +0
-0
cmd/Kconfig config CMD_DFU · line 516
Quoted 8 lines
cmd/Kconfig +5
-0@@ -509,6 +509,17 @@ config CMD_DFU Enables the command "dfu" which is used to have U-Boot create a DFU class device via USB. +config CMD_ROCKUSB + bool "rockusb" + select USB_FUNCTION_ROCKUSB + help + enables the rockusb command
Can you please expand a bit:
- what it is for
- link to docs on how to get tool, how to run it
- depends on ROCKCHIP or similar?
cmd/Kconfig config CMD_DFU · line 521
Quoted 5 lines
cmd/Kconfig +5
-0+ +config USB_FUNCTION_ROCKUSB + bool "Enable USB rockusb gadget" + help + This enables the USB part of the rockusb gadget.
Should this depend on the above, or vice versa?
Also wondering whether this one should go in the drivers/usb directory?
Quoted 97 lines
cmd/Kconfig +1
-0+ config CMD_USB_MASS_STORAGE bool "UMS usb mass storage" helpcmd/Makefile +1
-0@@ -109,6 +109,7 @@ obj-$(CONFIG_CMD_READ) += read.o obj-$(CONFIG_CMD_REGINFO) += reginfo.o obj-$(CONFIG_CMD_REISER) += reiser.o obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o +obj-$(CONFIG_CMD_ROCKUSB) += rockusb.o obj-$(CONFIG_SANDBOX) += host.o obj-$(CONFIG_CMD_SATA) += sata.o obj-$(CONFIG_CMD_SF) += sf.ocmd/rockusb.c new file +74
-1@@ -0,0 +1,74 @@ +/* +* Copyright (C) 2017 Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <command.h> +#include <console.h> +#include <g_dnl.h> +#include <usb.h> +#include <asm/arch/f_rockusb.h> + +static int do_rockusb (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ +int controller_index, dev_index; +char *usb_controller; +char *devtype; +char *devnum; +int ret; + +if (argc <2 ) +return CMD_RET_USAGE ; + + usb_controller = argv[1 ]; + controller_index =simple_strtoul (usb_controller,NULL ,0 ); + +if (argc >=4 ) { + devtype = argv[2 ]; + devnum = argv[3 ]; + }else { +return CMD_RET_USAGE ; + } + dev_index =simple_strtoul (devnum,NULL ,0 ); +rockusb_dev_init (devtype, dev_index); + + ret =board_usb_init (controller_index,USB_INIT_DEVICE ); +if (ret) { +error ("USB init failed: %d" , ret); +return CMD_RET_FAILURE ; + } + +g_dnl_clear_detach (); + ret =g_dnl_register ("usb_dnl_rockusb" ); +if (ret) +return CMD_RET_FAILURE ; + +if (!g_dnl_board_usb_cable_connected ()) { +puts ("\rUSB cable not detected, Command exit.\n" ); + ret =CMD_RET_FAILURE ; + goto exit; + } + +while (1 ) { +if (g_dnl_detach ()) +break ; +if (ctrlc ()) +break ; +usb_gadget_handle_interrupts (controller_index); + } + ret =CMD_RET_SUCCESS ; + +exit: +g_dnl_unregister (); +g_dnl_clear_detach (); +board_usb_cleanup (controller_index,USB_INIT_DEVICE ); + +return ret; +} + +U_BOOT_CMD (rockusb,4 ,1 , do_rockusb, +"use the rockusb protocol" , +"<USB_controller> <devtype> <dev[:part]> e.g. rockusb 0 mmc 0\n" +); --
Quoted 2 lines
1.9.1
Regards,
Simon
PATCH v3 2/4 usb: rockchip: add rockusb command
HI Simon
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 41 lines
Hi Eddie,
Quoted 7 lines · Eddie Cai
this patch add rockusb command. the usage is rockusb <
USB_controller> <devtype> <dev[:part]> e.g. rockusb 0 mmc 0Signed-off-by Eddie Cai <[email protected]>Changes in v3:
Review
Quoted 9 lines
(quoted diff) +0
-3-fix comment from Simon and Lukasz -fix checkpactch error --- cmd/Kconfig | 11 +++++++++ cmd/Makefile | 1 + cmd/rockusb.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 cmd/rockusb.cReviewed-by Simon Glass <[email protected]>Nits below
Quoted 6 lines
cmd/Kconfig +0
-0cmd/Kconfig config CMD_DFU · line 516
Quoted 8 lines
cmd/Kconfig +5
-0@@ -509,6 +509,17 @@ config CMD_DFU Enables the command "dfu" which is used to have U-Boot create a DFU class device via USB. +config CMD_ROCKUSB + bool "rockusb" + select USB_FUNCTION_ROCKUSB + help + enables the rockusb commandCan you please expand a bit:
Quoted 3 lines
- what it is for
- link to docs on how to get tool, how to run it
- depends on ROCKCHIP or similar?
OK
Quoted 8 lines
cmd/Kconfig config CMD_DFU · line 521
Quoted 6 lines
cmd/Kconfig +5
-0+ +config USB_FUNCTION_ROCKUSB + bool "Enable USB rockusb gadget" + help + This enables the USB part of the rockusb gadget.Should this depend on the above, or vice versa?
CMD_ROCKUSB should depend on USB_FUNCTION_ROCKUSB
Quoted 2 lines
Also wondering whether this one should go in the
drivers/usbdirectory?
OK, i will move to drivers/usb/gadget/Kconfig in next version
Quoted 103 lines
Quoted 98 lines
cmd/Kconfig +1
-0+ config CMD_USB_MASS_STORAGE bool "UMS usb mass storage" helpcmd/Makefile +1
-0@@ -109,6 +109,7 @@ obj-$(CONFIG_CMD_READ) += read.o obj-$(CONFIG_CMD_REGINFO) += reginfo.o obj-$(CONFIG_CMD_REISER) += reiser.o obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o +obj-$(CONFIG_CMD_ROCKUSB) += rockusb.o obj-$(CONFIG_SANDBOX) += host.o obj-$(CONFIG_CMD_SATA) += sata.o obj-$(CONFIG_CMD_SF) += sf.ocmd/rockusb.c new file +74
-1@@ -0,0 +1,74 @@ +/* +* Copyright (C) 2017 Eddie Cai <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <command.h> +#include <console.h> +#include <g_dnl.h> +#include <usb.h> +#include <asm/arch/f_rockusb.h> + +static int do_rockusb (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) +{ +int controller_index, dev_index; +char *usb_controller; +char *devtype; +char *devnum; +int ret; + +if (argc <2 ) +return CMD_RET_USAGE ; + + usb_controller = argv[1 ]; + controller_index =simple_strtoul (usb_controller,NULL ,0 ); + +if (argc >=4 ) { + devtype = argv[2 ]; + devnum = argv[3 ]; + }else { +return CMD_RET_USAGE ; + } + dev_index =simple_strtoul (devnum,NULL ,0 ); +rockusb_dev_init (devtype, dev_index); + + ret =board_usb_init (controller_index,USB_INIT_DEVICE ); +if (ret) { +error ("USB init failed: %d" , ret); +return CMD_RET_FAILURE ; + } + +g_dnl_clear_detach (); + ret =g_dnl_register ("usb_dnl_rockusb" ); +if (ret) +return CMD_RET_FAILURE ; + +if (!g_dnl_board_usb_cable_connected ()) { +puts ("\rUSB cable not detected, Command exit.\n" ); + ret =CMD_RET_FAILURE ; + goto exit; + } + +while (1 ) { +if (g_dnl_detach ()) +break ; +if (ctrlc ()) +break ; +usb_gadget_handle_interrupts (controller_index); + } + ret =CMD_RET_SUCCESS ; + +exit: +g_dnl_unregister (); +g_dnl_clear_detach (); +board_usb_cleanup (controller_index,USB_INIT_DEVICE ); + +return ret; +} + +U_BOOT_CMD (rockusb,4 ,1 , do_rockusb, +"use the rockusb protocol" , +"<USB_controller> <devtype> <dev[:part]> e.g. rockusb 0 mmc 0\n" +); --Quoted 2 lines
1.9.1
Regards,
Simon
PATCH v3 3/4 rockchip:usb: add a simple readme for rockusb
In reply to Eddie Caiadd a simple readme to introduce rockusb and tell people how to use it
Changes in v3:
-fix checkpatch error
--- doc/README.rockusb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 doc/README.rockusb
doc/README.rockusb new file +37 -0
@@ -0,0 +1,37 @@ +Rockusb (Rockchip USB protocol) +===================================================== + +Overview +-------- + +Rockusb protocol is widely used with Rockchip devices. +It can read/write info, image to/from devices. This +document briefly describes how to use Rockusb for upgrading +firmware (e.g. kernel, u-boot, rootfs, etc.). + +Tools +-------- +There are many tools can support Rockusb protocol. rkdeveloptool +(https://github.com/rockchip-linux/rkdeveloptool) is open source, +It is maintained by Rockchip. People don't want to build from source +can download from here +(https://github.com/rockchip-linux/rkbin/blob/master/tools/rkdeveloptool) + +Usage +-------- +The Usage of Rockusb command is +rockusb <USB_controller> <devtype> <dev[:part]> +e.g. rockusb 0 mmc 0 +On your U-Boot console, type this command to enter rockusb mode. +On your host PC. use lsusb command. you should see a usb device +using 0x2207 as its USB verdor id. Then use rkdeveloptool +sudo rkdeveloptool wl <BeginSec> <File> +to flash U-Boot image use command +sudo rkdeveloptool wl 64 <U-Boot binary> +There are plenty of Rockusb command. but wl(write lba) and +rd(reboot) command. These two command can let people flash +image to device. + +To do +----- +* Fully support Rockusb protocol
Signature · 1 line
1.9.1
PATCH v3 3/4 rockchip:usb: add a simple readme for rockusb
Hi Eddie,
Quoted 30 lines · Eddie Cai
add a simple readme to introduce rockusb and tell people how to use it
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-2-fix checkpatch error --- doc/README.rockusb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 doc/README.rockusbdoc/README.rockusb new file +12
-0@@ -0,0 +1,37 @@ +Rockusb (Rockchip USB protocol) +===================================================== + +Overview +-------- + +Rockusb protocol is widely used with Rockchip devices. +It can read/write info, image to/from devices. This +document briefly describes how to use Rockusb for upgrading +firmware (e.g. kernel, u-boot, rootfs, etc.). + +Tools
doc/README.rockusb line 22
Quoted 10 lines
doc/README.rockusb new file +10
-0+-------- +There are many tools can support Rockusb protocol. rkdeveloptool +(https://github.com/rockchip-linux/rkdeveloptool) is open source, +It is maintained by Rockchip. People don't want to build from source +can download from here +(https://github.com/rockchip-linux/rkbin/blob/master/tools/rkdeveloptool) + +Usage +-------- +The Usage of Rockusb command is
is:
blank line here
doc/README.rockusb line 23
Quoted 1 line
doc/README.rockusb new file +1
-0+rockusb <USB_controller> <devtype> <dev[:part]>
blank line
doc/README.rockusb line 24
Quoted 1 line
doc/README.rockusb new file +1
-0+e.g. rockusb 0 mmc 0
blanke line
doc/README.rockusb line 27
Quoted 3 lines
doc/README.rockusb new file +3
-0+On your U-Boot console, type this command to enter rockusb mode. +On your host PC. use lsusb command. you should see a usb device +using 0x2207 as its USB verdor id. Then use rkdeveloptool
blank line
doc/README.rockusb line 28
Quoted 1 line
doc/README.rockusb new file +1
-0+sudo rkdeveloptool wl <BeginSec> <File>
What are the parameters for? What do they mean?
blank line
doc/README.rockusb line 29
Quoted 1 line
doc/README.rockusb new file +1
-0+to flash U-Boot image use command
blank line
doc/README.rockusb line 30
Quoted 1 line
doc/README.rockusb new file +1
-0+sudo rkdeveloptool wl 64 <U-Boot binary>
blank line
Which U-Boot file? Please be specific
Quoted 10 lines
doc/README.rockusb new file +7
-1+There are plenty of Rockusb command. but wl(write lba) and +rd(reboot) command. These two command can let people flash +image to device. + +To do +----- +* Fully support Rockusb protocol --1.9.1
Regards,
Simon
PATCH v3 3/4 rockchip:usb: add a simple readme for rockusb
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 46 lines
Hi Eddie,
Quoted 30 lines · Eddie Cai
add a simple readme to introduce rockusb and tell people how to use it
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
(quoted diff) +0
-2-fix checkpatch error --- doc/README.rockusb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 doc/README.rockusbdoc/README.rockusb new file +12
-0@@ -0,0 +1,37 @@ +Rockusb (Rockchip USB protocol) +===================================================== + +Overview +-------- + +Rockusb protocol is widely used with Rockchip devices. +It can read/write info, image to/from devices. This +document briefly describes how to use Rockusb for upgrading +firmware (e.g. kernel, u-boot, rootfs, etc.). + +Toolsdoc/README.rockusb line 22
Quoted 10 lines
doc/README.rockusb new file +10
-0+-------- +There are many tools can support Rockusb protocol. rkdeveloptool +(https://github.com/rockchip-linux/rkdeveloptool) is open source, +It is maintained by Rockchip. People don't want to build from source +can download from here +(https://github.com/rockchip-linux/rkbin/blob/master/tools/rkdeveloptool) + +Usage +-------- +The Usage of Rockusb command isis:
Quoted 1 line
blank line here
OK
Quoted 4 lines
doc/README.rockusb line 23
Quoted 2 lines
doc/README.rockusb new file +1
-0+rockusb <USB_controller> <devtype> <dev[:part]>blank line
OK
Quoted 4 lines
doc/README.rockusb line 24
Quoted 2 lines
doc/README.rockusb new file +1
-0+e.g. rockusb 0 mmc 0blanke line
OK
Quoted 6 lines
doc/README.rockusb line 27
Quoted 4 lines
doc/README.rockusb new file +3
-0+On your U-Boot console, type this command to enter rockusb mode. +On your host PC. use lsusb command. you should see a usb device +using 0x2207 as its USB verdor id. Then use rkdeveloptoolblank line
OK
Quoted 4 lines
doc/README.rockusb line 28
Quoted 2 lines
doc/README.rockusb new file +1
-0+sudo rkdeveloptool wl <BeginSec> <File>What are the parameters for? What do they mean?
I will add it in next version
Quoted 2 lines
blank line
OK
Quoted 10 lines
doc/README.rockusb line 29
Quoted 2 lines
doc/README.rockusb new file +1
-0+to flash U-Boot image use commandblank line
doc/README.rockusb line 30
Quoted 1 line
doc/README.rockusb new file +1
-0+sudo rkdeveloptool wl 64 <U-Boot binary>blank line
Which U-Boot file? Please be specific
I will add it in next version
Quoted 14 lines
Quoted 11 lines
doc/README.rockusb new file +7
-1+There are plenty of Rockusb command. but wl(write lba) and +rd(reboot) command. These two command can let people flash +image to device. + +To do +----- +* Fully support Rockusb protocol --1.9.1
Regards,
Simon
PATCH v3 4/4 rockchip: usb: enable rockusb on rk3288 based board
In reply to Eddie Caiall rk3288 based boards support rockusb, so enable it
Changes in v3:
-move to defconfig
--- configs/evb-rk3288_defconfig | 3 +++ configs/fennec-rk3288_defconfig | 2 ++ configs/firefly-rk3288_defconfig | 2 ++ configs/miqi-rk3288_defconfig | 2 ++ configs/popmetal-rk3288_defconfig | 2 ++ configs/rock2_defconfig | 3 +++ configs/sandbox_defconfig | 3 ++- configs/tinker-rk3288_defconfig | 2 ++ 8 files changed, 18 insertions(+), 1 deletion(-)
configs/evb-rk3288_defconfig +3 -0
@@ -17,6 +17,9 @@ CONFIG_CMD_MMC=y CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y +CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/fennec-rk3288_defconfig +2 -0
@@ -18,6 +18,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/firefly-rk3288_defconfig +2 -0
@@ -17,6 +17,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/miqi-rk3288_defconfig +2 -0
@@ -17,6 +17,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/popmetal-rk3288_defconfig +2 -0
@@ -18,6 +18,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/rock2_defconfig +3 -0
@@ -16,6 +16,9 @@ CONFIG_CMD_MMC=y CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y +CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
configs/sandbox_defconfig +2 -1
@@ -33,7 +33,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y -CONFIG_CMD_REMOTEPROC=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y CONFIG_CMD_TFTPPUT=y CONFIG_CMD_TFTPSRV=y
configs/tinker-rk3288_defconfig +2 -0
@@ -18,6 +18,8 @@ CONFIG_CMD_SF=y CONFIG_CMD_SPI=y CONFIG_CMD_I2C=y CONFIG_CMD_USB=y +CONFIG_CMD_ROCKUSB=y +CONFIG_USB_FUNCTION_ROCKUSB=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_CACHE=y
Signature · 1 line
1.9.1
PATCH v3 4/4 rockchip: usb: enable rockusb on rk3288 based board
Quoted 6 lines · Eddie Cai
all rk3288 based boards support rockusb, so enable it
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
-move to defconfig
Quoted 10 lines
--- configs/evb-rk3288_defconfig | 3 +++ configs/fennec-rk3288_defconfig | 2 ++ configs/firefly-rk3288_defconfig | 2 ++ configs/miqi-rk3288_defconfig | 2 ++ configs/popmetal-rk3288_defconfig | 2 ++ configs/rock2_defconfig | 3 +++ configs/sandbox_defconfig | 3 ++- configs/tinker-rk3288_defconfig | 2 ++ 8 files changed, 18 insertions(+), 1 deletion(-)
I wonder if you could make it default to y in Kconfig?
PATCH v3 4/4 rockchip: usb: enable rockusb on rk3288 based board
2017-04-30 11:49 GMT+08:00 Simon Glass <[email protected]>:
Quoted 18 lines · Eddie Cai
Quoted 6 lines
all rk3288 based boards support rockusb, so enable it
Signed-off-by Eddie Cai <[email protected]>Changes in v3:
-move to defconfigQuoted 10 lines
--- configs/evb-rk3288_defconfig | 3 +++ configs/fennec-rk3288_defconfig | 2 ++ configs/firefly-rk3288_defconfig | 2 ++ configs/miqi-rk3288_defconfig | 2 ++ configs/popmetal-rk3288_defconfig | 2 ++ configs/rock2_defconfig | 3 +++ configs/sandbox_defconfig | 3 ++- configs/tinker-rk3288_defconfig | 2 ++ 8 files changed, 18 insertions(+), 1 deletion(-)
Quoted 1 line
Reviewed-by Simon Glass <[email protected]>
Thanks SImon
Quoted 2 lines
I wonder if you could make it default to y in
Kconfig?
Good idea. i will add it in next version
v3 cover introduce Rockchip rockusb
In reply to Eddie CaiQuoted 34 lines · On Sat, 29 Apr 2017 08:41:34 +0800 Eddie Cai <[email protected]> wrote:
rockusb is a protocol run between host pc and device. it help people get device info, flash image to device. this patch implement rockusb on device side
Changes in v3:
(quoted diff) +0
-3-switch back to use g_dnl code -address comment from Lukasz and Simon -fix checkpatch errorChanges in v2:
(quoted diff) +0
-2-switch to use usb masstorage framework -add readme for rockusbEddie Cai (4):
usb: rockchip: add the rockusb gadget
usb: rockchip: add rockusb command rockchip:usb: add a simple readme for rockusb
rockchip: usb: enable rockusb on rk3288 based boardarch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ cmd/Kconfig | 11 + cmd/Makefile | 1 + cmd/rockusb.c | 74 +++ configs/evb-rk3288_defconfig | 3 + configs/fennec-rk3288_defconfig | 2 + configs/firefly-rk3288_defconfig | 2 + configs/miqi-rk3288_defconfig | 2 + configs/popmetal-rk3288_defconfig | 2 + configs/rock2_defconfig | 3 + configs/sandbox_defconfig | 3 +- configs/tinker-rk3288_defconfig | 2 + doc/README.rockusb | 37 ++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724
Quoted 6 lines
+++++++++++++++++++++++++ 15 files changed, 970 insertions(+), 1 deletion(-) create mode 100644
arch/arm/include/asm/arch-rockchip/f_rockusb.hcreate mode 100644cmd/rockusb.ccreate mode 100644 doc/README.rockusbcreate mode 100644 drivers/usb/gadget/f_rockusb.c
I've built test your patches for "rockchip" and following errors emerged:
https://travis-ci.org/lmajewski/u-boot-dfu/jobs/227226144
Please fix those issues.
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: wd at denx.de
v3 cover introduce Rockchip rockusb
Hi Lukasz
2017-04-30 5:46 GMT+08:00 Lukasz Majewski <[email protected]>:
Quoted 47 lines
Quoted 34 lines · On Sat, 29 Apr 2017 08:41:34 +0800 Eddie Cai <[email protected]> wrote:
rockusb is a protocol run between host pc and device. it help people get device info, flash image to device. this patch implement rockusb on device side
Changes in v3:
(quoted diff) +0
-3-switch back to use g_dnl code -address comment from Lukasz and Simon -fix checkpatch errorChanges in v2:
(quoted diff) +0
-2-switch to use usb masstorage framework -add readme for rockusbEddie Cai (4):
usb: rockchip: add the rockusb gadget
usb: rockchip: add rockusb command rockchip:usb: add a simple readme for rockusb
rockchip: usb: enable rockusb on rk3288 based boardarch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ cmd/Kconfig | 11 + cmd/Makefile | 1 + cmd/rockusb.c | 74 +++ configs/evb-rk3288_defconfig | 3 + configs/fennec-rk3288_defconfig | 2 + configs/firefly-rk3288_defconfig | 2 + configs/miqi-rk3288_defconfig | 2 + configs/popmetal-rk3288_defconfig | 2 + configs/rock2_defconfig | 3 + configs/sandbox_defconfig | 3 +- configs/tinker-rk3288_defconfig | 2 + doc/README.rockusb | 37 ++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724Quoted 6 lines
+++++++++++++++++++++++++ 15 files changed, 970 insertions(+), 1 deletion(-) create mode 100644
arch/arm/include/asm/arch-rockchip/f_rockusb.hcreate mode 100644cmd/rockusb.ccreate mode 100644 doc/README.rockusbcreate mode 100644 drivers/usb/gadget/f_rockusb.cI've built test your patches for "rockchip" and following errors emerged:
Quoted 3 lines
https://travis-ci.org/lmajewski/u-boot-dfu/jobs/227226144
Please fix those issues.
I don't understand how you got those error. Here is my test branch git clone https://github.com/eddiecailinux/u-boot -b rockusb-v3 i use below command to build u-boot CROSS_COMPILE=arm-linux-gnueabihf- make firefly-rk3288_defconfig all
Quoted 11 lines
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: wd at denx.de
v3 cover introduce Rockchip rockusb
Hi Eddie,
Quoted 51 lines
Hi Lukasz
2017-04-30 5:46 GMT+08:00 Lukasz Majewski <[email protected]>:
Quoted 48 lines
Quoted 34 lines · On Sat, 29 Apr 2017 08:41:34 +0800 Eddie Cai <[email protected]> wrote:
rockusb is a protocol run between host pc and device. it help people get device info, flash image to device. this patch implement rockusb on device side
Changes in v3:
(quoted diff) +0
-3-switch back to use g_dnl code -address comment from Lukasz and Simon -fix checkpatch errorChanges in v2:
(quoted diff) +0
-2-switch to use usb masstorage framework -add readme for rockusbEddie Cai (4):
usb: rockchip: add the rockusb gadget
usb: rockchip: add rockusb command rockchip:usb: add a simple readme for rockusb
rockchip: usb: enable rockusb on rk3288 based boardarch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ cmd/Kconfig | 11 + cmd/Makefile | 1 + cmd/rockusb.c | 74 +++ configs/evb-rk3288_defconfig | 3 + configs/fennec-rk3288_defconfig | 2 + configs/firefly-rk3288_defconfig | 2 + configs/miqi-rk3288_defconfig | 2 + configs/popmetal-rk3288_defconfig | 2 + configs/rock2_defconfig | 3 + configs/sandbox_defconfig | 3 +- configs/tinker-rk3288_defconfig | 2 + doc/README.rockusb | 37 ++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724Quoted 6 lines
+++++++++++++++++++++++++ 15 files changed, 970 insertions(+), 1 deletion(-) create mode 100644
arch/arm/include/asm/arch-rockchip/f_rockusb.hcreate mode 100644cmd/rockusb.ccreate mode 100644 doc/README.rockusbcreate mode 100644 drivers/usb/gadget/f_rockusb.cI've built test your patches for "rockchip" and following errors emerged:
^^^^^^^^^^^^^^^^^^^^ [1]
Quoted 3 lines
Quoted 2 lines
Please fix those issues.
I don't understand how you got those error.
In the last commit you have enabled the "rockchip" protocol support for other RK boards.
Have you checked if it is possible to build those boards after your change?
To avoid build break regressions we do use "buildman".
For this test I've build all "rockchip" devices (as marked in boards.cfg file).
After applying your patches I've found following errors -> [1]
The buildman configuration can be read from log posted in [1].
Quoted 4 lines
Here is my test branch
git clone https://github.com/eddiecailinux/u-boot -b rockusb-v3 i use below command to build u-boot CROSS_COMPILE=arm-linux-gnueabihf- make firefly-rk3288_defconfig all
But this is only for one single board -> firefly-rk3288. You also should check if other boards are not affected by your code.
Quoted 5 lines
Quoted 5 lines
Best regards,
Quoted 8 lines
Quoted 8 lines
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:
wd at denx.de
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: wd at denx.de
v3 cover introduce Rockchip rockusb
HI Lukasz
2017-05-02 18:47 GMT+08:00 Lukasz Majewski <[email protected]>:
Quoted 75 lines
Hi Eddie,
Quoted 51 lines
Hi Lukasz
2017-04-30 5:46 GMT+08:00 Lukasz Majewski <[email protected]>:
Quoted 48 lines
Quoted 34 lines · On Sat, 29 Apr 2017 08:41:34 +0800 Eddie Cai <[email protected]> wrote:
rockusb is a protocol run between host pc and device. it help people get device info, flash image to device. this patch implement rockusb on device side
Changes in v3:
(quoted diff) +0
-3-switch back to use g_dnl code -address comment from Lukasz and Simon -fix checkpatch errorChanges in v2:
(quoted diff) +0
-2-switch to use usb masstorage framework -add readme for rockusbEddie Cai (4):
usb: rockchip: add the rockusb gadget
usb: rockchip: add rockusb command rockchip:usb: add a simple readme for rockusb
rockchip: usb: enable rockusb on rk3288 based boardarch/arm/include/asm/arch-rockchip/f_rockusb.h | 104 ++++ cmd/Kconfig | 11 + cmd/Makefile | 1 + cmd/rockusb.c | 74 +++ configs/evb-rk3288_defconfig | 3 + configs/fennec-rk3288_defconfig | 2 + configs/firefly-rk3288_defconfig | 2 + configs/miqi-rk3288_defconfig | 2 + configs/popmetal-rk3288_defconfig | 2 + configs/rock2_defconfig | 3 + configs/sandbox_defconfig | 3 +- configs/tinker-rk3288_defconfig | 2 + doc/README.rockusb | 37 ++ drivers/usb/gadget/Makefile | 1 + drivers/usb/gadget/f_rockusb.c | 724Quoted 6 lines
+++++++++++++++++++++++++ 15 files changed, 970 insertions(+), 1 deletion(-) create mode 100644
arch/arm/include/asm/arch-rockchip/f_rockusb.hcreate mode 100644cmd/rockusb.ccreate mode 100644 doc/README.rockusbcreate mode 100644 drivers/usb/gadget/f_rockusb.cI've built test your patches for "rockchip" and following errors emerged:
^^^^^^^^^^^^^^^^^^^^ [1]Quoted 3 lines
Quoted 2 lines
Please fix those issues.
I don't understand how you got those error.
In the last commit you have enabled the "rockchip" protocol support for other RK boards.
Have you checked if it is possible to build those boards after your change?
To avoid build break regressions we do use "buildman".
For this test I've build all "rockchip" devices (as marked in boards.cfg file).
After applying your patches I've found following errors -> [1]
The buildman configuration can be read from log posted in [1].
Quoted 7 lines
Quoted 4 lines
Here is my test branch
git clone https://github.com/eddiecailinux/u-boot -b rockusb-v3 i use below command to build u-boot CROSS_COMPILE=arm-linux-gnueabihf- make firefly-rk3288_defconfig allBut this is only for one single board -> firefly-rk3288. You also should check if other boards are not affected by your code.
got it. thanks for reminding.
Quoted 25 lines
Quoted 6 lines
Quoted 6 lines
Best regards,
Quoted 8 lines
Quoted 8 lines
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:
wd at denx.deBest 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: wd at denx.de