usbcas.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. LUFA Library
  3. Copyright (C) Dean Camera, 2021.
  4. dean [at] fourwalledcubicle [dot] com
  5. www.lufa-lib.org
  6. */
  7. /*
  8. Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com)
  9. Permission to use, copy, modify, distribute, and sell this
  10. software and its documentation for any purpose is hereby granted
  11. without fee, provided that the above copyright notice appear in
  12. all copies and that both that the copyright notice and this
  13. permission notice and warranty disclaimer appear in supporting
  14. documentation, and that the name of the author not be used in
  15. advertising or publicity pertaining to distribution of the
  16. software without specific, written prior permission.
  17. The author disclaims all warranties with regard to this
  18. software, including all implied warranties of merchantability
  19. and fitness. In no event shall the author be liable for any
  20. special, indirect or consequential damages or any damages
  21. whatsoever resulting from loss of use, data or profits, whether
  22. in an action of contract, negligence or other tortious action,
  23. arising out of or in connection with the use or performance of
  24. this software.
  25. */
  26. /** \file
  27. *
  28. * Header file for usbcas.c (USB serial to ABC cassette)
  29. */
  30. #ifndef _USB_CAS_H_
  31. #define _USB_CAS_H_
  32. /* Includes: */
  33. #include <avr/io.h>
  34. #include <avr/wdt.h>
  35. #include <avr/interrupt.h>
  36. #include <avr/power.h>
  37. #include "Descriptors.h"
  38. #include <LUFA/Drivers/Peripheral/SerialSPI.h>
  39. #include <LUFA/Drivers/Misc/RingBuffer.h>
  40. #include <LUFA/Drivers/USB/USB.h>
  41. #include <LUFA/Platform/Platform.h>
  42. /* Cassette header block data */
  43. struct cas_hdr_block {
  44. uint8_t filename[11]; /* Mangled filename */
  45. uint8_t divisor; /* Baudrate divisor */
  46. uint8_t zero[238]; /* Unused, must be zero */
  47. uint16_t nblocks; /* Data block count (for CASDISK) */
  48. };
  49. /* Cassette block data format */
  50. struct cas_block_data {
  51. uint8_t leadin[32]; /* 0x00 */
  52. uint8_t sync[3]; /* 0x16 */
  53. uint8_t stx; /* 0x02 */
  54. uint8_t blktype; /* 0x00 for data, 0xff for filename */
  55. uint16_t blkno; /* Block number (littleendian) */
  56. union {
  57. uint8_t data[253]; /* Actual data */
  58. struct cas_hdr_block hdr;
  59. };
  60. uint8_t etx; /* 0x03 */
  61. uint16_t csum; /* Checksum (littleendian) */
  62. uint8_t leadout[1]; /* 0x00 */
  63. } __attribute__((packed));
  64. /* Cassette block plus metadata */
  65. struct cas_block {
  66. volatile bool ready; /* Filled with data */
  67. uint8_t divisor; /* Transmission divisor (0 = unchanged) */
  68. unsigned int pause; /* Post-block delay */
  69. unsigned int offset; /* Offset into data buffer */
  70. struct cas_block *next; /* Next block pointer */
  71. struct cas_block_data data;
  72. };
  73. /* Function Prototypes: */
  74. void SetupHardware(void);
  75. void do_usb_tasks(void);
  76. void EVENT_USB_Device_Connect(void);
  77. void EVENT_USB_Device_Disconnect(void);
  78. void EVENT_USB_Device_ConfigurationChanged(void);
  79. void EVENT_USB_Device_ControlRequest(void);
  80. void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
  81. void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
  82. /* Enable the TX ISR which enables sending data */
  83. static inline ATTR_ALWAYS_INLINE void fmtx_enable(void)
  84. {
  85. UCSR1B |= (1 << UDRIE1);
  86. }
  87. void fmtx_drain(void);
  88. void fmtx_init(void);
  89. bool fmtx_full(void);
  90. void fmtx_recv_byte(uint8_t byte);
  91. extern bool _motor_relay;
  92. static inline ATTR_ALWAYS_INLINE bool motor_relay(void)
  93. {
  94. return _motor_relay;
  95. }
  96. extern uint16_t _modem_status;
  97. static inline ATTR_ALWAYS_INLINE void set_modem_status(uint16_t what)
  98. {
  99. _modem_status |= what;
  100. }
  101. void fmrx_init(void);
  102. void fmrx_set_speed(uint8_t divisor);
  103. void fmrx_recv_byte(uint8_t byte);
  104. void fmrx_motor_off(void);
  105. void go_to_bootloader(void);
  106. /* Parameters */
  107. #define CAS_BASE_CLOCK (1500000/16) /* What ABC800 uses */
  108. #define CAS_DIVISOR_ABC80 129
  109. #define CAS_BAUDRATE_ABC800 35
  110. #endif