linux_support_device_tree - TreeNewbeer/Coonix GitHub Wiki

让Linux内核支持设备树

新唐官方提供的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。

linux-menuconfig

make linux-menuconfig
  • Boot options -> Flattened Device Tree support 开启设备树支持

buildroot menuconfig

打开 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

保存配置

build

make -j12 linux-rebuild

然后在 output/images 里面会发现 uImage.nuc980-coonix 文件。

Troubleshooting

上述操作之后发现内核启动停在这里了

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>;
				};
			};
		}

然后再重新编译,问题消失了。

⚠️ **GitHub.com Fallback** ⚠️