Bring multirom to M86

This commit is contained in:
faust93
2016-12-18 14:13:41 +03:00
parent 1228cd3729
commit 994539e94a
17 changed files with 148 additions and 94 deletions

View File

@@ -58,7 +58,6 @@ endif
include $(BUILD_EXECUTABLE)
# Trampoline
include $(multirom_local_path)/trampoline/Android.mk

2
adbd

Submodule adbd updated: 012280c7a4...47afc72854

View File

@@ -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")

Submodule kexec-tools deleted from 1945c661d8

View File

@@ -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))
{

View File

@@ -23,7 +23,7 @@
#include <pthread.h>
#include <string.h>
#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);

View File

@@ -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 = {

View File

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

View File

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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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];

View File

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

View File

@@ -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)\""

View File

@@ -0,0 +1,62 @@
#include <stdlib.h>
// 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
};

View File

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