linux_support_device_tree - TreeNewbeer/Coonix GitHub Wiki
新唐官方提供的linux是不支持设备树的,但是发现linux代码中有关于设备树的宏,也有相关的dts, dtsi文件,所以可能通过简单的配置让linux支持设备树。
先建立一份自己的dts文件
cd output/build/linux-master/arch/arm/boot/dts/
cp nuc980-eth2uart.dts nuc980-coonix.dts
然后编辑 nuc980-coonix.dts 文件,把所有uart的status改为disabled。emac1也disabled。
make linux-menuconfig
- Boot options -> Flattened Device Tree support 开启设备树支持
打开 buildroot menuconfig
make menuconfig
作如下配置
- Kernel
- Build a Device Tree Blob (DTB) 编译设备树
- (nuc980-coonix) In-tree Device Tree Source file names 设置设备树源文件名称
- Kernel binary format
- uImage with appended DT
保存配置
make -j12 linux-rebuild
然后在 output/images 里面会发现 uImage.nuc980-coonix 文件。
上述操作之后发现内核启动停在这里了
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xc4800000 - 0xff800000 ( 944 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0xc0008000 - 0xc03efddc (4000 kB)
.init : 0xc03f0000 - 0xc050a000 (1128 kB)
.data : 0xc050a000 - 0xc053ba60 ( 199 kB)
.bss : 0xc053ba60 - 0xc056d854 ( 200 kB)
SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Preemptible hierarchical RCU implementation.
Build-time adjustment of leaf fanout to 32.
NR_IRQS:545
clocksource: nuc980-timer5: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 62
215505635 ns
sched_clock: 24 bits at 120kHz, resolution 8333ns, wraps every 69905062489ns
Console: colour dummy device 80x30
console [ttyS0] enabled
Calibrating delay loop...
然后在github上找得到了这个issue https://github.com/OpenNuvoton/NUC980-linux-4.4.y/issues/5 猜测我这个问题也是某个作为clocksource的timer在dts文件中被disabled了。 但是对比几个新唐提供的dts文件发现所有的timer都是disabled,rtc也是disabled,而且qspi也是disabled。但是rootfs还在spiflash里面啊。所以参考 nuc980-iot-v1.0.dts文件将qspi部分修改为
qspi0: qspi0@b0060000 {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
num_cs = <2>;
lsb = <0>;
txneg = <1>;
rxneg = <0>;
clkpol = <0>;
divider = <4>;
sleep = <0>;
txnum = <0>;
txbitlen = <8>;
bus_num = <0>;
flash: mt29f@0 {
compatible = "mt29f";
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
spi-max-frequency = <12000000>;
partition@0 {
label = "kernel";
reg = <0x00000000 0x0800000>;
};
partition@1 {
label = "rootfs";
reg = <0x0800000 0x0800000>;
};
};
}
然后再重新编译,问题消失了。