Droidboot API

From Android Boot Manager
Revision as of 12:11, 26 January 2023 by Luka177 (talk | contribs)
Jump to navigation Jump to search

ABM version 0.3 introduced a universal api to have single gui, lvgl, config parser etc. across all devices. That is achieved by having a separated droidboot_gui, bootloader, and HAL (hardware abstraction layer) that implements common functionality needed to use ABM. Here is the list of function you should implement to get ABM running on your bootloader.

Display related

droidboot_internal_get_display_height

int droidboot_internal_get_display_height()

Should return display height in pixels

droidboot_internal_get_display_width

int droidboot_internal_get_display_width()

Should return display width in pixels

droidboot_internal_get_disp_buffer_height

int droidboot_internal_get_disp_buffer_height()

Should return int that represents number of horizontal lines in lvgl image buffer, usually is same as droidboot_internal_get_display_height.

droidboot_internal_use_double_buffering

bool droidboot_internal_use_double_buffering()

Should return true if you want to have double image buffer for lvgl, if you have planty of free RAM should be just hardcoded return true; It do make display refrash faster in some cases.

droidboot_internal_fb_flush

void droidboot_fb_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)

Should draw color_p buffer on screen, coordinates are stored in area->x1, area->y1, area->x2, area->y2 after doing so should call lv_disp_flush_ready(disp_drv); Example implementations: If you have adress of fb in memory:

lv_coord_t w = (act_x2 - act_x1 + 1);
long int location = 0;
long int byte_location = 0;
unsigned char bit_location = 0;
int32_t y;
for(y = act_y1; y <= act_y2; y++) {
    location = (act_x1 + 0) + (y + 0) * upriv->line_length / 4;
    memcpy(&fbp32[location], (uint32_t *)color_p, (act_x2 - act_x1 + 1) * 4);
    color_p += w;
}
lv_disp_flush_ready(disp_drv);

Where fbp32 is pointer to framebuffer. If you have function to change pixel color:

time_t t;
int32_t x, y;
for(y = area->y1; y <= area->y2; y++) {
    for(x = area->x1; x <= area->x2; x++) {
        fbcon_draw_pixel(x, y, 0xff << 24 | color_p->ch.red << 16 | color_p->ch.green << 8 | color_p->ch.blue  ); /* Put a pixel to the display.*/
        color_p++;
    }
}
// Update display
fbcon_flush();
// Inform the graphics library that we are ready with the flushing
lv_disp_flush_ready(disp_drv);

Where fbcon_draw_pixel is function to update single pixel and fbcon_flush is function to flush whole display.