forked from len0rd/rockbox
code police part one...
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14499 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
c04dd32772
commit
5f59f94554
2 changed files with 70 additions and 46 deletions
|
@ -147,14 +147,18 @@ void usb_arcotg_dcd_init(void)
|
||||||
ep_num++;
|
ep_num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
logf("pipe %d -> ep %d %s", dcd_controller.endpoints[i].pipe_num, dcd_controller.endpoints[i].ep_num, dcd_controller.endpoints[i].name);
|
logf("pipe %d -> ep %d %s", dcd_controller.endpoints[i].pipe_num,
|
||||||
|
dcd_controller.endpoints[i].ep_num,
|
||||||
|
dcd_controller.endpoints[i].name);
|
||||||
|
|
||||||
if (ep_name[i] != NULL) {
|
if (ep_name[i] != NULL) {
|
||||||
memcpy(&dcd_controller.endpoints[i].name, ep_name[i], sizeof(dcd_controller.endpoints[i].name));
|
memcpy(&dcd_controller.endpoints[i].name, ep_name[i],
|
||||||
|
sizeof(dcd_controller.endpoints[i].name));
|
||||||
|
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
/* add to list of configurable endpoints */
|
/* add to list of configurable endpoints */
|
||||||
list_add_tail(&dcd_controller.endpoints[i].list, &arcotg_dcd.endpoints.list);
|
list_add_tail(&dcd_controller.endpoints[i].list,
|
||||||
|
&arcotg_dcd.endpoints.list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,7 +234,8 @@ void usb_arcotg_dcd_irq(void)
|
||||||
/* setup packet, we only support ep0 as control ep */
|
/* setup packet, we only support ep0 as control ep */
|
||||||
if (UDC_ENDPTSETUPSTAT & EP_SETUP_STATUS_EP0) {
|
if (UDC_ENDPTSETUPSTAT & EP_SETUP_STATUS_EP0) {
|
||||||
/* copy data from queue head to local buffer */
|
/* copy data from queue head to local buffer */
|
||||||
memcpy(&dcd_controller.local_setup_buff, (uint8_t *) &dev_qh[0].setup_buffer, 8);
|
memcpy(&dcd_controller.local_setup_buff,
|
||||||
|
(uint8_t *) &dev_qh[0].setup_buffer, 8);
|
||||||
/* ack setup packet*/
|
/* ack setup packet*/
|
||||||
UDC_ENDPTSETUPSTAT = UDC_ENDPTSETUPSTAT;
|
UDC_ENDPTSETUPSTAT = UDC_ENDPTSETUPSTAT;
|
||||||
setup_received_int(&dcd_controller.local_setup_buff);
|
setup_received_int(&dcd_controller.local_setup_buff);
|
||||||
|
@ -306,7 +311,9 @@ static void setup_received_int(struct usb_ctrlrequest* request)
|
||||||
int num = (request->wIndex & 0x000f);
|
int num = (request->wIndex & 0x000f);
|
||||||
struct usb_ep *ep;
|
struct usb_ep *ep;
|
||||||
|
|
||||||
if (request->wValue != 0 || request->wLength != 0 || (num * 2 + dir) > USB_MAX_PIPES) {
|
if (request->wValue != 0 ||
|
||||||
|
request->wLength != 0 ||
|
||||||
|
(num * 2 + dir) > USB_MAX_PIPES) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ep = &dcd_controller.endpoints[num * 2 + dir];
|
ep = &dcd_controller.endpoints[num * 2 + dir];
|
||||||
|
@ -335,7 +342,8 @@ static void setup_received_int(struct usb_ctrlrequest* request)
|
||||||
|
|
||||||
/* if dcd can not handle reqeust, ask driver */
|
/* if dcd can not handle reqeust, ask driver */
|
||||||
if (handled == 0) {
|
if (handled == 0) {
|
||||||
if (arcotg_dcd.device_driver != NULL && arcotg_dcd.device_driver->request != NULL) {
|
if (arcotg_dcd.device_driver != NULL &&
|
||||||
|
arcotg_dcd.device_driver->request != NULL) {
|
||||||
handled = arcotg_dcd.device_driver->request(request);
|
handled = arcotg_dcd.device_driver->request(request);
|
||||||
logf("result from driver %d", handled);
|
logf("result from driver %d", handled);
|
||||||
}
|
}
|
||||||
|
@ -389,7 +397,8 @@ static void port_change_int(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* inform device driver */
|
/* inform device driver */
|
||||||
if (arcotg_dcd.device_driver != NULL && arcotg_dcd.device_driver->speed != NULL) {
|
if (arcotg_dcd.device_driver != NULL &&
|
||||||
|
arcotg_dcd.device_driver->speed != NULL) {
|
||||||
arcotg_dcd.device_driver->speed(speed);
|
arcotg_dcd.device_driver->speed(speed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,7 +410,8 @@ static void suspend_int(void)
|
||||||
dcd_controller.usb_state = USB_STATE_SUSPENDED;
|
dcd_controller.usb_state = USB_STATE_SUSPENDED;
|
||||||
|
|
||||||
/* report suspend to the driver */
|
/* report suspend to the driver */
|
||||||
if (arcotg_dcd.device_driver != NULL && arcotg_dcd.device_driver->suspend != NULL) {
|
if (arcotg_dcd.device_driver != NULL &&
|
||||||
|
arcotg_dcd.device_driver->suspend != NULL) {
|
||||||
arcotg_dcd.device_driver->suspend();
|
arcotg_dcd.device_driver->suspend();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -413,7 +423,8 @@ static void resume_int(void)
|
||||||
dcd_controller.resume_state = USB_STATE_NOTATTACHED;
|
dcd_controller.resume_state = USB_STATE_NOTATTACHED;
|
||||||
|
|
||||||
/* report resume to the driver */
|
/* report resume to the driver */
|
||||||
if (arcotg_dcd.device_driver != NULL && arcotg_dcd.device_driver->resume != NULL) {
|
if (arcotg_dcd.device_driver != NULL &&
|
||||||
|
arcotg_dcd.device_driver->resume != NULL) {
|
||||||
arcotg_dcd.device_driver->resume();
|
arcotg_dcd.device_driver->resume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,7 +466,8 @@ static void reset_int(void)
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
/* usb controller ops */
|
/* usb controller ops */
|
||||||
|
|
||||||
int usb_arcotg_dcd_enable(struct usb_ep* ep, struct usb_endpoint_descriptor* desc)
|
int usb_arcotg_dcd_enable(struct usb_ep* ep,
|
||||||
|
struct usb_endpoint_descriptor* desc)
|
||||||
{
|
{
|
||||||
unsigned short max = 0;
|
unsigned short max = 0;
|
||||||
unsigned char mult = 0, zlt = 0;
|
unsigned char mult = 0, zlt = 0;
|
||||||
|
@ -610,7 +622,8 @@ int usb_arcotg_dcd_enable(struct usb_ep* ep, struct usb_endpoint_descriptor* des
|
||||||
|
|
||||||
/* Init endpoint x at here */
|
/* Init endpoint x at here */
|
||||||
ep_setup(ep->ep_num,
|
ep_setup(ep->ep_num,
|
||||||
(unsigned char)(desc->bEndpointAddress & USB_DIR_IN) ? USB_RECV : USB_SEND,
|
(unsigned char)(desc->bEndpointAddress & USB_DIR_IN) ?
|
||||||
|
USB_RECV : USB_SEND,
|
||||||
(unsigned char)(desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK));
|
(unsigned char)(desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK));
|
||||||
|
|
||||||
/* Now HW will be NAKing transfers to that EP,
|
/* Now HW will be NAKing transfers to that EP,
|
||||||
|
@ -810,8 +823,9 @@ int usb_arcotg_dcd_receive(struct usb_ep* ep, struct usb_response* res)
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
/* lifecylce */
|
/* lifecylce */
|
||||||
|
|
||||||
static void qh_init(unsigned char ep_num, unsigned char dir, unsigned char ep_type,
|
static void qh_init(unsigned char ep_num, unsigned char dir,
|
||||||
unsigned int max_pkt_len, unsigned int zlt, unsigned char mult)
|
unsigned char ep_type, unsigned int max_pkt_len,
|
||||||
|
unsigned int zlt, unsigned char mult)
|
||||||
{
|
{
|
||||||
struct dqh *qh = &dev_qh[2 * ep_num + dir];
|
struct dqh *qh = &dev_qh[2 * ep_num + dir];
|
||||||
uint32_t tmp = 0;
|
uint32_t tmp = 0;
|
||||||
|
@ -824,7 +838,8 @@ static void qh_init(unsigned char ep_num, unsigned char dir, unsigned char ep_ty
|
||||||
tmp = (max_pkt_len << LENGTH_BIT_POS) | INTERRUPT_ON_COMPLETE;
|
tmp = (max_pkt_len << LENGTH_BIT_POS) | INTERRUPT_ON_COMPLETE;
|
||||||
break;
|
break;
|
||||||
case USB_ENDPOINT_XFER_ISOC:
|
case USB_ENDPOINT_XFER_ISOC:
|
||||||
tmp = (max_pkt_len << LENGTH_BIT_POS) | (mult << EP_QUEUE_HEAD_MULT_POS);
|
tmp = (max_pkt_len << LENGTH_BIT_POS) |
|
||||||
|
(mult << EP_QUEUE_HEAD_MULT_POS);
|
||||||
break;
|
break;
|
||||||
case USB_ENDPOINT_XFER_BULK:
|
case USB_ENDPOINT_XFER_BULK:
|
||||||
case USB_ENDPOINT_XFER_INT:
|
case USB_ENDPOINT_XFER_INT:
|
||||||
|
@ -840,7 +855,8 @@ static void qh_init(unsigned char ep_num, unsigned char dir, unsigned char ep_ty
|
||||||
|
|
||||||
/* see 32.14.4.1 Queue Head Initialization */
|
/* see 32.14.4.1 Queue Head Initialization */
|
||||||
|
|
||||||
/* write the wMaxPacketSize field as required by the USB Chapter9 or application specific portocol */
|
/* write the wMaxPacketSize field as required by the USB Chapter9 or
|
||||||
|
application specific portocol */
|
||||||
qh->endpt_cap = tmp;
|
qh->endpt_cap = tmp;
|
||||||
|
|
||||||
/* write the next dTD Terminate bit fild to 1 */
|
/* write the next dTD Terminate bit fild to 1 */
|
||||||
|
@ -871,13 +887,15 @@ static void td_init(struct dtd* td, void* buffer, uint32_t todo)
|
||||||
/* set interrupt on compilte if desierd */
|
/* set interrupt on compilte if desierd */
|
||||||
td->dtd_token |= INTERRUPT_ON_COMPLETE;
|
td->dtd_token |= INTERRUPT_ON_COMPLETE;
|
||||||
|
|
||||||
/* initialize the status field with the active bit set to 1 and all remaining status bits to 0 */
|
/* initialize the status field with the active bit set to 1 and all
|
||||||
|
remaining status bits to 0 */
|
||||||
td->dtd_token |= STATUS_ACTIVE;
|
td->dtd_token |= STATUS_ACTIVE;
|
||||||
|
|
||||||
td->buf_ptr0 = (uint32_t)buffer;
|
td->buf_ptr0 = (uint32_t)buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type)
|
static void ep_setup(unsigned char ep_num, unsigned char dir,
|
||||||
|
unsigned char ep_type)
|
||||||
{
|
{
|
||||||
unsigned int tmp_epctrl = 0;
|
unsigned int tmp_epctrl = 0;
|
||||||
struct timer t;
|
struct timer t;
|
||||||
|
@ -904,7 +922,8 @@ static void ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_t
|
||||||
/* wait for the write reg to finish */
|
/* wait for the write reg to finish */
|
||||||
|
|
||||||
timer_set(&t, SETUP_TIMER);
|
timer_set(&t, SETUP_TIMER);
|
||||||
while (!(UDC_ENDPTCTRL(ep_num) & (tmp_epctrl & (EPCTRL_TX_ENABLE | EPCTRL_RX_ENABLE)))) {
|
while (!(UDC_ENDPTCTRL(ep_num) &
|
||||||
|
(tmp_epctrl & (EPCTRL_TX_ENABLE | EPCTRL_RX_ENABLE)))) {
|
||||||
if (timer_expired(&t)) {
|
if (timer_expired(&t)) {
|
||||||
logf("TIMEOUT: enable ep");
|
logf("TIMEOUT: enable ep");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#define ep_is_in(EP) (((EP)->desc->bEndpointAddress & USB_DIR_IN)==USB_DIR_IN)
|
#define ep_is_in(EP) (((EP)->desc->bEndpointAddress & USB_DIR_IN)==USB_DIR_IN)
|
||||||
|
|
||||||
#define EP_DIR_IN 1
|
#define EP_DIR_IN 1
|
||||||
#define EP_DIR_OUT 0
|
#define EP_DIR_OUT 0
|
||||||
|
@ -52,30 +52,30 @@
|
||||||
#define USB_SEND (1) /* IN EP */
|
#define USB_SEND (1) /* IN EP */
|
||||||
|
|
||||||
/* Shared Bit Masks for Endpoint Queue Head and Endpoint Transfer Descriptor */
|
/* Shared Bit Masks for Endpoint Queue Head and Endpoint Transfer Descriptor */
|
||||||
#define TERMINATE (1 << 0)
|
#define TERMINATE (1 << 0)
|
||||||
#define STATUS_ACTIVE (1 << 7)
|
#define STATUS_ACTIVE (1 << 7)
|
||||||
#define STATUS_HALTED (1 << 6)
|
#define STATUS_HALTED (1 << 6)
|
||||||
#define STATUS_DATA_BUFF_ERR (1 << 5)
|
#define STATUS_DATA_BUFF_ERR (1 << 5)
|
||||||
#define STATUS_TRANSACTION_ERR (1 << 4)
|
#define STATUS_TRANSACTION_ERR (1 << 4)
|
||||||
#define INTERRUPT_ON_COMPLETE (1 << 15)
|
#define INTERRUPT_ON_COMPLETE (1 << 15)
|
||||||
#define LENGTH_BIT_POS (16)
|
#define LENGTH_BIT_POS (16)
|
||||||
#define ADDRESS_MASK (0xFFFFFFE0)
|
#define ADDRESS_MASK (0xFFFFFFE0)
|
||||||
#define ERROR_MASK (DTD_STATUS_HALTED | \
|
#define ERROR_MASK (DTD_STATUS_HALTED | \
|
||||||
DTD_STATUS_DATA_BUFF_ERR | \
|
DTD_STATUS_DATA_BUFF_ERR | \
|
||||||
DTD_STATUS_TRANSACTION_ERR)
|
DTD_STATUS_TRANSACTION_ERR)
|
||||||
|
|
||||||
#define RESERVED_FIELDS ((1 << 0) | (1 << 2) | (1 << 4) | \
|
#define RESERVED_FIELDS ((1 << 0) | (1 << 2) | (1 << 4) | \
|
||||||
(1 << 8) | (1 << 9) | (1 << 12)| \
|
(1 << 8) | (1 << 9) | (1 << 12)| \
|
||||||
(1 << 13)| (1 << 14)| (1 << 31))
|
(1 << 13)| (1 << 14)| (1 << 31))
|
||||||
|
|
||||||
/* Endpoint Queue Head Bit Masks */
|
/* Endpoint Queue Head Bit Masks */
|
||||||
#define EP_QUEUE_HEAD_MULT_POS (30)
|
#define EP_QUEUE_HEAD_MULT_POS (30)
|
||||||
#define EP_QUEUE_HEAD_ZLT_SEL (0x20000000)
|
#define EP_QUEUE_HEAD_ZLT_SEL (0x20000000)
|
||||||
#define EP_QUEUE_HEAD_MAX_PKT_LEN(ep_info) (((ep_info)>>16)&0x07ff)
|
#define EP_QUEUE_HEAD_MAX_PKT_LEN(ep_info) (((ep_info)>>16)&0x07ff)
|
||||||
#define EP_QUEUE_HEAD_MULTO (0x00000C00)
|
#define EP_QUEUE_HEAD_MULTO (0x00000C00)
|
||||||
#define EP_QUEUE_CURRENT_OFFSET_MASK (0x00000FFF)
|
#define EP_QUEUE_CURRENT_OFFSET_MASK (0x00000FFF)
|
||||||
#define EP_QUEUE_FRINDEX_MASK (0x000007FF)
|
#define EP_QUEUE_FRINDEX_MASK (0x000007FF)
|
||||||
#define EP_MAX_LENGTH_TRANSFER (0x4000)
|
#define EP_MAX_LENGTH_TRANSFER (0x4000)
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -104,8 +104,10 @@ static const char* ep_name[] = {
|
||||||
|
|
||||||
/* Endpoint Transfer Descriptor data struct */
|
/* Endpoint Transfer Descriptor data struct */
|
||||||
struct dtd {
|
struct dtd {
|
||||||
uint32_t next_dtd; /* Next TD pointer(31-5), T(0) set indicate invalid */
|
uint32_t next_dtd; /* Next TD pointer(31-5),
|
||||||
uint32_t dtd_token; /* Total bytes (30-16), IOC (15), MultO(11-10), STS (7-0) */
|
T(0) set indicate invalid */
|
||||||
|
uint32_t dtd_token; /* Total bytes (30-16), IOC (15),
|
||||||
|
MultO(11-10), STS (7-0) */
|
||||||
uint32_t buf_ptr0; /* Buffer pointer Page 0 */
|
uint32_t buf_ptr0; /* Buffer pointer Page 0 */
|
||||||
uint32_t buf_ptr1; /* Buffer pointer Page 1 */
|
uint32_t buf_ptr1; /* Buffer pointer Page 1 */
|
||||||
uint32_t buf_ptr2; /* Buffer pointer Page 2 */
|
uint32_t buf_ptr2; /* Buffer pointer Page 2 */
|
||||||
|
@ -146,7 +148,8 @@ void usb_arcotg_dcd_start(void);
|
||||||
void usb_arcotg_dcd_stop(void);
|
void usb_arcotg_dcd_stop(void);
|
||||||
|
|
||||||
/* usb controller ops */
|
/* usb controller ops */
|
||||||
int usb_arcotg_dcd_enable(struct usb_ep* ep, struct usb_endpoint_descriptor* desc);
|
int usb_arcotg_dcd_enable(struct usb_ep* ep,
|
||||||
|
struct usb_endpoint_descriptor* desc);
|
||||||
int usb_arcotg_dcd_disable(struct usb_ep* ep);
|
int usb_arcotg_dcd_disable(struct usb_ep* ep);
|
||||||
int usb_arcotg_dcd_set_halt(struct usb_ep* ep, bool halt);
|
int usb_arcotg_dcd_set_halt(struct usb_ep* ep, bool halt);
|
||||||
int usb_arcotg_dcd_send(struct usb_ep* ep, struct usb_response* request);
|
int usb_arcotg_dcd_send(struct usb_ep* ep, struct usb_response* request);
|
||||||
|
@ -160,10 +163,12 @@ static void suspend_int(void);
|
||||||
static void resume_int(void);
|
static void resume_int(void);
|
||||||
|
|
||||||
/* life cycle */
|
/* life cycle */
|
||||||
static void qh_init(unsigned char ep_num, unsigned char dir, unsigned char ep_type,
|
static void qh_init(unsigned char ep_num, unsigned char dir,
|
||||||
unsigned int max_pkt_len, unsigned int zlt, unsigned char mult);
|
unsigned char ep_type, unsigned int max_pkt_len,
|
||||||
|
unsigned int zlt, unsigned char mult);
|
||||||
static void td_init(struct dtd* td, void* buffer, uint32_t todo);
|
static void td_init(struct dtd* td, void* buffer, uint32_t todo);
|
||||||
static void ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type);
|
static void ep_setup(unsigned char ep_num, unsigned char dir,
|
||||||
|
unsigned char ep_type);
|
||||||
|
|
||||||
/* helpers for tx/rx */
|
/* helpers for tx/rx */
|
||||||
static int td_enqueue(struct dtd* td, struct dqh* qh, unsigned int mask);
|
static int td_enqueue(struct dtd* td, struct dqh* qh, unsigned int mask);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue