@@ -139,11 +139,33 @@ static int loader(const struct shell *sh)
139
139
140
140
gpio_pin_configure_dt (& spec , GPIO_INPUT | GPIO_PULL_DOWN );
141
141
k_sleep (K_MSEC (200 ));
142
- if (gpio_pin_get_dt (& spec ) == 0 ) {
142
+ uint8_t * ram_firmware = NULL ;
143
+ uint32_t * ram_start = (uint32_t * )0x20000000 ;
144
+ if (!sketch_valid ) {
145
+ ram_firmware = (uint8_t * )k_malloc (64 * 1024 );
146
+ if (!ram_firmware ) {
147
+ printk ("Failed to allocate RAM for firmware\n" );
148
+ return - ENOMEM ;
149
+ }
150
+ memset (ram_firmware , 0 , 64 * 1024 );
151
+ * ram_start = & ram_firmware [0 ];
152
+ }
153
+ if (gpio_pin_get_dt (& spec ) == 0 || (ram_firmware != NULL )) {
143
154
matrixBegin ();
144
155
matrixSetGrayscaleBits (8 );
145
- while (gpio_pin_get_dt (& spec ) == 0 ) {
156
+ while (gpio_pin_get_dt (& spec ) == 0 || ( ram_firmware != NULL ) ) {
146
157
matrixPlay (_bootanimation , _bootanimation_len );
158
+ if (ram_firmware != NULL ) {
159
+ printk ("Trying to load firmware from RAM: %p\n" , ram_firmware );
160
+ // poll the first bytes, if filled try to use them for booting
161
+ sketch_hdr = (struct sketch_header_v1 * )(ram_firmware + 7 );
162
+ if (sketch_hdr -> ver == 0x1 && sketch_hdr -> magic == 0x2341 ) {
163
+ // Found valid data, use it for booting
164
+ base_addr = (uintptr_t )ram_firmware ;
165
+ * ram_start = 0 ;
166
+ break ;
167
+ }
168
+ }
147
169
}
148
170
matrixPlay (_bootanimation_end , _bootanimation_end_len );
149
171
uint8_t _framebuffer [104 ] = {0 };
0 commit comments