Rust JEP106芯片识别库的使用,高效解析与处理JEDEC标准芯片厂商编码信息
Rust JEP106芯片识别库的使用,高效解析与处理JEDEC标准芯片厂商编码信息
jep106是一个Rust库,用于检索与JEP106 ID代码对应的JEDEC制造商字符串。
该库包含了从JEDEC组织发布的PDF中解析出的所有代码数据,并提供了查询JEP106 ID代码对应JEDEC制造商字符串的接口。PDF解析由jep106-parse辅助库完成。
状态
该库提供了2025年2月发布的JEP106BL修订版代码列表。
使用示例
以下是内容中提供的示例:
# 克隆仓库
git clone https://github.com/Tiwalun/jep106-parser.git
cd jep106-parser
# 下载最新版本的PDF,例如JEP106BE.pdf
# Rust
# 运行以下命令解析PDF并生成`codes.rs`
cargo run -- --pdf JEP106BE.pdf --jep_version BE
# 将`codes.rs`复制到src/目录并格式化
mv codes.rs /path/to/jep106/src/codes.rs
cargo fmt
# NPM/JSON
# 运行以下命令解析PDF并生成`codes.json`
cargo run -- --pdf JEP106BE.pdf --jep_version BE --format json
# 将`codes.json`复制到src/目录并格式化
mv codes.json /path/to/jep106/src/codes.json
完整使用示例
以下是一个完整的Rust示例代码,展示如何使用jep106库来解析JEDEC标准芯片厂商编码信息:
use jep106::JEP106Code;
fn main() {
// 创建一个JEP106Code实例
let jep106 = JEP106Code::new();
// 示例1: 查询连续编码
let code1 = (0x01, 0x07); // (bank, number)
if let Some(manufacturer) = jep106.get_manufacturer(code1) {
println!("Manufacturer for code {:?}: {}", code1, manufacturer);
} else {
println!("No manufacturer found for code {:?}", code1);
}
// 示例2: 查询不连续编码
let code2 = (0x07, 0x15);
match jep106.get_manufacturer(code2) {
Some(name) => println!("Manufacturer for code {:?}: {}", code2, name),
None => println!("Manufacturer not found for code {:?}", code2),
}
// 示例3: 遍历所有已知厂商
println!("\nAll known manufacturers:");
for ((bank, number), manufacturer) in jep106.iter() {
println!("Bank {}, Number {}: {}", bank, number, manufacturer);
}
}
扩展完整示例
以下是一个更完整的示例,展示如何在实际应用中使用jep106库:
use jep106::JEP106Code;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 初始化JEP106解析器
let jep106 = JEP106Code::new();
// 从硬件设备或芯片寄存器中读取的JEP106代码示例
let sample_codes = vec![
(0x01, 0x07), // 已知厂商
(0x7F, 0x7F), // 保留代码
(0x0C, 0x81), // 另一个已知厂商
(0xFF, 0xFF) // 无效代码
];
println!("JEDEC Manufacturer Identification Report:");
println!("{:-^60}", "");
// 处理每个代码
for (bank, number) in sample_codes {
let code = (bank, number);
match jep106.get_manufacturer(code) {
Some(name) => {
println!("Code: Bank {:#04X}, Number {:#04X}", bank, number);
println!("Manufacturer: {}", name);
println!("{:-^60}", "");
},
None => {
println!("Code: Bank {:#04X}, Number {:#04X}", bank, number);
println!("Warning: Unknown manufacturer code");
println!("{:-^60}", "");
}
}
}
// 生成完整厂商列表报告
generate_manufacturer_report(&jep106)?;
Ok(())
}
fn generate_manufacturer_report(jep106: &JEP106Code) -> Result<(), Box<dyn Error>> {
use std::fs::File;
use std::io::Write;
let mut file = File::create("manufacturers_report.txt")?;
writeln!(file, "JEDEC JEP106 Manufacturer Code Listing")?;
writeln!(file, "Generated on: {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S"))?;
writeln!(file, "{:=^60}", "")?;
for ((bank, number), manufacturer) in jep106.iter() {
writeln!(file, "Bank: {:#04X} | Number: {:#04X} | Manufacturer: {}",
bank, number, manufacturer)?;
}
println!("Manufacturer report generated successfully.");
Ok(())
}
开发
这个库只包含jep106 crate的库部分。要更改PDF的处理方式,请查看jep106-parse辅助库。
许可证
该库采用以下任一种许可证:
- Apache License, Version 2.0
- MIT license
贡献
除非您明确声明,否则任何有意提交到本项目中的贡献都将按照上述双重许可协议进行授权,无需任何附加条款或条件。
1 回复
Rust JEP106芯片识别库的使用指南
介绍
JEP106是一个用于解析和处理JEDEC标准芯片厂商编码信息的Rust库。JEDEC标准(JEP106)定义了芯片厂商的唯一识别编码系统,这个库可以帮助开发者高效地解析这些编码,获取厂商信息。
该库主要功能包括:
- 解析JEDEC厂商ID编码
- 获取厂商名称信息
- 支持连续编码(continuation codes)解析
- 提供高效的查找功能
安装方法
在Cargo.toml中添加依赖:
[dependencies]
jep106 = "0.3"
基本使用方法
1. 解析厂商编码
use jep106::JEP106;
fn main() {
// 创建JEP106解析器实例
let jep = JEP106::new();
// 解析厂商编码 (bank, id)
if let Some(manufacturer) = jep.get(0x7F, 0x04) {
println!("Manufacturer: {}", manufacturer);
// 输出: Manufacturer: Texas Instruments
}
}
2. 处理连续编码
JEDEC厂商ID可能包含多个连续编码:
use jep106::JEP106;
fn main() {
let jep = JEP106::new();
// 解析包含连续编码的厂商ID
let codes = vec![0x7F, 0x7F, 0x04];
if let Some(manufacturer) = jep.get_cont(&codes) {
println!("Manufacturer with continuation: {}", manufacturer);
// 输出: Manufacturer with continuation: Texas Instruments
}
}
3. 迭代所有厂商
use jep106::JEP106;
fn main() {
let jep = JEP106::new();
// 遍历所有已知厂商
for (bank, id, name) in jep.iter_all() {
println!("Bank: {}, ID: {}, Name: {}", bank, id, name);
}
}
高级用法
1. 自定义数据库
如果需要使用自定义的厂商数据库:
use jep106::{JEP106, Manufacturer};
fn main() {
// 创建自定义厂商数据库
let mut custom_jep = JEP106::empty();
// 添加自定义厂商
custom_jep.insert(0x01, 0x01, Manufacturer::new("My Custom Company"));
// 使用自定义数据库查询
if let Some(manufacturer) = custom_jep.get(0x01, 0x01) {
println!("Custom manufacturer: {}", manufacturer);
}
}
2. 错误处理
use jep106::JEP106;
fn main() {
let jep = JEP106::new();
match jep.get(0x99, 0x99) {
Some(manufacturer) => println!("Found: {}", manufacturer),
None => println!("Manufacturer not found in JEP106 database"),
}
}
性能提示
JEP106::new()
会初始化完整的厂商数据库,考虑重用实例- 对于频繁查询,可以缓存结果
- 如果只需要部分厂商,考虑使用自定义数据库减少内存占用
实际应用示例
解析芯片签名中的厂商ID
use jep106::JEP106;
fn parse_chip_signature(signature: &[u8]) -> Option<String> {
let jep = JEP106::new();
// 假设签名中前3个字节是JEDEC厂商ID
if signature.len() >= 3 {
let bank = signature[0];
let id = signature[1];
let cont = signature[2];
if bank == 0x7F {
// 处理连续编码情况
let codes = vec![bank, cont, id];
jep.get_cont(&codes).map(|m| m.to_string())
} else {
// 标准编码
jep.get(bank, id).map(|m| m.to_string())
}
} else {
None
}
}
fn main() {
let signature = [0x7F, 0x04, 0x7F]; // Texas Instruments的编码
if let Some(manufacturer) = parse_chip_signature(&signature) {
println!("Chip manufacturer: {}", manufacturer);
}
}
这个库特别适合嵌入式开发、芯片工具开发等需要处理JEDEC厂商ID的场景。
完整示例代码
下面是一个结合了基本使用和高级功能的完整示例:
use jep106::{JEP106, Manufacturer};
fn main() {
// 1. 基本使用示例
// 初始化标准JEP106数据库
let jep = JEP106::new();
// 示例1: 解析标准厂商编码
if let Some(mfg) = jep.get(0x01, 0x01) {
println!("Standard manufacturer: {}", mfg);
}
// 示例2: 解析连续编码
let cont_codes = vec![0x7F, 0x7F, 0x04];
if let Some(mfg) = jep.get_cont(&cont_codes) {
println!("Manufacturer with continuation codes: {}", mfg);
}
// 2. 高级功能示例
// 创建自定义数据库
let mut custom_db = JEP106::empty();
// 添加自定义厂商
custom_db.insert(0xFF, 0xFF, Manufacturer::new("My Custom Chip Co."));
// 查询自定义厂商
match custom_db.get(0xFF, 0xFF) {
Some(mfg) => println!("Found custom manufacturer: {}", mfg),
None => println!("Custom manufacturer not found"),
}
// 3. 实际应用: 解析芯片签名
let signatures = vec![
[0x7F, 0x04, 0x7F], // Texas Instruments
[0x01, 0x01, 0x00], // 标准厂商
[0xFF, 0xFF, 0x00], // 未知厂商
];
for sig in signatures {
if let Some(mfg) = parse_chip_signature(&sig) {
println!("Signature: {:02X?} -> Manufacturer: {}", sig, mfg);
} else {
println!("Signature: {:02X?} -> Manufacturer unknown", sig);
}
}
}
fn parse_chip_signature(signature: &[u8]) -> Option<String> {
let jep = JEP106::new();
if signature.len() >= 3 {
let bank = signature[0];
let id = signature[1];
let cont = signature[2];
if bank == 0x7F {
let codes = vec![bank, cont, id];
jep.get_cont(&codes).map(|m| m.to_string())
} else {
jep.get(bank, id).map(|m| m.to_string())
}
} else {
None
}
}
这个完整示例展示了:
- 基本厂商编码解析
- 连续编码处理
- 自定义数据库的使用
- 实际芯片签名解析应用
- 错误处理机制
输出示例可能如下:
Standard manufacturer: AMD
Manufacturer with continuation codes: Texas Instruments
Found custom manufacturer: My Custom Chip Co.
Signature: [7F, 04, 7F] -> Manufacturer: Texas Instruments
Signature: [01, 01, 00] -> Manufacturer: AMD
Signature: [FF, FF, 00] -> Manufacturer unknown