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:
@@ -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();
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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_ */
|
||||||
|
Reference in New Issue
Block a user