diff --git a/README.md b/README.md index d8cd179b..6d4d1afc 100644 --- a/README.md +++ b/README.md @@ -13,28 +13,28 @@ ``` sudo dpkg --add-architecture i386 sudo apt-get update -sudo apt-get install libsdl2-dev:i386 +sudo apt-get install libsdl2-dev:i386 libsdl2-image-dev:i386 make build_unix ``` ####Fedora ``` -sudo yum install SDL2-devel.i686 +sudo yum install SDL2-devel.i686 SDL2_image-devel.i686 make build_unix ``` ####openSUSE ``` -sudo zypper install libSDL2-devel-32bit +sudo zypper install libSDL2-devel-32bit libSDL2_image-devel-32bit make build_unix ``` ###OS X ``` -brew install --universal sdl2 +brew install --universal sdl2 sdl2_image make build_unix ``` diff --git a/bootloader/ui-mockup/res/bootloader.png b/bootloader/ui-mockup/res/bootloader.png deleted file mode 100644 index 30db60f9..00000000 Binary files a/bootloader/ui-mockup/res/bootloader.png and /dev/null differ diff --git a/extmod/modtrezorui/display-stmhal.h b/extmod/modtrezorui/display-stmhal.h index b9c0602b..7bd1e22b 100644 --- a/extmod/modtrezorui/display-stmhal.h +++ b/extmod/modtrezorui/display-stmhal.h @@ -137,8 +137,75 @@ static void display_unsleep(void) { #endif } +void display_init(void) { + display_sram_init(); + // hardware reset + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); + HAL_Delay(20); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); + HAL_Delay(5); +#if DISPLAY_ILI9341V || DISPLAY_ST7789V + CMD(0x01); // software reset + HAL_Delay(20); + CMD(0x28); // display off + CMD(0xCF); DATAS("\x00\xC1\x30", 3); + CMD(0xED); DATAS("\x64\x03\x12\x81", 4); + CMD(0xE8); DATAS("\x85\x10\x7A", 3); + CMD(0xCB); DATAS("\x39\x2C\x00\x34\x02", 5); + CMD(0xF7); DATA(0x20); + CMD(0xEA); DATAS("\x00\x00", 2); + CMD(0xC0); DATA(0x23); // power control VRH[5:0] + CMD(0xC1); DATA(0x12); // power control SAP[2:0] BT[3:0] + CMD(0xC5); DATAS("\x60\x44", 2); // vcm control 1 + CMD(0xC7); DATA(0x8A); // vcm control 2 + CMD(0x3A); DATA(0x55); // memory access control (16-bit 565) + CMD(0xB1); DATAS("\x00\x18", 2); // framerate +#endif +#if DISPLAY_ILI9341V + CMD(0xB6); DATAS("\x0A\xA2", 2); // display function control + CMD(0xF6); DATAS("\x01\x30\x00", 3); // interface control + CMD(0xF2); DATA(0x00); // 3 gamma func disable +#endif +#if DISPLAY_ILI9341V + CMD(0x26); DATA(0x01); // gamma func enable + CMD(0xE0); DATAS("\x0F\x2F\x2C\x0B\x0F\x09\x56\xD9\x4A\x0B\x14\x05\x0C\x06\x00", 15); // gamma curve 1 + CMD(0xE1); DATAS("\x00\x10\x13\x04\x10\x06\x25\x26\x3B\x04\x0B\x0A\x33\x39\x0F", 15); // gamma curve 2 +#endif +#if DISPLAY_ST7789V + CMD(0x26); DATA(0x01); // gamma func enable + CMD(0xE0); DATAS("\x70\x2C\x2E\x15\x10\x09\x48\x33\x53\x0B\x19\x18\x20\x25", 14); // gamma curve 1 + CMD(0xE1); DATAS("\x70\x2C\x2E\x15\x10\x09\x48\x33\x53\x0B\x19\x18\x20\x25", 14); // gamma curve 2 +#endif +#if DISPLAY_ILI9341V + CMD(0x21); // invert colors +#endif +#if DISPLAY_ST7789V + CMD(0x20); // don't invert colors +#endif + display_orientation(0); + display_backlight(0); + // clear buffer + display_clear(); + display_unsleep(); +} + static uint8_t WINDOW_OFFSET_X = 0, WINDOW_OFFSET_Y = 0; +void display_set_window(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + x += WINDOW_OFFSET_X; + y += WINDOW_OFFSET_Y; + uint16_t x1 = x + w - 1; + uint16_t y1 = y + h - 1; +#if DISPLAY_ILI9341V || DISPLAY_ST7789V + CMD(0x2A); DATA(x >> 8); DATA(x & 0xFF); DATA(x1 >> 8); DATA(x1 & 0xFF); // column addr set + CMD(0x2B); DATA(y >> 8); DATA(y & 0xFF); DATA(y1 >> 8); DATA(y1 & 0xFF); // row addr set + CMD(0x2C); +#endif +} + +void display_refresh(void) { +} + int display_orientation(int degrees) { // memory access control @@ -203,73 +270,6 @@ int display_orientation(int degrees) return ORIENTATION; } -void display_init(void) { - display_sram_init(); - // hardware reset - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); - HAL_Delay(20); - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); - HAL_Delay(5); -#if DISPLAY_ILI9341V || DISPLAY_ST7789V - CMD(0x01); // software reset - HAL_Delay(20); - CMD(0x28); // display off - CMD(0xCF); DATAS("\x00\xC1\x30", 3); - CMD(0xED); DATAS("\x64\x03\x12\x81", 4); - CMD(0xE8); DATAS("\x85\x10\x7A", 3); - CMD(0xCB); DATAS("\x39\x2C\x00\x34\x02", 5); - CMD(0xF7); DATA(0x20); - CMD(0xEA); DATAS("\x00\x00", 2); - CMD(0xC0); DATA(0x23); // power control VRH[5:0] - CMD(0xC1); DATA(0x12); // power control SAP[2:0] BT[3:0] - CMD(0xC5); DATAS("\x60\x44", 2); // vcm control 1 - CMD(0xC7); DATA(0x8A); // vcm control 2 - CMD(0x3A); DATA(0x55); // memory access control (16-bit 565) - CMD(0xB1); DATAS("\x00\x18", 2); // framerate -#endif -#if DISPLAY_ILI9341V - CMD(0xB6); DATAS("\x0A\xA2", 2); // display function control - CMD(0xF6); DATAS("\x01\x30\x00", 3); // interface control - CMD(0xF2); DATA(0x00); // 3 gamma func disable -#endif -#if DISPLAY_ILI9341V - CMD(0x26); DATA(0x01); // gamma func enable - CMD(0xE0); DATAS("\x0F\x2F\x2C\x0B\x0F\x09\x56\xD9\x4A\x0B\x14\x05\x0C\x06\x00", 15); // gamma curve 1 - CMD(0xE1); DATAS("\x00\x10\x13\x04\x10\x06\x25\x26\x3B\x04\x0B\x0A\x33\x39\x0F", 15); // gamma curve 2 -#endif -#if DISPLAY_ST7789V - CMD(0x26); DATA(0x01); // gamma func enable - CMD(0xE0); DATAS("\x70\x2C\x2E\x15\x10\x09\x48\x33\x53\x0B\x19\x18\x20\x25", 14); // gamma curve 1 - CMD(0xE1); DATAS("\x70\x2C\x2E\x15\x10\x09\x48\x33\x53\x0B\x19\x18\x20\x25", 14); // gamma curve 2 -#endif -#if DISPLAY_ILI9341V - CMD(0x21); // invert colors -#endif -#if DISPLAY_ST7789V - CMD(0x20); // don't invert colors -#endif - display_orientation(0); - display_backlight(0); - // clear buffer - display_clear(); - display_unsleep(); -} - -void display_set_window(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - x += WINDOW_OFFSET_X; - y += WINDOW_OFFSET_Y; - uint16_t x1 = x + w - 1; - uint16_t y1 = y + h - 1; -#if DISPLAY_ILI9341V || DISPLAY_ST7789V - CMD(0x2A); DATA(x >> 8); DATA(x & 0xFF); DATA(x1 >> 8); DATA(x1 & 0xFF); // column addr set - CMD(0x2B); DATA(y >> 8); DATA(y & 0xFF); DATA(y1 >> 8); DATA(y1 & 0xFF); // row addr set - CMD(0x2C); -#endif -} - -void display_refresh(void) { -} - int display_backlight(int val) { if (val >= 0 && val <= 255) { @@ -278,3 +278,7 @@ int display_backlight(int val) } return BACKLIGHT; } + +void display_save(const char *filename) +{ +} diff --git a/extmod/modtrezorui/display-unix-null.h b/extmod/modtrezorui/display-unix-null.h index b3467e19..c50af8b9 100644 --- a/extmod/modtrezorui/display-unix-null.h +++ b/extmod/modtrezorui/display-unix-null.h @@ -34,3 +34,7 @@ int display_backlight(int val) { return BACKLIGHT; } + +void display_save(const char *filename) +{ +} diff --git a/extmod/modtrezorui/display-unix-sdl.h b/extmod/modtrezorui/display-unix-sdl.h index 7e379cd6..286df95b 100644 --- a/extmod/modtrezorui/display-unix-sdl.h +++ b/extmod/modtrezorui/display-unix-sdl.h @@ -7,11 +7,12 @@ #include #include +#include #define DISPLAY_BORDER 16 static SDL_Renderer *RENDERER = 0; -static SDL_Surface *SCREEN = 0; +static SDL_Surface *BUFFER = 0; static SDL_Texture *TEXTURE = 0; static int DATAODD = 0; static int POSX, POSY, SX, SY, EX, EY = 0; @@ -20,7 +21,7 @@ static int POSX, POSY, SX, SY, EX, EY = 0; void DATA(uint8_t x) { if (POSX <= EX && POSY <= EY) { - ((uint8_t *)SCREEN->pixels)[POSX * 2 + POSY * SCREEN->pitch + (DATAODD ^ 1)] = x; + ((uint8_t *)BUFFER->pixels)[POSX * 2 + POSY * BUFFER->pitch + (DATAODD ^ 1)] = x; } DATAODD = !DATAODD; if (DATAODD == 0) { @@ -93,7 +94,7 @@ void display_init(void) } SDL_SetRenderDrawColor(RENDERER, BACKLIGHT, BACKLIGHT, BACKLIGHT, 255); SDL_RenderClear(RENDERER); - SCREEN = SDL_CreateRGBSurface(0, DISPLAY_RESX, DISPLAY_RESY, 16, 0xF800, 0x07E0, 0x001F, 0x0000); + BUFFER = SDL_CreateRGBSurface(0, DISPLAY_RESX, DISPLAY_RESY, 16, 0xF800, 0x07E0, 0x001F, 0x0000); TEXTURE = SDL_CreateTexture(RENDERER, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, DISPLAY_RESX, DISPLAY_RESY); SDL_SetTextureBlendMode(TEXTURE, SDL_BLENDMODE_NONE); SDL_SetTextureAlphaMod(TEXTURE, 0); @@ -110,7 +111,7 @@ void display_set_window(uint16_t x, uint16_t y, uint16_t w, uint16_t h) void display_refresh(void) { SDL_RenderClear(RENDERER); - SDL_UpdateTexture(TEXTURE, NULL, SCREEN->pixels, SCREEN->pitch); + SDL_UpdateTexture(TEXTURE, NULL, BUFFER->pixels, BUFFER->pitch); const SDL_Rect r = {DISPLAY_BORDER, DISPLAY_BORDER, DISPLAY_RESX, DISPLAY_RESY}; SDL_RenderCopyEx(RENDERER, TEXTURE, NULL, &r, ORIENTATION, NULL, 0); SDL_RenderPresent(RENDERER); @@ -134,3 +135,8 @@ int display_backlight(int val) } return BACKLIGHT; } + +void display_save(const char *filename) +{ + IMG_SavePNG(BUFFER, filename); +} diff --git a/extmod/modtrezorui/display.h b/extmod/modtrezorui/display.h index 8ee957d8..07d0ca61 100644 --- a/extmod/modtrezorui/display.h +++ b/extmod/modtrezorui/display.h @@ -37,5 +37,6 @@ uint32_t display_text_width(const char *text, int textlen, uint8_t font); void display_qrcode(uint8_t x, uint8_t y, const char *data, int datalen, int scale); void display_loader(uint16_t progress, uint16_t fgcolor, uint16_t bgcolor, const uint8_t *icon, uint32_t iconlen, uint16_t iconfgcolor); void display_raw(uint8_t reg, const uint8_t *data, int datalen); +void display_save(const char *filename); #endif diff --git a/extmod/modtrezorui/modtrezorui-display.h b/extmod/modtrezorui/modtrezorui-display.h index 42affc4a..3b48b086 100644 --- a/extmod/modtrezorui/modtrezorui-display.h +++ b/extmod/modtrezorui/modtrezorui-display.h @@ -354,6 +354,20 @@ STATIC mp_obj_t mod_TrezorUi_Display_raw(mp_obj_t self, mp_obj_t reg, mp_obj_t d } STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_TrezorUi_Display_raw_obj, mod_TrezorUi_Display_raw); +/// def trezor.ui.display.save(filename: string) -> None: +/// ''' +/// Saves current display contents to file filename. +/// ''' +STATIC mp_obj_t mod_TrezorUi_Display_save(mp_obj_t self, mp_obj_t filename) { + mp_buffer_info_t fn; + mp_get_buffer_raise(filename, &fn, MP_BUFFER_READ); + if (fn.len > 0) { + display_save(fn.buf); + } + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorUi_Display_save_obj, mod_TrezorUi_Display_save); + STATIC const mp_rom_map_elem_t mod_TrezorUi_Display_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&mod_TrezorUi_Display_clear_obj) }, { MP_ROM_QSTR(MP_QSTR_refresh), MP_ROM_PTR(&mod_TrezorUi_Display_refresh_obj) }, @@ -371,6 +385,7 @@ STATIC const mp_rom_map_elem_t mod_TrezorUi_Display_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_orientation), MP_ROM_PTR(&mod_TrezorUi_Display_orientation_obj) }, { MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&mod_TrezorUi_Display_backlight_obj) }, { MP_ROM_QSTR(MP_QSTR_raw), MP_ROM_PTR(&mod_TrezorUi_Display_raw_obj) }, + { MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&mod_TrezorUi_Display_save_obj) }, { MP_ROM_QSTR(MP_QSTR_FONT_MONO), MP_OBJ_NEW_SMALL_INT(FONT_MONO) }, { MP_ROM_QSTR(MP_QSTR_FONT_NORMAL), MP_OBJ_NEW_SMALL_INT(FONT_NORMAL) }, { MP_ROM_QSTR(MP_QSTR_FONT_BOLD), MP_OBJ_NEW_SMALL_INT(FONT_BOLD) }, diff --git a/vendor/micropython b/vendor/micropython index 4ab6e8c3..b041b5bf 160000 --- a/vendor/micropython +++ b/vendor/micropython @@ -1 +1 @@ -Subproject commit 4ab6e8c3b714d6393c67b359a305ae72f368fe7b +Subproject commit b041b5bf5d25e598ac792ab03896d534cbe73336