base file
This commit is contained in:
91
北极星光OPENWRT/编程器软件/scripts/MX25L1605D_OTP.pas
Normal file
91
北极星光OPENWRT/编程器软件/scripts/MX25L1605D_OTP.pas
Normal file
@@ -0,0 +1,91 @@
|
||||
// designed for MACRONIX MX25L1605D
|
||||
// READ / WRITE 512-bit OTP PAGE, read and set OTP_LOCK bit
|
||||
// WRITE is really OTP operation, be careful, OTP page can not be erased.
|
||||
{$ READ_ID}
|
||||
begin
|
||||
ID_9F:= CreateByteArray(3);
|
||||
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
|
||||
LogPrint ('Start read ID');
|
||||
// read ID
|
||||
SPIWrite (0, 1, $9F);
|
||||
SPIRead(1, 3, ID_9F);
|
||||
logprint('ID(9F): ' + inttohex((GetArrayItem(ID_9F, 0)),2)+ inttohex((GetArrayItem(ID_9F, 1)),2)+ inttohex((GetArrayItem(ID_9F, 2)),2));
|
||||
LogPrint ('End read ID ');
|
||||
SPIExitProgMode ();
|
||||
end
|
||||
|
||||
{$ READ_OTP_LOCK_BIT}
|
||||
begin
|
||||
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
|
||||
sreg :=0;
|
||||
SPIWrite (0, 1, $2B);
|
||||
SPIRead (1, 1, sreg);
|
||||
if (sreg and $01) then LogPrint ('Factory OTP LockBit = 1')
|
||||
else if (sreg and $02) then LogPrint ('Customer OTP LockBit = 1')
|
||||
else LogPrint ('OTP LockBit = 0');
|
||||
|
||||
SPIExitProgMode ();
|
||||
end
|
||||
|
||||
{$ READ_OTP_PAGE}
|
||||
begin
|
||||
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
|
||||
LogPrint ('Start READ 512-bit OTP page of MX25L1605D');
|
||||
RegSize :=64;
|
||||
SPIWrite (1, 1, $B1); //Enter OTP mode
|
||||
SPIWrite (0, 4, $03, $00, $00, $00);
|
||||
SPIReadToEditor (1, RegSize);
|
||||
SPIWrite (1, 1, $C1); //Exit OTP mode
|
||||
|
||||
LogPrint ('End read OTP page of MX25L1605D');
|
||||
SPIExitProgMode ();
|
||||
end
|
||||
|
||||
|
||||
{$ WRITE_OTP_PAGE}
|
||||
begin
|
||||
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
|
||||
RegSize :=64;
|
||||
sreg :=0;
|
||||
repeat // Write is really OTP, so also confirm
|
||||
Confirm := InputBox('Are you really SHURE??? (YES/NO)','','NO');
|
||||
until (Confirm = 'YES') or (Confirm = 'NO');
|
||||
if (Confirm = 'YES') then
|
||||
begin
|
||||
LogPrint ('Start WRITE 512-bit OTP page of MX25L1605D');
|
||||
SPIWrite (1, 1, $B1); // Enter OTP mode
|
||||
SPIWrite (0, 1, $2B);
|
||||
SPIRead (1, 1, sreg);
|
||||
if (sreg and $03) then LogPrint ('OTP LockBit = 1, write not possible anymore!')
|
||||
else for i:=0 to RegSize-1 do
|
||||
begin
|
||||
SPIWrite (1, 1, $06); // write enable
|
||||
SPIWrite (0, 4, $02, $00, $00, i); // write byte-by-byte only!
|
||||
SPIWriteFromEditor(1, 1, i);
|
||||
repeat //Busy
|
||||
SPIWrite(0, 1, $05);
|
||||
SPIRead(1, 1, sreg);
|
||||
until((sreg and 1) <> 1);
|
||||
end;
|
||||
SPIWrite (1, 1, $C1); //Exit OTP mode
|
||||
LogPrint ('End write OTP page of MX25L1605D');
|
||||
end;
|
||||
SPIExitProgMode ();
|
||||
end
|
||||
|
||||
{$ SET_OTP_LOCK_BIT}
|
||||
begin
|
||||
if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
|
||||
sreg :=0;
|
||||
repeat
|
||||
Confirm := InputBox('Are you really SURE??? (YES/NO)','','NO');
|
||||
until (Confirm = 'YES') or (Confirm = 'NO');
|
||||
if (Confirm = 'YES') then
|
||||
begin
|
||||
SPIWrite (1, 1, $2F); // write secure reg (customer lock)
|
||||
LogPrint ('Customer OTP LockBit written!');
|
||||
end
|
||||
else LogPrint ('OTP LockBit not written, good choice!');
|
||||
SPIExitProgMode ();
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user