More update of USB API

This commit is contained in:
NIIBE Yutaka
2016-06-09 09:53:15 +09:00
parent d061e6f931
commit 4d7e97028e
7 changed files with 117 additions and 108 deletions

View File

@@ -1,3 +1,13 @@
2016-06-09 NIIBE Yutaka <gniibe@fsij.org>
* mcu/usb-stm32f103.c (usb_lld_ctrl_recv): Rename.
(usb_lld_ctrl_send): Rename.
(usb_lld_ctrl_ack): Rename and let have return value.
* mcu/usb-mkl27z.c: Likewise.
* example-cdc/usb-cdc.c: Follow the change of API.
* example-fs-bb48/usb-cdc.c: Likewise.
2016-06-08 NIIBE Yutaka <gniibe@fsij.org>
* mcu/usb-stm32f103.c: Rewrite to be event driven API.

6
NEWS
View File

@@ -6,8 +6,10 @@ NEWS - Noteworthy changes
Released 2016-06-xx
** New USB API
Since USB driver is included, it should be good one. It used to be
interrupt based API with callbacks. Now, it's event driven API.
Now, USB driver is included in Chopstx. So, it should be good one.
It used to be the code which was derived from interrupt driven API
with callbacks. It's changed to event driven API, so that a user can
do as wish, beyond the restriction of callbacks.
* Major changes in Chopstx 0.12

View File

@@ -293,7 +293,7 @@ vcom_port_data_setup (struct usb_dev *dev)
struct tty *t = tty_get (arg->index, 0);
if (arg->request == USB_CDC_REQ_GET_LINE_CODING)
return usb_lld_reply_request (dev, &t->line_coding,
return usb_lld_ctrl_send (dev, &t->line_coding,
sizeof (struct line_coding));
}
else /* USB_SETUP_SET (req) */
@@ -303,11 +303,11 @@ vcom_port_data_setup (struct usb_dev *dev)
{
struct tty *t = tty_get (arg->index, 0);
return usb_lld_set_data_to_recv (dev, &t->line_coding,
return usb_lld_ctrl_recv (dev, &t->line_coding,
sizeof (struct line_coding));
}
else if (arg->request == USB_CDC_REQ_SET_CONTROL_LINE_STATE)
return 0;
return usb_lld_ctrl_ack (dev);
}
return -1;
@@ -337,10 +337,10 @@ usb_get_descriptor (struct usb_dev *dev)
return -1;
if (desc_type == DEVICE_DESCRIPTOR)
return usb_lld_reply_request (dev,
return usb_lld_ctrl_send (dev,
vcom_device_desc, sizeof (vcom_device_desc));
else if (desc_type == CONFIG_DESCRIPTOR)
return usb_lld_reply_request (dev,
return usb_lld_ctrl_send (dev,
vcom_config_desc, sizeof (vcom_config_desc));
else if (desc_type == STRING_DESCRIPTOR)
{
@@ -369,7 +369,7 @@ usb_get_descriptor (struct usb_dev *dev)
return -1;
}
return usb_lld_reply_request (dev, str, size);
return usb_lld_ctrl_send (dev, str, size);
}
return -1;
@@ -435,6 +435,7 @@ usb_set_configuration (struct usb_dev *dev)
chopstx_mutex_unlock (&tty0.mtx);
}
usb_lld_ctrl_ack (dev);
return 0;
}
@@ -453,6 +454,7 @@ usb_set_interface (struct usb_dev *dev)
else
{
vcom_setup_endpoints_for_interface (interface, 0);
usb_lld_ctrl_ack (dev);
return 0;
}
}
@@ -467,7 +469,7 @@ usb_get_interface (struct usb_dev *dev)
return -1;
/* We don't have alternate interface, so, always return 0. */
return usb_lld_reply_request (dev, &zero, 1);
return usb_lld_ctrl_send (dev, &zero, 1);
}
static int
@@ -479,7 +481,7 @@ usb_get_status_interface (struct usb_dev *dev)
if (interface >= NUM_INTERFACES)
return -1;
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
@@ -733,49 +735,38 @@ tty_main (void *arg)
usb_device_reset (&dev);
continue;
case USB_EVENT_GET_DESCRIPTOR:
if (usb_get_descriptor (&dev) < 0)
usb_lld_ctrl_error (&dev);
continue;
case USB_EVENT_DEVICE_ADDRESSED:
/* The addres is assigned to the device. We don't
* need to do anything for this actually, but in this
* application, we maintain the USB status of the
* device. Usually, just "continue" as EVENT_NONE is
* OK.
*/
case USB_EVENT_DEVICE_ADDRESSED:
chopstx_mutex_lock (&tty0.mtx);
tty0.device_state = ADDRESSED;
chopstx_cond_signal (&tty0.cnd);
chopstx_mutex_unlock (&tty0.mtx);
continue;
case USB_EVENT_GET_DESCRIPTOR:
if (usb_get_descriptor (&dev) < 0)
usb_lld_ctrl_error (&dev);
continue;
case USB_EVENT_SET_CONFIGURATION:
if (usb_set_configuration (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
case USB_EVENT_SET_INTERFACE:
if (usb_set_interface (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
/* Non standard device request. */
case USB_EVENT_CTRL_REQUEST:
/* Device specific device request. */
if (usb_setup (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
/* Control WRITE transfer finished. */
case USB_EVENT_CTRL_WRITE_FINISH:
usb_ctrl_write_finish (&dev);
continue;
case USB_EVENT_GET_STATUS_INTERFACE:
@@ -788,11 +779,19 @@ tty_main (void *arg)
usb_lld_ctrl_error (&dev);
continue;
case USB_EVENT_NONE:
case USB_EVENT_SET_FEATURE_DEVICE:
case USB_EVENT_SET_FEATURE_ENDPOINT:
case USB_EVENT_CLEAR_FEATURE_DEVICE:
case USB_EVENT_CLEAR_FEATURE_ENDPOINT:
usb_lld_ctrl_ack (&dev);
continue;
case USB_EVENT_CTRL_WRITE_FINISH:
/* Control WRITE transfer finished. */
usb_ctrl_write_finish (&dev);
continue;
case USB_EVENT_NONE:
case USB_EVENT_DEVICE_SUSPEND:
default:
continue;

View File

@@ -274,7 +274,6 @@ usb_ctrl_write_finish (struct usb_dev *dev)
}
static int
vcom_port_data_setup (struct usb_dev *dev)
{
@@ -285,7 +284,7 @@ vcom_port_data_setup (struct usb_dev *dev)
struct tty *t = tty_get (arg->index, 0);
if (arg->request == USB_CDC_REQ_GET_LINE_CODING)
return usb_lld_reply_request (dev, &t->line_coding,
return usb_lld_ctrl_send (dev, &t->line_coding,
sizeof (struct line_coding));
}
else /* USB_SETUP_SET (req) */
@@ -295,11 +294,11 @@ vcom_port_data_setup (struct usb_dev *dev)
{
struct tty *t = tty_get (arg->index, 0);
return usb_lld_set_data_to_recv (dev, &t->line_coding,
return usb_lld_ctrl_recv (dev, &t->line_coding,
sizeof (struct line_coding));
}
else if (arg->request == USB_CDC_REQ_SET_CONTROL_LINE_STATE)
return 0;
return usb_lld_ctrl_ack (dev);
}
return -1;
@@ -329,10 +328,10 @@ usb_get_descriptor (struct usb_dev *dev)
return -1;
if (desc_type == DEVICE_DESCRIPTOR)
return usb_lld_reply_request (dev,
return usb_lld_ctrl_send (dev,
vcom_device_desc, sizeof (vcom_device_desc));
else if (desc_type == CONFIG_DESCRIPTOR)
return usb_lld_reply_request (dev,
return usb_lld_ctrl_send (dev,
vcom_config_desc, sizeof (vcom_config_desc));
else if (desc_type == STRING_DESCRIPTOR)
{
@@ -361,7 +360,7 @@ usb_get_descriptor (struct usb_dev *dev)
return -1;
}
return usb_lld_reply_request (dev, str, size);
return usb_lld_ctrl_send (dev, str, size);
}
return -1;
@@ -428,7 +427,7 @@ usb_set_configuration (struct usb_dev *dev)
chopstx_mutex_unlock (&tty0.mtx);
}
return 0;
return usb_lld_ctrl_ack (dev);
}
@@ -446,7 +445,7 @@ usb_set_interface (struct usb_dev *dev)
else
{
vcom_setup_endpoints_for_interface (dev, interface, 0);
return 0;
return usb_lld_ctrl_ack (dev);
}
}
@@ -460,8 +459,9 @@ usb_get_interface (struct usb_dev *dev)
return -1;
/* We don't have alternate interface, so, always return 0. */
return usb_lld_reply_request (dev, &zero, 1);
return usb_lld_ctrl_send (dev, &zero, 1);
}
static int
usb_get_status_interface (struct usb_dev *dev)
{
@@ -471,7 +471,7 @@ usb_get_status_interface (struct usb_dev *dev)
if (interface >= NUM_INTERFACES)
return -1;
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
@@ -743,23 +743,17 @@ tty_main (void *arg)
case USB_EVENT_SET_CONFIGURATION:
if (usb_set_configuration (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
case USB_EVENT_SET_INTERFACE:
if (usb_set_interface (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
/* Non standard device request. */
case USB_EVENT_CTRL_REQUEST:
if (usb_setup (&dev) < 0)
usb_lld_ctrl_error (&dev);
else
usb_lld_ctrl_good (&dev);
continue;
/* Control WRITE transfer finished. */

View File

@@ -326,15 +326,13 @@ usb_lld_ctrl_error (struct usb_dev *dev)
kl27z_ep_stall (ENDP0);
}
void
usb_lld_ctrl_good (struct usb_dev *dev)
int
usb_lld_ctrl_ack (struct usb_dev *dev)
{
if (dev->dev_req.len == 0)
{
/* Zero length packet for ACK. */
dev->state = WAIT_STATUS_IN;
kl27z_prepare_ep0_in (&dev->dev_req, 0, DATA1);
}
return USB_EVENT_NONE;
}
@@ -394,7 +392,7 @@ usb_lld_event_handler (struct usb_dev *dev)
USB_CTRL1->ISTAT = USB_IS_STALL;
}
return 0;
return USB_EVENT_NONE;
}
@@ -502,7 +500,7 @@ std_get_status (struct usb_dev *dev)
else /* Self-powered */
status_info &= ~1;
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
}
else if (rcp == INTERFACE_RECIPIENT)
@@ -523,7 +521,7 @@ std_get_status (struct usb_dev *dev)
return -1;
status_info = kl27z_ep_is_stall (n);
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
return -1;
@@ -624,7 +622,7 @@ std_set_address (struct usb_dev *dev)
if (rcp == DEVICE_RECIPIENT && arg->len == 0 && arg->value <= 127
&& arg->index == 0 && dev->configuration == 0)
return USB_EVENT_NONE;
return usb_lld_ctrl_ack (dev);
return -1;
}
@@ -652,7 +650,7 @@ std_get_configuration (struct usb_dev *dev)
return -1;
if (rcp == DEVICE_RECIPIENT)
return usb_lld_reply_request (dev, &dev->configuration, 1);
return usb_lld_ctrl_send (dev, &dev->configuration, 1);
return -1;
}
@@ -735,14 +733,10 @@ handle_setup0 (struct usb_dev *dev)
default: handler = std_none; break;
}
if ((r = (*handler) (dev)) <= 0)
if ((r = (*handler) (dev)) < 0)
{
/* Handling finished in standard way. */
if (r == 0)
usb_lld_ctrl_good (dev);
else
usb_lld_ctrl_error (dev);
return 0;
return USB_EVENT_NONE;
}
else
return r;
@@ -835,7 +829,7 @@ handle_transaction (struct usb_dev *dev, uint8_t stat)
{
handle_out0 (dev, stat);
USB_CTRL1->ISTAT = USB_IS_TOKDNE;
return 0;
return USB_EVENT_NONE;
}
}
else
@@ -959,7 +953,7 @@ usb_lld_current_configuration (struct usb_dev *dev)
}
int
usb_lld_set_data_to_recv (struct usb_dev *dev, void *p, size_t len)
usb_lld_ctrl_recv (struct usb_dev *dev, void *p, size_t len)
{
struct ctrl_data *data_p = &dev->ctrl_data;
data_p->addr = (uint8_t *)p;
@@ -969,7 +963,7 @@ usb_lld_set_data_to_recv (struct usb_dev *dev, void *p, size_t len)
kl27z_prepare_ep0_out (p, len, DATA1);
dev->state = OUT_DATA;
return 0;
return USB_EVENT_NONE;
}
/*
@@ -979,7 +973,7 @@ usb_lld_set_data_to_recv (struct usb_dev *dev, void *p, size_t len)
* BUFLEN: size of the data.
*/
int
usb_lld_reply_request (struct usb_dev *dev, const void *buf, size_t buflen)
usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen)
{
struct ctrl_data *data_p = &dev->ctrl_data;
uint32_t len_asked = dev->dev_req.len;
@@ -1012,7 +1006,7 @@ usb_lld_reply_request (struct usb_dev *dev, const void *buf, size_t buflen)
data_p->len -= len;
data_p->addr += len;
return 0;
return USB_EVENT_NONE;
}
void

View File

@@ -353,15 +353,13 @@ usb_lld_ctrl_error (struct usb_dev *dev)
st103_ep_set_rxtx_status (ENDP0, EP_RX_STALL, EP_TX_STALL);
}
void
usb_lld_ctrl_good (struct usb_dev *dev)
int
usb_lld_ctrl_ack (struct usb_dev *dev)
{
if (dev->dev_req.len == 0)
{
dev->state = WAIT_STATUS_IN;
st103_set_tx_count (ENDP0, 0);
st103_ep_set_rxtx_status (ENDP0, EP_RX_NAK, EP_TX_VALID);
}
return USB_EVENT_NONE;
}
void usb_lld_init (struct usb_dev *dev, uint8_t feature)
@@ -418,7 +416,7 @@ usb_lld_event_handler (struct usb_dev *dev)
return usb_handle_transfer (dev, istr_value);
}
return 0;
return USB_EVENT_NONE;
}
static void handle_datastage_out (struct usb_dev *dev)
@@ -522,7 +520,7 @@ static int std_get_status (struct usb_dev *dev)
else /* Self-powered */
status_info &= ~1;
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
}
else if (rcp == INTERFACE_RECIPIENT)
@@ -557,7 +555,7 @@ static int std_get_status (struct usb_dev *dev)
status_info |= 1; /* OUT Endpoint stalled */
}
return usb_lld_reply_request (dev, &status_info, 2);
return usb_lld_ctrl_send (dev, &status_info, 2);
}
return -1;
@@ -673,7 +671,7 @@ static int std_set_address (struct usb_dev *dev)
if (rcp == DEVICE_RECIPIENT && arg->len == 0 && arg->value <= 127
&& arg->index == 0 && dev->configuration == 0)
return USB_EVENT_NONE;
return usb_lld_ctrl_ack (dev);
return -1;
}
@@ -699,7 +697,7 @@ static int std_get_configuration (struct usb_dev *dev)
return -1;
if (rcp == DEVICE_RECIPIENT)
return usb_lld_reply_request (dev, &dev->configuration, 1);
return usb_lld_ctrl_send (dev, &dev->configuration, 1);
return -1;
}
@@ -796,14 +794,10 @@ static int handle_setup0 (struct usb_dev *dev)
default: handler = std_none; break;
}
if ((r = (*handler) (dev)) <= 0)
if ((r = (*handler) (dev)) < 0)
{
/* Handling finished in standard way. */
if (r == 0)
usb_lld_ctrl_good (dev);
else
usb_lld_ctrl_error (dev);
return 0;
return USB_EVENT_NONE;
}
else
return r;
@@ -891,7 +885,7 @@ usb_handle_transfer (struct usb_dev *dev, uint16_t istr_value)
else
{
handle_out0 (dev);
return 0;
return USB_EVENT_NONE;
}
}
}
@@ -914,7 +908,7 @@ usb_handle_transfer (struct usb_dev *dev, uint16_t istr_value)
}
}
return 0;
return USB_EVENT_NONE;
}
void usb_lld_reset (struct usb_dev *dev, uint8_t feature)
@@ -1017,12 +1011,12 @@ uint8_t usb_lld_current_configuration (struct usb_dev *dev)
return dev->configuration;
}
int usb_lld_set_data_to_recv (struct usb_dev *dev, void *p, size_t len)
int usb_lld_ctrl_recv (struct usb_dev *dev, void *p, size_t len)
{
struct ctrl_data *data_p = &dev->ctrl_data;
data_p->addr = p;
data_p->len = len;
return 0;
return USB_EVENT_NONE;
}
void usb_lld_to_pmabuf (const void *src, uint16_t addr, size_t n)
@@ -1106,7 +1100,7 @@ void usb_lld_from_pmabuf (void *dst, uint16_t addr, size_t n)
* BUFLEN: size of the data.
*/
int
usb_lld_reply_request (struct usb_dev *dev, const void *buf, size_t buflen)
usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen)
{
struct ctrl_data *data_p = &dev->ctrl_data;
uint32_t len_asked = dev->dev_req.len;

View File

@@ -106,11 +106,27 @@ void usb_lld_init (struct usb_dev *dev, uint8_t feature);
#define USB_EVENT_ID(e) ((e >> 24))
int usb_lld_event_handler (struct usb_dev *dev);
int usb_lld_reply_request (struct usb_dev *dev,
const void *buf, size_t buflen);
int usb_lld_set_data_to_recv (struct usb_dev *dev, void *p, size_t len);
/*
* Control Endpoint ENDP0 does device requests handling.
* In response to an event of
* USB_EVENT_SET_CONFIGURATION
* USB_EVENT_SET_INTERFACE
* USB_EVENT_SET_FEATURE_DEVICE
* USB_EVENT_SET_FEATURE_ENDPOINT
* USB_EVENT_CLEAR_FEATURE_DEVICE
* USB_EVENT_CLEAR_FEATURE_ENDPOINT
* USB_EVENT_GET_STATUS_INTERFACE
* USB_EVENT_GET_DESCRIPTOR
* USB_EVENT_GET_INTERFACE
* USB_EVENT_CTRL_REQUEST
* a single action should be done, which is SEND, RECV, or,
* ACKNOWLEDGE (no data to be sent, or to be received).
* Otherwise, it's an error.
*/
int usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen);
int usb_lld_ctrl_recv (struct usb_dev *dev, void *p, size_t len);
int usb_lld_ctrl_ack (struct usb_dev *dev);
void usb_lld_ctrl_error (struct usb_dev *dev);
void usb_lld_ctrl_good (struct usb_dev *dev);
void usb_lld_reset (struct usb_dev *dev, uint8_t feature);
void usb_lld_set_configuration (struct usb_dev *dev, uint8_t config);