How to access fuse banks on the imx51

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to access fuse banks on the imx51

Jump to solution
802 Views
ernstzberg
Contributor I

I am working on imx515 processor and I would like to know how can I access the fuse banks of the processor in order to be able to  read and write the IMEI and MAC Addresses fields.

Labels (1)
0 Kudos
1 Solution
555 Views
Yuri
NXP Employee
NXP Employee

Below are some comments regarding working with i.MX51 fuses.

1. How to read a fuse?

Once sensing is done at boot, every read access is done directly in this shadow

registers rather than physically. Shadow registers integrity is guaranteed by

automatic parity generation/checking circuitry.

It is not needed to take care of this.

So, to read a fuse state is as simple as reading a register. The memory map is

described in Chapter 6 (Fuse Map) of the Reference Manual.

NOTE: there are references in some register fields to the sensing mechanism. It

can be done, if it is allowed for the bank, to force a physical read, but it is

not recommended, and actually useless cause of the shadow registers.

2. How to program a fuse?

The first step in programming a fuse is to write the fuse address into the upper

and lower address registers.

This address is the bit address of the fuse to be programmed. Address bits 13:11

select the bank in which the fuse resides, bits 10:3 select the byte to be

programmed, and bits 2:0 select the bit within the byte.

Bits 7:0 of the address are written into the LA register and bits 13:8 into the

UA register.

Next, please use algorithm, described in section 41.3.5.3 (Programming Sequence)

of the Reference Manual.

Let me remind, "In Read mode, Freescale recommends VDD_FUSE be floated or

grounded.

Tying VDD_FUSE to a positive supply (3.0 V3.3 V) increases the possibility of

inadvertently blowing fuses and is not recommended."

3. Build the fuse address:

Example code:

#define SHIFT_BANK_13_11 11

#define MASK_BANK 0x7

#define SHIFT_ROW_10_3 3

#define MASK_ROW 0xFF

#define MASK_BIT 0x7

int addr, upper_addr, lower_addr;

addr = ((BANK & MASK_BANK) << SHIFT_BANK_13_11) | ((ROW & MASK_ROW) <<

SHIFT_ROW_10_3) | (BANK & MASK_BIT);

upper_addr = (addr >> 8) & 0xFF;

lower_addr = addr & 0xFF;


Have a great day,
Yuri

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

View solution in original post

0 Kudos
1 Reply
556 Views
Yuri
NXP Employee
NXP Employee

Below are some comments regarding working with i.MX51 fuses.

1. How to read a fuse?

Once sensing is done at boot, every read access is done directly in this shadow

registers rather than physically. Shadow registers integrity is guaranteed by

automatic parity generation/checking circuitry.

It is not needed to take care of this.

So, to read a fuse state is as simple as reading a register. The memory map is

described in Chapter 6 (Fuse Map) of the Reference Manual.

NOTE: there are references in some register fields to the sensing mechanism. It

can be done, if it is allowed for the bank, to force a physical read, but it is

not recommended, and actually useless cause of the shadow registers.

2. How to program a fuse?

The first step in programming a fuse is to write the fuse address into the upper

and lower address registers.

This address is the bit address of the fuse to be programmed. Address bits 13:11

select the bank in which the fuse resides, bits 10:3 select the byte to be

programmed, and bits 2:0 select the bit within the byte.

Bits 7:0 of the address are written into the LA register and bits 13:8 into the

UA register.

Next, please use algorithm, described in section 41.3.5.3 (Programming Sequence)

of the Reference Manual.

Let me remind, "In Read mode, Freescale recommends VDD_FUSE be floated or

grounded.

Tying VDD_FUSE to a positive supply (3.0 V3.3 V) increases the possibility of

inadvertently blowing fuses and is not recommended."

3. Build the fuse address:

Example code:

#define SHIFT_BANK_13_11 11

#define MASK_BANK 0x7

#define SHIFT_ROW_10_3 3

#define MASK_ROW 0xFF

#define MASK_BIT 0x7

int addr, upper_addr, lower_addr;

addr = ((BANK & MASK_BANK) << SHIFT_BANK_13_11) | ((ROW & MASK_ROW) <<

SHIFT_ROW_10_3) | (BANK & MASK_BIT);

upper_addr = (addr >> 8) & 0xFF;

lower_addr = addr & 0xFF;


Have a great day,
Yuri

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos