立即注册
查看: 4943|回复: 11

[openwrt问题] Openwrt之DTS

已绑定手机
发表于 2019-4-1 20:52:52 | 显示全部楼层 |阅读模式 来自 广东省深圳市
DTS (Device tree source)它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。


OPENWRT的dts文件一般位于目录:target\linux\raMIPS\dts
根据不同机型选择不同的dts文件:


MT7620a.dts为例:
/dts-v1/;
/include/ "mt7620a.dtsi"   /*引用此文件,但同名定义以此文件为主*/
/ { /*根节点*/
        compatible = "ralink,mt7620a-eval-board", "ralink,mt7620a-soc"; /*这些字符串列表被操作系统用来选择用哪一个driver来驱动该设备*/
        model = "Ralink MT7620A evaluation board"; /*此字符串会显示在 单板status->system->model 页面中*/
        palmbus@10000000 {  /*寄存器映射位置,即0x1000,0000,见《MT7620_ProgrammingGuide》的1.3(P13)的 SYSCTL*/
                sysc@0 {/*相对于palmbus的偏移,即0x1000,0000,见《MT7620_ProgrammingGuide》的1.3(P13)的 SYSCTL*/
                        ralink,gpiomux = "i2c", "jtag"; /*表示i2c和jtag,也可以用于gpio控制;具体到这里,是由于按键要用到i2c*/
                        ralink,uartmux = "gpio"; /*表示gpio,也可以用于UART输出*/
                        ralink,wdtmux = <1>;
                };
               

                /*MT7620A将GPIO分为4组,如下是针对各组的定义*/

                gpio0: gpio@600 {/*相对于palmbus的偏移,即0x1000,0600,见《MT7620_ProgrammingGuide》的1.3(P13)的 PIO*/
                        status = "okay"; /*状态为okay,表示此GPIO组可用*/
                };
               
                gpio1: gpio@638 {
                        status = "okay";
                };
               
                gpio2: gpio@660 {
                        status = "okay";
                };


                gpio3: gpio@688 {
                        status = "okay";
                };


                spi@b00 {/*相对于palmbus的偏移,即0x1000,0b00,见《MT7620_ProgrammingGuide》的1.3(P13)的 SPI*/
                        status = "okay";
                        m25p80@0 {/*相对于SPI的偏移*/
                                #address-cells = <1>;
                                #size-cells = <1>;
                                compatible = "en25q64";
                                reg = <0 0>; /*mtd中的偏移量和大小*/
                                linux,modalias = "m25p80", "en25q64";
                                spi-max-frequency = <10000000>; /*Maximum SPI clocking speed of device in Hz;原来值是1000000,比驱动要求的值小;会导致Flash加载失败*/
                                /*如下分区只针对 8M 大小;当bootloader中没有设定分区定义时,内核就据此来划分Flash分区了*/

                                partition@0 {
                                        label = "u-boot";  /*此分区的标识,会体现在 /proc/mtd文件中*/
                                        reg = <0x0 0x30000>; /*此分区的偏移量和大小*/
                                        read-only; /*表示此分区只读*/
                                };
                                partition@30000 {
                                        label = "u-boot-env";
                                        reg = <0x30000 0x10000>;
                                        read-only;
                                };
                                factory: partition@40000 {
                                        label = "factory";
                                        reg = <0x40000 0x10000>;
                                        read-only;
                                };
                                
                                kernel: partition@50000 {
                                        label = "kernel";
                                        reg = <0x50000 0x190000>;
                                };
                                
                                rootfs: partition@1E0000 {
                                        label = "rootfs";
                                        reg = <0x1E0000 0x620000>;
                                };
                                partition{
                                        label = "firmware";
                                        reg = <0x50000 0x7b0000>; /*这是kernel+rootfs的合计*/
                                };
                        };
                };
        };
        
        pinctrl { /*描述pin控制逻辑*/
                state_default: pinctrl0 {
/*ralink,group和ralink,function,用于mt7620.c中的识别处理;定义PIN节点:"ephy", "i2c", "uartf", "wled","spi refclk",也可以用于GPIO控制*/
                        gpio {
                                ralink,group = "ephy", "i2c", "uartf", "wled", "spi refclk";
                                ralink,function = "gpio";
                        };               
                };
        };
        ethernet@10100000 {
                status = "okay";
                pinctrl-names = "default";
                mtd-mac-address = <&factory 0x28>; /*在分区"factory"的偏移位置0x28,对应LAN侧的MAC地址*/
                ralink,port-map = "llllw"; /*ralink,port-map,对应 MT7530.c中的mt7530_find_mapping 识别处理;这里表示port0到port3是lan;port4是wan*/
        };
        
        sdhci@10130000 {
                status = "okay";
        };
        pcie@10140000 {
                status = "okay";
        };


        gpio-keys-polled {
                compatible = "gpio-keys-polled"; /*用于在gpio-button-hotplug中的识别*/
                #address-cells = <1>;
                #size-cells = <0>;
                poll-interval = <20>; /*用于在gpio-button-hotplug中的轮训间隔设置;单位是ms*/
               
                reset {/*特别定义reset按键*/
                        label = "reset";
                        gpios = <&gpio0 13 1>;  /*reset按键的GPIO编号*/
                        linux,code = <0x198>;  /*当按下reset按键后,向内核发出的code;这些code,用于input_event上报的code代码,具体含义见input.h:比如这里的0x198就对应KEY_RESTART;而在gpio-button-hotplug.c中,有BH_MAP(KEY_RESTART,        "reset"),*/
                };
        };
        

        wmac@10180000 {
                ralink,mtd-eeprom = <&factory 0>; /*wifi的K值的读取起始位置*/
                mtd-mac-address = <&factory 0x4>; /*wifi的MAC地址,读取起始位置*/
        };
        
        /*如下定义led灯控*/

        gpio-leds {
                compatible = "gpio-leds";
               
                wan {
                        label = "w856n:blue:wan"; /*led灯的标识,会体现在/sys/class/leds目录中*/
                        gpios = <&gpio2 4 1>; /*led灯对应的gpio编号;表示是gpio2组中的第4个GPIO;这里的wan对应路由器面板外壳上的丝印*/
                };
                lan4 {
                        label = "w856n:blue:lan4";
                        gpios = <&gpio2 0 1>;
                };
                lan3 {
                        label = "w856n:blue:lan3";
                        gpios = <&gpio2 1 1>;
                };        
                lan2 {
                        label = "w856n:blue:lan2";
                        gpios = <&gpio2 2 1>;
                };
                lan1 {
                        label = "w856n:blue:lan1";
                        gpios = <&gpio2 3 1>;
                };
               
                WLAN {
                        label = "w856n:blue:wlan";
                        gpios = <&gpio3 0 1>;
                };
               
                wps {
                        label = "w856n:blue:wps";
                        gpios = <&gpio1 15 1>;
                };        
        };
};


游客,如果您要查看本帖隐藏内容请回复


在注册总线和设备时,会对dts节点的状态作一个判断,如果节点里面的status属性没有被定义,或者status属性被定义了并且值被设为“ok”或者“okay”,其他情况则不被注册到系统中
我知道答案 回答被采纳将会获得5 RD币 已有11人回答
已绑定手机
已实名认证
一牛网现金打赏上线了!解问题 赚现金,知识收益,等你来!具体详情请点击:一牛网现金打赏说明
发表于 2019-4-2 10:39:54 | 显示全部楼层 来自 广东省深圳市
新平台,看看是什么
发表于 2019-4-15 15:40:58 | 显示全部楼层 来自 北京市
过来学习下
已绑定手机
发表于 2019-10-20 18:00:10 | 显示全部楼层 来自 广东省阳江市
回复学习  感谢分享
发表于 2020-4-7 08:58:19 | 显示全部楼层 来自 上海市

_

介绍的还算详细
已绑定手机
发表于 2020-4-13 10:11:14 | 显示全部楼层 来自 浙江省宁波市

_

看看~~~下载看看 谢谢!
已绑定手机
发表于 2020-7-21 08:08:08 | 显示全部楼层 来自 四川省成都市
谢谢分享,简单明了,好文章
发表于 2020-8-10 16:12:26 | 显示全部楼层 来自 广东省深圳市
谢谢分享
已绑定手机
发表于 2020-9-2 23:38:08 来自手机 | 显示全部楼层 来自 山西省临汾市
感谢楼主无私奉献  谢谢
已绑定手机
发表于 2021-9-20 09:11:18 | 显示全部楼层 来自 上海市
终于找到了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表