1 | void fix_fuses(void) {
|
2 |
|
3 |
|
4 | uint32_t new_fusebits[2];
|
5 | new_fusebits[0] = 0xD8E0C7FF; // Default values
|
6 | new_fusebits[1] = 0xFFFFFC5D; //
|
7 |
|
8 | /* Auxiliary space cannot be accessed if the security bit is set */
|
9 | if (NVMCTRL->STATUS.reg & NVMCTRL_STATUS_SB) {
|
10 | return;
|
11 | }
|
12 |
|
13 | /* Disable Cache */
|
14 | uint32_t temp = NVMCTRL->CTRLB.reg;
|
15 | NVMCTRL->CTRLB.reg = temp | NVMCTRL_CTRLB_CACHEDIS;
|
16 |
|
17 | /* Clear error flags */
|
18 | NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK;
|
19 |
|
20 | /* Set address, command will be issued elsewhere */
|
21 | NVMCTRL->ADDR.reg = NVMCTRL_AUX0_ADDRESS / 2;
|
22 |
|
23 | /* Erase the user page */
|
24 | NVMCTRL->CTRLA.reg = 0x05| NVMCTRL_CTRLA_CMDEX_KEY;
|
25 |
|
26 | /* Wait for NVM command to complete */
|
27 | while (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY));
|
28 |
|
29 | /* Clear error flags */
|
30 | NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK;
|
31 |
|
32 | /* Set address, command will be issued elsewhere */
|
33 | NVMCTRL->ADDR.reg = NVMCTRL_AUX0_ADDRESS / 2;
|
34 |
|
35 | /* Erase the page buffer before buffering new data */
|
36 | NVMCTRL->CTRLA.reg = 0x44 | NVMCTRL_CTRLA_CMDEX_KEY;
|
37 |
|
38 | /* Wait for NVM command to complete */
|
39 | while (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY));
|
40 |
|
41 | /* Clear error flags */
|
42 | NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK;
|
43 |
|
44 | /* Set address, command will be issued elsewhere */
|
45 | NVMCTRL->ADDR.reg = NVMCTRL_AUX0_ADDRESS / 2;
|
46 |
|
47 | *((uint32_t *)NVMCTRL_AUX0_ADDRESS) = new_fusebits[0];
|
48 | *(((uint32_t *)NVMCTRL_AUX0_ADDRESS) + 1) = new_fusebits[1];
|
49 |
|
50 | /* Write the user page */
|
51 | NVMCTRL->CTRLA.reg = 0x06 | NVMCTRL_CTRLA_CMDEX_KEY;
|
52 |
|
53 | /* Restore the settings */
|
54 | NVMCTRL->CTRLB.reg = temp;
|
55 | }
|