8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
宿主机: ubuntu16.04
开发板: tq-imx6ull
内核版本: linux-4.1.15
用实例讲解下设备树dts语法, dts文档都在内核的arch/arm/boot/dts目录下; 在查看dts文档时候发现这有些c语言的语法包含在其中, 比如#inlcude , #include "xxx.dtsi"; 接下来分析天嵌官方提供的设备树文档;
二. 语法分析arch/arm/boot/dts
tq官方提供了两种设备树配置, 一种是单网口和8串口配置, 一种是双网口和6串口配置; 笔者将以后一种配置的设备树文档进行分析, 开头有说过, dts文档支持类似C语言的语法, 下面列出了包含情况:
tq-imx6ul_net0_uart.dts
#include "tq-imx6ul.dts"
#include
#include "imx6ul.dtsi"
#include "skeleton.dtsi"
#include
#include
#include
#include "imx6ul-pinfunc.h"
先从最前面的dts文档分析:tq-imx6ul_net0_uart.dts
截取部分内容如下:
#include "tq-imx6ul.dts"
.....
&fec1 { ①
pinctrl-names = "default";
pinctrl-0 = ; ②
phy-mode = "rmii";
phy-handle = ;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy0: [emailprotected] {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <2>;
};
};
};
.....
2.1 dts修改方式①: &fec1表示引用标签fec1, 它来自imx6ul.dtsi, 原型如下:
fec1: [emailprotected] {
compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
reg = <0x02188000 0x4000>;
interrupts = ,
;
clocks = ,
,
,
,
;
clock-names = "ipg", "ahb", "ptp",
"enet_clk_ref", "enet_out";
stop-mode = ;
fsl,num-tx-queues=<1>;
fsl,num-rx-queues=<1>;
fsl,magic-packet;
fsl,wakeup_irq = <0>;
status = "disabled";
};
仔细观察它比在tq-imx6ul_net0_uart.dts时的属性多的多, 其实这是dts的一个特点, 可以进行引用修改, 即在原有的基础上进行修改或增加, 以属性status为例, 原本是"disable"状态, 后引用修改为"okay"状态, 而不需要重新全部的写一边节点; 因为在编译成dtb的时候, 编译器会将他们合并; 这个可以通过dtb文档反汇编成dts文档查看反汇编dtb, 上述
[emailprotected] {
compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
reg = <0x2188000 0x4000>;
interrupts = <0x0 0x76 0x4 0x0 0x77 0x4>;
clocks = <0x1 0x90 0x1 0x91 0x1 0x30 0x1 0x2c 0x1 0x2c>;
clock-names = "ipg", "ahb", "ptp", "enet_clk_ref", "enet_out";
stop-mode = <0x16 0x10 0x3>;
fsl,num-tx-queues = <0x1>;
fsl,num-rx-queues = <0x1>;
fsl,magic-packet;
fsl,wakeup_irq = <0x0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <0x1a>;
phy-mode = "rmii";
phy-handle = <0x1b>;
mdio {
#address-cells = <0x1>;
#size-cells = <0x0>;
[emailprotected] {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x2>;
linux,phandle = <0x1b>;
phandle = <0x1b>;
};
};
};
可以看到他们已经合并在一起了, 其实还有修改一种方式如下:
/ {
[emailprotected] {
......
status = "okay";
};
};
该方式称为重写; 注意, 这样书写的方式必须写在root节点内; 讲到这里觉得有比较说下dts的基本语法知识, 如下:
[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
};
在设备树中最开始的符号:
/ {
};
表示根节点, 也叫做root节点, 而fec1表示一个label, ethernet表示节点名字, 则@02188000表示节点对应的寄存器地址, 加上这个只是为了区分不同的节点, 比如这款soc就支持双网口;
compatible和status表示一个属性, mdio { };则表示一个子节点;
从lable的引用可以看出很多公共的节点都会先在.dtsi中书写或.h中书写, 有差异的时候需要修改则在.dts中引用修改;
2.2 lable转换phandle
pinctrl_enet1: enet1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO07__ENET1_MDC0x1b0b0
MX6UL_PAD_GPIO1_IO06__ENET1_MDIO0x1b0b0
.....
>;
};
其实在编译以后, lable会转换成属性phandle在该节点中, 并且会为其赋上u32类型的值; 反汇编后enet1grp节点的dts如下:
enet1grp {
....
linux,phandle = <0x1a>;
phandle = <0x1a>;
};
我们在看看前面反汇编出的pinctrl-0引用的值变为了0x1a
[emailprotected] {
compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
....
pinctrl-0 = <0x1a>;
phy-mode = "rmii";
phy-handle = <0x1b>;
....
};
2.3 属性取值方式prop-encoded-array
比如: local-mac-address = [ 00 00 12 34 56 78];
每个字节的值用两个16进制的数表示, 也可以写成local-mac-address = [ 000012345678];string
比如: compatible = "fsl,imx6ul-lcdif";string list
比如: compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";u32
比如: address-bits = <48>;phandle
比如: phy-handle = ;
该方式其实是引用lable, 最后编译其实是个u32类型的整数; 欢迎大家纠错讨论: !