mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
[DP/GFX/SDMMC] Bugfixes
- Sanitize framebuffer. Original idea from @StevenMattera - Change clear framebuffer to memset (for grey colors), for performance (we don't use alpha blending, so it does not matter to set it to 0xFF). - Enable screen backlight after gfx init - Reduce wait time for emmc/sd read/write retries to 100ms.
This commit is contained in:
parent
b299cb40c7
commit
16ac26f583
8 changed files with 43 additions and 21 deletions
16
ipl/di.c
16
ipl/di.c
|
@ -14,6 +14,8 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "di.h"
|
||||
#include "t210.h"
|
||||
#include "util.h"
|
||||
|
@ -131,9 +133,14 @@ void display_init()
|
|||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_config_11, 113);
|
||||
}
|
||||
|
||||
void display_backlight(u8 enable)
|
||||
{
|
||||
GPIO_6(0x24) = (GPIO_6(0x24) & 0xFFFFFFFE) | (enable & 1);
|
||||
}
|
||||
|
||||
void display_end()
|
||||
{
|
||||
GPIO_6(0x24) &= 0xFFFFFFFE;
|
||||
display_backlight(0);
|
||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 1;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x2805;
|
||||
|
||||
|
@ -197,17 +204,20 @@ void display_color_screen(u32 color)
|
|||
|
||||
sleep(35000);
|
||||
|
||||
GPIO_6(0x24) = GPIO_6(0x24) & 0xFFFFFFFE | 1;
|
||||
display_backlight(1);
|
||||
}
|
||||
|
||||
u32 *display_init_framebuffer(u32 *fb)
|
||||
{
|
||||
//Sanitize framebuffer area. Aligned to 4MB.
|
||||
memset((u32 *)0xC0000000, 0, 0x400000);
|
||||
//This configures the framebuffer @ 0xC0000000 with a resolution of 1280x720 (line stride 768).
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer, 32);
|
||||
|
||||
sleep(35000);
|
||||
|
||||
GPIO_6(0x24) = GPIO_6(0x24) & 0xFFFFFFFE | 1;
|
||||
//Enable backlight
|
||||
//display_backlight(1);
|
||||
|
||||
return (u32 *)0xC0000000;
|
||||
}
|
||||
|
|
3
ipl/di.h
3
ipl/di.h
|
@ -341,6 +341,9 @@ void display_end();
|
|||
/*! Show one single color on the display. */
|
||||
void display_color_screen(u32 color);
|
||||
|
||||
/*! Switches screen backlight ON/OFF. */
|
||||
void display_backlight(u8 enable);
|
||||
|
||||
/*! Init display in full 1280x720 resolution (32bpp, line stride 768, framebuffer size = 1280*768*4 bytes). */
|
||||
u32 *display_init_framebuffer();
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include "gfx.h"
|
||||
|
||||
static const u8 _gfx_font[] = {
|
||||
|
@ -76,7 +77,12 @@ void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride)
|
|||
ctxt->stride = stride;
|
||||
}
|
||||
|
||||
void gfx_clear(gfx_ctxt_t *ctxt, u32 color)
|
||||
void gfx_clear_grey(gfx_ctxt_t *ctxt, u8 color)
|
||||
{
|
||||
memset(ctxt->fb, color, 0x400000);
|
||||
}
|
||||
|
||||
void gfx_clear_color(gfx_ctxt_t *ctxt, u32 color)
|
||||
{
|
||||
for (u32 i = 0; i < ctxt->height * ctxt->stride; i++)
|
||||
ctxt->fb[i] = color;
|
||||
|
|
|
@ -38,7 +38,8 @@ typedef struct _gfx_con_t
|
|||
} gfx_con_t;
|
||||
|
||||
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride);
|
||||
void gfx_clear(gfx_ctxt_t *ctxt, u32 color);
|
||||
void gfx_clear_grey(gfx_ctxt_t *ctxt, u8 color);
|
||||
void gfx_clear_color(gfx_ctxt_t *ctxt, u32 color);
|
||||
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt);
|
||||
void gfx_con_setcol(gfx_con_t *con, u32 fgcol, int fillbg, u32 bgcol);
|
||||
void gfx_con_getpos(gfx_con_t *con, u32 *x, u32 *y);
|
||||
|
|
|
@ -394,7 +394,7 @@ int hos_launch(ini_sec_t *cfg)
|
|||
memset(&ctxt, 0, sizeof(launch_ctxt_t));
|
||||
list_init(&ctxt.kip1_list);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (cfg && !_config(&ctxt, cfg))
|
||||
|
|
25
ipl/main.c
25
ipl/main.c
|
@ -336,7 +336,7 @@ void config_hw()
|
|||
|
||||
void print_fuseinfo()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
|
@ -365,7 +365,7 @@ void print_fuseinfo()
|
|||
|
||||
void print_kfuseinfo()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, "%kKFuse contents:\n\n%k", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
|
@ -398,7 +398,7 @@ void print_kfuseinfo()
|
|||
|
||||
void print_mmc_info()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||
|
@ -541,7 +541,7 @@ out:
|
|||
|
||||
void print_sdcard_info()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||
|
@ -592,7 +592,7 @@ void print_sdcard_info()
|
|||
|
||||
void print_tsec_key()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
sdmmc_storage_t storage;
|
||||
|
@ -1014,7 +1014,7 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
|||
{
|
||||
int res = 0;
|
||||
u32 timer = 0;
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (!sd_mount())
|
||||
|
@ -1123,7 +1123,7 @@ void dump_package1()
|
|||
memset(secmon, 0, 0x40000);
|
||||
memset(loader, 0, 0x40000);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (!sd_mount())
|
||||
|
@ -1216,7 +1216,7 @@ void launch_firmware()
|
|||
ini_sec_t *cfg_sec = NULL;
|
||||
LIST_INIT(ini_sections);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (sd_mount())
|
||||
|
@ -1257,8 +1257,8 @@ void launch_firmware()
|
|||
|
||||
if (!cfg_sec)
|
||||
{
|
||||
gfx_printf(&gfx_con, "\nUsing default launch configuration...\n");
|
||||
sleep(3000000);
|
||||
gfx_printf(&gfx_con, "Using default launch configuration...\n");
|
||||
}
|
||||
|
||||
if (!hos_launch(cfg_sec))
|
||||
|
@ -1328,7 +1328,7 @@ void about()
|
|||
" (/` ( (` ) ) '-; %k[switchbrew]%k\n"
|
||||
" ` '-; (-'%k";
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, octopus, 0xFFFFCC00, 0xFFCCCCCC,
|
||||
|
@ -1435,9 +1435,12 @@ void ipl_main()
|
|||
//display_color_screen(0xAABBCCDD);
|
||||
u32 *fb = display_init_framebuffer();
|
||||
gfx_init_ctxt(&gfx_ctxt, fb, 720, 1280, 768);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||
gfx_con_init(&gfx_con, &gfx_ctxt);
|
||||
|
||||
//Enable backlight after initializing gfx
|
||||
display_backlight(1);
|
||||
|
||||
while (1)
|
||||
tui_do_menu(&gfx_con, &menu_top);
|
||||
|
||||
|
|
|
@ -174,8 +174,7 @@ static int _sdmmc_storage_readwrite(sdmmc_storage_t *storage, u32 sector, u32 nu
|
|||
else
|
||||
retries--;
|
||||
|
||||
sleep(500000);
|
||||
|
||||
sleep(100000);
|
||||
} while (retries);
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ void *tui_do_menu(gfx_con_t *con, menu_t *menu)
|
|||
int idx = 0, cnt;
|
||||
int prev_idx = 0;
|
||||
|
||||
gfx_clear(con->gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(con->gfx_ctxt, 0x1B);
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
@ -124,7 +124,7 @@ void *tui_do_menu(gfx_con_t *con, menu_t *menu)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
gfx_clear(con->gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_clear_grey(con->gfx_ctxt, 0x1B);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue