build_embed_linux_system

T113_I设备树分析

本节注意列出T113_i的设备树,并分析每项的含义。

pio_module

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_module

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_module

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子系统

cryptoengine_module

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_module

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子系统

display_module

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_module

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_module

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_module

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_module

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 = <&reg_pio1_8>;                                   //pinctrl模块电源
    vcc-pfo-supply = <&reg_pio3_3>;                                  //pinctrl模块电源
    
    //..
}

文档相关: T113-i_User_Manual_V1.4 - 9.7 GPIO

源码: kernel/linux-5.4/drivers/pinctrl/sunxi/pinctrl-sun8iw20.c

设备类型: gpio子系统

ledc_module

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_module

低速率模数转换器(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_module

脉冲宽度调制(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框架

rtc_module

实时时钟(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_mdoule

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_module

串行外设接口(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 = <&reg_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设备

tpadc_module

触摸面板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_module

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_module

通用异步接收发射机(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_module

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子系统

wdt_module

看门狗(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子系统

next_chapter

返回目录

直接开始下一节说明: rk3568设备树分析