Skip to content

Commit 6f858e8

Browse files
committed
update doc
1 parent b23662f commit 6f858e8

File tree

2 files changed

+158
-6
lines changed

2 files changed

+158
-6
lines changed

.vitepress/config.mts

+1-6
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export default defineConfig({
9292
{
9393
text: 'CAN', items: [
9494
{ text: 'CAN Basic', link: '/examples/can/readme', },
95+
{ text: 'NXP UDS Bootloader', link: '/examples/nxp_bootloader/readme' },
9596
], collapsed: true
9697
},
9798
{
@@ -102,12 +103,6 @@ export default defineConfig({
102103
],
103104
collapsed: true
104105
},
105-
{
106-
text: 'CAN', items: [
107-
{ text: 'NXP UDS Bootloader', link: '/examples/nxp_bootloader/readme' },
108-
],
109-
collapsed: true
110-
},
111106
{
112107
text: 'DOIP', items: [
113108
{ text: 'DoIP Tester', link: '/examples/doip/readme' },

resources/examples/nxp_bootloader/readme.md

+157
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,161 @@ This example demonstrates how to use the EcuBus-Pro to upgrade Application firmw
3434

3535
---
3636

37+
38+
39+
## Diagnostic Steps
40+
41+
This example implements firmware upgrade through UDS diagnostic protocol. The main steps are as follows:
42+
43+
1. Session Control and Communication Control
44+
- DiagnosticSessionControl (0x10) switch to programming session (0x03)
45+
- CommunicationControl (0x28) disable normal communication (controlType=0x03)
46+
- DiagnosticSessionControl (0x10) switch to extended session (0x02)
47+
48+
2. Security Access
49+
- SecurityAccess (0x27, subfunction=0x01) request seed
50+
- SecurityAccess (0x27, subfunction=0x02) send key
51+
- Key calculation uses AES-128-CBC algorithm, key is [0-15], IV is all zeros
52+
53+
3. Write Identifier
54+
- WriteDataByIdentifier (0x2E, DID=0xF15A) write specific identifier
55+
56+
4. Download Program
57+
For each firmware file:
58+
1. RequestDownload (0x34) request download, specify memory address and size
59+
2. RoutineControl (0x31, routineId=0x0202) verify CRC
60+
3. TransferData (0x36) transfer data in blocks
61+
4. RequestTransferExit (0x37) end transfer
62+
63+
5. Firmware Verification and Reset
64+
- RoutineControl (0x31, routineId=0xFF00) verify firmware
65+
- RoutineControl (0x31, routineId=0xFF01) verification complete
66+
- ECUReset (0x11) reset ECU
67+
68+
## Firmware Files
69+
70+
The example includes two firmware files:
71+
1. S32K344_FlsDrvRTD100.bin
72+
- Download Address: 0x20000010
73+
- Driver firmware
74+
75+
2. S32K344_CAN_App_RTD200.bin
76+
- Download Address: 0x00440200
77+
- Application firmware
78+
79+
## Notes
80+
81+
1. Ensure firmware files are placed in the project's bin directory
82+
2. Do not disconnect or power off during download
83+
3. If download fails, you can retry the entire process
84+
4. Each firmware file needs CRC verification
85+
86+
---
87+
3788
**[Demo Video](https://www.bilibili.com/video/BV1KcmfYNEkQ)**
89+
90+
## Script Implementation Details
91+
92+
The bootloader.ts script implements the diagnostic sequence. Here's a detailed explanation of each part:
93+
94+
### Initialization and Imports
95+
```typescript
96+
import crypto from 'crypto'
97+
import { CRC, DiagRequest, DiagResponse } from 'ECB'
98+
import path from 'path'
99+
import fs from 'fs/promises'
100+
```
101+
- Imports required modules for cryptography, CRC calculation, and file operations
102+
- `ECB` provides UDS diagnostic communication utilities
103+
104+
### Configuration
105+
```typescript
106+
const crc = new CRC('self', 16, 0x3d65, 0, 0xffff, true, true)
107+
let maxChunkSize: number|undefined = undefined
108+
let content: undefined|Buffer = undefined
109+
```
110+
- Configures CRC-16 calculator for firmware verification
111+
- Variables to store transfer block size and firmware content
112+
113+
### Firmware Files Configuration
114+
```typescript
115+
const fileList = [{
116+
addr: 0x20000010,
117+
file: path.join(process.env.PROJECT_ROOT, 'bin', 'S32K344_FlsDrvRTD100.bin')
118+
}, {
119+
addr: 0x00440200,
120+
file: path.join(process.env.PROJECT_ROOT, 'bin', 'S32K344_CAN_App_RTD200.bin')
121+
}]
122+
```
123+
- Defines firmware files to be downloaded with their target addresses
124+
125+
### Initialization Handler
126+
```typescript
127+
Util.Init(async () => {
128+
const req = DiagRequest.from('Tester_1.RoutineControl491')
129+
req.diagSetParameter('routineControlType', 1)
130+
await req.changeService()
131+
const resp = DiagResponse.from('Tester_1.RoutineControl491')
132+
resp.diagSetParameter('routineControlType', 1)
133+
await resp.changeService()
134+
})
135+
```
136+
- Modifies RoutineControl491 service to use type 1 (start routine)
137+
- Updates both request and response parameters
138+
139+
### Security Access Handler
140+
```typescript
141+
Util.On('Tester_1.SecurityAccess390.recv', async (v) => {
142+
const data = v.diagGetParameterRaw('securitySeed')
143+
const cipher = crypto.createCipheriv(
144+
'aes-128-cbc',
145+
Buffer.from([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]),
146+
Buffer.alloc(16, 0)
147+
)
148+
let encrypted = cipher.update(data)
149+
cipher.final()
150+
const req = DiagRequest.from('Tester_1.SecurityAccess391')
151+
req.diagSetParameterSize('data', 128)
152+
req.diagSetParameterRaw('data', encrypted)
153+
await req.changeService()
154+
})
155+
```
156+
- Handles security access seed-key exchange
157+
- Uses AES-128-CBC to calculate key from received seed
158+
- Sends calculated key back to ECU
159+
160+
### Download Process Handlers
161+
```typescript
162+
Util.Register("Tester_1.JobFunction0", async () => {
163+
// Prepare next firmware file for download
164+
const item = fileList.shift()
165+
if(item) {
166+
// Request download and verify CRC
167+
// Returns array of requests to be sent
168+
}
169+
return []
170+
})
171+
172+
Util.Register("Tester_1.JobFunction1", () => {
173+
// Handle actual data transfer
174+
// Splits firmware into chunks and sends them
175+
// Ends with transfer exit request
176+
// Returns array of requests to be sent
177+
})
178+
```
179+
- JobFunction0: Prepares download by:
180+
1. Getting next firmware file
181+
2. Setting up download request with correct address
182+
3. Calculating and verifying CRC
183+
- JobFunction1: Handles data transfer by:
184+
1. Splitting firmware into appropriate chunk sizes
185+
2. Creating TransferData requests for each chunk
186+
3. Adding RequestTransferExit at the end
187+
4. Triggering firmware verification after last file
188+
189+
The script works in conjunction with the sequence defined in the ECB file, which executes:
190+
1. Session and communication control services
191+
2. Security access sequence
192+
3. JobFunction0 to prepare download
193+
4. JobFunction1 to transfer data
194+
5. Final verification and reset

0 commit comments

Comments
 (0)