Advertisement
Guest User

Untitled

a guest
Dec 14th, 2012
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 14.85 KB | None | 0 0
  1. diff --git a/firmware/export/logf.h b/firmware/export/logf.h
  2. index b57ae91..48cfae8 100644
  3. --- a/firmware/export/logf.h
  4. +++ b/firmware/export/logf.h
  5. @@ -29,7 +29,7 @@
  6.  
  7.  #ifndef __PCTOOL__
  8.  
  9. -#define MAX_LOGF_SIZE 16384
  10. +#define MAX_LOGF_SIZE 163840
  11.  
  12.  extern unsigned char logfbuffer[MAX_LOGF_SIZE];
  13.  extern int logfindex;
  14. diff --git a/firmware/export/rk27xx.h b/firmware/export/rk27xx.h
  15. index 3ca2bc0..0a56536 100644
  16. --- a/firmware/export/rk27xx.h
  17. +++ b/firmware/export/rk27xx.h
  18. @@ -8,7 +8,8 @@
  19.  #define FLASH_BANK1 0x11000000
  20.  
  21.  #define USB_NUM_ENDPOINTS 16
  22. -#define USB_DEVBSS_ATTR
  23. +/* cache aligned */
  24. +#define USB_DEVBSS_ATTR        __attribute__((aligned(32)))
  25.  
  26.  /* Timers */
  27.  #define APB0_TIMER             (ARM_BUS0_BASE + 0x00000000)
  28. @@ -731,6 +732,7 @@
  29.  #define RXVOIDINTEN            (1<<5)
  30.  #define RXERRINTEN             (1<<6)
  31.  #define RXACKINTEN             (1<<7)
  32. +#define RXCFINTE               (1<<12)
  33.  /* bits 31:8 reserved for EP0 */
  34.  /* bits 31:14 reserved for others */
  35.  
  36. @@ -753,6 +755,7 @@
  37.  #define TXERRINTEN             (1<<5)
  38.  #define TXACKINTEN             (1<<6)
  39.  #define TXDMADNEN              (1<<7) /* reserved for EP0 */
  40. +#define TXCFINTE               (1<<12)
  41.  /* bits 31:8 reserved */
  42.  
  43.  /* TXnBUF bits */
  44. diff --git a/firmware/target/arm/rk27xx/usb-drv-rk27xx.c b/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
  45. index 810c793..4795e77 100644
  46. --- a/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
  47. +++ b/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
  48. @@ -170,48 +170,112 @@ static void ctr_read(void)
  49.      RX0DMACTLO = DMA_START;                          /* start DMA */
  50.  }
  51.  
  52. -static void blk_write(int ep)
  53. +static void blk_write(int ep_num)
  54.  {
  55. -    int ep_num = EP_NUM(ep);
  56. -    int max = usb_drv_port_speed() ? 512 : 64;
  57. -    int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt;  
  58.      unsigned int timeout = current_tick + HZ/10;
  59. -    
  60. +    int max = usb_drv_port_speed() ? 512 : 64;
  61. +    int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt;
  62. +
  63.      while (BIN_TXBUF(ep_num) & TXFULL) /* TXFULL flag */
  64.      {
  65.          if(TIME_AFTER(current_tick, timeout))
  66.              break;
  67.      }
  68. -    
  69. +
  70.      BIN_TXSTAT(ep_num) = xfer_size;                            /* size */
  71.      BIN_DMAINLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; /* buf address */
  72.      BIN_DMAINCTL(ep_num) = DMA_START;                          /* start DMA */
  73.      BIN_TXCON(ep_num) &= ~TXNAK;                               /* clear NAK */
  74. -    
  75. +
  76.      /* Decrement by max packet size is intentional.
  77. -     * This way if we have final packet short one we will get negative len
  78. -     * after transfer, which in turn indicates we *don't* need to send
  79. -     * zero length packet. If the final packet is max sized packet we will
  80. -     * get zero len after transfer which indicates we need to send
  81. -     * zero length packet to signal host end of the transfer.
  82. -     */
  83. +    * This way if we have final packet short one we will get negative len
  84. +    * after transfer, which in turn indicates we *don't* need to send
  85. +    * zero length packet. If the final packet is max sized packet we will
  86. +    * get zero len after transfer which indicates we need to send
  87. +    * zero length packet to signal host end of the transfer.
  88. +    */
  89.      endpoints[ep_num].cnt -= max;
  90.      endpoints[ep_num].buf += xfer_size;
  91.  }
  92.  
  93. -static void blk_read(int ep)
  94. +static void blk_write_int(int ep_num)
  95.  {
  96. -    int ep_num = EP_NUM(ep);
  97. -    int xfer_size = BOUT_RXSTAT(ep_num) & 0xffff;
  98. -    
  99. -    /* clear NAK bit */
  100. -    BOUT_RXCON(ep_num) &= ~RXNAK;
  101. -
  102. -    endpoints[ep_num].cnt -= xfer_size;
  103. -    endpoints[ep_num].buf += xfer_size;
  104. -  
  105. -    BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf;
  106. -    BOUT_DMAOUTCTL(ep_num) = DMA_START;
  107. +    uint32_t txstat = BIN_TXSTAT(ep_num);
  108. +    struct endpoint_t *endp = &endpoints[ep_num];
  109. +
  110. +    if(txstat & TXCFINT)
  111. +    {
  112. +        logf("blk_write:cf(0x%x), %ld", ep_num, current_tick);
  113. +        /* bit cleared by read */
  114. +        usb_drv_stall(ep_num, false, true);
  115. +    }
  116. +
  117. +    if (txstat & TXACK) /* check TxACK flag */
  118. +    {
  119. +        if (endp->cnt >= 0)
  120. +        {
  121. +            logf("blk_write:ack(0x%x), %ld", ep_num, current_tick);
  122. +            /* we still have data to send (or ZLP) */
  123. +            blk_write(ep_num);
  124. +        }
  125. +        else
  126. +        {
  127. +            logf("udc_intr: usb_core_transfer_complete(0x%x, USB_DIR_IN, 0, 0x%x), %ld", ep_num, endp->len, current_tick);
  128. +            /* final ack received */
  129. +            usb_core_transfer_complete(ep_num,     /* ep */
  130. +                                        USB_DIR_IN, /* dir */
  131. +                                        0,          /* status */
  132. +                                        endp->len);  /* length */
  133. +
  134. +            /* release semaphore for blocking transfer */
  135. +            if (endp->block)
  136. +            {
  137. +                logf("udc_intr: ep=0x%x, semaphore_release(), %ld", ep_num, current_tick);
  138. +                semaphore_release(&endp->complete);
  139. +            }
  140. +        }
  141. +    }
  142. +}
  143. +
  144. +static void blk_read_int(int ep_num)
  145. +{
  146. +    uint32_t rxstat = BOUT_RXSTAT(ep_num);
  147. +    int xfer_size = rxstat & 0xffff;
  148. +    int max = usb_drv_port_speed() ? 512 : 64;
  149. +    struct endpoint_t *endp = &endpoints[ep_num];
  150. +
  151. +    if(rxstat & RXCFINT)
  152. +    {
  153. +        logf("blk_read:cf(0x%x), %ld", ep_num, current_tick);
  154. +        /* bit cleared by read */
  155. +        usb_drv_stall(ep_num, false, false);
  156. +    }
  157. +
  158. +    if((rxstat & RXACK) && endp->cnt > 0)
  159. +    {
  160. +        logf("blk_read:ack(0x%x,0x%x), %ld", ep_num, xfer_size, current_tick);
  161. +        /* clear NAK bit */
  162. +        BOUT_RXCON(ep_num) &= ~RXNAK;
  163. +
  164. +        endp->cnt -= xfer_size;
  165. +        endp->buf += xfer_size;
  166. +
  167. +        /* if the transfer was short or if the total count is zero, transfer is complete */
  168. +        if (endp->cnt == 0 || xfer_size < max)
  169. +        {
  170. +            logf("udc_intr: usb_core_transfer_complete(0x%x, USB_DIR_OUT, 0, 0x%x), %ld", ep_num, endp->len, current_tick);
  171. +            usb_core_transfer_complete(ep_num,      /* ep */
  172. +                                        USB_DIR_OUT, /* dir */
  173. +                                        0,           /* status */
  174. +                                        endp->len - endp->cnt);    /* length */
  175. +            endp->cnt = 0;
  176. +        }
  177. +        else
  178. +        {
  179. +            BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)endp->buf;
  180. +            BOUT_DMAOUTCTL(ep_num) = DMA_START;
  181. +        }
  182. +    }
  183.  }
  184.  
  185.  static void int_write(int ep)
  186. @@ -387,17 +451,20 @@ void INT_UDC(void)
  187.  
  188.      if (intsrc & CONN_INTR) /* usb connect */
  189.      {
  190. -//        if (DEV_INFO & VBUS_STS)
  191. -//        {
  192. +        if (DEV_INFO & VBUS_STS)
  193. +        {
  194.              udc_phy_reset();
  195.              udelay(10000);
  196.              udc_soft_connect();
  197.              udc_conn = 1;
  198.              usb_status_event(USB_INSERTED);
  199.  
  200. -//        }
  201. -//        else
  202. -//            udc_conn = 0;
  203. +        }
  204. +        else
  205. +        {
  206. +            udc_conn = 0;
  207. +            usb_status_event(USB_EXTRACTED);
  208. +        }
  209.      }
  210.  
  211.      /* TODO this needs rework */
  212. @@ -414,60 +481,10 @@ void INT_UDC(void)
  213.                  {
  214.                      case USB_ENDPOINT_XFER_BULK:
  215.                          if (ep->dir == DIR_OUT)
  216. -                        {
  217.                              /* bulk out */
  218. -                            rxstat = BOUT_RXSTAT(ep_num);
  219. -            
  220. -                            /* TODO handle errors */
  221. -                            if (rxstat & RXACK) /* RxACK */
  222. -                            {
  223. -                                if (ep->cnt > 0)
  224. -                                {
  225. -                                    logf("udc_intr: blk_read(0x%x), %ld", ep_num, current_tick);
  226. -                                    blk_read(ep_num);
  227. -                                }
  228. -                                else
  229. -                                {
  230. -                                    logf("udc_intr: usb_core_transfer_complete(0x%x, USB_DIR_OUT, 0, 0x%x), %ld", ep_num, ep->len, current_tick);
  231. -                                    usb_core_transfer_complete(ep_num,      /* ep */
  232. -                                                               USB_DIR_OUT, /* dir */
  233. -                                                               0,           /* status */
  234. -                                                               ep->len);    /* length */
  235. -                                }
  236. -                            }
  237. -                        }
  238. +                            blk_read_int(ep_num);
  239.                          else
  240. -                        {
  241. -                            /* bulk in */
  242. -                            txstat = BIN_TXSTAT(ep_num);
  243. -            
  244. -                            /* TODO handle errors */
  245. -                            if (txstat & TXACK) /* check TxACK flag */
  246. -                            {
  247. -                                if (ep->cnt >= 0)
  248. -                                {
  249. -                                    logf("udc_intr: blk_write(0x%x), %ld", ep_num, current_tick);
  250. -                                    /* we still have data to send (or ZLP) */
  251. -                                    blk_write(ep_num);
  252. -                                }
  253. -                                else
  254. -                                {
  255. -                                    logf("udc_intr: usb_core_transfer_complete(0x%x, USB_DIR_IN, 0, 0x%x), %ld", ep_num, ep->len, current_tick);
  256. -                                    /* final ack received */
  257. -                                    usb_core_transfer_complete(ep_num,     /* ep */
  258. -                                                               USB_DIR_IN, /* dir */
  259. -                                                               0,          /* status */
  260. -                                                               ep->len);  /* length */
  261. -                
  262. -                                    /* release semaphore for blocking transfer */
  263. -                                    if (ep->block)
  264. -                                    {
  265. -                                        logf("udc_intr: ep=0x%x, semaphore_release(), %ld", ep_num, current_tick);
  266. -                                        semaphore_release(&ep->complete);
  267. -                                    }
  268. -                                }
  269. -                            }
  270. -                        }
  271. +                            blk_write_int(ep_num);
  272.                          break;
  273.  
  274.                      case USB_ENDPOINT_XFER_INT:
  275. @@ -534,15 +551,15 @@ int usb_drv_request_endpoint(int type, int dir)
  276.  
  277.              if (ep_num%3 == 0) /* IIN 3, 6, 9, 12, 15 */
  278.              {
  279. -                IIN_TXCON(ep_num) = (ep_num<<8)|TXEPEN|TXNAK; /* ep_num, enable, NAK */
  280. +                IIN_TXCON(ep_num) = (ep_num<<8)|TXEPEN|TXNAK|TXACKINTEN|TXCFINTE;
  281.              }
  282.              else if (ep_num%3 == 1) /* BOUT 1, 4, 7, 10, 13 */
  283.              {
  284. -                BOUT_RXCON(ep_num) = (ep_num<<8)|RXEPEN|RXNAK; /* ep_num, NAK, enable */
  285. +                BOUT_RXCON(ep_num) = (ep_num<<8)|RXEPEN|RXNAK|RXACKINTEN|RXCFINTE;
  286.              }
  287.              else if (ep_num%3 == 2) /* BIN 2, 5, 8, 11, 14 */
  288.              {
  289. -                BIN_TXCON(ep_num) = (ep_num<<8)|TXEPEN|TXNAK; /* ep_num, enable, NAK */
  290. +                BIN_TXCON(ep_num) = (ep_num<<8)|TXEPEN|TXNAK|TXACKINTEN|TXCFINTE;
  291.              }
  292.  
  293.              /* enable interrupt from this endpoint */
  294. @@ -586,6 +603,12 @@ static int _usb_drv_send(int endpoint, void *ptr, int length, bool block)
  295.      struct endpoint_t *ep;
  296.      int ep_num = EP_NUM(endpoint);
  297.  
  298. +    /* for send transfers, make sure the data is committed
  299. +     * for recv, I don't know how to simply discard the cache so commit and
  300. +     * pray that no-one will read it in between */
  301. +    //commit_discard_dcache_range(ptr, length);
  302. +    commit_discard_idcache();
  303. +
  304.      logf("_usb_drv_send: endpt=0x%x, len=0x%x, block=%d", endpoint, length, block);    
  305.      if (ep_num == 0)
  306.          ep = &ctrlep[DIR_IN];
  307. @@ -602,7 +625,7 @@ static int _usb_drv_send(int endpoint, void *ptr, int length, bool block)
  308.      
  309.      switch (ep->type)
  310.      {
  311. -        case USB_ENDPOINT_XFER_CONTROL:                    
  312. +        case USB_ENDPOINT_XFER_CONTROL:
  313.              ctr_write();
  314.              break;
  315.          
  316. @@ -724,6 +747,7 @@ bool usb_drv_stalled(int endpoint, bool in)
  317.  void usb_drv_stall(int endpoint, bool stall, bool in)
  318.  {
  319.      int ep_num = EP_NUM(endpoint);
  320. +    logf("usb_drv: %sstall EP%d %s", stall ? "": "un", ep_num, in ? "IN" : "OUT");
  321.  
  322.      switch (endpoints[ep_num].type)
  323.      {
  324. diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
  325. index 8dc5969..0703036 100644
  326. --- a/firmware/usbstack/usb_core.c
  327. +++ b/firmware/usbstack/usb_core.c
  328. @@ -686,6 +686,16 @@ static void usb_core_do_set_config(uint8_t config)
  329.      #endif
  330.  }
  331.  
  332. +static void usb_core_do_clear_feature(int recip, int recip_nr, int feature)
  333. +{
  334. +    logf("usb_core: CLEAR FEATURE (%d,%d,%d)", recip, recip_nr, feature);
  335. +    if(recip == USB_RECIP_ENDPOINT)
  336. +    {
  337. +        if(feature == USB_ENDPOINT_HALT)
  338. +            usb_drv_stall(EP_NUM(recip_nr), false, EP_DIR(recip_nr));
  339. +    }
  340. +}
  341. +
  342.  static void request_handler_device(struct usb_ctrlrequest* req)
  343.  {
  344.      switch(req->bRequest) {
  345. @@ -808,12 +818,11 @@ static void request_handler_endpoint_standard(struct usb_ctrlrequest* req)
  346.  {
  347.      switch (req->bRequest) {
  348.          case USB_REQ_CLEAR_FEATURE:
  349. -            if(req->wValue == USB_ENDPOINT_HALT)
  350. -                usb_drv_stall(EP_NUM(req->wIndex), false, EP_DIR(req->wIndex));
  351. -            
  352. +            usb_core_do_clear_feature(USB_RECIP_ENDPOINT, req->wIndex, req->wValue);
  353.              usb_drv_send(EP_CONTROL, NULL, 0);
  354.              break;
  355.          case USB_REQ_SET_FEATURE:
  356. +            logf("usb_core: SET FEATURE (%d)", req->wValue);
  357.              if(req->wValue == USB_ENDPOINT_HALT)
  358.                 usb_drv_stall(EP_NUM(req->wIndex), true, EP_DIR(req->wIndex));
  359.              
  360. diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
  361. index dbcf4a2..d2b2a5e 100644
  362. --- a/firmware/usbstack/usb_storage.c
  363. +++ b/firmware/usbstack/usb_storage.c
  364. @@ -753,6 +753,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
  365.      unsigned int block_size_mult = 1;
  366.  
  367.      if(letoh32(cbw->signature) != CBW_SIGNATURE) {
  368. +        logf("ums: bad cbw signature (%x)", cbw->signature);
  369.          usb_drv_stall(ep_in, true,true);
  370.          usb_drv_stall(ep_out, true,false);
  371.          return;
  372. @@ -1151,6 +1152,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
  373.  
  374.          default:
  375.              logf("scsi unknown cmd %x",cbw->command_block[0x0]);
  376. +            usb_drv_stall(ep_in, true,true);
  377.              send_csw(UMS_STATUS_FAIL);
  378.              cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST;
  379.              cur_sense_data.asc=ASC_INVALID_COMMAND;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement