Guest User

Untitled

a guest
Dec 14th, 2012
57
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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;
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×