forked from len0rd/rockbox
USB AMSv2: simplify FOR_EACH* macros
- use a single table to store endpoints numbers (1 table by direction) - drop __ prefix since the table isn't meant to be hidden (it is used in reset_endpoints() - the tables won't change at runtime: mark const git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28038 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e526681c63
commit
24cd51a2fe
1 changed files with 25 additions and 31 deletions
|
@ -36,37 +36,26 @@
|
||||||
#include "usb-drv-as3525v2.h"
|
#include "usb-drv-as3525v2.h"
|
||||||
#include "usb_core.h"
|
#include "usb_core.h"
|
||||||
|
|
||||||
static int __in_ep_list[NUM_IN_EP] = {IN_EP_LIST};
|
static const int in_ep_list[NUM_IN_EP + 1] = {0, IN_EP_LIST};
|
||||||
static int __out_ep_list[NUM_OUT_EP] = {OUT_EP_LIST};
|
static const int out_ep_list[NUM_OUT_EP + 1] = {0, OUT_EP_LIST};
|
||||||
static int __in_ep_list_ep0[NUM_IN_EP + 1] = {0, IN_EP_LIST};
|
|
||||||
static int __out_ep_list_ep0[NUM_OUT_EP + 1] = {0, OUT_EP_LIST};
|
|
||||||
|
|
||||||
/* iterate through each in/out ep except EP0
|
/* iterate through each in/out ep except EP0
|
||||||
* 'counter' is the counter, 'ep' is the actual value */
|
* 'i' is the counter, 'ep' is the actual value */
|
||||||
#define FOR_EACH_EP(list, size, counter, ep) \
|
#define FOR_EACH_EP(list, start, i, ep) \
|
||||||
for(counter = 0, ep = (list)[0]; \
|
for(ep = list[i = start]; \
|
||||||
counter < (size); \
|
i < (sizeof(list)/sizeof(*list)); \
|
||||||
counter++, ep = (list)[counter])
|
i++, ep = list[i])
|
||||||
|
|
||||||
#define FOR_EACH_IN_EP_EX(include_ep0, counter, ep) \
|
|
||||||
FOR_EACH_EP(include_ep0 ? __in_ep_list_ep0 : __in_ep_list, \
|
|
||||||
include_ep0 ? NUM_IN_EP + 1: NUM_IN_EP, counter, ep)
|
|
||||||
|
|
||||||
#define FOR_EACH_OUT_EP_EX(include_ep0, counter, ep) \
|
#define FOR_EACH_IN_EP_EX(include_ep0, i, ep) \
|
||||||
FOR_EACH_EP(include_ep0 ? __out_ep_list_ep0 : __out_ep_list, \
|
FOR_EACH_EP(in_ep_list, (include_ep0) ? 0 : 1, i, ep)
|
||||||
include_ep0 ? NUM_OUT_EP + 1: NUM_OUT_EP, counter, ep)
|
|
||||||
|
|
||||||
#define FOR_EACH_IN_EP(counter, ep) \
|
|
||||||
FOR_EACH_IN_EP_EX(false, counter, ep)
|
|
||||||
|
|
||||||
#define FOR_EACH_IN_EP_AND_EP0(counter, ep) \
|
#define FOR_EACH_OUT_EP_EX(include_ep0, i, ep) \
|
||||||
FOR_EACH_IN_EP_EX(true, counter, ep)
|
FOR_EACH_EP(out_ep_list, (include_ep0) ? 0 : 1, i, ep)
|
||||||
|
|
||||||
#define FOR_EACH_OUT_EP(counter, ep) \
|
#define FOR_EACH_IN_EP(i, ep) FOR_EACH_IN_EP_EX (false, i, ep)
|
||||||
FOR_EACH_OUT_EP_EX(false, counter, ep)
|
#define FOR_EACH_IN_EP_AND_EP0(i, ep) FOR_EACH_IN_EP_EX (true, i, ep)
|
||||||
|
#define FOR_EACH_OUT_EP(i, ep) FOR_EACH_OUT_EP_EX(false, i, ep)
|
||||||
#define FOR_EACH_OUT_EP_AND_EP0(counter, ep) \
|
#define FOR_EACH_OUT_EP_AND_EP0(i, ep) FOR_EACH_OUT_EP_EX(true, i, ep)
|
||||||
FOR_EACH_OUT_EP_EX(true, counter, ep)
|
|
||||||
|
|
||||||
/* store per endpoint, per direction, information */
|
/* store per endpoint, per direction, information */
|
||||||
struct usb_endpoint
|
struct usb_endpoint
|
||||||
|
@ -279,7 +268,8 @@ static void handle_ep0_setup(void)
|
||||||
|
|
||||||
static void reset_endpoints(void)
|
static void reset_endpoints(void)
|
||||||
{
|
{
|
||||||
int i, ep;
|
unsigned i;
|
||||||
|
int ep;
|
||||||
/* disable all endpoints except EP0 */
|
/* disable all endpoints except EP0 */
|
||||||
FOR_EACH_IN_EP_AND_EP0(i, ep)
|
FOR_EACH_IN_EP_AND_EP0(i, ep)
|
||||||
{
|
{
|
||||||
|
@ -314,7 +304,7 @@ static void reset_endpoints(void)
|
||||||
/* Setup next chain for IN eps */
|
/* Setup next chain for IN eps */
|
||||||
FOR_EACH_IN_EP_AND_EP0(i, ep)
|
FOR_EACH_IN_EP_AND_EP0(i, ep)
|
||||||
{
|
{
|
||||||
int next_ep = __in_ep_list_ep0[(i + 1) % (NUM_IN_EP + 1)];
|
int next_ep = in_ep_list[(i + 2) % (NUM_IN_EP + 1)];
|
||||||
DIEPCTL(ep) = (DIEPCTL(ep) & ~bitm(DEPCTL, nextep)) | (next_ep << DEPCTL_nextep_bitp);
|
DIEPCTL(ep) = (DIEPCTL(ep) & ~bitm(DEPCTL, nextep)) | (next_ep << DEPCTL_nextep_bitp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -323,7 +313,9 @@ static void cancel_all_transfers(bool cancel_ep0)
|
||||||
{
|
{
|
||||||
logf("usb-drv: cancel all transfers");
|
logf("usb-drv: cancel all transfers");
|
||||||
int flags = disable_irq_save();
|
int flags = disable_irq_save();
|
||||||
unsigned i, ep;
|
int ep;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
FOR_EACH_IN_EP_EX(cancel_ep0, i, ep)
|
FOR_EACH_IN_EP_EX(cancel_ep0, i, ep)
|
||||||
{
|
{
|
||||||
endpoints[ep][DIR_IN].status = -1;
|
endpoints[ep][DIR_IN].status = -1;
|
||||||
|
@ -346,7 +338,8 @@ static void cancel_all_transfers(bool cancel_ep0)
|
||||||
|
|
||||||
static void core_dev_init(void)
|
static void core_dev_init(void)
|
||||||
{
|
{
|
||||||
unsigned int i, ep;
|
int ep;
|
||||||
|
unsigned int i;
|
||||||
/* Restart the phy clock */
|
/* Restart the phy clock */
|
||||||
PCGCCTL = 0;
|
PCGCCTL = 0;
|
||||||
/* Set phy speed : high speed */
|
/* Set phy speed : high speed */
|
||||||
|
@ -677,7 +670,8 @@ static unsigned long usb_drv_mps_by_type(int type)
|
||||||
|
|
||||||
int usb_drv_request_endpoint(int type, int dir)
|
int usb_drv_request_endpoint(int type, int dir)
|
||||||
{
|
{
|
||||||
int i, ep, ret = -1;
|
int ep, ret = -1;
|
||||||
|
unsigned i;
|
||||||
logf("usb-drv: request endpoint (type=%d,dir=%s)", type, dir == USB_DIR_IN ? "IN" : "OUT");
|
logf("usb-drv: request endpoint (type=%d,dir=%s)", type, dir == USB_DIR_IN ? "IN" : "OUT");
|
||||||
|
|
||||||
if(dir == USB_DIR_IN)
|
if(dir == USB_DIR_IN)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue