qp_internal_driver.h (4280B)
1 // Copyright 2021-2023 Nick Brassel (@tzarc) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #pragma once 5 6 #include "qp_internal.h" 7 8 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 // Driver callbacks 10 11 typedef bool (*painter_driver_init_func)(painter_device_t device, painter_rotation_t rotation); 12 typedef bool (*painter_driver_power_func)(painter_device_t device, bool power_on); 13 typedef bool (*painter_driver_clear_func)(painter_device_t device); 14 typedef bool (*painter_driver_flush_func)(painter_device_t device); 15 typedef bool (*painter_driver_viewport_func)(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom); 16 typedef bool (*painter_driver_pixdata_func)(painter_device_t device, const void *pixel_data, uint32_t native_pixel_count); 17 typedef bool (*painter_driver_convert_palette_func)(painter_device_t device, int16_t palette_size, qp_pixel_t *palette); 18 typedef bool (*painter_driver_append_pixels)(painter_device_t device, uint8_t *target_buffer, qp_pixel_t *palette, uint32_t pixel_offset, uint32_t pixel_count, uint8_t *palette_indices); 19 typedef bool (*painter_driver_append_pixdata)(painter_device_t device, uint8_t *target_buffer, uint32_t pixdata_offset, uint8_t pixdata_byte); 20 21 // Driver vtable definition 22 typedef struct painter_driver_vtable_t { 23 painter_driver_init_func init; 24 painter_driver_power_func power; 25 painter_driver_clear_func clear; 26 painter_driver_flush_func flush; 27 painter_driver_viewport_func viewport; 28 painter_driver_pixdata_func pixdata; 29 painter_driver_convert_palette_func palette_convert; 30 painter_driver_append_pixels append_pixels; 31 painter_driver_append_pixdata append_pixdata; 32 } painter_driver_vtable_t; 33 34 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 35 // Comms callbacks 36 37 typedef bool (*painter_driver_comms_init_func)(painter_device_t device); 38 typedef bool (*painter_driver_comms_start_func)(painter_device_t device); 39 typedef bool (*painter_driver_comms_stop_func)(painter_device_t device); 40 typedef uint32_t (*painter_driver_comms_send_func)(painter_device_t device, const void *data, uint32_t byte_count); 41 42 typedef struct painter_comms_vtable_t { 43 painter_driver_comms_init_func comms_init; 44 painter_driver_comms_start_func comms_start; 45 painter_driver_comms_stop_func comms_stop; 46 painter_driver_comms_send_func comms_send; 47 } painter_comms_vtable_t; 48 49 typedef bool (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd); 50 typedef bool (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len); 51 52 typedef struct painter_comms_with_command_vtable_t { 53 painter_comms_vtable_t base; // must be first, so this object can be cast from the painter_comms_vtable_t* type 54 painter_driver_comms_send_command_func send_command; 55 painter_driver_comms_bulk_command_sequence bulk_command_sequence; 56 } painter_comms_with_command_vtable_t; 57 58 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 59 // Driver base definition 60 61 typedef struct painter_driver_t { 62 const painter_driver_vtable_t *driver_vtable; 63 const painter_comms_vtable_t *comms_vtable; 64 65 // Flag signifying if validation was successful 66 bool validate_ok; 67 68 // Panel geometry 69 uint16_t panel_width; 70 uint16_t panel_height; 71 72 // Target drawing rotation 73 painter_rotation_t rotation; 74 75 // Automated offsets for setting viewport 76 uint16_t offset_x; 77 uint16_t offset_y; 78 79 // Number of bits per pixel, used for determining how many pixels can be sent during a transmission of the pixdata buffer 80 uint8_t native_bits_per_pixel; 81 82 // Comms config pointer -- needs to point to an appropriate comms config if the comms driver requires it. 83 void *comms_config; 84 } painter_driver_t; 85 86 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 87 // Device internals 88 89 bool qp_internal_register_device(painter_device_t driver);