usb_bulk.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * =====================================================================================
  3. *
  4. * .d8888b 88888b. .d88b. .d8888b 888d888 8888b. 88888b.d88b.
  5. * 88K 888 "88b d8P Y8b 88K 888P" "88b 888 "888 "88b
  6. * "Y8888b. 888 888 88888888 "Y8888b. 888 .d888888 888 888 888
  7. * X88 888 888 Y8b. X88 888 888 888 888 888 888
  8. * 88888P' 888 888 "Y8888 88888P' 888 "Y888888 888 888 888
  9. *
  10. * www.optixx.org
  11. *
  12. *
  13. * Version: 1.0
  14. * Created: 07/21/2009 03:32:16 PM
  15. * Author: david@optixx.org
  16. *
  17. * =====================================================================================
  18. */
  19. #include <avr/io.h>
  20. #include <avr/pgmspace.h> /* required by usbdrv.h */
  21. #include <avr/interrupt.h> /* for sei() */
  22. #include <util/delay.h> /* for _delay_ms() */
  23. #include <stdlib.h>
  24. #include "usbdrv.h"
  25. #include "oddebug.h" /* This is also an example for using debug
  26. * macros */
  27. #include "config.h"
  28. #include "requests.h" /* The custom request numbers we use */
  29. #include "uart.h"
  30. #include "sram.h"
  31. #include "debug.h"
  32. #include "crc.h"
  33. #include "usb_bulk.h"
  34. extern uint8_t read_buffer[TRANSFER_BUFFER_SIZE];
  35. extern uint32_t req_addr;
  36. extern uint32_t req_size;
  37. extern uint8_t req_bank;
  38. extern uint32_t req_bank_size;
  39. extern uint8_t req_state;
  40. extern uint8_t rx_remaining;
  41. extern uint8_t tx_remaining;
  42. extern uint8_t tx_buffer[32];
  43. extern uint16_t crc;
  44. uint8_t usbFunctionWrite(uint8_t * data, uint8_t len)
  45. {
  46. uint8_t *ptr;
  47. uint8_t i;
  48. if (len > rx_remaining) {
  49. printf("ERROR:usbFunctionWrite more data than expected remain: %i len: %i\n",
  50. rx_remaining, len);
  51. len = rx_remaining;
  52. }
  53. if (req_state == REQ_STATUS_UPLOAD) {
  54. rx_remaining -= len;
  55. debug(DEBUG_USB_TRANS,"usbFunctionWrite REQ_STATUS_UPLOAD addr: 0x%08lx len: %i rx_remaining=%i\n",
  56. req_addr, len, rx_remaining);
  57. debug(DEBUG_USB_TRANS,"usbFunctionWrite %02x %02x %02x %02x %02x %02x %02x %x\n",
  58. data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]);
  59. sram_copy(req_addr, data, len);
  60. req_addr += len;
  61. } else if (req_state == REQ_STATUS_BULK_UPLOAD) {
  62. rx_remaining -= len;
  63. debug(DEBUG_USB_TRANS,"usbFunctionWrite REQ_STATUS_BULK_UPLOAD addr: 0x%08lx len: %i rx_remaining=%i\n",
  64. req_addr, len, rx_remaining);
  65. ptr = data;
  66. i = len;
  67. while(i--){
  68. sram_bulk_write(*ptr++);
  69. sram_bulk_write_next();
  70. }
  71. }
  72. /* test this */
  73. //return rx_remaining == 0
  74. return len;
  75. }
  76. uint8_t usbFunctionRead(uint8_t * data, uint8_t len)
  77. {
  78. uint8_t i;
  79. if (len > tx_remaining)
  80. len = tx_remaining;
  81. tx_remaining -= len;
  82. debug(DEBUG_USB_TRANS,"usbFunctionRead len=%i tx_remaining=%i \n", len, tx_remaining);
  83. for (i = 0; i < len; i++) {
  84. *data = tx_buffer[len];
  85. data++;
  86. }
  87. return len;
  88. }