#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); ret <<= 1; value <<= 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_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); (void)spi_send_byte(0); (void)spi_send_byte(0); } static void spi_send_init() { spi_send_packet(TABBY_PRINTER_PACKET_INIT, NULL, 0); } static void spi_send_job(uint8_t sheets, uint8_t linefeeds, uint8_t palette, uint8_t density) { uint8_t job[4] = { sheets, linefeeds, palette, density }; spi_send_packet(TABBY_PRINTER_PACKET_JOB, job, sizeof(job)); } static void spi_send_data(uint8_t *data, uint16_t size) { spi_send_packet(TABBY_PRINTER_PACKET_DATA, data, size); } static void spi_send_sheet(uint8_t *sheet, uint16_t size) { int i; spi_send_init(); for (i=0; i