thordown: Use plain udevice for UDC controller interaction

Convert to plain udevice interaction with UDC controller
device, avoid the use of UDC uclass dev_array .

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
This commit is contained in:
Marek Vasut
2023-09-01 11:49:59 +02:00
parent 6b84acc978
commit 5b8c9d1b58
3 changed files with 45 additions and 42 deletions

View File

@@ -17,6 +17,7 @@ int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{ {
char *interface, *devstring; char *interface, *devstring;
int controller_index; int controller_index;
struct udevice *udc;
int ret; int ret;
if (argc < 4) if (argc < 4)
@@ -32,7 +33,7 @@ int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
goto done; goto done;
controller_index = simple_strtoul(argv[1], NULL, 0); controller_index = simple_strtoul(argv[1], NULL, 0);
ret = usb_gadget_initialize(controller_index); ret = udc_device_get_by_index(controller_index, &udc);
if (ret) { if (ret) {
pr_err("USB init failed: %d\n", ret); pr_err("USB init failed: %d\n", ret);
ret = CMD_RET_FAILURE; ret = CMD_RET_FAILURE;
@@ -46,7 +47,7 @@ int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
goto exit; goto exit;
} }
ret = thor_init(); ret = thor_init(udc);
if (ret) { if (ret) {
pr_err("THOR DOWNLOAD failed: %d\n", ret); pr_err("THOR DOWNLOAD failed: %d\n", ret);
ret = CMD_RET_FAILURE; ret = CMD_RET_FAILURE;
@@ -54,7 +55,7 @@ int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
} }
do { do {
ret = thor_handle(); ret = thor_handle(udc);
if (ret == THOR_DFU_REINIT_NEEDED) { if (ret == THOR_DFU_REINIT_NEEDED) {
dfu_free_entities(); dfu_free_entities();
ret = dfu_init_env_entities(interface, devstring); ret = dfu_init_env_entities(interface, devstring);
@@ -67,7 +68,7 @@ int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
} while (ret == 0); } while (ret == 0);
exit: exit:
g_dnl_unregister(); g_dnl_unregister();
usb_gadget_release(controller_index); udc_device_put(udc);
done: done:
dfu_free_entities(); dfu_free_entities();

View File

@@ -15,9 +15,10 @@
*/ */
#include <command.h> #include <command.h>
#include <errno.h>
#include <common.h> #include <common.h>
#include <console.h> #include <console.h>
#include <dm.h>
#include <errno.h>
#include <init.h> #include <init.h>
#include <log.h> #include <log.h>
#include <malloc.h> #include <malloc.h>
@@ -34,9 +35,9 @@
#include "f_thor.h" #include "f_thor.h"
static void thor_tx_data(unsigned char *data, int len); static void thor_tx_data(struct udevice *udc, unsigned char *data, int len);
static void thor_set_dma(void *addr, int len); static void thor_set_dma(void *addr, int len);
static int thor_rx_data(void); static int thor_rx_data(struct udevice *udc);
static struct f_thor *thor_func; static struct f_thor *thor_func;
static inline struct f_thor *func_to_thor(struct usb_function *f) static inline struct f_thor *func_to_thor(struct usb_function *f)
@@ -56,15 +57,15 @@ DEFINE_CACHE_ALIGN_BUFFER(char, f_name, F_NAME_BUF_SIZE + 1);
static unsigned long long int thor_file_size; static unsigned long long int thor_file_size;
static int alt_setting_num; static int alt_setting_num;
static void send_rsp(const struct rsp_box *rsp) static void send_rsp(struct udevice *udc, const struct rsp_box *rsp)
{ {
memcpy(thor_tx_data_buf, rsp, sizeof(struct rsp_box)); memcpy(thor_tx_data_buf, rsp, sizeof(struct rsp_box));
thor_tx_data(thor_tx_data_buf, sizeof(struct rsp_box)); thor_tx_data(udc, thor_tx_data_buf, sizeof(struct rsp_box));
debug("-RSP: %d, %d\n", rsp->rsp, rsp->rsp_data); debug("-RSP: %d, %d\n", rsp->rsp, rsp->rsp_data);
} }
static void send_data_rsp(s32 ack, s32 count) static void send_data_rsp(struct udevice *udc, s32 ack, s32 count)
{ {
ALLOC_CACHE_ALIGN_BUFFER(struct data_rsp_box, rsp, ALLOC_CACHE_ALIGN_BUFFER(struct data_rsp_box, rsp,
sizeof(struct data_rsp_box)); sizeof(struct data_rsp_box));
@@ -73,12 +74,12 @@ static void send_data_rsp(s32 ack, s32 count)
rsp->count = count; rsp->count = count;
memcpy(thor_tx_data_buf, rsp, sizeof(struct data_rsp_box)); memcpy(thor_tx_data_buf, rsp, sizeof(struct data_rsp_box));
thor_tx_data(thor_tx_data_buf, sizeof(struct data_rsp_box)); thor_tx_data(udc, thor_tx_data_buf, sizeof(struct data_rsp_box));
debug("-DATA RSP: %d, %d\n", ack, count); debug("-DATA RSP: %d, %d\n", ack, count);
} }
static int process_rqt_info(const struct rqt_box *rqt) static int process_rqt_info(struct udevice *udc, const struct rqt_box *rqt)
{ {
ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box)); ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box));
memset(rsp, 0, sizeof(struct rsp_box)); memset(rsp, 0, sizeof(struct rsp_box));
@@ -111,11 +112,11 @@ static int process_rqt_info(const struct rqt_box *rqt)
return -EINVAL; return -EINVAL;
} }
send_rsp(rsp); send_rsp(udc, rsp);
return true; return true;
} }
static int process_rqt_cmd(const struct rqt_box *rqt) static int process_rqt_cmd(struct udevice *udc, const struct rqt_box *rqt)
{ {
ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box)); ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box));
memset(rsp, 0, sizeof(struct rsp_box)); memset(rsp, 0, sizeof(struct rsp_box));
@@ -126,7 +127,7 @@ static int process_rqt_cmd(const struct rqt_box *rqt)
switch (rqt->rqt_data) { switch (rqt->rqt_data) {
case RQT_CMD_REBOOT: case RQT_CMD_REBOOT:
debug("TARGET RESET\n"); debug("TARGET RESET\n");
send_rsp(rsp); send_rsp(udc, rsp);
g_dnl_unregister(); g_dnl_unregister();
dfu_free_entities(); dfu_free_entities();
#ifdef CONFIG_THOR_RESET_OFF #ifdef CONFIG_THOR_RESET_OFF
@@ -136,7 +137,7 @@ static int process_rqt_cmd(const struct rqt_box *rqt)
break; break;
case RQT_CMD_POWEROFF: case RQT_CMD_POWEROFF:
case RQT_CMD_EFSCLEAR: case RQT_CMD_EFSCLEAR:
send_rsp(rsp); send_rsp(udc, rsp);
default: default:
printf("Command not supported -> cmd: %d\n", rqt->rqt_data); printf("Command not supported -> cmd: %d\n", rqt->rqt_data);
return -EINVAL; return -EINVAL;
@@ -145,7 +146,8 @@ static int process_rqt_cmd(const struct rqt_box *rqt)
return true; return true;
} }
static long long int download_head(unsigned long long total, static long long int download_head(struct udevice *udc,
unsigned long long total,
unsigned int packet_size, unsigned int packet_size,
long long int *left, long long int *left,
int *cnt) int *cnt)
@@ -166,7 +168,7 @@ static long long int download_head(unsigned long long total,
while (total - rcv_cnt >= packet_size) { while (total - rcv_cnt >= packet_size) {
thor_set_dma(buf, packet_size); thor_set_dma(buf, packet_size);
buf += packet_size; buf += packet_size;
ret_rcv = thor_rx_data(); ret_rcv = thor_rx_data(udc);
if (ret_rcv < 0) if (ret_rcv < 0)
return ret_rcv; return ret_rcv;
rcv_cnt += ret_rcv; rcv_cnt += ret_rcv;
@@ -184,7 +186,7 @@ static long long int download_head(unsigned long long total,
} }
buf = transfer_buffer; buf = transfer_buffer;
} }
send_data_rsp(0, ++usb_pkt_cnt); send_data_rsp(udc, 0, ++usb_pkt_cnt);
} }
/* Calculate the amount of data to arrive from PC (in bytes) */ /* Calculate the amount of data to arrive from PC (in bytes) */
@@ -200,11 +202,11 @@ static long long int download_head(unsigned long long total,
if (left_to_rcv) { if (left_to_rcv) {
thor_set_dma(buf, packet_size); thor_set_dma(buf, packet_size);
ret_rcv = thor_rx_data(); ret_rcv = thor_rx_data(udc);
if (ret_rcv < 0) if (ret_rcv < 0)
return ret_rcv; return ret_rcv;
rcv_cnt += ret_rcv; rcv_cnt += ret_rcv;
send_data_rsp(0, ++usb_pkt_cnt); send_data_rsp(udc, 0, ++usb_pkt_cnt);
} }
debug("%s: %llu total: %llu cnt: %d\n", __func__, rcv_cnt, total, *cnt); debug("%s: %llu total: %llu cnt: %d\n", __func__, rcv_cnt, total, *cnt);
@@ -254,7 +256,7 @@ static int download_tail(long long int left, int cnt)
return ret; return ret;
} }
static long long int process_rqt_download(const struct rqt_box *rqt) static long long int process_rqt_download(struct udevice *udc, const struct rqt_box *rqt)
{ {
ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box)); ALLOC_CACHE_ALIGN_BUFFER(struct rsp_box, rsp, sizeof(struct rsp_box));
static long long int left, ret_head; static long long int left, ret_head;
@@ -301,8 +303,8 @@ static long long int process_rqt_download(const struct rqt_box *rqt)
} }
break; break;
case RQT_DL_FILE_START: case RQT_DL_FILE_START:
send_rsp(rsp); send_rsp(udc, rsp);
ret_head = download_head(thor_file_size, THOR_PACKET_SIZE, ret_head = download_head(udc, thor_file_size, THOR_PACKET_SIZE,
&left, &cnt); &left, &cnt);
if (ret_head < 0) { if (ret_head < 0) {
left = 0; left = 0;
@@ -324,11 +326,11 @@ static long long int process_rqt_download(const struct rqt_box *rqt)
ret = -ENOTSUPP; ret = -ENOTSUPP;
} }
send_rsp(rsp); send_rsp(udc, rsp);
return ret; return ret;
} }
static int process_data(void) static int process_data(struct udevice *udc)
{ {
ALLOC_CACHE_ALIGN_BUFFER(struct rqt_box, rqt, sizeof(struct rqt_box)); ALLOC_CACHE_ALIGN_BUFFER(struct rqt_box, rqt, sizeof(struct rqt_box));
int ret = -EINVAL; int ret = -EINVAL;
@@ -339,13 +341,13 @@ static int process_data(void)
switch (rqt->rqt) { switch (rqt->rqt) {
case RQT_INFO: case RQT_INFO:
ret = process_rqt_info(rqt); ret = process_rqt_info(udc, rqt);
break; break;
case RQT_CMD: case RQT_CMD:
ret = process_rqt_cmd(rqt); ret = process_rqt_cmd(udc, rqt);
break; break;
case RQT_DL: case RQT_DL:
ret = (int) process_rqt_download(rqt); ret = (int) process_rqt_download(udc, rqt);
break; break;
case RQT_UL: case RQT_UL:
puts("RQT: UPLOAD not supported!\n"); puts("RQT: UPLOAD not supported!\n");
@@ -536,7 +538,7 @@ static struct usb_request *alloc_ep_req(struct usb_ep *ep, unsigned length)
return req; return req;
} }
static int thor_rx_data(void) static int thor_rx_data(struct udevice *udc)
{ {
struct thor_dev *dev = thor_func->dev; struct thor_dev *dev = thor_func->dev;
int data_to_rx, tmp, status; int data_to_rx, tmp, status;
@@ -557,7 +559,7 @@ static int thor_rx_data(void)
} }
while (!dev->rxdata) { while (!dev->rxdata) {
usb_gadget_handle_interrupts(0); dm_usb_gadget_handle_interrupts(udc);
if (ctrlc()) if (ctrlc())
return -1; return -1;
} }
@@ -568,7 +570,7 @@ static int thor_rx_data(void)
return tmp; return tmp;
} }
static void thor_tx_data(unsigned char *data, int len) static void thor_tx_data(struct udevice *udc, unsigned char *data, int len)
{ {
struct thor_dev *dev = thor_func->dev; struct thor_dev *dev = thor_func->dev;
unsigned char *ptr = dev->in_req->buf; unsigned char *ptr = dev->in_req->buf;
@@ -591,7 +593,7 @@ static void thor_tx_data(unsigned char *data, int len)
/* Wait until tx interrupt received */ /* Wait until tx interrupt received */
while (!dev->txdata) while (!dev->txdata)
usb_gadget_handle_interrupts(0); dm_usb_gadget_handle_interrupts(udc);
dev->txdata = 0; dev->txdata = 0;
} }
@@ -685,18 +687,18 @@ static void thor_set_dma(void *addr, int len)
dev->out_req->length = len; dev->out_req->length = len;
} }
int thor_init(void) int thor_init(struct udevice *udc)
{ {
struct thor_dev *dev = thor_func->dev; struct thor_dev *dev = thor_func->dev;
/* Wait for a device enumeration and configuration settings */ /* Wait for a device enumeration and configuration settings */
debug("THOR enumeration/configuration setting....\n"); debug("THOR enumeration/configuration setting....\n");
while (!dev->configuration_done) while (!dev->configuration_done)
usb_gadget_handle_interrupts(0); dm_usb_gadget_handle_interrupts(udc);
thor_set_dma(thor_rx_data_buf, strlen("THOR")); thor_set_dma(thor_rx_data_buf, strlen("THOR"));
/* detect the download request from Host PC */ /* detect the download request from Host PC */
if (thor_rx_data() < 0) { if (thor_rx_data(udc) < 0) {
printf("%s: Data not received!\n", __func__); printf("%s: Data not received!\n", __func__);
return -1; return -1;
} }
@@ -706,7 +708,7 @@ int thor_init(void)
udelay(30 * 1000); /* 30 ms */ udelay(30 * 1000); /* 30 ms */
strcpy((char *)thor_tx_data_buf, "ROHT"); strcpy((char *)thor_tx_data_buf, "ROHT");
thor_tx_data(thor_tx_data_buf, strlen("ROHT")); thor_tx_data(udc, thor_tx_data_buf, strlen("ROHT"));
} else { } else {
puts("Wrong reply information\n"); puts("Wrong reply information\n");
return -1; return -1;
@@ -715,17 +717,17 @@ int thor_init(void)
return 0; return 0;
} }
int thor_handle(void) int thor_handle(struct udevice *udc)
{ {
int ret; int ret;
/* receive the data from Host PC */ /* receive the data from Host PC */
while (1) { while (1) {
thor_set_dma(thor_rx_data_buf, sizeof(struct rqt_box)); thor_set_dma(thor_rx_data_buf, sizeof(struct rqt_box));
ret = thor_rx_data(); ret = thor_rx_data(udc);
if (ret > 0) { if (ret > 0) {
ret = process_data(); ret = process_data(udc);
#ifdef CONFIG_THOR_RESET_OFF #ifdef CONFIG_THOR_RESET_OFF
if (ret == RESET_DONE) if (ret == RESET_DONE)
break; break;

View File

@@ -14,7 +14,7 @@
#define THOR_DFU_REINIT_NEEDED 0xFFFFFFFE #define THOR_DFU_REINIT_NEEDED 0xFFFFFFFE
int thor_handle(void); int thor_handle(struct udevice *udc);
int thor_init(void); int thor_init(struct udevice *udc);
int thor_add(struct usb_configuration *c); int thor_add(struct usb_configuration *c);
#endif /* __THOR_H_ */ #endif /* __THOR_H_ */