本节注意列出T113_i的设备树,并分析每项的含义。
pio模块时t113_i定义的引脚复用功能定义模块,其支持配置引脚的复用功能。
设备树节点:
&pio {
pinctrl_gpio_led: pinctrl_gpio_led {
allwinner,pins = "PC0", "PC1", "PG11"; // 定义访问的引脚
allwinner,function = "gpio_out"; // 定义引脚复用功能, gpio输出
};
hw_watchdog_pins: hw_watchdog_pins {
allwinner,pins = "PE0", "PG16";
allwinner,function = "gpio_out";
};
sdc0_pins_a: sdc0@0 {
// old-style
allwinner,pins = "PF0", "PF1", "PF2", // 定义配置的引脚
"PF3", "PF4", "PF5";
allwinner,function = "sdc0"; // 定义引脚复用功能, sdc0
allwinner,muxsel = <2>; // 复用功能选择,新版本已经移除
allwinner,drive = <3>; // 定义引脚的驱动能力(1~4),对应10~40mA
allwinner,pull = <1>; // 上下拉能力,0: no pull 1: pull up 2: pull down
// new-style
pins = "PF0", "PF1", "PF2", // 定义配置的引脚
"PF3", "PF4", "PF5";
function = "sdc0"; // 定义引脚复用功能, sdc0
drive-strength = <30>; // 定义引脚的驱动能力, 以10mA步进,10~40mA,
bias-pull-up; // 上下拉能力 bias-pull-up: pull up, bias-pull-down: pull down, bias-disable: no pull
power-source = <3300>;
};
//....
};
文档相关: T113-i_User_Manual_V1.4 - 9.7 GPIO
源码: kernel/linux-5.4/drivers/pinctrl/sunxi/pinctrl-sunxi.c
设备类型: pinctrl子系统
audio模块是一个音频控制器,通常用于连接外部音频设备,并提供音频通信接口。
设备树节点:
codec:codec@2030000 {
#sound-dai-cells = <0>; //sound-dai-cells数量
compatible = "allwinner,sunxi-internal-codec"; //codec模块标签,匹配驱动的字符串
reg = <0x0 0x02030000 0x0 0x34c>; //codec模块寄存器地址
clocks = <&ccu CLK_PLL_AUDIO0>, //codec模块时钟
<&ccu CLK_PLL_AUDIO1_DIV5>,
<&ccu CLK_AUDIO_DAC>,
<&ccu CLK_AUDIO_ADC>,
<&ccu CLK_BUS_AUDIO_CODEC>;
clock-names = "pll_audio0", "pll_audio1_div5", //codec模块时钟名称
"audio_clk_dac", "audio_clk_adc",
"audio_clk_bus";
resets = <&ccu RST_BUS_AUDIO_CODEC>; //codec模块复位
rx_sync_en = <0x00>; //codec模块接收同步使能
device_type = "codec"; //codec模块设备类型
status = "okay"; //codec模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 8.4 Audio Codec
源码: kernel/linux-5.4/sound/soc/sunxi/sun8iw20-codec.c
设备类型: audio子系统
CAN(控制器局域网)模块支持BoSCH CAN总线规范2.0中定义的CAN 2.0 a /B协议。CAN在CPUX中,R-CAN在CPUS中。
设备树节点:
can0: can@0x0 {
#address-cells = <1>; //标准属性,子节点reg定义标准属性,表示reg中解析地址时个数
#size-cells = <0>; //标准属性,子节点reg定义标准属性,表示reg中解析地址长度时个数
compatible = "allwinner,sun8i-can"; //can模块标签,匹配驱动的字符串
pinctrl-names = "default"; //can模块引脚复用别名
pinctrl-0 = <&can0_pins>; //can模块引脚复用管理定义
device_type = "can0"; //can模块设备类型
id = <0>; //can模块id
status = "disabled"; //can模块状态,表示模块未启用
};
文档相关: T113-i_User_Manual_V1.4 - 9.16 CAN
源码: kernel/linux-5.4/drivers/net/can/sunxi_can.c
相关功能: can接口,net子系统
CE(cryptoengine)模块表示算法模块。
设备树节点:
cryptoengine: ce@03040000 {
compatible = "allwinner,sunxi-ce"; //ce模块标签,匹配驱动的字符串
device_name = "ce"; //ce模块设备名称
reg = <0x0 0x03040000 0x0 0xa0>, //ce模块寄存器地址
<0x0 0x03040800 0x0 0xa0>;
interrupts = <GIC_SPI 52 IRQ_TYPE_EDGE_RISING>, //ce模块中断号
<GIC_SPI 53 IRQ_TYPE_EDGE_RISING>;
clock-frequency = <400000000>; //ce模块时钟频率
clocks = <&ccu CLK_BUS_CE>, <&ccu CLK_CE>, <&ccu CLK_MBUS_CE>, //ce模块时钟
<&ccu CLK_PLL_PERIPH0_2X>;
clock-names = "bus_ce", "ce_clk", "mbus_ce", "pll_periph0_2x"; //ce模块时钟名称
resets = <&ccu RST_BUS_CE>; //ce模块复位
status = "okay"; //ce模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 10.1 Crypto Engine
源码: kernel/linux-5.4/drivers/crypto/sunxi-ce/sunxi-ce.c
相关功能: can接口,net子系统
csi模块是一个摄像头接口(CSI)控制器,通常用于连接摄像头,并提供摄像头数据的输入。
设备树节点:
csi0: csi@5801000{
compatible = "allwinner,sunxi-csi"; //csi模块标签,匹配驱动的字符串
reg = <0x0 0x05801000 0x0 0x1000>; //csi模块寄存器地址
interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; //csi模块中断号
pinctrl-names = "default","sleep"; //csi模块引脚复用别名
pinctrl-0 = <&csi0_pins_a>; //csi模块引脚复用管理定义
pinctrl-1 = <&csi0_pins_b>; //csi模块引脚复用管理定义
device_id = <0>; //csi模块设备id
iommus = <&mmu_aw 1 1>; //csi模块对应的IOMMU内存访问管理单元
status = "disabled"; //csi模块状态,表示模块未启用
};
文档相关: T113-i_User_Manual_V1.4 - 6.1 CSI
源码: kernel/linux-5.4/drivers/media/platform/sunxi-vin/vin-csi/sunxi_csi.c
设备类型: csi子系统
lcd0 模块是一个显示单元,通常用于连接和控制液晶显示屏(LCD)。
设备树节点:
lcd0: lcd0@5461000 {
compatible = "allwinner,sunxi-lcd0"; //lcd标签,匹配驱动的字符串
reg = <0x0 0x05461000 0x0 0xfff>; //lcd操作寄存器
pinctrl-names = "active","sleep"; //lcd引脚复用管理定义
status = "okay"; //lcd模块状态
};
&lcd0 {
//part1: 决定配置是否被使用,以及使用哪个驱动
lcd_used = <1>; //启用LCD的使用
lcd_driver_name = "panel-lt8912b-hdmi"; //匹配的LCD驱动代码
//part2: 决定改配置的dsi接口,以及dsi接口使用的video mode
lcd_if = <4>;
lcd_dsi_if = <0>;
//part3: 决定LCD模块的发生时序
lcd_x = <1920>; //显示屏的水平像素数量,也就是屏分辨率中的宽
lcd_y = <1080>; //显示屏的垂直行数,也就是屏分辨率中的高。
lcd_dclk_freq = <148>; //Dot Clock Frequency。传输像素传送频率。单位为MHz
lcd_hbp = <192>; //Horizontal Back Porch。指有效行间,行同步信号(hsync)开始,到有效数据开始之间的dclk的cycle个数,包括同步信号区。是包含了hspw段,也就是lcd_hbp=实际的hbp+实际的hspw。对应屏厂HBP+HSW
lcd_ht = <2200>; //Horizontal Total time。指一行总的dclk的cycle 个数。cd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp。对应屏厂Width+HSW+HBP+HFP。
lcd_hspw = <44>; //Vertical Sync Pulse Width。指场同步信号的宽度。单位为行。对应屏厂VSW。
lcd_vbp = <41>; //Vertical Back Porch。指场同步信号(vsync)开始,到有效数据行开始之间的行数,包括场同步信号区。是包含了vspw段,也就是lcd_vbp = 实际的vbp + 实际的vspw。对应屏厂VBP+VSW。
lcd_vt = <1125>; //Vertical Total time。指一场的总行数。lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp。对应屏厂Height+VSW+VBP+VFP。
lcd_vspw = <5>; //Vertical Sync Pulse Width。指场同步信号的宽度。单位为行。对应屏厂VSW。
//part4: 背光相关参数配置
lcd_backlight = <255>; //背光亮度,0-255。对应屏厂Backlight。
//part5: dsi接口的详细设置
lcd_dsi_lane = <4>; //dsi接口的lane数量。对应屏厂Lane。
lcd_dsi_format = <0>; //dsi接口的数据格式。对应屏厂Format。
lcd_dsi_te = <0>; //dsi接口的te信号极性。对应屏厂TE。
//part6: 显示效果相关的配置
lcd_frm = <0>; //帧缓冲格式。对应屏厂Frame Rate。
lcd_gamma_en = <0>; //是否使能gamma校正。对应屏厂Gamma。
lcd_cmap_en = <0>; //是否使能颜色映射。对应屏厂Color Map。
smart_color = <90>; //智能色彩调节。对应屏厂Smart Color。
lcdgamma4iep = <22>; //gamma校正的参数。对应屏厂Gamma4iep。
lcd_bright_curve_en = <0>; //是否使能亮度曲线调节。对应屏厂Bright Curve。
lcd_io_phase = <0>; //dsi接口的io相位。对应屏厂IO Phase。
deu_mode = <0>; //deu模式。对应屏厂DEU Mode。
//part7: 管脚和电源的相关配置
lcd_gpio_0 = <&pio PE 11 GPIO_ACTIVE_HIGH>; //对应屏厂GPIO0。
pinctrl-0 = <&dsi4lane_pins_a>; //引脚复用控制
pinctrl-1 = <&dsi4lane_pins_b>; //引脚复用控制
};
文档相关: T113-i_User_Manual_V1.4 - 5.1 TCON LCD
源码: kernel/linux-5.4/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c
设备类型: display子系统
EMAC (Ethernet Medium Access Controller)是一种以太网介质访问控制器,它使主机能够在符合IEEE 802.3-2002标准的以太网上传输和接收数据。支持全双工和半双工模式下的10/100/1000mbit/s外部PHY与RMII/RGMII接口。
设备树节点:
gmac0: eth@4500000 {
compatible = "allwinner,sunxi-gmac"; //emac模块标签,匹配驱动的字符串
reg = <0x0 0x04500000 0x0 0x10000>, //emac模块寄存器地址
<0x0 0x03000030 0x0 0x4>;
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>; //emac模块中断号
interrupt-names = "gmacirq"; //emac模块中断名称
clocks = <&ccu CLK_BUS_EMAC0>, <&ccu CLK_EMAC0_25M>; //emac模块时钟
clock-names = "gmac", "ephy"; //emac模块时钟名称
resets = <&ccu RST_BUS_EMAC0>; //emac模块复位
device_type = "gmac0"; //emac模块设备类型
gmac-power0; //gmac电源管理相关控制
gmac-power1;
gmac-power2;
status = "disabled"; //emac模块状态,表示模块未启用
};
&gmac0 {
pinctrl-0 = <&gmac0_pins_a>; //emac模块引脚复用管理定义
pinctrl-1 = <&gmac0_pins_b>; //emac模块引脚复用管理定义
pinctrl-names = "default", "sleep"; //emac模块引脚复用别名
phy-mode = "rgmii"; //emac模块phy模式
use_ephy25m = <0>; //emac模块phy时钟是否为25M
phy-rst = <&pio PG 13 GPIO_ACTIVE_LOW>; //emac模块phy复位
tx-delay = <2>; //emac模块tx延时
rx-delay = <0>; //emac模块rx延时
phy-tx-delay = <3>; //emac模块phy tx延时
phy-rx-delay = <0>; //emac模块phy rx延时
status = "okay"; //emac模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 9.13 EMAC
源码: kernel/linux-5.4/drivers/net/ethernet/allwinner/
设备类型: net子系统
g2d 模块是一个图形处理单元(GPU),通常用于加速图形处理任务,如2D图形渲染、图像缩放、旋转等。
设备树节点:
g2d: g2d@5410000 {
compatible = "allwinner,sunxi-g2d"; //g2d图像处理模块标签,匹配驱动的字符串
reg = <0x0 0x05410000 0x0 0x3ffff>; //g2d模块寄存器地址
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>; //g2d模块中断号
clocks = <&ccu CLK_BUS_G2D>, <&ccu CLK_G2D>, <&ccu CLK_MBUS_G2D>; //g2d模块时钟
clock-names = "bus", "g2d", "mbus_g2d"; //g2d模块时钟名称
resets = <&ccu RST_BUS_G2D>; //g2d模块复位
iommus = <&mmu_aw 3 1>; //g2d模块对应的IOMMU内存访问管理单元
status = "okay"; //g2d模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 4.3 G2D
源码: kernel/linux-5.4/drivers/char/sunxi_g2d/g2d_rcq/g2d.c
设备类型: g2d子系统
gpadc是12bit分辨率,8位采集精度的模数转换模块,其中channel0支持用于KEY读取。
设备树节点:
gpadc: gpadc@2009000 {
compatible = "allwinner,sunxi-gpadc"; //gpadc模块标签,匹配驱动的字符串
reg = <0x0 0x02009000 0x0 0x400>; //gpadc模块寄存器地址
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>; //gpadc模块中断号
clocks = <&ccu CLK_BUS_GPADC>; //gpadc模块时钟
clock-names = "bus"; //gpadc模块时钟名称
resets = <&ccu RST_BUS_GPADC>; //gpadc模块复位
status = "okay"; //gpadc模块状态,表示模块正常工作
};
&gpadc {
channel_num = <2>; //使用的通道数目,表示2个通道
channel_select = <3>; //通道使能选择,channel0:0x01, channel1:0x02, channel3:0x04, channel4:0x08
channel_data_select = <3>; //数据通道使能选择,channel0:0x01, channel1:0x02, channel3:0x04, channel4:0x08
channel_compare_select = <3>; //比较通道使能选择,channel0:0x01, channel1:0x02, channel3:0x04, channel4:0x08
channel_cld_select = <3>; //使能数据小于比较功能通道选择,channel0:0x01, channel1:0x02, channel3:0x04, channel4:0x08
channel_chd_select = <3>; //使能数据大于比较功能通道选择,channel0:0x01, channel1:0x02, channel3:0x04, channel4:0x08
channel0_compare_lowdata = <1700000>; //数据小于此值时触发中断
channel0_compare_higdata = <1200000>; //数据高于此值时触发中断
channel1_compare_lowdata = <460000>; //数据小于此值时触发中断
channel1_compare_higdata = <1200000>; //数据高于此值时触发中断
status = "okay";
};
文档相关: T113-i_User_Manual_V1.4 - 9.8 GPADC
源码: kernel/linux-5.4/drivers/input/sensor/sunxi_gpadc.c
设备类型: input子系统,/dev/event/eventX
gpio模块是一个通用的输入/输出(GPIO)控制器,通常用于控制外部设备的输入和输出。
设备树节点:
pio: pinctrl@2000000 {
compatible = "allwinner,sun8iw20-pinctrl"; //pinctrl模块标签,匹配驱动的字符串
reg = <0x0 0x02000000 0x0 0x500>; //pinctrl模块寄存器地址
interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, //pinctrl模块中断号
<GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
device_type = "pio"; //pinctrl模块设备类型
clocks = <&ccu CLK_APB0>, <&dcxo24M>, <&rtc_ccu CLK_OSC32K>; //pinctrl模块时钟
clock-names = "apb", "hosc", "losc"; //pinctrl模块时钟名称
gpio-controller; //表示为gpio控制器
#gpio-cells = <3>; //引用gpio控制器的gpio单元数量量
interrupt-controller; //表示为中断控制器
#interrupt-cells = <3>; //引用中断控制器的中断单元数量
#size-cells = <0>; //引用子节点中size数目
vcc-pf-supply = <®_pio1_8>; //pinctrl模块电源
vcc-pfo-supply = <®_pio3_3>; //pinctrl模块电源
//..
}
文档相关: T113-i_User_Manual_V1.4 - 9.7 GPIO
源码: kernel/linux-5.4/drivers/pinctrl/sunxi/pinctrl-sun8iw20.c
设备类型: gpio子系统
LEDC模块是一个低功耗的LED控制器,通常用于控制LED灯的亮度和颜色。
设备树节点:
ledc: ledc@2008000 {
#address-cells = <1>; //标准属性,子节点reg定义标准属性,表示reg中解析地址时个数
#size-cells = <0>; //标准属性,子节点reg定义标准属性,表示reg中解析地址长度时个数
compatible = "allwinner,sunxi-leds"; //ledc模块标签,匹配驱动的字符串
reg = <0x0 0x02008000 0x0 0x400>; //ledc模块寄存器地址
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; //ledc模块中断号
interrupt-names = "ledcirq"; //ledc模块中断名称
clocks = <&ccu CLK_LEDC>, <&ccu CLK_BUS_LEDC>; //ledc模块时钟
clock-names = "clk_ledc", "clk_cpuapb"; //ledc模块时钟名称
dmas = <&dma 42>, <&dma 42>; //ledc模块DMA
dma-names = "rx", "tx"; //ledc模块DMA名称
resets = <&ccu RST_BUS_LEDC>; //ledc模块复位
reset-names = "ledc_reset"; //ledc模块复位名称
status = "disable"; //ledc模块状态,表示模块未启用
};
&ledc {
pinctrl-0 = <&ledc_pins_a>; //ledc模块引脚复用0
pinctrl-1 = <&ledc_pins_b>; //ledc模块引脚复用1
led_count = <32>; //ledc模块led数量
output_mode = "GRB"; //ledc模块输出模式
reset_ns = <84>; //ledc模块复位时间,单位ns
t1h_ns = <800>; //ledc模块t1h时间,单位ns
t1l_ns = <450>; //ledc模块t1l时间,单位ns
t0h_ns = <400>; //ledc模块t0h时间,单位ns
t0l_ns = <850>; //ledc模块t0l时间,单位ns
wait_time0_ns = <84>; //ledc模块wait_time0时间,单位ns
wait_time1_ns = <84>; //ledc模块wait_time1时间,单位ns
wait_data_time_ns = <600000>; //ledc模块wait_data_time时间,单位ns
status = "disabled"; //ledc模块状态,表示模块未启用
};
文档相关: T113-i_User_Manual_V1.4 - 9.12 LEDC
源码: kernel/linux-5.4/drivers/leds/leds-sunxi.c
设备类型: led子系统
低速率模数转换器(LRADC)可以将外界信号转换成一定比例的数字值,实现对模拟信号的测量,可应用于功率检测和按键检测。
设备树节点:
keyboard0: keyboard@2009800 {
compatible = "allwinner,keyboard_1350mv"; //lradc模块标签,匹配驱动的字符串
reg = <0x0 0x02009800 0x0 0x400>; //lradc模块寄存器地址
interrupts = <GIC_SPI 61 IRQ_TYPE_EDGE_RISING>; //lradc模块中断号
clocks = <&ccu CLK_BUS_LRADC>; //lradc模块时钟
clock-names = "mclk"; //lradc模块时钟名称
resets = <&ccu RST_BUS_LRADC>; //lradc模块复位
key_cnt = <5>; //lradc模块按键数量
key0 = <210 115>; //lradc模块按键0的电压值和按键值
key1 = <410 114>; //lradc模块按键1的电压值和按键值
key2 = <590 139>; //lradc模块按键2的电压值和按键值
key3 = <750 28>; //lradc模块按键3的电压值和按键值
key4 = <880 172>; //lradc模块按键4的电压值和按键值
wakeup-source; //lradc模块是否支持为唤醒源
status = "okay"; //lradc模块状态,表示模块正常工作
};
/* LRADC KEY */
&keyboard0 {
key_cnt = <1>; //lradc模块按键数量
key0 = <210 148>; /* <Voltage mV> <KEY_PROG1>*/ //lradc模块按键0的电压值和按键值
};
文档相关: T113-i_User_Manual_V1.4 - 9.10 LRADC
源码: kernel/linux-5.4/drivers/input/keyboard/sunxi-keyboard.c
设备类型: iput子系统,/dev/event/eventX
脉冲宽度调制(PWM)模块可以输出可配置的PWM波形和测量外部输入的aefrm。
设备树节点:
pwm7: pwm7@2000c17 {
compatible = "allwinner,sunxi-pwm7"; //pwm模块标签,匹配驱动的字符串
pinctrl-names = "active", "sleep"; //pwm模块引脚复用别名
reg = <0x0 0x02000c17 0x0 0x4>; //pwm模块寄存器地址
reg_base = <0x02000c00>; //pwm模块寄存器基地址
};
&pwm7 {
pinctrl-names = "active", "sleep"; //pwm模块引脚复用别名
pinctrl-0 = <&pwm7_pin_a>; //pwm模块引脚复用管理定义
pinctrl-1 = <&pwm7_pin_b>; //pwm模块引脚复用管理定义
status = "okay"; //pwm模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 9.11 PWM
源码: kernel/linux-5.4/drivers/pwm/pwm-sun4i.c
设备类型: pwm框架
实时时钟(Real Time Clock, RTC)用于实现时间计数器和定时唤醒功能。
设备树节点:
rtc: rtc@7090000 {
compatible = "allwinner,sun8iw20-rtc"; //rtc模块标签,匹配驱动的字符串
device_type = "rtc"; //rtc模块设备类型
wakeup-source; //rtc模块支持为唤醒源
reg = <0x0 0x07090000 0x0 0x320>; //rtc模块寄存器地址
interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>; //rtc模块中断号
clocks = <&r_ccu CLK_R_AHB_BUS_RTC>, <&rtc_ccu CLK_RTC_1K>, <&rtc_ccu CLK_RTC_SPI>; //rtc模块时钟
clock-names = "r-ahb-rtc", "rtc-1k", "rtc-spi"; //rtc模块时钟名称
resets = <&r_ccu RST_R_AHB_BUS_RTC>; //rtc模块复位
gpr_cur_pos = <6>; //rtc模块当前位置
};
文档相关: T113-i_User_Manual_V1.4 - 3.16 RTC
源码: kernel/linux-5.4/drivers/rtc/rtc-sunxi.c
设备类型: rtc子系统
SID 提供的功能可以分为四大部分:ChipID、SoC Version、 Efuse功能、一些状态位。
设备树节点:
sid@3006000 {
compatible = "allwinner,sun8iw20p1-sid", "allwinner,sunxi-sid"; //sid模块标签,匹配驱动的字符串
reg = <0x0 0x03006000 0 0x1000>; //sid模块寄存器地址
#address-cells = <1>; //sid模块子节点reg属性地址单元格数量
#size-cells = <1>; //sid模块子节点reg属性大小单元格数量
secure_status {
reg = <0x0 0>; //加密状态寄存器列表
offset = <0xa0>; //加密状态寄存器偏移值
size = <0x4>; //加密状态寄存器长度数目
};
chipid {
reg = <0x0 0>; //cpuid寄存器列表
offset = <0x200>; //cpuid寄存器偏移值
size = <0x10>; //cpuid寄存器长度数目
};
//....
};
文档相关: -
源码: kernel/linux-5.4/drivers/nvmem/sunxi_sid.c
设备类型: nvmem子系统
串行外设接口(SPI)是CPU和符合SPI的外部设备之间的全双工、同步、四线串行通信接口。
设备树节点:
spi0: spi@4025000 {
#address-cells = <1>; //子节点reg属性地址单元格数量
#size-cells = <0>; //子节点reg属性大小单元格数量
compatible = "allwinner,sun8i-spi"; //spi模块标签,匹配驱动的字符串
device_type = "spi0"; //spi模块设备类型
reg = <0x0 0x04025000 0x0 0x1000>; //spi模块寄存器地址
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; //spi模块中断号
clocks = <&ccu CLK_PLL_PERIPH0>, <&ccu CLK_SPI0>, <&ccu CLK_BUS_SPI0>; //spi模块时钟
clock-names = "pll", "mod", "bus"; //spi模块时钟名称
resets = <&ccu RST_BUS_SPI0>; //spi模块复位
clock-frequency = <100000000>; //spi模块时钟频率
spi0_cs_number = <1>; //spi模块cs数量
spi0_cs_bitmap = <1>; //spi模块cs位图
dmas = <&dma 22>, <&dma 22>; //spi模块dma通道
dma-names = "tx", "rx"; //spi模块dma通道名称
status = "disabled"; //spi模块状态,表示模块未启用
};
&spi0 {
clock-frequency = <100000000>; //spi模块时钟频率
pinctrl-0 = <&spi0_pins_a &spi0_pins_b>; //spi模块引脚复用管理定义
pinctrl-1 = <&spi0_pins_c>; //spi模块引脚复用管理定义
pinctrl-names = "default", "sleep"; //spi模块引脚复用别名
/*spi-supply = <®_dcdc1>;*/
spi_slave_mode = <0>; //spi模块工作模式
spi0_cs_number = <1>; //spi模块cs数量
spi0_cs_bitmap = <1>; //spi模块cs位图
status = "disabled"; //spi模块状态,表示模块未启用
spi-nand@0 {
compatible = "spi-nand"; //spi-nand模块标签,匹配驱动的字符串
spi-max-frequency=<80000000>; //spi-nand模块最大时钟频率
reg = <0x0>; //spi-nand模块寄存器地址
spi-rx-bus-width=<0x04>; //spi-nand模块接收总线宽度
spi-tx-bus-width=<0x04>; //spi-nand模块发送总线宽度
status="okay"; //spi-nand模块状态,表示模块正常工作
};
};
文档相关: T113-i_User_Manual_V1.4 - 9.3 SPI
源码: kernel/linux-5.4/drivers/spi/spi-sunxi.c,kernel/linux-5.4/drivers/mtd/awnand/spinand/sunxi-core.c
设备类型: spi接口,mtd设备
触摸面板ADC(TPADC)是一种4线电阻式触摸屏控制器,包括一个12位逐次逼近型A/D转换器。
设备树节点:
rtp:rtp@2009c00 {
compatible = "allwinner,sun8i-ts"; //标签,用于rtp驱动匹配的字符串
reg = <0x0 0x02009c00 0x0 0x400>; //rtp寄存器地址<寄存器高位 寄存器低位 寄存器范围高位 寄存器范围低位>
clocks = <&ccu CLK_TPADC>, <&ccu CLK_BUS_TPADC>; //tpadc时钟
clock-names = "mod", "bus"; //tpadc时钟别名
clock-frequency = <1000000>; //tpadc时钟频率
resets = <&ccu RST_BUS_TPADC>; //tpadc复位
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>; //tpadc中断
};
文档相关: T113-i_User_Manual_V1.4 - 9.9 TPADC
源码: kernel/linux-5.4/drivers/input/touchscreen/sunxi-ts.c
设备类型: /dev/event/eventX,iput子系统
TWI (Two Wire Interface)提供了CPU和任何通过TWI总线连接的兼容TWI总线的设备之间的接口。TWI被设计成与标准I2C总线协议兼容。
设备树节点:
//上层,定义子节点都是2个位
// #address-cells = <2>;
// #size-cells = <2>;
//pinctrl引脚配置
//详细配置参考kernel/linux-5.4/driver/pinctrl/sunxi/
&pio {
//...
twi2_pins_a: twi2@0 {
pins = "PE12", "PE13"; //引脚声明,twi2使用PE12,PE13
function = "twi2"; //定义引脚的复用功能,用于twi2
drive-strength = <10>; //引脚的驱动能力
};
twi2_pins_b: twi2@1 {
pins = "PE12", "PE13";
function = "gpio_in"; //定义引脚的复用功能,输入模式,用于低功耗休眠模式
};
}
twi2: twi@2502800{
#address-cells = <1>; //定义描述子节点寄存器地址的数目,为1个
#size-cells = <0>; //定义描述子节点寄存器范围的数目,不存在
compatible = "allwinner,sun8i-twi"; //标签,用于twi驱动匹配的字符串
device_type = "twi2"; //设备类型twi2
reg = <0x0 0x02502800 0x0 0x400>; //twi2寄存器地址<寄存器高位 寄存器低位 寄存器范围高位 寄存器范围低位>
interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>; //twi2中断处理 <所属中断,中断线号,中断类型>
clocks = <&ccu CLK_BUS_I2C2>; //twi2使能时钟,devm_clk_get
resets = <&ccu RST_BUS_I2C2>; //twi2复位时钟,devm_reset_control_get
clock-names = "bus"; //twi2使能时钟别名,用于驱动中访问获取
clock-frequency = <100000>; //twi2的clk时钟频率
status = "disabled"; //twi2的状态,关闭
};
&twi2 {
clock-frequency = <100000>; //twi2的clk时钟频率
pinctrl-0 = <&twi2_pins_a>; //默认的twi2的引脚复用配置,i2c模式
pinctrl-1 = <&twi2_pins_b>; //休眠模式下的引脚复用配置,I/O输入模式
pinctrl-names = "default", "sleep"; //pinctrl选项名称,用于驱动中使用
twi_drv_used = <1>; //是否启动dma访问数据,0表示不启用,1表示使用dma
dmas = <&dma 45>, <&dma 45>; //twi2控制器的dma通道号
dma-names = "tx", "rx"; //dma名称,tx, rx
status = "okay"; //模块状态
rtc@68 {
compatible = "dallas,ds1307"; //rtc标签,用于驱动匹配
reg = <0x68>; //rtc寄存器说明,0x68表示i2c器件地址
};
};
文档相关: T113-i_User_Manual_V1.4 - 9.3 SPI
源码:
相关功能: i2c接口,rtc子系统
通用异步接收发射机(UART)提供与外部设备、调制解调器(数据载波设备,DCE)的异步串行通信。
设备树节点:
//bias-pull-up 引脚配置为pull up
//bias-pull-down 引脚配置为pull down
//bias-disable 引脚配置为no-pull
&pio {
uart1_pins_a: uart1_pins@0 { /* For EVB1 board */
pins = "PB8", "PB9"; //引脚声明,uart1使用PB8,PB9
function = "uart1"; //定义引脚的复用功能,用于uart1
drive-strength = <10>; //引脚的驱动能力
bias-pull-up; //引脚默认配置高电平(防止拉低,启动时输出全0数据)
};
uart1_pins_b: uart1_pins { /* For EVB1 board */
pins = "PB8", "PB9";
function = "gpio_in"; //定义引脚的复用功能,输入模式,用于低功耗休眠模式
};
};
uart1: uart@2500400 {
compatible = "allwinner,sun8i-uart"; //标签,用于驱动匹配设备节点
device_type = "uart1"; //节点设备类型,uart1
reg = <0x0 0x02500400 0x0 0x400>; //twi2寄存器地址<寄存器高位 寄存器低位 寄存器范围高位 寄存器范围低位>
interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; //uart1对应的中断控制器和中断线号
sunxi,uart-fifosize = <256>; //uart1底层队列缓存大小
clocks = <&ccu CLK_BUS_UART1>; //uart1对应的clk控制时钟
clock-names = "uart1"; //uart1对应的clk时钟名称
resets = <&ccu RST_BUS_UART1>; //uart1对应的复位信号
uart1_port = <1>; //uart对应端口,表示uart1
uart1_type = <4>; //uart对应的io数目,表示4-wire(tx, rx, cts, rts)
status = "okay"; //状态,开启
};
&uart1 {
pinctrl-names = "default", "sleep"; //pinctrl选项名称,用于驱动中使用
pinctrl-0 = <&uart1_pins_a>; //默认的uart0的引脚复用配置,uart模式
pinctrl-1 = <&uart1_pins_b>; //休眠模式下的引脚复用配置,I/O输入模式
dmas = <&dma 15>, <&dma 15>; //uart1控制器的dma通道号
dma-names = "tx", "rx"; //dma名称,tx, rx
use_dma = <3>; //配置dma工作方式,0不开启dma,1:dma tx 2: dma rx 3: 同时开启
status = "okay"; //状态,开启
};
文档相关: T113-i_User_Manual_V1.4 - 9.2 UART
源码: kernel/linux-5.4/drivers/tty/serial/sunxi-uart.c
相关功能: uart serial子系统
usb模块是一个通用的USB控制器,通常用于连接外部USB设备,并提供USB通信接口。
设备树节点:
usbc0:usbc0@0 {
device_type = "usbc0"; //usbc0模块设备类型
compatible = "allwinner,sunxi-otg-manager"; //usbc0模块标签,匹配驱动的字符串
usb_port_type = <2>; //usbc0模块端口类型
usb_detect_type = <1>; //usbc0模块检测类型
usb_id_gpio; //usbc0模块支持id检测
usb_det_vbus_gpio; //usbc0模块支持vbus检测
usb_regulator_io = "nocare"; //usbc0模块供电控制io
usb_wakeup_suspend = <0>; //usbc0模块唤醒挂起时间
usb_luns = <3>; //usbc0模块luns数量
usb_serial_unique = <0>; //usbc0模块唯一编号
usb_serial_number = "20080411"; //usbc0模块序列号
rndis_wceis = <1>; //usbc0模块rndis支持
status = "okay"; //usbc0模块状态,表示模块正常工作
};
文档相关: T113-i_User_Manual_V1.4 - 9.6 USB2.0 HOST
源码: kernel/linux-5.4/drivers/usb/host/sunxi_usb/manage/usb_manage.c
设备类型: usb子系统
看门狗(Watchdog Timer,WDT)是一种在系统运行时监控系统状态的硬件设备。WDT可以在系统出现故障时自动重启系统。
设备树节点:
wdt: watchdog@20500A0 {
compatible = "allwinner,sun6i-a31-wdt"; //标签,用于驱动匹配的字符串
reg = <0x0 0x020500A0 0x0 0x20>; //wdt寄存器地址<寄存器高位 寄存器低位 寄存器范围高位 寄存器范围低位>
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>; //wdt中断
};
文档相关: T113-i_User_Manual_V1.4 - 3.7 Timer
源码: kernel/linux-5.4/drivers/watchdog/sunxi_wdt.c
相关功能: watchdog子系统
直接开始下一节说明: rk3568设备树分析