void bootloader_loop(void) { oledClear(); oledDrawBitmap(0, 0, &bmp_logo64); if (firmware_present()) { oledDrawString(52, 0, "TREZOR", FONT_STANDARD); static char serial[25]; fill_serialno_fixed(serial); oledDrawString(52, 20, "Serial No.", FONT_STANDARD); oledDrawString(52, 40, serial + 12, FONT_STANDARD); // second part of serial serial[12] = 0; oledDrawString(52, 30, serial, FONT_STANDARD); // first part of serial oledDrawStringRight(OLED_WIDTH - 1, OLED_HEIGHT - 8, "Loader " VERSTR(VERSION_MAJOR) "." VERSTR(VERSION_MINOR) "." VERSTR(VERSION_PATCH), FONT_STANDARD); } else { oledDrawString(52, 10, "Welcome!", FONT_STANDARD); oledDrawString(52, 30, "Please visit", FONT_STANDARD); oledDrawString(52, 50, "trezor.io/start", FONT_STANDARD); } oledRefresh(); usbLoop(firmware_present()); }
int main(void) { #ifndef APPVER setup(); #endif __stack_chk_guard = random32(); // this supports compiler provided unpredictable stack protection checks #ifndef APPVER memory_protect(); oledInit(); #endif #ifndef APPVER // at least one button is unpressed uint16_t state = gpio_port_read(BTN_PORT); int unpressed = ((state & BTN_PIN_YES) == BTN_PIN_YES || (state & BTN_PIN_NO) == BTN_PIN_NO); if (firmware_present() && unpressed) { oledClear(); oledDrawBitmap(40, 0, &bmp_logo64_empty); oledRefresh(); uint8_t hash[32]; int signed_firmware = signatures_ok(hash); if (SIG_OK != signed_firmware) { show_unofficial_warning(hash); timer_init(); } load_app(signed_firmware); } #endif bootloader_loop(); return 0; }
static int firmware_present(struct pipe_screen *pscreen, enum pipe_video_profile profile) { struct nouveau_screen *screen = nouveau_screen(pscreen); int chipset = screen->device->chipset; int vp3 = chipset < 0xa3 || chipset == 0xaa || chipset == 0xac; int vp5 = chipset >= 0xd0; int ret; /* For all chipsets, try to create a BSP objects. Assume that if firmware * is present for it, firmware is also present for VP/PPP */ if (!(screen->firmware_info.profiles_checked & 1)) { struct nouveau_object *channel = NULL, *bsp = NULL; struct nv04_fifo nv04_data = {.vram = 0xbeef0201, .gart = 0xbeef0202}; struct nvc0_fifo nvc0_args = {}; struct nve0_fifo nve0_args = {.engine = NVE0_FIFO_ENGINE_BSP}; void *data = NULL; int size, oclass; if (chipset < 0xc0) oclass = 0x85b1; else if (vp5) oclass = 0x95b1; else oclass = 0x90b1; if (chipset < 0xc0) { data = &nv04_data; size = sizeof(nv04_data); } else if (chipset < 0xe0) { data = &nvc0_args; size = sizeof(nvc0_args); } else { data = &nve0_args; size = sizeof(nve0_args); } /* kepler must have its own channel, so just do this for everyone */ nouveau_object_new(&screen->device->object, 0, NOUVEAU_FIFO_CHANNEL_CLASS, data, size, &channel); if (channel) { nouveau_object_new(channel, 0, oclass, NULL, 0, &bsp); if (bsp) screen->firmware_info.profiles_present |= 1; nouveau_object_del(&bsp); nouveau_object_del(&channel); } screen->firmware_info.profiles_checked |= 1; } if (!(screen->firmware_info.profiles_present & 1)) return 0; /* For vp3/vp4 chipsets, make sure that the relevant firmware is present */ if (!vp5 && !(screen->firmware_info.profiles_checked & (1 << profile))) { char path[PATH_MAX]; struct stat s; if (vp3) vp3_getpath(profile, path); else vp4_getpath(profile, path); ret = stat(path, &s); if (!ret && s.st_size > 1000) screen->firmware_info.profiles_present |= (1 << profile); screen->firmware_info.profiles_checked |= (1 << profile); } return vp5 || (screen->firmware_info.profiles_present & (1 << profile)); } int nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, enum pipe_video_profile profile, enum pipe_video_entrypoint entrypoint, enum pipe_video_cap param) { int chipset = nouveau_screen(pscreen)->device->chipset; int vp3 = chipset < 0xa3 || chipset == 0xaa || chipset == 0xac; int vp5 = chipset >= 0xd0; enum pipe_video_format codec = u_reduce_video_profile(profile); switch (param) { case PIPE_VIDEO_CAP_SUPPORTED: /* VP3 does not support MPEG4, VP4+ do. */ return entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM && profile >= PIPE_VIDEO_PROFILE_MPEG1 && (!vp3 || codec != PIPE_VIDEO_FORMAT_MPEG4) && firmware_present(pscreen, profile); case PIPE_VIDEO_CAP_NPOT_TEXTURES: return 1; case PIPE_VIDEO_CAP_MAX_WIDTH: case PIPE_VIDEO_CAP_MAX_HEIGHT: return vp5 ? 4096 : 2048; case PIPE_VIDEO_CAP_PREFERED_FORMAT: return PIPE_FORMAT_NV12; case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: case PIPE_VIDEO_CAP_PREFERS_INTERLACED: return true; case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: return false; case PIPE_VIDEO_CAP_MAX_LEVEL: switch (profile) { case PIPE_VIDEO_PROFILE_MPEG1: return 0; case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: case PIPE_VIDEO_PROFILE_MPEG2_MAIN: return 3; case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE: return 3; case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE: return 5; case PIPE_VIDEO_PROFILE_VC1_SIMPLE: return 1; case PIPE_VIDEO_PROFILE_VC1_MAIN: return 2; case PIPE_VIDEO_PROFILE_VC1_ADVANCED: return 4; case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: return 41; default: debug_printf("unknown video profile: %d\n", profile); return 0; } default: debug_printf("unknown video param: %d\n", param); return 0; } }