usb_bulk.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * =====================================================================================
  3. *
  4. * ________ .__ __ ________ ____ ________
  5. * \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/
  6. * / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \
  7. * / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \
  8. * \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ /
  9. * \__> \/ \/ \/ \/ \/
  10. *
  11. * www.optixx.org
  12. *
  13. *
  14. * Version: 1.0
  15. * Created: 07/21/2009 03:32:16 PM
  16. * Author: david@optixx.org
  17. *
  18. * =====================================================================================
  19. */
  20. #include <avr/io.h>
  21. #include <avr/pgmspace.h> /* required by usbdrv.h */
  22. #include <avr/interrupt.h> /* for sei() */
  23. #include <util/delay.h> /* for _delay_ms() */
  24. #include <stdlib.h>
  25. #include "usbdrv.h"
  26. #include "oddebug.h" /* This is also an example for using debug 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 "info.h"
  33. #include "crc.h"
  34. #include "usb_bulk.h"
  35. extern usb_transaction_t usb_trans;
  36. uint8_t usbFunctionWrite(uint8_t * data, uint8_t len)
  37. {
  38. uint8_t *ptr;
  39. uint8_t i;
  40. if (len > usb_trans.rx_remaining) {
  41. info_P(PSTR
  42. ("ERROR:usbFunctionWrite more data than expected remain: %i len: %i\n"),
  43. usb_trans.rx_remaining, len);
  44. len = usb_trans.rx_remaining;
  45. }
  46. if (usb_trans.req_state == REQ_STATUS_BULK_UPLOAD) {
  47. usb_trans.rx_remaining -= len;
  48. debug_P(DEBUG_USB_TRANS,
  49. PSTR
  50. ("usbFunctionWrite REQ_STATUS_BULK_UPLOAD addr: 0x%08lx len: %i rx_remaining=%i\n"),
  51. usb_trans.req_addr, len, usb_trans.rx_remaining);
  52. ptr = data;
  53. i = len;
  54. while (i--) {
  55. sram_bulk_write(*ptr++);
  56. sram_bulk_write_next();
  57. }
  58. }
  59. return len;
  60. }
  61. uint8_t usbFunctionRead(uint8_t * data, uint8_t len)
  62. {
  63. uint8_t i;
  64. if (len > usb_trans.tx_remaining)
  65. len = usb_trans.tx_remaining;
  66. usb_trans.tx_remaining -= len;
  67. debug_P(DEBUG_USB_TRANS, PSTR("usbFunctionRead len=%i tx_remaining=%i \n"),
  68. len, usb_trans.tx_remaining);
  69. for (i = 0; i < len; i++) {
  70. *data = usb_trans.tx_buffer[len];
  71. data++;
  72. }
  73. return len;
  74. }