aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stm32-metapac-gen/src/lib.rs79
-rw-r--r--stm32-metapac/Cargo.toml7
2 files changed, 57 insertions, 29 deletions
diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs
index 070afb348..9fe3be55c 100644
--- a/stm32-metapac-gen/src/lib.rs
+++ b/stm32-metapac-gen/src/lib.rs
@@ -425,29 +425,7 @@ pub fn gen_chip(
425 gpio_base, gpio_stride, 425 gpio_base, gpio_stride,
426 ); 426 );
427 427
428 let peripheral_version_table = peripheral_versions 428 for (module, version) in &peripheral_versions {
429 .iter()
430 .map(|(kind, version)| vec![kind.clone(), version.clone()])
431 .collect();
432
433 make_table(&mut extra, "pins", &pin_table);
434 make_table(&mut extra, "interrupts", &interrupt_table);
435 make_table(&mut extra, "peripherals", &peripherals_table);
436 make_table(&mut extra, "peripheral_versions", &peripheral_version_table);
437 make_table(&mut extra, "peripheral_pins", &peripheral_pins_table);
438 make_table(
439 &mut extra,
440 "peripheral_dma_channels",
441 &peripheral_dma_channels_table,
442 );
443 make_table(&mut extra, "peripheral_rcc", &peripheral_rcc_table);
444 make_table(&mut extra, "gpio_rcc", &gpio_rcc_table);
445 make_table(&mut extra, "dma_channels", &dma_channels_table);
446 make_table(&mut extra, "dbgmcu", &dbgmcu_table);
447 make_peripheral_counts(&mut extra, &peripheral_counts);
448 make_dma_channel_counts(&mut extra, &dma_channel_counts);
449
450 for (module, version) in peripheral_versions {
451 all_peripheral_versions.insert((module.clone(), version.clone())); 429 all_peripheral_versions.insert((module.clone(), version.clone()));
452 write!( 430 write!(
453 &mut extra, 431 &mut extra,
@@ -467,19 +445,25 @@ pub fn gen_chip(
467 transform::sort::Sort {}.run(&mut ir).unwrap(); 445 transform::sort::Sort {}.run(&mut ir).unwrap();
468 transform::Sanitize {}.run(&mut ir).unwrap(); 446 transform::Sanitize {}.run(&mut ir).unwrap();
469 447
448 // ==============================
449 // Setup chip dir
450
470 let chip_dir = options 451 let chip_dir = options
471 .out_dir 452 .out_dir
472 .join("src/chips") 453 .join("src/chips")
473 .join(chip_core_name.to_ascii_lowercase()); 454 .join(chip_core_name.to_ascii_lowercase());
474 fs::create_dir_all(&chip_dir).unwrap(); 455 fs::create_dir_all(&chip_dir).unwrap();
475 456
476 let items = generate::render(&ir, &gen_opts()).unwrap(); 457 // ==============================
477 let mut file = File::create(chip_dir.join("pac.rs")).unwrap(); 458 // generate pac.rs
478 let data = items.to_string().replace("] ", "]\n"); 459
460 let data = generate::render(&ir, &gen_opts()).unwrap().to_string();
461 let data = data.replace("] ", "]\n");
479 462
480 // Remove inner attributes like #![no_std] 463 // Remove inner attributes like #![no_std]
481 let re = Regex::new("# *! *\\[.*\\]").unwrap(); 464 let data = Regex::new("# *! *\\[.*\\]").unwrap().replace_all(&data, "");
482 let data = re.replace_all(&data, ""); 465
466 let mut file = File::create(chip_dir.join("pac.rs")).unwrap();
483 file.write_all(data.as_bytes()).unwrap(); 467 file.write_all(data.as_bytes()).unwrap();
484 file.write_all(extra.as_bytes()).unwrap(); 468 file.write_all(extra.as_bytes()).unwrap();
485 469
@@ -494,11 +478,48 @@ pub fn gen_chip(
494 .unwrap(); 478 .unwrap();
495 } 479 }
496 480
481 // ==============================
482 // generate mod.rs
483
484 let mut data = String::new();
485
486 write!(&mut data, "#[cfg(feature=\"pac\")] mod pac;").unwrap();
487 write!(&mut data, "#[cfg(feature=\"pac\")] pub use pac::*; ").unwrap();
488
489 let peripheral_version_table = peripheral_versions
490 .iter()
491 .map(|(kind, version)| vec![kind.clone(), version.clone()])
492 .collect();
493
494 make_table(&mut data, "pins", &pin_table);
495 make_table(&mut data, "interrupts", &interrupt_table);
496 make_table(&mut data, "peripherals", &peripherals_table);
497 make_table(&mut data, "peripheral_versions", &peripheral_version_table);
498 make_table(&mut data, "peripheral_pins", &peripheral_pins_table);
499 make_table(
500 &mut data,
501 "peripheral_dma_channels",
502 &peripheral_dma_channels_table,
503 );
504 make_table(&mut data, "peripheral_rcc", &peripheral_rcc_table);
505 make_table(&mut data, "gpio_rcc", &gpio_rcc_table);
506 make_table(&mut data, "dma_channels", &dma_channels_table);
507 make_table(&mut data, "dbgmcu", &dbgmcu_table);
508 make_peripheral_counts(&mut data, &peripheral_counts);
509 make_dma_channel_counts(&mut data, &dma_channel_counts);
510
511 let mut file = File::create(chip_dir.join("mod.rs")).unwrap();
512 file.write_all(data.as_bytes()).unwrap();
513
514 // ==============================
515 // generate device.x
516
497 File::create(chip_dir.join("device.x")) 517 File::create(chip_dir.join("device.x"))
498 .unwrap() 518 .unwrap()
499 .write_all(device_x.as_bytes()) 519 .write_all(device_x.as_bytes())
500 .unwrap(); 520 .unwrap();
501 521
522 // ==============================
502 // generate default memory.x 523 // generate default memory.x
503 gen_memory_x(&chip_dir, &chip); 524 gen_memory_x(&chip_dir, &chip);
504} 525}
@@ -594,7 +615,7 @@ pub fn gen(options: Options) {
594 let x = name.to_ascii_lowercase(); 615 let x = name.to_ascii_lowercase();
595 write!( 616 write!(
596 &mut paths, 617 &mut paths,
597 "#[cfg_attr(feature=\"{}\", path = \"chips/{}/pac.rs\")]", 618 "#[cfg_attr(feature=\"{}\", path = \"chips/{}/mod.rs\")]",
598 x, x 619 x, x
599 ) 620 )
600 .unwrap(); 621 .unwrap();
diff --git a/stm32-metapac/Cargo.toml b/stm32-metapac/Cargo.toml
index 1ca80d162..7411e6cec 100644
--- a/stm32-metapac/Cargo.toml
+++ b/stm32-metapac/Cargo.toml
@@ -16,6 +16,13 @@ regex = "1.5.4"
16# END BUILD DEPENDENCIES 16# END BUILD DEPENDENCIES
17 17
18[features] 18[features]
19default = ["pac"]
20
21# Build the actual PAC. Set by default.
22# If not set, only the macrotables will be generated. You may want to not set it
23# if you're using stm32-metapac from a build.rs script to use the macros.
24pac = []
25
19rt = ["cortex-m-rt/device"] 26rt = ["cortex-m-rt/device"]
20memory-x = [] 27memory-x = []
21 28