6个版本 (3个重大更新)

0.4.0 2024年4月28日
0.3.0 2024年4月17日
0.2.0 2024年2月11日
0.1.2 2024年2月11日
0.1.1 2024年1月18日

#533嵌入式开发

Download history 101/week @ 2024-04-23 33/week @ 2024-04-30 2/week @ 2024-05-21 3/week @ 2024-05-28 2/week @ 2024-06-11 16/week @ 2024-06-18 1/week @ 2024-07-02

每月473次下载

GPL-3.0-only

255KB
6K SLoC

JH71xx-HAL

jh71xx-hal 是 StarFive 基于 JH71xx 的 SoC 的 HAL(硬件抽象层)crate。

目前,仅支持 JH7110 SoC。 JH7100 似乎已停产,StarFive 的下一款 SoC 系列将是 JH81xx 系列。

如果您想添加对 JH7100 SoC 的支持,请提交更改!

用法

GPIO

完全支持GPIO配置和访问

use jh71xx_hal::{pac, gpio};
use embedded_hal::digital::{InputPin, OutputPin};

let dp = pac::Peripherals::take().unwrap();
let gpio0 = gpio::get_gpio(dp.sys_pinctrl.gpio_0());

// Configure as an enabled output
let mut gpio0_out = gpio0.into_enabled_output();

// Drive pin high
gpio0_out.set_high();
// Drive pin low
gpio0_out.set_low();

// Configure as an enabled input
let gpio0_in = gpio0_out.into_enabled_input();

// Configure as high-impedance input
let gpio0_in_high_z = gpio0_in.into_input_high_z();
// Configure as pull-up input
let gpio0_in_pull_up = gpio0_in_high_z.into_input_pull_up();
// Configure as pull-down input
let mut gpio0_in_pull_down = gpio0_in_pull_up.into_input_pull_down();

// Is pin low?
if gpio0_in_pull_down.is_low() {
    // do interesting GPIO stuff
}

// Is pin high?
if gpio0_in_pull_down.is_high() {
    // do interesting GPIO stuff
}

WIP:GPIO

JH7110 SoC 使用引脚复用器来配置引脚以实现专用功能(I2C、SPI等)。

正在进行工作,以提供用于配置GPIO引脚的专用功能的高级接口。

目前可以通过重导出为 jh71xx_hal::pacjh71xx-pac crate 来实现低级配置。

I2C

完全支持I2C配置和访问。

use embedded_hal::i2c::{I2c as _, Operation};
use jh71xx_hal::{pac, i2c};

let dp = pac::Peripherals::take().unwrap();
let mut i2c0 = i2c::I2c::new(dp.i2c0);

// 7-bit address
let addr: u8 = 1;
let mut read_buf = [0u8; 1];
let ops = Operation::Read(&mut read_buf);

i2c0.transaction(addr, &mut [ops]).unwrap(); 

// 10-bit address
let addr: u16 = 1;

i2c0.transaction(addr, &mut [ops]).unwrap();

SPI

完全支持SPI配置和访问。

use embedded_hal::spi::SpiBus;
use jh71xx_hal::{pac, spi};

let dp = pac::Peripherals::take().unwrap();

// 8-bit transactions
let mut spi0 = spi::Spi::<pac::Spi0, 8>::new(dp.spi0).unwrap();
let mut read_buf = [0u8; 1];
let write_buf = [0u8; 1];

// Read and write as separate transactions
spi0.read(read_buf.as_mut()).unwrap();
spi0.write(write_buf.as_ref()).unwrap();

// Read and write in the same call
spi0.transfer(read_buf.as_mut(), write_buf.as_ref()).unwrap();
// Write and read from the same buffer
// NOTE: writes happen first, since the read overwrites the buffer
spi0.transfer_in_place(read_buf.as_mut()).unwrap();

// Flushes read/write FIFOs, and waits for peripheral to become idle
spi0.flush().unwrap();

// 16-bit transactions
let mut spi1 = spi::Spi::<pac::Spi1, 16>::new(dp.spi1).unwrap();
let mut read_buf = [0u16; 1];
let write_buf = [0u16; 1];

// Read and write as separate transactions
spi1.read(read_buf.as_mut()).unwrap();
spi1.write(write_buf.as_ref()).unwrap();

// Read and write in the same call
spi1.transfer(read_buf.as_mut(), write_buf.as_ref()).unwrap();
// Write and read from the same buffer
// NOTE: writes happen first, since the read overwrites the buffer
spi1.transfer_in_place(read_buf.as_mut()).unwrap();

// Flushes read/write FIFOs, and waits for peripheral to become idle
spi1.flush().unwrap();

WIP:SPI

目前仅支持8位和16位传输。SoC的外设支持4位到16位传输。

TBD:接口是否应支持

  • 打包数据传输以提高效率(但增加了复杂性)
  • 未打包传输以提高简单性(但降低了效率)

无论如何,都可以在不更改当前API的情况下支持额外的数据大小。

ARM pl022 SSP SPI外设还支持“从”模式,它超出了 embedded-hal traits 的范围,但对 jh71xx-hal 用户可能仍然有用。

同样,该外设还支持德州仪器的同步串行和微线串行帧格式(目前不支持)。

PWM

完全支持PWM配置和访问。

use embedded_hal::pwm::SetDutyCycle;
use jh71xx_hal::{pac, pwm};

let dp = pac::Peripherals::take().unwrap();
let mut pwm0 = pwm::Pwm::new(dp.pwm);

// Gets the maximum duty cycle
let max_cycle = pwm0.max_duty_cycle();
// Sets the PWM peripheral to a ~50% duty cycle
pwm0.set_duty_cycle(max_cycle / 2).unwrap();

依赖关系

约10MB
约213K SLoC