在JZ2440上移植设备树---上:u-boot移植

在JZ2440上移植设备树–上:u-boot移植

为了用上买了之后就一直在吃灰的JZ2440,决定下一番功夫在jz2440上移植设备树。由于韦老师的视频中没有讲到设备树相关,前前后后总共花了我约五个晚上,一个周末的时间。

1、移植u-boot

u-boot可以从u-boot官网上下载;我下载的版本是u-boot-2013.03。
编译器我用的是gcc-4.6.4也可使用韦老师提供的gcc-4.3.2;gcc安装和u-boot解压过程不进行赘述。

1.1 u-boot编译

打开u-boot源码目录,u-boot-2013.01board\samsung发现并没有支持JZ2440的单板文件,我们选取和2440最接近的smdk2410。为了省事,可以不进行如下的新建单板的步骤:

cd board/samsung/ cp smdk2410 smdk2440 -rf
cd ../../include/configs/ cp smdk2410.h smdk2440.h
修改boards.cfg:
仿照
smdk2410 arm arm920t - samsung s3c24x0
添加:
smdk2440 arm arm920t - samsung s3c24x0

而直接在u-boot-2013.01目录下make smdk2410_defconfig
然后make (2013版本的u-boot还没有支持make menuconfig,我们可以通过修改smdk2410.h的宏定义进行u-boot的配置)
ps:make之前先在u-boot主目录下配置配置内核架构和编译器,如下图:
在JZ2440上移植设备树---上:u-boot移植_第1张图片
不出意外的话,make一路编译成功,生成u-boot.bin文件;

1.2 u-boot烧写

由于JZ2440配有Jlink,我们直接通过jlink烧写uboot.bin到nor flash。
ps:Jlink烧写u-boot.bin参考韦老师的”如何烧写S3C2440裸板程序.pdf
另外,如果没有Jlink,我们还可以通过”新方法 使用NandFlash上的u-boot烧写NorFlash.pdf“在nor flash上烧录u-boot。
烧录完成后,选择nor启动,重启开发板,会发现串口无任何输出,说明smdk2410的默认配置不适合jz2440。我们需要对其进行修改。

1.3 修改u-boot支持jz2440串口输出

1.3.1 修改u-boot时钟配置

由于S3C2440和S3C2410时钟计算法不一样,打开smdk2410.c,修改初始化函数中的时钟配置。
vim board/samsung/smdk2410/smdk2410.c 修改如下图:
在JZ2440上移植设备树---上:u-boot移植_第2张图片

1.3.2 修改int board_early_init_f(void)函数添加CLKDIVN寄存器配置

增加一行
writel(0x5, &clk_power->clkdivn); 如下图:
在JZ2440上移植设备树---上:u-boot移植_第3张图片

1.3.3 修改串口驱动

通过查看代码可知,串口初始化的代码在drivers\serial\serial-s3c24x0.c中,serial_init_dev(const int dev_index) 函数完成串口初始化,调用stati_serial_setbrg(const int dev_index)设置波特率,找到get_HCLK()函数,
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440
switch (readl(&clk_power->clkdivn) & 0x6) {
default:
case 0:
return get_FCLK();
case 2:
return get_FCLK() / 2;
case 4:
return (readl(&clk_power->camdivn) & (1 << 9)) ?
get_FCLK() / 8 : get_FCLK() / 4;
case 6:
return (readl(&clk_power->camdivn) & (1 << 8)) ?
get_FCLK() / 6 : get_FCLK() / 3;
}
#else
return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif
}
发现宏CONFIG_S3C2440并未定义,我们只需要在smdk2410.h里定义CONFIG_S3C2440即可。
vim include/configs/smdk2410.h
在JZ2440上移植设备树---上:u-boot移植_第4张图片
再次编译并烧写,会发现jz2440串口已有输出;
ps:以上内容参考了:https://bbs.csdn.net/topics/391037133

1.4 u-boot支持网卡

参考韦老师视频中的内容对smdk2410.h进行如下修改即可:
打开board\samsung\smdk2410\smdk2410.c 找到board_eth_init函数:
在JZ2440上移植设备树---上:u-boot移植_第5张图片
只要在include/configs/smdk2410.h注释掉cs8900的宏,定义dm9000的宏即可,如下图:
在JZ2440上移植设备树---上:u-boot移植_第6张图片

1.5 u-boot支持nor flash

我们虽然能将uboot.bin烧录入nor flash,然后直接在nor上启动并通过自搬移将u-boot搬移到内存上运行;但是并不支持对Nor flash的写和擦除操作。参考韦老师的视频,只需要在drivers/mtd/jedec_flash.c 的 jedec_table[] 中增加一项匹配板子上的NOR-Flash厂商ID和设备ID即可:
在JZ2440上移植设备树---上:u-boot移植_第7张图片
另外还需要在include/configs/smdk2410.h 对以下宏进行修改
#define CONFIG_SYS_MAX_FLASH_SECT (128)
测试一下norflash能否正确读写,用以下u-boot命令:
    cp.b 0 30000000 80
    cmp.b 0 30000000 80
    发现读norflash没有问题。再用以下几条命令测试写norflash:
    mw.b 30000000 12 3
    protect off all
    erase 0 ffff
    cp.b 30000000 0 3
    md.b 0 3
    发现也是121212;因此写norflash成功,至此u-boot已经支持JZ2440开发板的norflash
ps:以上norflash移植内容参考了:https://www.cnblogs.com/blogs-of-lxl/p/5887047.html

1.5 u-boot支持nand flash

nand flash的内容我是直接按照韦老师的办法进行移植,这里不再赘述;详见“毕业班第2课第3.4节_移植最新u-boot之修改代码支持NandFlash.WMV”
移植完之后可通过nand flash的相关操作进行测试验证。

1.6 u-boot环境参数

1.6.1 定义环境参数存放位置

参考 韦老师 “毕业班第2课第4.1节_移植最新u-boot之裁剪和修改默认参数.WMV”中内容。
u-boot启动时,会读取环境参数,并判断环境参数是否有效,有效则用,无效则用默认参数。默认参数为default_environment[]中的内容,可在include/configs/smdk2410.h 里的进行相关宏定义。详情参考视频。
需要在smdk2410.h中做如下修改:
在JZ2440上移植设备树---上:u-boot移植_第8张图片
定义宏CONFIG_ENV_IN_NAND 定义环境变量在nand flash中
定义宏CONFIG_ENV_OFFSET 定义环境变量存放位置
定义宏CONFIG_ENV_SIZE 定义环境变量大小
定义宏CONFIG_ENV_RANGE 定义环境变量范围和CONFIG_ENV_SIZE一样

1.6.2 设置环境参数支持设备树

首先要在include/configs/smdk2410.h里面定义:

#define CONFIG_OF_LIBFDT

重新编译u-boot即可让u-boot支持内核设备树dts。、
修改uboot环境参数:
bootcmd=tftp 31000000 uImage; tftp 32000000 s3c2440-jz2440.dtb; bootm 31000000 - 32000000
利用tftp命令从tftp服务器获取内核镜像和设备树文件到内存,再通过bootm命令即可加载内核和设备树;如下
U-Boot 2013.01 (May 15 2018 - 22:43:15)

CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
ERROR: resetting DM9000 -> not responding
dm9000 i/o: 0x20000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
could not establish link
Using dm9000 device
TFTP from server 192.168.8.3; our IP address is 192.168.8.4
Filename ‘uImage’.
Load address: 0x31000000
Loading: #################################################################
#################################################################
#################################################################
#######################################
876 KiB/s
done
Bytes transferred = 3426600 (344928 hex)
dm9000 i/o: 0x20000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
could not establish link
Using dm9000 device
TFTP from server 192.168.8.3; our IP address is 192.168.8.4
Filename ‘s3c2440-jz2440.dtb’.
Load address: 0x32000000
Loading: T #
1000 Bytes/s
done
Bytes transferred = 6038 (1796 hex)
Booting kernel from Legacy Image at 31000000 …
Image Name: jz2440
Created: 2018-05-19 14:57:09 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3426536 Bytes = 3.3 MiB
Load Address: 31000000
Entry Point: 31000040
Verifying Checksum … OK
Flattened Device Tree blob at 32000000
Booting using the fdt blob at 0x32000000
XIP Kernel Image … OK
OK
Loading Device Tree to 33b23000, end 33b27795 … OK

Starting kernel …

你可能感兴趣的:(linux系统移植)