diff --git a/Android.mk b/Android.mk index b1c1d1c..38d3d61 100644 --- a/Android.mk +++ b/Android.mk @@ -58,7 +58,6 @@ endif include $(BUILD_EXECUTABLE) - # Trampoline include $(multirom_local_path)/trampoline/Android.mk diff --git a/adbd b/adbd index 012280c..47afc72 160000 --- a/adbd +++ b/adbd @@ -1 +1 @@ -Subproject commit 012280c7a478b44790ffd962480329bdebc6d6e7 +Subproject commit 47afc728548430f4e51c90f16093a9c3636a3f2d diff --git a/device_defines.mk b/device_defines.mk index ef36b88..494e67a 100644 --- a/device_defines.mk +++ b/device_defines.mk @@ -25,6 +25,8 @@ endif ifeq ($(MR_PIXEL_FORMAT),"RGBX_8888") LOCAL_CFLAGS += -DRECOVERY_RGBX +else ifeq ($(MR_PIXEL_FORMAT),"RGBA_8888") + LOCAL_CFLAGS += -DRECOVERY_RGBA else ifeq ($(MR_PIXEL_FORMAT),"BGRA_8888") LOCAL_CFLAGS += -DRECOVERY_BGRA else ifeq ($(MR_PIXEL_FORMAT),"RGB_565") diff --git a/kexec-tools b/kexec-tools deleted file mode 160000 index 1945c66..0000000 --- a/kexec-tools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1945c661d8b117297d3ac44ea071556298c31ec3 diff --git a/kexec-tools-arm64 b/kexec-tools-arm64 index 98d3c38..116d9ac 160000 --- a/kexec-tools-arm64 +++ b/kexec-tools-arm64 @@ -1 +1 @@ -Subproject commit 98d3c3837237cad9512146ad561e639cee8e3163 +Subproject commit 116d9ac04e7a0d461e80e13d9ca343ab24da1be4 diff --git a/lib/framebuffer.c b/lib/framebuffer.c index 49eada9..0eb0105 100644 --- a/lib/framebuffer.c +++ b/lib/framebuffer.c @@ -384,6 +384,11 @@ px_type fb_convert_color(uint32_t c) #elif defined(RECOVERY_RGBX) // A B G R return (c & 0xFF000000) | ((c & 0xFF) << 16) | (c & 0xFF00) | ((c & 0xFF0000) >> 16); +#elif defined(RECOVERY_RGBA) + return (c & 0xFF000000) | ((c & 0xFF) << 16) | (c & 0xFF00) | ((c & 0xFF0000) >> 16); +#elif defined(RECOVERY_ABGR) + // A B G R + return (c & 0xFF000000) | ((c & 0xFF) << 16) | (c & 0xFF00) | ((c & 0xFF0000) >> 16); #elif defined(RECOVERY_RGB_565) const uint8_t alpha_pct = (((c >> 24) & 0xFF)*100) / 0xFF; // R G B @@ -601,7 +606,7 @@ void fb_draw_rect(fb_rect *r) if(alpha == 0) return; -#ifdef RECOVERY_RGBX +#if defined(RECOVERY_RGBX) || (RECOVERY_RGBA) || defined(RECOVERY_ABGR) const uint32_t premult_color_rb = ((color & 0xFF00FF) * (alpha)) >> 8; const uint32_t premult_color_g = ((color & 0x00FF00) * (alpha)) >> 8; #elif defined(RECOVERY_BGRA) @@ -646,7 +651,7 @@ void fb_draw_rect(fb_rect *r) #else for(x = 0; x < rendered_w; ++x) { - #ifdef RECOVERY_RGBX + #if defined(RECOVERY_RGBX) || defined(RECOVERY_RGBA) || defined(RECOVERY_ABGR) const uint32_t rb = (premult_color_rb & 0xFF00FF) + ((inv_alpha * (*bits & 0xFF00FF)) >> 8); const uint32_t g = (premult_color_g & 0x00FF00) + ((inv_alpha * (*bits & 0x00FF00)) >> 8); *bits = 0xFF000000 | (rb & 0xFF00FF) | (g & 0x00FF00); @@ -1089,7 +1094,7 @@ void *fb_draw_thread_work(UNUSED void *cookie) clock_gettime(CLOCK_MONOTONIC, &curr); diff = timespec_diff(&last, &curr); - expected.__val = 1; // might be reseted by atomic_compare_exchange_strong +// expected.__val = 1; // might be reseted by atomic_compare_exchange_strong pthread_mutex_lock(&fb_draw_mutex); if(atomic_compare_exchange_strong(&fb_draw_requested, &expected, 0)) { diff --git a/lib/framebuffer.h b/lib/framebuffer.h index 2eeec95..f3f9c21 100644 --- a/lib/framebuffer.h +++ b/lib/framebuffer.h @@ -23,7 +23,7 @@ #include #include -#if defined(RECOVERY_BGRA) || defined(RECOVERY_RGBX) +#if defined(RECOVERY_BGRA) || defined(RECOVERY_RGBX) || defined(RECOVERY_RGBA) || defined(RECOVERY_ABGR) #define PIXEL_SIZE 4 typedef uint32_t px_type; #else @@ -52,11 +52,29 @@ typedef uint16_t px_type; #define PX_GET_G(px) ((px & 0xFF00) >> 8) #define PX_GET_B(px) ((px & 0xFF0000) >> 16) #define PX_GET_A(px) ((px & 0xFF000000) >> 24) +#elif defined(RECOVERY_RGBA) +#define PX_IDX_A 3 +#define PX_IDX_R 0 +#define PX_IDX_G 1 +#define PX_IDX_B 2 +#define PX_GET_R(px) (px & 0xFF) +#define PX_GET_G(px) ((px & 0xFF00) >> 8) +#define PX_GET_B(px) ((px & 0xFF0000) >> 16) +#define PX_GET_A(px) ((px & 0xFF000000) >> 24) #elif defined(RECOVERY_RGB_565) #define PX_GET_R(px) (((((px & 0x1F)*100)/31)*0xFF)/100) #define PX_GET_G(px) ((((((px & 0x7E0) >> 5)*100)/63)*0xFF)/100) #define PX_GET_B(px) ((((((px & 0xF800) >> 11)*100)/31)*0xFF)/100) #define PX_GET_A(px) (0xFF) +#elif defined(RECOVERY_ABGR) +#define PX_IDX_A 3 +#define PX_IDX_R 0 +#define PX_IDX_G 1 +#define PX_IDX_B 2 +#define PX_GET_R(px) ((px & 0xFF)) +#define PX_GET_G(px) ((px & 0xFF00) >> 8) +#define PX_GET_B(px) ((px & 0xFF0000) >> 16) +#define PX_GET_A(px) ((px & 0xFF000000) >> 24) #endif struct framebuffer { @@ -323,7 +341,7 @@ void fb_png_release(px_type *data); void fb_png_drop_unused(void); int fb_png_save_img(const char *path, int w, int h, int stride, px_type *data); -inline void center_text(fb_img *text, int targetX, int targetY, int targetW, int targetH); +void center_text(fb_img *text, int targetX, int targetY, int targetW, int targetH); int vt_set_mode(int graphics); diff --git a/lib/framebuffer_generic.c b/lib/framebuffer_generic.c index 76bc5bf..4dbc7f8 100644 --- a/lib/framebuffer_generic.c +++ b/lib/framebuffer_generic.c @@ -34,6 +34,8 @@ // for the code to know how many buffers we use #define NUM_BUFFERS 2 +unsigned int smem_len; + struct fb_generic_data { px_type *mapped[NUM_BUFFERS]; int active_buff; @@ -41,57 +43,39 @@ struct fb_generic_data { static int impl_open(struct framebuffer *fb) { - fb->vi.bits_per_pixel = PIXEL_SIZE * 8; + fb->vi.bits_per_pixel = 32; INFO("Pixel format: %dx%d @ %dbpp\n", fb->vi.xres, fb->vi.yres, fb->vi.bits_per_pixel); -#ifdef RECOVERY_BGRA - INFO("Pixel format: BGRA_8888\n"); - fb->vi.red.offset = 8; - fb->vi.red.length = 8; - fb->vi.green.offset = 16; - fb->vi.green.length = 8; - fb->vi.blue.offset = 24; - fb->vi.blue.length = 8; - fb->vi.transp.offset = 0; - fb->vi.transp.length = 8; -#elif defined(RECOVERY_RGBX) - INFO("Pixel format: RGBX_8888\n"); - fb->vi.red.offset = 24; - fb->vi.red.length = 8; - fb->vi.green.offset = 16; - fb->vi.green.length = 8; - fb->vi.blue.offset = 8; - fb->vi.blue.length = 8; - fb->vi.transp.offset = 0; - fb->vi.transp.length = 8; -#elif defined(RECOVERY_RGB_565) - INFO("Pixel format: RGB_565\n"); - fb->vi.blue.offset = 0; - fb->vi.green.offset = 5; - fb->vi.red.offset = 11; - fb->vi.blue.length = 5; - fb->vi.green.length = 6; - fb->vi.red.length = 5; - fb->vi.blue.msb_right = 0; - fb->vi.green.msb_right = 0; - fb->vi.red.msb_right = 0; - fb->vi.transp.offset = 0; - fb->vi.transp.length = 0; -#else -#error "Unknown pixel format" -#endif - fb->vi.vmode = FB_VMODE_NONINTERLACED; fb->vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->vi); + + ioctl(fb->fd, FBIOGET_FSCREENINFO, &fb->fi); + ioctl(fb->fd, FBIOGET_VSCREENINFO, &fb->vi); + + INFO("fb0 reports (possibly inaccurate):\n" + " vi.bits_per_pixel = %d\n" + " vi.red.offset = %3d .length = %3d\n" + " vi.green.offset = %3d .length = %3d\n" + " vi.blue.offset = %3d .length = %3d\n" + " vi.xres = %3d vi.yres = %3d fi.line_length = %3d\n", + + fb->vi.bits_per_pixel, + fb->vi.red.offset, fb->vi.red.length, + fb->vi.green.offset, fb->vi.green.length, + fb->vi.blue.offset, fb->vi.blue.length, fb->vi.xres, fb->vi.yres, fb->fi.line_length); + + smem_len = fb->vi.yres * fb->fi.line_length; + INFO("smem_len: %d\n",smem_len); // mmap and memset to 0 before setting the vi to prevent screen flickering during init - px_type *mapped = mmap(0, fb->fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0); + px_type *mapped = mmap(0, smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0); if (mapped == MAP_FAILED) return -1; - memset(mapped, 0, fb->fi.smem_len); - munmap(mapped, fb->fi.smem_len); + memset(mapped, 0, smem_len); + munmap(mapped, smem_len); if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->vi) < 0) { @@ -102,14 +86,14 @@ static int impl_open(struct framebuffer *fb) if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &fb->fi) < 0) return -1; - mapped = mmap(0, fb->fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0); + mapped = mmap(0, smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0); if (mapped == MAP_FAILED) return -1; struct fb_generic_data *data = mzalloc(sizeof(struct fb_generic_data)); data->mapped[0] = mapped; - data->mapped[1] = (px_type*) (((uint8_t*)mapped) + (fb->vi.yres * fb->fi.line_length)); + data->mapped[1] = (px_type*) calloc(fb->vi.yres * fb->fi.line_length, 1); fb->impl_data = data; @@ -124,9 +108,15 @@ static int impl_open(struct framebuffer *fb) static void impl_close(struct framebuffer *fb) { struct fb_generic_data *data = fb->impl_data; + __u32 dummy = 0; + if(data) { - munmap(data->mapped[0], fb->fi.smem_len); + memset(data->mapped[0], 0, smem_len); + ioctl(fb->fd, FBIOPAN_DISPLAY, &fb->vi); + + munmap(data->mapped[0], smem_len); + munmap(data->mapped[1], smem_len); free(data); fb->impl_data = NULL; } @@ -135,15 +125,11 @@ static void impl_close(struct framebuffer *fb) static int impl_update(struct framebuffer *fb) { struct fb_generic_data *data = fb->impl_data; + __u32 dummy = 0; - fb->vi.yres_virtual = fb->vi.yres * NUM_BUFFERS; - fb->vi.yoffset = data->active_buff * fb->vi.yres; - - if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->vi) < 0) - { - ERROR("active fb swap failed"); - return -1; - } + ioctl(fb->fd, FBIO_WAITFORVSYNC, &dummy); + memcpy(data->mapped[0], data->mapped[1], fb->vi.yres * fb->fi.line_length); + ioctl(fb->fd, FBIOPAN_DISPLAY, &fb->vi); return 0; } @@ -151,8 +137,7 @@ static int impl_update(struct framebuffer *fb) static void *impl_get_frame_dest(struct framebuffer *fb) { struct fb_generic_data *data = fb->impl_data; - data->active_buff = !data->active_buff; - return data->mapped[data->active_buff]; + return data->mapped[1]; } const struct fb_impl fb_impl_generic = { diff --git a/lib/framebuffer_png.c b/lib/framebuffer_png.c index 7db86ad..646b7d1 100644 --- a/lib/framebuffer_png.c +++ b/lib/framebuffer_png.c @@ -296,21 +296,9 @@ void fb_png_drop_unused(void) static inline void convert_fb_px_to_rgb888(px_type src, uint8_t *dest) { -#ifdef RECOVERY_BGRA - dest[0] = ((src & 0xFF0000) >> 16); // R - dest[1] = ((src & 0xFF00) >> 8); // G - dest[2] = (src & 0xFF); // B -#elif defined(RECOVERY_RGBX) - dest[0] = (src & 0xFF); // R - dest[1] = ((src & 0xFF00) >> 8); // G - dest[2] = ((src & 0xFF0000) >> 16); // B -#elif defined(RECOVERY_RGB_565) - dest[0] = ((src & 0xF800) >> 8); // R - dest[1] = ((src & 0x7E0) >> 3); // G - dest[2] = ((src & 0x1F) << 3); // B -#else -#error "Unknown pixel format" -#endif + dest[0] = PX_GET_R(src); + dest[1] = PX_GET_G(src); + dest[2] = PX_GET_B(src); } int fb_png_save_img(const char *path, int w, int h, int stride, px_type *data) diff --git a/lib/framebuffer_truetype.c b/lib/framebuffer_truetype.c index 95349d7..f3d5ad3 100644 --- a/lib/framebuffer_truetype.c +++ b/lib/framebuffer_truetype.c @@ -711,7 +711,7 @@ char *fb_text_get_content(fb_img *img) return ex->text; } -inline void center_text(fb_img *text, int targetX, int targetY, int targetW, int targetH) +void center_text(fb_img *text, int targetX, int targetY, int targetW, int targetH) { text_extra *ex = text->extra; diff --git a/lib/util.c b/lib/util.c index b7bc754..942016c 100644 --- a/lib/util.c +++ b/lib/util.c @@ -624,7 +624,7 @@ int imax(int a, int b) return (a > b) ? a : b; } -inline int iabs(int a) +int iabs(int a) { return a >= 0 ? a : -a; } diff --git a/lib/util.h b/lib/util.h index 5e2936e..1078e0f 100644 --- a/lib/util.h +++ b/lib/util.h @@ -62,7 +62,7 @@ int mr_system(const char *shell_fmt, ...); inline int imin(int a, int b); inline int imax(int a, int b); -inline int iabs(int a); +int iabs(int a); inline int in_rect(int x, int y, int rx, int ry, int rw, int rh); inline void *mzalloc(size_t size); // alloc and fill with 0s diff --git a/multirom.c b/multirom.c index e7cb753..1ed492f 100644 --- a/multirom.c +++ b/multirom.c @@ -1659,7 +1659,10 @@ int multirom_fill_kexec_android(struct multirom_status *s, struct multirom_rom * { int res = -1; char img_path[256]; + char dtb_path[256]; + snprintf(img_path, sizeof(img_path), "%s/boot.img", rom->base_path); + snprintf(dtb_path, sizeof(dtb_path), "%s/dtb.img", rom->base_path); // Trampolines in ROM boot images may get out of sync, so we need to check it and // update if needed. I can't do that during ZIP installation because of USB drives. @@ -1686,16 +1689,8 @@ int multirom_fill_kexec_android(struct multirom_status *s, struct multirom_rom * kexec_add_arg(kexec, "--initrd=/initrd.img"); #ifdef MR_KEXEC_DTB - if(libbootimg_dump_dtb(&img, "/dtb.img") >= 0) { printf("DTB: dtb image found!"); - kexec_add_arg(kexec, "--dtb=/dtb.img"); - } - else { - printf("DTB: no dtb image found!"); -#ifdef MR_NOT_64BIT - kexec_add_arg(kexec, "--dtb"); -#endif - } + kexec_add_arg_prefix(kexec, "--dtb=", dtb_path); #endif char cmdline[1536]; diff --git a/multirom_ui.c b/multirom_ui.c index fa4da1d..4f8fc08 100644 --- a/multirom_ui.c +++ b/multirom_ui.c @@ -265,8 +265,8 @@ int multirom_ui(struct multirom_status *s, struct multirom_rom **to_boot) ncard_show(b, 1); anim_stop(1); - fb_freeze(1); - fb_force_draw(); +// fb_freeze(1); +// fb_force_draw(); multirom_ui_destroy_theme(); multirom_ui_free_themes(themes_info); diff --git a/trampoline/Android.mk b/trampoline/Android.mk index c372568..138bcd3 100644 --- a/trampoline/Android.mk +++ b/trampoline/Android.mk @@ -18,7 +18,8 @@ LOCAL_FORCE_STATIC_EXECUTABLE := true ifeq ($(MR_INIT_DEVICES),) $(info MR_INIT_DEVICES was not defined in device files!) endif -LOCAL_SRC_FILES += ../../../../$(MR_INIT_DEVICES) +#LOCAL_SRC_FILES += ../../../../$(MR_INIT_DEVICES) +LOCAL_SRC_FILES += mr_init_devices.c # for adb LOCAL_CFLAGS += -DPRODUCT_MODEL="\"$(PRODUCT_MODEL)\"" -DPRODUCT_MANUFACTURER="\"$(PRODUCT_MANUFACTURER)\"" diff --git a/trampoline/mr_init_devices.c b/trampoline/mr_init_devices.c new file mode 100644 index 0000000..b44a6ca --- /dev/null +++ b/trampoline/mr_init_devices.c @@ -0,0 +1,62 @@ +#include + +// These are paths to folders in /sys which contain "uevent" file +// need to init this device. +// MultiROM needs to init framebuffer, mmc blocks, input devices, +// some ADB-related stuff and USB drives, if OTG is supported +// You can use * at the end to init this folder and all its subfolders +const char *mr_init_devices[] = +{ + "/sys/class/graphics/fb0", + + "/sys/block/mmcblk0", + "/sys/devices/15560000.dwmmc2", + "/sys/devices/15560000.dwmmc2/mmc_host/mmc0", + "/sys/devices/15560000.dwmmc2/mmc_host/mmc0/mmc0:59b4", + "/sys/devices/15560000.dwmmc2/mmc_host/mmc0/mmc0:59b4/block/mmcblk0", + "/sys/devices/15560000.dwmmc2/mmc_host/mmc0/mmc0:59b4/block/mmcblk0/*", + "/dev/block/platform/15570000.ufs/by-name/*", + "/sys/devices/15570000.ufs", + "/sys/devices/15570000.ufs/host0", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/*", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda26", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda43", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda41", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda44", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda22", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda30", + "/sys/devices/15570000.ufs/host0/target0:0:0/0:0:0:0/block/sda/sda21", + + "/sys/bus/mmc", + "/sys/bus/mmc/drivers/mmcblk", + "/sys/module/mmc_core", + "/sys/module/mmcblk", + "/sys/module/block", + "/sys/module/ufshcd", + "/sys/module/ufshcd_pltfrm", + "/sys/module/decon", + + "/sys/devices/gpio_keys.42/input*", + "/sys/devices/virtual/input*", + "/sys/devices/virtual/misc/uinput", + "/sys/devices/13690000.hsi2c/i2c-10/10-0044/input*", + "/sys/devices/13690000.hsi2c/i2c-10/10-001e/input*", + "/sys/devices/13660000.hsi2c/i2c-4/4-0049/input*", + "/sys/devices/13660000.hsi2c/i2c-4/4-0049/input/input7", + + // for adb + "/sys/devices/virtual/tty/ptmx", + "/sys/devices/virtual/misc/android_adb", + "/sys/devices/virtual/android_usb/android0/f_adb", + + "/sys/devices/platform/nop_usb_xceiv*", + + // Encryption + "/sys/devices/virtual/misc/device-mapper", + "/sys/devices/virtual/misc/ion", + "/sys/devices/virtual/mobicore/mobicore", + + NULL +}; diff --git a/trampoline/trampoline.c b/trampoline/trampoline.c index b9a10e9..7138eec 100644 --- a/trampoline/trampoline.c +++ b/trampoline/trampoline.c @@ -99,7 +99,7 @@ static void run_multirom(void) char *cmd[] = { path, NULL }; do { - ERROR("Running multirom\n"); + ERROR("Running multirom: %s\n",path); int res = run_cmd(cmd); if(res == 0) break;