Linux设备树学习笔记(三、修改uboot、linux-4.15内核在JZ2440使用设备树)

1. 实验开发环境

u-boot:u-boot-2016.03
Linux内核:linux-4.15
开发板:JZ2440开发板

2. 添加uboot mtd device_tree分区保存设备树文件

在uboot的JZ2440开发板的配置文件include/configs/jz2440.hMTDPARTS_DEFAULT中添加device_tree分区,代码如下:

#define MTDPARTS_DEFAULT     "mtdparts=jz2440-0:512k(u-boot),"   \
                             "128k(device_tree)," \  /*添加device_tree分区*/
                             "256k(params),"     \
                             "4m(kernel),"   \
                             "-(rootfs)"     \

3. 修改内核mtd分区

uboot修改了分区,linux也要修改对应的分区,在arch/arm/mach-s3c24xx/common-smdk.csmdk_default_nand_part添加device_tree分区,代码如下:

/* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name   = "bootloader",
        .size   = SZ_512K,
        .offset = 0,
    },
    [1] = {  /*添加device_tree分区*/
        .name   = "device_tree",  
        .size   = SZ_128K,
        .offset = MTDPART_OFS_APPEND,
    },
    [2] = {
        .name   = "params",
        .offset = MTDPART_OFS_APPEND,
        .size   = SZ_256K,
    },
    [3] = {
        .name   = "kernel",
        .offset = MTDPART_OFS_APPEND,
        .size   = SZ_4M,
    },
    [4] = {
        .name   = "rootfs",
        .offset = MTDPART_OFS_APPEND,
        .size   = MTDPART_SIZ_FULL,
    },
};

4. 修改内核代码支持JZ2440使用设备树

注:这部分的修改参考韦东山设备树视频配套资料的linux-4.19-rc3_device_tree_for_jz2440.patch补丁文件
1.修改 arch/arm/mach-s3c24xx/mach-smdk2440.c 文件:
添加如下代码:

static const char *const smdk2440_dt_compat[] __initconst = {
    "samsung,smdk2440",
    NULL
};
MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
    .atag_offset    = 0x100,

    .dt_compat      = smdk2440_dt_compat, /*添加*/

    .init_irq   = s3c2440_init_irq,
    .map_io     = smdk2440_map_io,
    .init_machine   = smdk2440_machine_init,
    .init_time  = smdk2440_init_time,
MACHINE_END

2.修改arch/arm/plat-samsung/gpio-samsung.csamsung_gpiolib_init函数:
注释掉以下代码:

//  if (of_have_populated_dt())
//      return 0;

3.在arch/arm/boot/dts/Makefile添加如下代码:

dtb-$(CONFIG_ARCH_S3C2440) += jz2440.dtb

4.把jz2440.dts 文件拷贝到 arch/arm/boot/dts/ 目录下,jz2440.dts的代码如下:

// SPDX-License-Identifier: GPL-2.0
/*
 * SAMSUNG SMDK2440 board device tree source
 *
 * Copyright (c) 2018 weidongshan@qq.com
 * dtc -I dtb -O dts -o jz2440.dts jz2440.dtb
 */
 
#define S3C2410_GPA(_nr)	((0<<16) + (_nr))
#define S3C2410_GPB(_nr)	((1<<16) + (_nr))
#define S3C2410_GPC(_nr)	((2<<16) + (_nr))
#define S3C2410_GPD(_nr)	((3<<16) + (_nr))
#define S3C2410_GPE(_nr)	((4<<16) + (_nr))
#define S3C2410_GPF(_nr)	((5<<16) + (_nr))
#define S3C2410_GPG(_nr)	((6<<16) + (_nr))
#define S3C2410_GPH(_nr)	((7<<16) + (_nr))
#define S3C2410_GPJ(_nr)	((8<<16) + (_nr))
#define S3C2410_GPK(_nr)	((9<<16) + (_nr))
#define S3C2410_GPL(_nr)	((10<<16) + (_nr))
#define S3C2410_GPM(_nr)	((11<<16) + (_nr))

/dts-v1/;

/ {
	model = "SMDK24440";
	compatible = "samsung,smdk2440";

	#address-cells = <1>;
	#size-cells = <1>;
		
	memory@30000000 {
		device_type = "memory";
		reg =  <0x30000000 0x4000000>;
	};
/*
	cpus {
		cpu {
			compatible = "arm,arm926ej-s";
		};
	};
*/	
	chosen {
		bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
	};

	
	led {
		compatible = "jz2440_led";
		reg = <S3C2410_GPF(5) 1>;
	};
};

5. 测试

1.重新编译内核,设备树,在linux内核顶层目录下,输入以下命令:

make uImage -j4
make dtbs  /*编译设备树,生成jz2440.dtb文件*/

2.下载内核,设备树到开发板测试:

nfs 30000000 192.168.0.102:/home/book/works/first_fs/uImage
nfs 32000000 192.168.0.102:/home/book/works/first_fs/jz2440.dtb
bootm 30000000 - 32000000

打印信息如下,可见JZ2440可以使用设备树了。
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Louis@L.M.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值