#include #include #include #include #include #include #include static void spi_init() { SC_OUTPUT(); SO_OUTPUT(); SI_INPUT(); SI_PULLUP(); SC_HIGH(); SO_LOW(); } static uint8_t spi_send_byte(uint8_t value) { uint8_t i, ret = 0; for (i=0; i<8; i++) { SC_LOW(); if (value & 0x80) { SO_HIGH(); } else { SO_LOW(); } _delay_us(SPI_PULSE_USEC); value <<= 1; ret <<= 1; if (SI_IS_HIGH()) { ret |= 1; } SC_HIGH(); _delay_us(SPI_PULSE_USEC); } return ret; } static uint16_t checksum(tabby_printer_packet *header, uint8_t *body) { uint16_t sum = 0; int i; for (i=2; idata[i]; } for (i=0; isize; i++) { sum += body[i]; } return sum; } static void spi_send_packet(uint8_t type, uint8_t *body, uint16_t size, tabby_printer_response *response) { tabby_printer_packet header = { .preamble = { TABBY_PRINTER_SYNC_1, TABBY_PRINTER_SYNC_2 }, .type = type, .compression = TABBY_PRINTER_COMPRESSION_NONE, .size = size }; uint16_t sum = checksum(&header, body); int i; for (i=0; i> 8); response->device = spi_send_byte(0); response->status = spi_send_byte(0); } static void spi_send_init(tabby_printer_response *response) { spi_send_packet(TABBY_PRINTER_PACKET_INIT, NULL, 0, response); } static void spi_send_inquiry(tabby_printer_response *response) { spi_send_packet(TABBY_PRINTER_PACKET_INQUIRY, NULL, 0, response); } static void spi_send_job(tabby_printer_job *job, tabby_printer_response *response) { spi_send_packet(TABBY_PRINTER_PACKET_JOB, job->data, sizeof(job), response); } static void spi_send_data(uint8_t *data, uint16_t size, tabby_printer_response *response) { spi_send_packet(TABBY_PRINTER_PACKET_DATA, data, size, response); } static void spi_send_sheet(uint8_t *sheet, uint16_t size, tabby_printer_response *response) { int i; spi_send_init(response); for (i=0; i