/* LUFA Library Copyright (C) Dean Camera, 2021. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file * * Header file for usbcas.c (USB serial to ABC cassette) */ #ifndef _USB_CAS_H_ #define _USB_CAS_H_ /* Includes: */ #include #include #include #include #include "Descriptors.h" #include #include #include #include /* Cassette header block data */ struct cas_hdr_block { uint8_t filename[11]; /* Mangled filename */ uint8_t divisor; /* Baudrate divisor */ uint8_t zero[238]; /* Unused, must be zero */ uint16_t nblocks; /* Data block count (for CASDISK) */ }; /* Cassette block data format */ struct cas_block_data { uint8_t leadin[32]; /* 0x00 */ uint8_t sync[3]; /* 0x16 */ uint8_t stx; /* 0x02 */ uint8_t blktype; /* 0x00 for data, 0xff for filename */ uint16_t blkno; /* Block number (littleendian) */ union { uint8_t data[253]; /* Actual data */ struct cas_hdr_block hdr; }; uint8_t etx; /* 0x03 */ uint16_t csum; /* Checksum (littleendian) */ uint8_t leadout[1]; /* 0x00 */ } __attribute__((packed)); /* Cassette block plus metadata */ struct cas_block { volatile bool ready; /* Filled with data */ uint8_t divisor; /* Transmission divisor (0 = unchanged) */ unsigned int pause; /* Post-block delay */ unsigned int offset; /* Offset into data buffer */ struct cas_block *next; /* Next block pointer */ struct cas_block_data data; }; /* Function Prototypes: */ void SetupHardware(void); void do_usb_tasks(void); void EVENT_USB_Device_Connect(void); void EVENT_USB_Device_Disconnect(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_ControlRequest(void); void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); /* Enable the TX ISR which enables sending data */ static inline ATTR_ALWAYS_INLINE void fmtx_enable(void) { UCSR1B |= (1 << UDRIE1); } void fmtx_drain(void); void fmtx_init(void); bool fmtx_full(void); void fmtx_recv_byte(uint8_t byte); extern bool _motor_relay; static inline ATTR_ALWAYS_INLINE bool motor_relay(void) { return _motor_relay; } extern uint16_t _modem_status; static inline ATTR_ALWAYS_INLINE void set_modem_status(uint16_t what) { _modem_status |= what; } void fmrx_init(void); void fmrx_set_speed(uint8_t divisor); void fmrx_recv_byte(uint8_t byte); void fmrx_motor_off(void); void go_to_bootloader(void); /* Parameters */ #define CAS_BASE_CLOCK (1500000/16) /* What ABC800 uses */ #define CAS_DIVISOR_ABC80 129 #define CAS_BAUDRATE_ABC800 35 #endif