blob: 62139b5428c4f0a3a356ac5b8819627fc2c1ebf3 [file]
/**
* Copyright (c) 2023 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
#include "pico/bootrom.h"
#include "hardware/gpio.h"
#include "hardware/regs/otp_data.h"
#include "pico/binary_info.h"
// Very rough - seems to be broken in xip_sram
#define sleep_ms(x) for(int i=0; i<x*20000; i++) asm volatile("nop");
int main() {
bi_decl(bi_program_feature_group(0x1234, 0x5678, "led_config"));
bi_decl(bi_ptr_int32(0x1234, 0x5678, led, PICO_DEFAULT_LED_PIN));
gpio_init(led);
gpio_set_dir(led, GPIO_OUT);
gpio_put(led, true);
bi_decl(bi_program_feature_group(0x1111, 0x2222, "otp_page_permissions"));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page0, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page1, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page2, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page3, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page4, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page5, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page6, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page7, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page8, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page9, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page10, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page11, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page12, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page13, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page14, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page15, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page16, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page17, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page18, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page19, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page20, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page21, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page22, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page23, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page24, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page25, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page26, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page27, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page28, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page29, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page30, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page31, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page32, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page33, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page34, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page35, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page36, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page37, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page38, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page39, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page40, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page41, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page42, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page43, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page44, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page45, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page46, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page47, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page48, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page49, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page50, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page51, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page52, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page53, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page54, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page55, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page56, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page57, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page58, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page59, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page60, 0));
bi_decl(bi_ptr_int32(0x1111, 0x2222, page61, 0));
uint32_t pages[62] = {
page0,
page1,
page2,
page3,
page4,
page5,
page6,
page7,
page8,
page9,
page10,
page11,
page12,
page13,
page14,
page15,
page16,
page17,
page18,
page19,
page20,
page21,
page22,
page23,
page24,
page25,
page26,
page27,
page28,
page29,
page30,
page31,
page32,
page33,
page34,
page35,
page36,
page37,
page38,
page39,
page40,
page41,
page42,
page43,
page44,
page45,
page46,
page47,
page48,
page49,
page50,
page51,
page52,
page53,
page54,
page55,
page56,
page57,
page58,
page59,
page60,
page61,
};
otp_cmd_t cmd;
static __attribute__((aligned(4))) uint8_t otp_buffer[8];
for (int i=0; i < 62; i++) {
if (pages[i] == 0) {
continue;
}
uint8_t perms0 = pages[i] & 0xff;
uint8_t perms1 = (pages[i] >> 16) & 0xff;
// printf("Unlocking\n");
// for (int i=0; i<4; i++) {
// uint32_t key_i = ((i*2+1) << 24) | ((i*2+1) << 16) |
// (i*2 << 8) | i*2;
// otp_hw->crt_key_w[i] = key_i;
// printf("%08x\n", key_i);
// }
cmd.flags = (OTP_CMD_ROW_BITS & (OTP_DATA_PAGE0_LOCK0_ROW + i*2)) | OTP_CMD_WRITE_BITS;
otp_buffer[0] = perms0;
otp_buffer[1] = perms0;
otp_buffer[2] = perms0;
otp_buffer[3] = 0;
otp_buffer[4] = perms1;
otp_buffer[5] = perms1;
otp_buffer[6] = perms1;
otp_buffer[7] = 0;
int8_t num = rom_func_otp_access(otp_buffer, sizeof(otp_buffer), cmd);
sleep_ms(100);
}
gpio_put(led, false);
reset_usb_boot(0, 0);
}