1
1
#include " devicemanager.h"
2
2
#include " stopwatch.h"
3
3
#include " usbprogrammer.h"
4
+ #include " bc_def.h"
4
5
#include < cstring>
5
6
6
7
DeviceManager::DeviceManager ()
@@ -11,7 +12,7 @@ DeviceManager::DeviceManager()
11
12
bool DeviceManager::IsSupported ()
12
13
{
13
14
uint16_t id;
14
- if (!programmer->Read (0xff9a , &id)) return false ;
15
+ if (!programmer->Read (GBL_CHIP_VERSION , &id)) return false ;
15
16
return id == 0x4826 ;
16
17
}
17
18
@@ -22,44 +23,46 @@ bool DeviceManager::XapResetAndGo()
22
23
int reset_count = 0 ;
23
24
StopWatch timer;
24
25
uint16_t tmp;
25
- int xx = 0x540000 ;
26
26
27
27
programmer->SetTransferSpeed (0x189 );
28
- programmer->Write (0x6A , 2 );
28
+ programmer->Write (SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK );
29
29
timer.start ();
30
- while (timer.elapsedmsec () < 0x10 )
31
- programmer->Write (0x6A , 2 );
30
+ while (timer.elapsedmsec () < 16 )
31
+ programmer->Write (SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK );
32
32
33
33
programmer->SetTransferSpeed (4 );
34
34
for (int i=0 ;i<100 ;i++)
35
35
{
36
- if ( !programmer->Read (0x73 , &tmp) )
36
+ if ( !programmer->Read (MMU_FLASH_BANK_SELECT , &tmp) )
37
37
{
38
- if ( tmp >= 0x200u )
39
- programmer->Write (0x73u , 0 );
38
+ if ( tmp >= 0x200 )
39
+ programmer->Write (MMU_FLASH_BANK_SELECT , 0 );
40
40
if (++reset_count >= 10 )
41
41
break ;
42
42
}
43
43
}
44
44
45
+ /* write instructions - endless loop and execute it */
46
+ uint32_t xx = 0x540000 ;
45
47
uint32_t address = 0xa000 + xx - 0x140000 ;
46
- programmer->Write (address,0 );
47
- programmer->Write (address + 1 , 0 );
48
- programmer->Write (address + 2 , 0xE0u );
49
- programmer->Write (0xFFE9 , xx >> 16 );
50
- programmer->Write (0xFFEA , xx);
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);
51
53
52
- programmer->Read (0xFF7E , &tmp);
54
+ programmer->Read (ANA_CONFIG2 , &tmp);
53
55
tmp &= 0xEFFF ;
54
- programmer->Write (0xFF7E , tmp);
55
- programmer->Write (0xFFDE , 0 );
56
- programmer->Read (0xFFE8 , &tmp);
57
- tmp &= 0x20u ;
58
- programmer->Write (0xFFE8 , tmp);
59
- programmer->Write (0x76 , 2 );
60
- programmer->Write (0xFF91 , 5 );
61
- programmer->Write (0x77 , 1 );
62
- programmer->Write (0x6A , 0 );
56
+ programmer->Write (ANA_CONFIG2, tmp);
57
+ programmer->Write (GBL_CLK_RATE, 0 );
58
+ programmer->Read (XAP_FLAGS, &tmp);
59
+ tmp &= 0x20 ;
60
+ programmer->Write (XAP_FLAGS, tmp);
61
+ programmer->Write (RSTGEN_WATCHDOG_DELAY, 2 );
62
+ programmer->Write (GBL_RST_ENABLES, RST_WATCHDOG_EN_MASK |
63
+ RST_FULL_CHIP_RESET);
64
+ programmer->Write (RSTGEN_WATCHDOG_KICK, 1 );
65
+ programmer->Write (SPI_EMU_CMD, 0 );
63
66
64
67
return true ;
65
68
}
@@ -69,14 +72,14 @@ bool DeviceManager::XapResetAndStop()
69
72
if (!IsSupported ()) return false ;
70
73
71
74
int status;
72
- uint16_t data[ 0x6B ], tmp;
75
+ uint16_t tmp;
73
76
StopWatch timer;
74
77
75
78
XapResetAndGo ();
76
79
timer.start ();
77
80
do
78
81
{
79
- programmer->ReadBlock ( 0xFF91 , 1 , &tmp);
82
+ programmer->Read (GBL_RST_ENABLES , &tmp);
80
83
if ( tmp )
81
84
status = 0 ;
82
85
else
@@ -87,29 +90,18 @@ bool DeviceManager::XapResetAndStop()
87
90
if (status < 2 )
88
91
return false ;
89
92
90
- for (int i = 0 ; i < 20 ; ++i )
91
- programmer->Write (0x6A , 2 );
92
-
93
- memset (data, 0 , 0xD6 );
94
-
95
- programmer->WriteBlock (0 , 0x6B , data);
96
- programmer->Write (0x6A , 2 );
97
- programmer->Write (0x6A , 2 );
98
- programmer->WriteBlock (0xFFE0 , 16 , data);
99
- programmer->Write (0xFFEB , 0xff );
100
- programmer->Write (0xFFEC , 0xffff );
101
-
102
- return true ;
93
+ return XapStop ();
103
94
}
104
95
105
96
bool DeviceManager::XapGo ()
106
97
{
107
98
if (!IsSupported ()) return false ;
108
99
109
- programmer->Write (0x6A ,2 );
110
- programmer->Write (0x6A ,3 );
111
- programmer->Write (0x6A ,2 );
112
- programmer->Write (0x6A ,1 );
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);
113
105
114
106
return true ;
115
107
}
@@ -121,18 +113,18 @@ bool DeviceManager::XapStop()
121
113
uint16_t data[0x6B ];// ,tmp;
122
114
123
115
for (int i = 0 ; i < 20 ; ++i )
124
- programmer->Write (0x6A , 2 );
116
+ programmer->Write (SPI_EMU_CMD, SPI_EMU_CMD_XAP_RUN_B_MASK );
125
117
126
118
memset (data, 0 , sizeof (data));
127
119
128
120
programmer->WriteBlock (0 , 0x6B , data);
129
- programmer->Write (0x6A , 2 );
130
- programmer->Write (0x6A , 2 );
131
- /* programmer->Read(0xFFEB, &tmp);
132
- programmer->Read(0xFFEC, &tmp) */
133
- programmer->WriteBlock (0xFFE0 , 16 , data);
134
- programmer->Write (0xFFEB , 0xff );
135
- programmer->Write (0xFFEC , 0xffff );
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 );
123
+
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 );
136
128
137
129
return true ;
138
130
}
0 commit comments