42
42
#include "stm32_common/stm32_common.h"
43
43
#include "hw/arm/armv7m.h"
44
44
#include "parts/spi_rgb.h"
45
+ #include "otp.h"
45
46
46
47
#define BOOTLOADER_IMAGE "Prusa_Mk4_Boot.bin"
47
48
#define XFLASH_FN "Prusa_Mk4_xflash.bin"
@@ -118,6 +119,7 @@ typedef struct mk4_cfg_t {
118
119
uint8_t m_spi ;
119
120
uint8_t m_uart ;
120
121
bool is_400step ;
122
+ uint8_t dm_ver ;
121
123
122
124
} mk4_cfg_t ;
123
125
@@ -154,6 +156,7 @@ static const mk4_cfg_t mk4_027c_cfg = {
154
156
.m_select = {STM_PIN (GPIOG ,15 ), STM_PIN (GPIOB ,5 ), STM_PIN (GPIOF ,15 ), STM_PIN (GPIOF ,12 )},
155
157
.m_spi = STM32_P_SPI3 ,
156
158
.is_400step = true,
159
+ .dm_ver = 27
157
160
};
158
161
159
162
static const mk4_cfg_t mk4_034_cfg = {
@@ -187,10 +190,23 @@ static const mk4_cfg_t mk4_034_cfg = {
187
190
.m_select = {STM_PIN (GPIOG ,15 ), STM_PIN (GPIOB ,5 ), STM_PIN (GPIOF ,15 ), STM_PIN (GPIOF ,12 )},
188
191
.m_spi = STM32_P_SPI3 ,
189
192
.is_400step = true,
193
+ .dm_ver = 34 ,
190
194
};
191
195
192
196
static void mk4_init (MachineState * machine , mk4_cfg_t cfg )
193
197
{
198
+
199
+ OTP_v4 otp_data = { .version = 4 , .size = sizeof (OTP_v4 ),
200
+ .datamatrix = {'4' , '5' , '5' , '8' , '-' , '2' , '7' , '0' , '0' , '0' , '0' , '1' , '9' , '0' , '0' , '5' , '2' , '5' , '9' , '9' , '9' , '9' , 0 , 0 }
201
+ };
202
+ if (cfg .dm_ver == 34 )
203
+ {
204
+ otp_data .datamatrix [5 ]= '3' ;
205
+ otp_data .datamatrix [6 ]= '4' ;
206
+ }
207
+
208
+ uint32_t * otp_raw = (uint32_t * ) & otp_data ;
209
+
194
210
DeviceState * dev ;
195
211
196
212
dev = qdev_new (TYPE_STM32F427xI_SOC );
@@ -205,6 +221,19 @@ static void mk4_init(MachineState *machine, mk4_cfg_t cfg)
205
221
printf ("Extended flash size: now %" PRIu64 " kB\n" , flash_size /1024 );
206
222
}
207
223
qdev_prop_set_uint32 (dev ,"flash-size" , flash_size );
224
+
225
+ DeviceState * otp = stm32_soc_get_periph (dev , STM32_P_OTP );
226
+ qdev_prop_set_uint32 (otp ,"len-otp-data" , 9 );
227
+ qdev_prop_set_uint32 (otp ,"otp-data[0]" , otp_raw [0 ]);
228
+ qdev_prop_set_uint32 (otp ,"otp-data[1]" , otp_raw [1 ]);
229
+ qdev_prop_set_uint32 (otp ,"otp-data[2]" , otp_raw [2 ]);
230
+ qdev_prop_set_uint32 (otp ,"otp-data[3]" , otp_raw [3 ]);
231
+ qdev_prop_set_uint32 (otp ,"otp-data[4]" , otp_raw [4 ]);
232
+ qdev_prop_set_uint32 (otp ,"otp-data[5]" , otp_raw [5 ]);
233
+ qdev_prop_set_uint32 (otp ,"otp-data[6]" , otp_raw [6 ]);
234
+ qdev_prop_set_uint32 (otp ,"otp-data[7]" , otp_raw [7 ]);
235
+ qdev_prop_set_uint32 (otp ,"otp-data[8]" , otp_raw [8 ]);
236
+
208
237
sysbus_realize (SYS_BUS_DEVICE (dev ), & error_fatal );
209
238
DeviceState * dev_soc = dev ;
210
239
// We (ab)use the kernel command line to piggyback custom arguments into QEMU.
0 commit comments