qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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);