Snowy Screen
This is used by the boot loader and has cmd IDs that tell the FPGA to display pre-canned images.
-
Commands:
-
PSDISPLAYCMD0_NULL = 0
-
PSDISPLAYCMD0_SET_PARAMETER = 1
-
PSDISPLAYCMD0_DISPLAY_OFF = 2
-
PSDISPLAYCMD0_DISPLAY_ON = 3
-
PSDISPLAYCMD0_DRAW_SCENE = 4
-
Scene numbers put into cmd_parameter and used by the PSDISPLAYCMD0_DRAW_SCENE command:
-
PSDISPLAYSCENE_BLACK = 0
-
PSDISPLAYSCENE_SPLASH = 1 // splash screen
-
PSDISPLAYSCENE_UPDATE = 2 // firmware update
-
PSDISPLAYSCENE_ERROR = 3 // display error code
The display expects complete frames to be sent through the SPI bus, one column at a time starting from the left-most column, each column sent from bottom to top. The bits and bytes in each column are scrambled however and need to be unscrambled before placing them into the framebuffer.
-
Commands for PSDISPLAY_CMD_SET_1. We accept these while in the PSDISPLAYSTATE_ACCEPTING_CMD state. These are implemented in the firmware
-
PSDISPLAYCMD1_FRAME_BEGIN = 5
-
8 Bits MSB first:
-
2 bits unused (00)
-
2 bits red
-
2 bits green
-
2 bits blue
- INTN interrupt:
- display done (de-assert=true)
- DONE interrupt:
- asserted (=false) on reset
- sclk
- ?? (not used in qemu)
- Download Pebble qemu source code
- Open
hw/display/pebble_snowy_display.c
- Edit the
prog_header
array to be at least 33000 byte big - Add the following lines to the
ps_display_determine_command_set
method:
FILE *myfile = fopen("/tmp/fpga.bin", "w");
fwrite(s->prog_header, sizeof(uint8_t), s->prog_byte_offset, myfile);
fclose(myfile);
- Run the Pebble emulator
- Profit
// Recovery screen mode (no FPGA Firmware loaded)
PEBBLE_SNOWY_DISPLAY: state change from 0 (PSDISPLAYSTATE_PROGRAMMING) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 0
PEBBLE_SNOWY_DISPLAY: DISPLAY POWER CTL changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: RESET changed to 1
PEBBLE_SNOWY_DISPLAY: Asserting done interrupt
PEBBLE_SNOWY_DISPLAY: Resetting state to accept command
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 0
PEBBLE_SNOWY_DISPLAY: BACKLIGHT ENABLE changed to 0
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 4, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set0: cmd: 4 -- cs: CS
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 3 (PSDISPLAYSTATE_ACCEPTING_SCENE_BYTE) frame: 0 - bytes: 1
PEBBLE_SNOWY_DISPLAY: received scene ID: 1
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set0: cmd: 4 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: DRAW_SCENE: 1
PEBBLE_SNOWY_DISPLAY: Asserting done interrupt
PEBBLE_SNOWY_DISPLAY: Resetting state to accept command
PEBBLE_SNOWY_DISPLAY: state change from 3 (PSDISPLAYSTATE_ACCEPTING_SCENE_BYTE) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 2
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 3, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set0: cmd: 3 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: DISPLAY_ON
PEBBLE_SNOWY_DISPLAY: Asserting done interrupt
PEBBLE_SNOWY_DISPLAY: Resetting state to accept command
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 3
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
//Switch to FPGA programming mode
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: RESET changed to 0
PEBBLE_SNOWY_DISPLAY: RESET changed to 1
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 0 (PSDISPLAYSTATE_PROGRAMMING) frame: 0 - bytes: 3
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: Exiting programming mode
PEBBLE_SNOWY_DISPLAY: Asserting done interrupt
PEBBLE_SNOWY_DISPLAY: Resetting state to accept command
PEBBLE_SNOWY_DISPLAY: state change from 0 (PSDISPLAYSTATE_PROGRAMMING) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 32301
PEBBLE_SNOWY_DISPLAY: ps_display_determine_command_set: found 'Lattice' string in programming header
PEBBLE_SNOWY_DISPLAY: ps_display_determine_command_set: found 'iCEcube2 2016.02.27810' string in programming header
PEBBLE_SNOWY_DISPLAY: ps_display_determine_command_set: found 'Part: iCE40LP1K-CM36' string in programming header
PEBBLE_SNOWY_DISPLAY: ps_display_determine_command_set: found 'Date: Jul 6 2016 11:48:2' string in programming header
PEBBLE_SNOWY_DISPLAY: PEBBLE_SNOWY_DISPLAY: Unknown FPGA programming with a date stamp of 'Date: Jul 6 2016 11:48:2'. Defaulting to command set 2
PEBBLE_SNOWY_DISPLAY: BACKLIGHT ENABLE changed to 0
PEBBLE_SNOWY_DISPLAY: BACKLIGHT ENABLE changed to 1
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 63
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 5, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set1: cmd: 5 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: FRAME_BEGIN
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) frame: 0 - bytes: 32302
PEBBLE_SNOWY_DISPLAY: New frame? -- 0x3F, row 169, col 2 -- bytes: 32303 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Got last byte in frame (col) row 169, col 146
PEBBLE_SNOWY_DISPLAY: state change from 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 0 - bytes: 56494
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 5, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set1: cmd: 5 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: FRAME_BEGIN
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) frame: 1 - bytes: 56495
PEBBLE_SNOWY_DISPLAY: New frame? -- 0x3F, row 169, col 2 -- bytes: 56496 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Got last byte in frame (col) row 169, col 146
PEBBLE_SNOWY_DISPLAY: state change from 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 1 - bytes: 80687
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 5, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set1: cmd: 5 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: FRAME_BEGIN
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) frame: 2 - bytes: 80688
PEBBLE_SNOWY_DISPLAY: New frame? -- 0x3F, row 169, col 2 -- bytes: 80689 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Got last byte in frame (col) row 169, col 146
PEBBLE_SNOWY_DISPLAY: state change from 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 2 - bytes: 104880
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 5, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set1: cmd: 5 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: FRAME_BEGIN
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) frame: 3 - bytes: 104881
PEBBLE_SNOWY_DISPLAY: New frame? -- 0x3F, row 169, col 2 -- bytes: 104882 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Got last byte in frame (col) row 169, col 146
PEBBLE_SNOWY_DISPLAY: state change from 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 3 - bytes: 129073
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: CS changed to 0
PEBBLE_SNOWY_DISPLAY: received command 5, deasserting done interrupt
PEBBLE_SNOWY_DISPLAY: ps_display_execute_current_cmd_set1: cmd: 5 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Executing command: FRAME_BEGIN
PEBBLE_SNOWY_DISPLAY: state change from 1 (PSDISPLAYSTATE_ACCEPTING_CMD) to 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) frame: 4 - bytes: 129074
PEBBLE_SNOWY_DISPLAY: New frame? -- 0x3F, row 169, col 2 -- bytes: 129075 -- cs: CS
PEBBLE_SNOWY_DISPLAY: Got last byte in frame (col) row 169, col 146
PEBBLE_SNOWY_DISPLAY: state change from 4 (PSDISPLAYSTATE_ACCEPTING_FRAME_DATA) to 1 (PSDISPLAYSTATE_ACCEPTING_CMD) frame: 4 - bytes: 153266
PEBBLE_SNOWY_DISPLAY: CS changed to 1
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 60
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 57
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 54
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 51
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 47
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 44
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 41
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 38
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 35
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 31
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 28
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 25
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 22
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 19
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 15
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 12
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 9
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 6
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 3
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: Backlight level changed to 0
PEBBLE_SNOWY_DISPLAY: BACKLIGHT ENABLE changed to 0
PEBBLE_SNOWY_DISPLAY: BACKLIGHT ENABLE changed to 0
- Pin Assignments
- Snowy Screen
- Assorted IDA Notes
- Pebble Time (Snowy) EXTI and GPIO configuration
- Firmware: Flashing from a computer
- Firmware: Communicating with the bootloader
- Firmware: Update and boot mechanism
- Libraries
- MPUless Pebble
- Pebble Parts and Datasheets
- Firmware Font Format
- Working with Resources
- Bluetooth LE Generic Access Profile
If you'd like anything added here, please contact @ishotjr or @johannesn via the Pebble Dev Discord server