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.
Solved! Go to Solution.
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!
-----------------------------------------------------------------------------------------------------------------------
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!
-----------------------------------------------------------------------------------------------------------------------