1 #include "devicemanager.h"
3 #include "programmer.h"
7 DeviceManager::DeviceManager(Programmer *prog) : programmer(prog)
12 bool DeviceManager::IsSupported()
15 if(!programmer->Read(GBL_CHIP_VERSION, &id)) return false;
19 bool DeviceManager::XapResetAndGo()
21 if(!IsSupported()) return false;
27 programmer->SetTransferSpeed(20);
28 programmer->Write(SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK);
30 while (timer.elapsedmsec() < 16 )
31 programmer->Write(SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK);
33 programmer->SetTransferSpeed(1000);
34 for(int i=0;i<100;i++)
36 if ( !programmer->Read(MMU_FLASH_BANK_SELECT, &tmp) )
39 programmer->Write(MMU_FLASH_BANK_SELECT, 0);
40 if(++reset_count >= 10)
45 /* write instructions - endless loop and execute it */
46 uint32_t xx = 0x540000;
47 uint32_t address = 0xa000 + xx - 0x140000;
48 programmer->Write(address, 0x0000); //nop
49 programmer->Write(address+1, 0x0000); //nop
50 programmer->Write(address+2, 0x00E0); //x: bra x
51 programmer->Write(XAP_PCH, xx >> 16);
52 programmer->Write(XAP_PCL, xx);
54 programmer->Read(ANA_CONFIG2, &tmp);
56 programmer->Write(ANA_CONFIG2, tmp);
57 programmer->Write(GBL_CLK_RATE, 0);
58 programmer->Read(XAP_FLAGS, &tmp);
60 programmer->Write(XAP_FLAGS, tmp);
61 programmer->Write(RSTGEN_WATCHDOG_DELAY, 2);
62 programmer->Write(GBL_RST_ENABLES, RST_WATCHDOG_EN_MASK |
64 programmer->Write(RSTGEN_WATCHDOG_KICK, 1);
65 programmer->Write(SPI_EMU_CMD, 0);
70 bool DeviceManager::XapResetAndStop()
72 if(!IsSupported()) return false;
82 programmer->Read(GBL_RST_ENABLES, &tmp);
88 while ( status < 2 && timer.elapsedmsec() < 8 );
96 bool DeviceManager::XapGo()
98 if(!IsSupported()) return false;
100 programmer->Write(SPI_EMU_CMD,SPI_EMU_CMD_XAP_RUN_B_MASK);
101 programmer->Write(SPI_EMU_CMD,SPI_EMU_CMD_XAP_STEP_MASK |
102 SPI_EMU_CMD_XAP_RUN_B_MASK);
103 programmer->Write(SPI_EMU_CMD,SPI_EMU_CMD_XAP_RUN_B_MASK);
104 programmer->Write(SPI_EMU_CMD,SPI_EMU_CMD_XAP_STEP_MASK);
109 bool DeviceManager::XapStop()
111 if(!IsSupported()) return false;
113 uint16_t data[0x6B];//,tmp;
115 for (int i = 0; i < 20; ++i )
116 programmer->Write(SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK);
118 memset(data, 0, sizeof(data));
120 programmer->WriteBlock(0, 0x6B, data);
121 programmer->Write(SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK);
122 programmer->Write(SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK);
124 /* reset all register to their default values */
125 programmer->WriteBlock(XAP_AH, 16, data);
126 programmer->Write(XAP_BRK_REGH, 0xff);
127 programmer->Write(XAP_BRK_REGL, 0xffff);