
清空记录
历史记录
取消
清空记录
历史记录

FlexBus是一种高速、并行、可配置的外部总线接口,主要用于芯片与外部设备之间进行高速数据交互,是嵌入式 / 工业控制里非常关键的通信接口。
瑞芯微RK3506定位高性能工业控制与数据采集领域设计的专用SoC,具备以下核心特性:
异构多核架构
集成高速FlexBus 总线
双系统协同架构
工业级可靠性
丰富外设接口
触觉智能-瑞芯微硬件方案商,提供RK3506核心板、开发板/主板硬件解决方案。
FlexBus技术优势可总结为以下4点:
确定性实时传输
数据完整性保障
系统可扩展性
工业环境适应性
FlexBus构成了系统内部的高速数据通道,连接Cortex-M0协处理器与外部数据采集设备(如 AD7616),实现低延迟、高吞吐量的并行数据传输。
瑞芯微RK3506平台集成的硬件级FlexBus并行总线,可广泛应用于工业过程监控、科学仪器测量、自动化测试系统及医疗设备监测等多种高性能实时场景。
根据触觉智能RK3506网盘下的SDK,修改多个配置。
(1)引脚配置rk3506-pinctrl.dtsi
目录kernel/arch/arm/boot/dts/rk3506-pinctrl.dtsi,修改内容如下:
@@ -358,13 +358,13 @@ flexbus0_clk_pins: flexbus0-clk-pins {
flexbus0_d0_pins: flexbus0-d0-pins {
rockchip,pins =
/* flexbus0_d0 */
- <1 RK_PD3 3 &pcfg_pull_none>;
+ <1 RK_PD3 3 &pcfg_pull_up>;
};
/omit-if-no-ref/
flexbus0_d1_pins: flexbus0-d1-pins {
rockchip,pins =
/* flexbus0_d1 */
- <1 RK_PD2 3 &pcfg_pull_none>;
+ <1 RK_PD2 3 &pcfg_pull_up>;
};
/omit-if-no-ref/
flexbus0_d2_pins: flexbus0-d2-pins {(2)FlexBus控制器节点配置rk3502.dtsi
目录arch/arm/boot/dts/rk3502.dtsi,修改内容如下:
@@ -1237,6 +1237,12 @@ flexbus: flexbus@ff880000 {
rockchip,grf = <&grf>;
status = "disabled";
+ flexbus_ad7616_par_hw: ad7616 {
+ compatible = "rockchip,flexbus-ad7616-par-hw";
+
#io
-channel-cells = <0>;
+ status = "disabled";
+ };
+
flexbus_adc: adc {
compatible = "rockchip,flexbus-adc";
#io
-channel-cells = <0>;(3)启用板级设备树ido-evb3506-v1a-nand.dtsi
目录arch/arm/boot/dts/ido-evb3506-v1a-nand.dtsi,修改内容如下:
@@ -8,6 +8,7 @@
#include
<dt-bindings/input/rk-input.h>
#include
<dt-bindings/suspend/rockchip-rk3506.h>
#include
"rk3506.dtsi"
+
#include
<dt-bindings/mfd/rockchip-flexbus.h>
/ {
model = "Rockchip RK3506 IDO EVB3506 V10 Board";
@@ -633,3 +634,22 @@ &usb20_otg1 {
dr_mode = "host";
status = "okay";
};
+
+&flexbus {
+ rockchip,flexbus0-opmode = <ROCKCHIP_FLEXBUS0_OPMODE_DAC>;
+ rockchip,flexbus1-opmode = <ROCKCHIP_FLEXBUS1_OPMODE_ADC>;
+ status = "okay";
+};
+
+&flexbus_ad7616_par_hw {
+ pinctrl-names = "default";
+ /* flexbus0_d0: RD, flexbus0_d1: CS */
+ //pinctrl-0 = <&flexbus0_d0_pins &flexbus0_d1_pins
+ pinctrl-0 = <&flexbus1_clk_pins &flexbus1m4_pins
+ &flexbus1_d0_pins &flexbus1_d1_pins &flexbus1_d2_pins
+ &flexbus1_d3_pins &flexbus1_d4_pins &flexbus1_d5_pins
+ &flexbus1_d6_pins &flexbus1_d7_pins &flexbus1_d8_pins
+ &flexbus1_d9_pins &flexbus1_d10_pins &flexbus1_d11_pins
+ &flexbus1_d12_pins &flexbus1_d13_pins &flexbus1_d14_pins
+ &flexbus1_d15_pins>;
+ status = "okay";
+};
+&uart4 {
+ status = "disabled";
+};
+
+&uart2 {
+ status = "disabled";
+};
+
+&can0 {
+ status = "disabled";
+};
+
+&saradc {
+ status = "disabled";
+};(4)设备数修改
修改kernel/drivers/iio/adc/Makefile:
obj-$(CONFIG_RCAR_GYRO_ADC) += rcar-gyroadc.o
obj-$(CONFIG_RN5T618_ADC) += rn5t618-adc.o
obj-$(CONFIG_ROCKCHIP_FLEXBUS_ADC) += rockchip-flexbus-adc.o
+ obj-$(CONFIG_ROCKCHIP_FLEXBUS_ADC) += rockchip-flexbus-ad7616-par-hw.o
obj-$(CONFIG_ROCKCHIP_SARADC) += rockchip_saradc.o
obj-$(CONFIG_RICHTEK_RTQ6056) += rtq6056.o
obj-$(CONFIG_RZG2L_ADC) += rzg2l_adc.o修改kernel/include/linux/mfd/rockchip-flexbus.h:
#define
FLEXBUS_DST_WAT_LVL_SHIFT 0
/* Bit fields in IMR, RISR, ISR and ICR */
+
#define
FLEXBUS_CCI BIT(31)
#define
FLEXBUS_DMA_TIMEOUT_ISR BIT(13)
#define
FLEXBUS_DMA_ERR_ISR BIT(12)
#define
FLEXBUS_DMA_DST1_ISR BIT(11)新建kernel/drivers/iio/adc/rockchip-flexbus-ad7616-par-hw.c,附件请关注触觉智能,回复联系客服获取。
加载驱动后,会产生/sys/bus/iio/devices/iio:device0节点,进行修改采样频率:
root@rk3506-buildroot:/root# ls /sys/bus/iio/devices/iio:device0
in_voltage_raw power
in_voltage_sampling_frequency subsystem
name uevent
of_node waiting_for_supplier获取 ADC命令如下:
cat /sys/bus/iio/devices/iio:device0/in_voltage_raw设置采样频率,命令如下:
echo 1000000 > /sys/bus/iio/devices/iio\:device0/in_voltage_sampling_frequency以下为测试脚本示例,用于连续读取多通道ADC数据:
# init 1MHz clk
echo 1000000 > /sys/bus/iio/devices/iio\:device0/in_voltage_sampling_frequency
# reset 1
gpioset gpiochip0 2=1
sleep 0.3
gpioset gpiochip0 3=1
gpioset gpiochip1 18=1
gpioset gpiochip1 19=1
sleep 0.1
# convst 1 -> 0
gpioset gpiochip0 4=1
sleep 0.01
gpioset gpiochip0 4=0
sleep 0.1
if [ $1 -eq 3 ]; then
# cs 0
# adc3_cs 0
gpioset gpiochip1 23=0
# adc2_cs 1
gpioset gpiochip1 22=1
# adc1_cs 1
gpioset gpiochip1 21=1
# adc0_cs 1
gpioset gpiochip1 20=1
elif [ $1 -eq 2 ]; then
# cs 0
# adc3_cs 0
gpioset gpiochip1 23=1
# adc2_cs 1
gpioset gpiochip1 22=0
# adc1_cs 1
gpioset gpiochip1 21=1
# adc0_cs 1
gpioset gpiochip1 20=1
elif [ $1 -eq 1 ]; then
# cs 0
# adc3_cs 0
gpioset gpiochip1 23=1
# adc2_cs 1
gpioset gpiochip1 22=1
# adc1_cs 1
gpioset gpiochip1 21=0
# adc0_cs 1
gpioset gpiochip1 20=1
elif [ $1 -eq 0 ]; then
# cs 0
# adc3_cs 0
gpioset gpiochip1 23=1
# adc2_cs 1
gpioset gpiochip1 22=1
# adc1_cs 1
gpioset gpiochip1 21=1
# adc0_cs 1
gpioset gpiochip1 20=0
fi
sleep 0.1
#触发采样并读取数据
cat /sys/bus/iio/devices/iio:device0/in_voltage_raw
dmesg -c观察内核打印(只需要关注0x00-0x0f的值):
[ 1182.468572] 0x00: 0x0c00
[ 1182.468639] 0x01: 0x141a
[ 1182.468668] 0x02: 0x2ba4
[ 1182.468695] 0x03: 0x2bbd
[ 1182.468722] 0x04: 0x2ba1
[ 1182.468748] 0x05: 0x2bd1
[ 1182.468774] 0x06: 0x2ba4
[ 1182.468800] 0x07: 0x2bcd
[ 1182.468826] 0x08: 0x2bba
[ 1182.468852] 0x09: 0x2bca
[ 1182.468879] 0x0a: 0x2ba8
[ 1182.468905] 0x0b: 0x141a
[ 1182.468931] 0x0c: 0x2ba4
[ 1182.468957] 0x0d: 0x2bbd
[ 1182.468983] 0x0e: 0x2bbd
[ 1182.469010] 0x0f: 0x2ba1FlexBus ADC 寄存器与通道对应关系如下:
电压计算公式:
Vin = (raw÷32768)×5.0v比如测试日志0x01: 0x141a,表示A0通道。
如需RK3506 Flexbus相关资料请关注深圳触觉智能公众号,添加官方客服134-2385-6106,近80个G的各类软硬件资料与Demo助您加速开发。
