Skip to content

Commit aa3cf2a

Browse files
bors[bot]japaric
andcommitted
Merge #203
203: cortex-m: generate code that compiles on stable r=japaric a=japaric This is still missing some stuff: - svd2rust must now generate an interrupts.x linker script and a build script that puts the linker script somewhere the linker can find it. See japaric/stm32f103xx#24 for a sample of what those files look like. - we have to decide how to organize the svd2rust output. It probably makes sense to generate 3 files on $PWD (lib.rs, build.rs, interrupts.x) for Cortex-M and a single lib.rs for the other targets. - I probably broke the other targets; need to test them Co-authored-by: Jorge Aparicio <jorge@japaric.io>
2 parents f271405 + b3f536f commit aa3cf2a

File tree

7 files changed

+383
-242
lines changed

7 files changed

+383
-242
lines changed

.travis.yml

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,38 @@ matrix:
1212
include:
1313
# Nightly, for testing
1414
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Atmel
15-
rust: nightly
15+
rust: beta
16+
1617
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Freescale
17-
rust: nightly
18+
rust: beta
19+
1820
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Fujitsu
19-
rust: nightly
21+
rust: beta
22+
2023
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Holtek
21-
rust: nightly
24+
rust: beta
25+
2226
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Nordic
23-
rust: nightly
27+
rust: beta
28+
2429
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Nuvoton
25-
rust: nightly
30+
rust: beta
31+
2632
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=NXP
27-
rust: nightly
33+
rust: beta
34+
2835
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=SiliconLabs
29-
rust: nightly
36+
rust: beta
37+
3038
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Spansion
31-
rust: nightly
39+
rust: beta
40+
3241
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=STMicro
33-
rust: nightly
42+
rust: beta
43+
3444
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=Toshiba
35-
rust: nightly
45+
rust: beta
46+
3647
- env: TARGET=x86_64-unknown-linux-gnu VENDOR=OTHER
3748
rust: nightly
3849

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ keywords = [
1919
license = "MIT OR Apache-2.0"
2020
name = "svd2rust"
2121
repository = "https://github.com/japaric/svd2rust"
22-
version = "0.12.1"
22+
version = "0.13.0"
2323

2424
[[bin]]
2525
doc = false

ci/script.sh

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@ test_svd() {
88
)
99

1010
# NOTE we care about errors in svd2rust, but not about errors / warnings in rustfmt
11-
target/$TARGET/release/svd2rust -i $td/${1}.svd | \
12-
( rustfmt 2>/dev/null > $td/src/lib.rs || true )
11+
local cwd=$(pwd)
12+
pushd $td
13+
$cwd/target/$TARGET/release/svd2rust -i ${1}.svd
14+
15+
mv lib.rs src/lib.rs
16+
17+
rustfmt src/lib.rs
18+
popd
1319

1420
cargo check --manifest-path $td/Cargo.toml
1521
}
@@ -34,18 +40,17 @@ main() {
3440

3541
# test crate
3642
cargo init --name foo $td
37-
echo 'bare-metal = "0.1.0"' >> $td/Cargo.toml
38-
echo 'cortex-m = "0.4.0"' >> $td/Cargo.toml
39-
echo 'cortex-m-rt = "0.3.0"' >> $td/Cargo.toml
43+
echo 'cortex-m = "0.5.0"' >> $td/Cargo.toml
44+
echo 'cortex-m-rt = "0.5.0"' >> $td/Cargo.toml
4045
echo 'vcell = "0.1.0"' >> $td/Cargo.toml
41-
echo 'msp430 = "0.1.0"' >> $td/Cargo.toml
42-
# echo 'riscv = "0.1.4"' >> $td/Cargo.toml
43-
# echo 'riscv-rt = "0.1.3"' >> $td/Cargo.toml
4446
echo '[profile.dev]' >> $td/Cargo.toml
4547
echo 'incremental = false' >> $td/Cargo.toml
4648

4749
case $VENDOR in
4850
Atmel)
51+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
52+
echo 'version = "0.2.0"' >> $td/Cargo.toml
53+
4954
# BAD-SVD missing resetValue
5055
# test_svd AT91SAM9CN11
5156
# test_svd AT91SAM9CN12
@@ -129,6 +134,9 @@ main() {
129134
;;
130135

131136
Freescale)
137+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
138+
echo 'version = "0.2.0"' >> $td/Cargo.toml
139+
132140
# BAD-SVD bad enumeratedValue value
133141
# test_svd MKV56F20
134142
# test_svd MKV56F22
@@ -277,6 +285,9 @@ main() {
277285
;;
278286

279287
Fujitsu)
288+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
289+
echo 'version = "0.2.0"' >> $td/Cargo.toml
290+
280291
# OK
281292
test_svd MB9AF10xN
282293
test_svd MB9AF10xR
@@ -381,6 +392,9 @@ main() {
381392
;;
382393

383394
Holtek)
395+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
396+
echo 'version = "0.2.0"' >> $td/Cargo.toml
397+
384398
# OK
385399
test_svd ht32f125x
386400
test_svd ht32f175x
@@ -389,6 +403,18 @@ main() {
389403

390404
# test other targets (architectures)
391405
OTHER)
406+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
407+
echo 'version = "0.1.0"' >> $td/Cargo.toml
408+
409+
echo '[dependencies.msp430]' >> $td/Cargo.toml
410+
echo 'version = "0.1.0"' >> $td/Cargo.toml
411+
412+
# echo '[dependencies.riscv]' >> $td/Cargo.toml
413+
# echo 'version = "0.2.0"' >> $td/Cargo.toml
414+
415+
# echo '[dependencies.riscv-rt]' >> $td/Cargo.toml
416+
# echo 'version = "0.2.0"' >> $td/Cargo.toml
417+
392418
(
393419
cd $td &&
394420
curl -LO \
@@ -415,6 +441,9 @@ main() {
415441
;;
416442

417443
Nordic)
444+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
445+
echo 'version = "0.2.0"' >> $td/Cargo.toml
446+
418447
# BAD-SVD two enumeratedValues have the same value
419448
# test_svd nrf52
420449

@@ -423,12 +452,18 @@ main() {
423452
;;
424453

425454
Nuvoton)
455+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
456+
echo 'version = "0.2.0"' >> $td/Cargo.toml
457+
426458
# OK
427459
test_svd M051_Series
428460
test_svd NUC100_Series
429461
;;
430462

431463
NXP)
464+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
465+
echo 'version = "0.2.0"' >> $td/Cargo.toml
466+
432467
# BAD-SVD two enumeratedValues have the same name
433468
# test_svd LPC11Exx_v5
434469
# test_svd LPC11Uxx_v7
@@ -465,6 +500,9 @@ main() {
465500
;;
466501

467502
SiliconLabs)
503+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
504+
echo 'version = "0.2.0"' >> $td/Cargo.toml
505+
468506
# #99 regression tests
469507
test_svd SIM3C1x4_SVD
470508
test_svd SIM3C1x6_SVD
@@ -481,6 +519,9 @@ main() {
481519
;;
482520

483521
Spansion)
522+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
523+
echo 'version = "0.2.0"' >> $td/Cargo.toml
524+
484525
# OK
485526
test_svd MB9AF12xK
486527
test_svd MB9AF12xL
@@ -576,6 +617,9 @@ main() {
576617
;;
577618

578619
STMicro)
620+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
621+
echo 'version = "0.2.0"' >> $td/Cargo.toml
622+
579623
# OK
580624
test_svd STM32F030
581625
test_svd STM32F031x
@@ -626,6 +670,9 @@ main() {
626670
;;
627671

628672
Toshiba)
673+
echo '[dependencies.bare-metal]' >> $td/Cargo.toml
674+
echo 'version = "0.2.0"' >> $td/Cargo.toml
675+
629676
# BAD-SVD resetValue is bigger than the register size
630677
# test_svd M365
631678
# test_svd M367

src/generate/device.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use Target;
99
use generate::{interrupt, peripheral};
1010

1111
/// Whole device generation
12-
pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>> {
12+
pub fn render(d: &Device, target: &Target, nightly: bool, device_x: &mut String) -> Result<Vec<Tokens>> {
1313
let mut out = vec![];
1414

1515
let doc = format!(
@@ -27,7 +27,7 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
2727
});
2828
}
2929

30-
if *target != Target::None {
30+
if *target != Target::None && *target != Target::CortexM {
3131
out.push(quote! {
3232
#![cfg_attr(feature = "rt", feature(global_asm))]
3333
#![cfg_attr(feature = "rt", feature(use_extern_macros))]
@@ -37,15 +37,19 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
3737

3838
out.push(quote! {
3939
#![doc = #doc]
40-
#![allow(private_no_mangle_statics)]
4140
#![deny(missing_docs)]
4241
#![deny(warnings)]
4342
#![allow(non_camel_case_types)]
44-
#![feature(const_fn)]
45-
#![feature(try_from)]
4643
#![no_std]
4744
});
4845

46+
if *target != Target::CortexM {
47+
out.push(quote! {
48+
#![feature(const_fn)]
49+
#![feature(try_From)]
50+
});
51+
}
52+
4953
if nightly {
5054
out.push(quote! {
5155
#![feature(untagged_unions)]
@@ -58,8 +62,6 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
5862
extern crate cortex_m;
5963
#[cfg(feature = "rt")]
6064
extern crate cortex_m_rt;
61-
#[cfg(feature = "rt")]
62-
pub use cortex_m_rt::{default_handler, exception};
6365
});
6466
}
6567
Target::Msp430 => {
@@ -98,7 +100,7 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
98100
});
99101
}
100102

101-
out.extend(interrupt::render(d, target, &d.peripherals)?);
103+
out.extend(interrupt::render(target, &d.peripherals, device_x)?);
102104

103105
const CORE_PERIPHERALS: &[&str] = &[
104106
"CBP", "CPUID", "DCB", "DWT", "FPB", "FPU", "ITM", "MPU", "NVIC", "SCB", "SYST", "TPIU"
@@ -111,18 +113,10 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
111113
pub use cortex_m::peripheral::Peripherals as CorePeripherals;
112114
});
113115

114-
// NOTE re-export only core peripherals available on *all* Cortex-M devices
115-
// (if we want to re-export all core peripherals available for the target then we are going
116-
// to need to replicate the `#[cfg]` stuff that cortex-m uses and that would require all
117-
// device crates to define the custom `#[cfg]`s that cortex-m uses in their build.rs ...)
118116
out.push(quote! {
119-
pub use cortex_m::peripheral::CPUID;
120-
pub use cortex_m::peripheral::DCB;
121-
pub use cortex_m::peripheral::DWT;
122-
pub use cortex_m::peripheral::MPU;
123-
pub use cortex_m::peripheral::NVIC;
124-
pub use cortex_m::peripheral::SCB;
125-
pub use cortex_m::peripheral::SYST;
117+
pub use cortex_m::peripheral::{
118+
CBP, CPUID, DCB, DWT, FPB, FPU, ITM, MPU, NVIC, SCB, SYST, TPIU,
119+
};
126120
});
127121
}
128122

@@ -132,7 +126,6 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
132126
continue;
133127
}
134128

135-
136129
out.extend(peripheral::render(p, &d.peripherals, &d.defaults, nightly)?);
137130

138131
if p.registers
@@ -180,6 +173,7 @@ pub fn render(d: &Device, target: &Target, nightly: bool) -> Result<Vec<Tokens>>
180173
// NOTE `no_mangle` is used here to prevent linking different minor versions of the device
181174
// crate as that would let you `take` the device peripherals more than once (one per minor
182175
// version)
176+
#[allow(private_no_mangle_statics)]
183177
#[no_mangle]
184178
static mut DEVICE_PERIPHERALS: bool = false;
185179

0 commit comments

Comments
 (0)