平台:jz2440

作者:庄泽彬(欢迎转载,请注明作者)

说明:韦东山二期视频学习笔记

交叉编译工具:arm-linux-gcc (GCC)4.3.2

linux:linu3.4.2

PC环境:ubuntu18.04

一、kernel的编译和烧录:

下载linux-3.4.2版本进行移植,下载链接:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/

修改顶层Makefile,设置为arm架构,以及设置交叉工具链

 zhuang@zhuang:~/project/-jz2440/systems/linux-3.4.$ git diff .
diff --git a/Makefile b/Makefile
index 901a9557..9cc1639a
--- a/Makefile
+++ b/Makefile
@@ -, +, @@ SUBARCH := $(shell uname -m | sed -e s/i./i386/ -e s/sun4u/sparc64/ \
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
-ARCH ?= $(SUBARCH)
-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH ?= arm
+CROSS_COMPILE ?= arm-linux- # Architecture as present in compile.h
UTS_MACHINE := $(ARCH)

编译:

 make s3c2410_defconfig
make uImage -j4

哎呀,竟然报了下面这个错误:

应该是高版本的make导致这个错误出现的,按照错误的log修改文件。

修改如下:

 diff --git a/kernel/timeconst.pl b/kernel/timeconst.pl
index eb51d76e..
--- a/kernel/timeconst.pl
+++ b/kernel/timeconst.pl
@@ -, +, @@ if ($hz eq '--can') {
} @val = @{$canned_values{$hz}};
- if (!defined(@val)) {
+ if (!@val) {
@val = compute_values($hz);
}
output($hz, @val);

 生成对应的uImage :

上述编译出来的内核烧录到板子加载内核却出现乱码,出现乱码,有可能是我们的机器ID没有设置好,导致调用的初始化错误导致的。:

 

 二 、内核的启动

uboot启动内核主要的操作如下,从nandflash里把内核读入内存,设置TAG参数(内存的起始地址大小,命令行参数等等),R1存放机器ID,R2存放参数的存放地址,内核在启动的时候会解析TAG参数,根据uboot传递过来的机器ID,判断是否能够支持该机器,从而调用对应板子的初始化函数.

uboot设置机器ID的代码主要流程如下:

Smdk2410.c (board\samsung\smdk2440) 
board_init
  gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; //设置机器ID的默认值

Bootm.c (arch\arm\lib)

boot_jump_linux

  unsigned long machid = gd->bd->bi_arch_number;

  s = getenv("machid");         //可根据环境变量设置机器ID

我在cmdline随便设置一个machid,看看内核支持那些板子

set machid 

启动过程打印的log,根据log可以看出有匹配对应的开发板子的一个过程,最后由于匹配失败,卡在这里。

OK
Using machid 0x33333 from environment Starting kernel ... Uncompressing Linux... done, booting the kernel. Error: unrecognized/unsupported machine ID (r1 = 0x00033333). Available machine support: ID (hex) NAME
AML_M5900
0000014b Simtec-BAST
0000015b IPAQ-H1940
0000039f Acer-N35
Acer-N30
000002a8 Nex Vision - Otom 1.1
QT2410
000000c1 SMDK2410
000005b4 TCT_HAMMER
000001db Thorcom-VR1000
000005d2 JIVE
000003fe SMDK2413
000003f1 SMDK2412
S3C2413
VSTMS
SMDK2416
000002de Simtec-Anubis
AT2440EVB
000007cf MINI2440
000002a9 NexVision - Nexcoder
0000034a Simtec-OSIRIS
IPAQ-RX3715
0000016a SMDK2440
GTA02
000003b8 HP iPAQ RX1950
0000043c SMDK2443

2.1 支持mini2440开发板的machid 7cf

设置cmdline波特率为115200

 set bootargs console=ttySAC0, root=/dev/mtdblock3

  nfs 32000000 192.168.1.100:/work/nfs_root/uImage   //烧录内核命令

 设置machid为mini2440的开发板7cf,启动,串口不会有乱码.

2.2支持smdk2440开发板的machid 16a

设置machid为smdk2440开发板16a,串口却出现乱码:

我们来看看内核smd2440开发板初始化代码,是不是跟jz2440有差异:

Mach-smdk2440.c (arch\arm\mach-s3c24xx)    
  MACHINE_START(S3C2440, "SMDK2440")

    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
     .atag_offset = 0x100,

.init_irq = s3c24xx_init_irq,
     .map_io = smdk2440_map_io,   //这个函数的初始化化有点问题,
     .init_machine = smdk2440_machine_init,
     .timer = &s3c24xx_timer,
     .restart = s3c244x_restart,
     MACHINE_END

static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400);  //jz2440开发板是12M的晶振,使用使用smdk2440的machid,这里要修改为12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

代码修改如下,支持smdk2440开发板,串口输出不会有乱码:

zhuang@zhuang:~/project/-jz2440/systems/linux-3.4.$ git diff .
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2440.c b/arch/arm/mach-s3c24xx/mach-smdk2440.c
index 83a1036d..b92c2bd5
--- a/arch/arm/mach-s3c24xx/mach-smdk2440.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2440.c
@@ -, +, @@ static struct platform_device *smdk2440_devices[] __initdata = {
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
- s3c24xx_init_clocks();
+ s3c24xx_init_clocks(); //jz2440开发板是12M的晶振,使用使用smdk2440的machid,这里要修改为12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

设置为smdk2440开发板的machid 16a,启动系统串口没有输出乱码见下图:

三、修改内核分区 

 内核将nandflash分区划分如下:

1 0x00000000-0x00040000 : "bootloader"
2 0x00040000-0x00060000 : "params"
3 0x00060000-0x00260000 : "kernel"
4 0x00260000-0x10000000 : "root"

 代码修改如下:

 1 diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c
2 index 084604be..f7dce9b9 100644
3 --- a/arch/arm/mach-s3c24xx/common-smdk.c
4 +++ b/arch/arm/mach-s3c24xx/common-smdk.c
5 @@ -110,43 +110,23 @@ static struct platform_device smdk_led7 = {
6
7 static struct mtd_partition smdk_default_nand_part[] = {
8 [0] = {
9 - .name = "Boot Agent",
10 - .size = SZ_16K,
11 + .name = "bootloader",
12 + .size = SZ_256K,
13 .offset = 0,
14 },
15 [1] = {
16 - .name = "S3C2410 flash partition 1",
17 - .offset = 0,
18 - .size = SZ_2M,
19 + .name = "params",
20 + .offset = MTDPART_OFS_APPEND,
21 + .size = SZ_128K,
22 },
23 [2] = {
24 - .name = "S3C2410 flash partition 2",
25 - .offset = SZ_4M,
26 - .size = SZ_4M,
27 - },
28 - [3] = {
29 - .name = "S3C2410 flash partition 3",
30 - .offset = SZ_8M,
31 + .name = "kernel",
32 + .offset = MTDPART_OFS_APPEND,
33 .size = SZ_2M,
34 },
35 - [4] = {
36 - .name = "S3C2410 flash partition 4",
37 - .offset = SZ_1M * 10,
38 - .size = SZ_4M,
39 - },
40 - [5] = {
41 - .name = "S3C2410 flash partition 5",
42 - .offset = SZ_1M * 14,
43 - .size = SZ_1M * 10,
44 - },
45 - [6] = {
46 - .name = "S3C2410 flash partition 6",
47 - .offset = SZ_1M * 24,
48 - .size = SZ_1M * 24,
49 - },
50 - [7] = {
51 - .name = "S3C2410 flash partition 7",
52 - .offset = SZ_1M * 48,
53 + [3] = {
54 + .name = "rootfs",
55 + .offset = MTDPART_OFS_APPEND,
56 .size = MTDPART_SIZ_FULL,
57 }
58 };
59 zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$

内核启动将会把nandflash划分为上述四个分区

四、制作新的文件系统

3.1编译busybox1.20.0

解压busybox 

tar -xvf busybox-1.20..tar.bz2

设置交叉工具链make menuconfig

编译

 make 

安装

 make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new

从交叉工具链安装glibc

 cd /work/nfs_root/fs_mini_mdev_new
mkdir lib usr/lib
3 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d
4 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib/ -d

创建etc目录

 mkdir etc

在etc目录下创建inittab文件

 vim inittab    //内容从2-6行
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

在etc目录下穿件init.d/rcS文件

 mkdir init.d
vim init.d/rcS
chmod a+x init.d/rcS //设置为可执行文件
rcS文件内容如下:
#!/bin/sh mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

在etc目录下创建fstab文件:内容如下:

 # device     mount-point    type   options        dump  fsck order
proc /proc proc defaults
tmpfs /tmp tmpfs defaults
sysfs /sys sysfs defaults
tmpfs /dev tmpfs defaults

创建dev目录:

 mkdir dev
sudo mknod console c
sudo mknod null c

创建其他目录

 mkdir proc tmp mnt sys root

编译制作jffs2映像文件的工具

 tar -xvf mtd-utils-05.07..tar.bz2
cd mtd-utils-05.07./util
make
sudo make install
//根据需要有可能要先编译zlib库

将fs_mini_mdev_new目录制作成文件系统镜像命令:

 mkfs.jffs2 -n -s  -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

在uboot中将文件系统和内核烧录进系统命令

 nfs  192.168.1.100:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 $filesize
set bootargs console=ttySAC0, root=/dev/mtdblock3 rootfstype=jffs2
//烧录内核
nfs 192.168.1.100:/work/nfs_root/uImage
7 bootm 32000000

启动系统,却报了如下的错误,这是由于我们的交叉工具链接在编译的时候是使用eabi接口的,内核也要使用这种接口才行

进入内核make menuconfig,加上EABI接口

重新烧录系统,成功进入系统没有问题。

 五、移植yaffs文件系统

下载yaffs文件系统的链接:https://yaffs.net/get-yaffs

或者使用git下载命令:

 git clone git://www.aleph1.co.uk/yaffs2

将yaffs文件系统源码安装到内核:

./patch-ker.sh c m /home/zhuang/project/-jz2440/systems/linux-3.4. 

make menuconfig选中yaffs文件系统

 编译却报了如下的错误:

 查看内核struct mtd_info的定义,并没有sync成员而是_sync,把报错的地方都加上_即可。 

将文件系统制作成yaffs2文件系统镜像

 mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2

烧录启动:

 nfs  192.168.1.100:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase.part rootfs
nand write.yaffs $filesize

 

jz2440-linux3.4.2-kernel移植【学习笔记】【原创】的更多相关文章

  1. JZ2440裸机点亮LED【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 一.我们首先来做第一个实验,用汇编语言点亮板子上的LED. 1.1 LED的原理图 从下面的原理图可知LED1是 ...

  2. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  3. kernel&uboot学习笔记

    uboot kernel uboot 1.Uboot编译流程分析: uboot是如何编译生成的? 2.根据include/configs/$(target).h可以生成include/autoconf ...

  4. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  5. Unity3D之移植学习笔记:移植到Android平台更好的方法

    接上文,之前我们采用了直接将Unity项目导出为Eclipse项目来修改的方式,这种做法存在的一个最大的问题就是:每当Unity被修改之后,都需要重新导出,而每次导出的项目在Android平台方面的J ...

  6. Zynq-Linux移植学习笔记之27UIO机制响应外部中断实现【转】

    转自:https://blog.csdn.net/zhaoxinfan/article/details/80285150 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  7. Zynq-Linux移植学习笔记之十-u-boot网络配置

    在zynq开发板zc706上,网络通路由下面三个设备组成: 其中zynq负责对phy进行配置,当zynq上的网络控制器以及phy完成正确配置时,能够看到RJ45上面的黄灯亮,此时表明链路已经通了.如果 ...

  8. Unity3D之移植学习笔记:移植到Android平台

    首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以. ...

  9. Android移植学习笔记

    1.一头雾水不知道用什么编译环境,不知道用什么下载软件 编译软件:Ubuntu12.04(编译主机系统),JDK(Java) 下载软件: 模拟器: qemu

  10. Angular源代码学习笔记-原创

    时间:2014年12月15日 14:15:10 /** * @license AngularJS v1.3.0-beta.15 * (c) 2010-2014 Google, Inc. http:// ...

随机推荐

  1. javaScript高级教程(五) Event Flow

    1.两个阶段三个模型:Netscape支持事件捕获,IE支持事件冒泡,w3c是先捕获后冒泡 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 S ...

  2. 带分数dfs+剪枝优化

    #include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>using name ...

  3. cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip

    在cocos2d-x使用中,须要不停的转换文件和压缩或解压文件.假设全人工来做,太麻烦了,且easy出错. 我如今把一些用的到批处理贴出来,供大家使用 自己主动把dat文件按数字排序重命名gz.DOS ...

  4. Jquery-plugins-toastr-消息提示

    toastr是一个基于jQuery简单.漂亮的消息提示插件,使用简单.方便,可以根据设置的超时时间自动消失. 1.使用很简单,首选引入toastr的js.css文件 html <link rel ...

  5. jQuery内部原理和实现方式浅析

    这篇文章主要介绍了jQuery内部原理和实现方式浅析,本文试图从整体来阐述一下jQuery的内部实现,需要的朋友可以参考下 这段时间在学习研究jQuery源码,受益于jQuery日益发展强大,研究jQ ...

  6. [py][mx]django邮箱注册的验证码部分-django-simple-captcha库使用

    邮箱注册-验证码 验证码使用第三方库django-simple-captcha 这个安装图形插件步骤官网有哦 - 1.Install django-simple-captcha via pip: pi ...

  7. Andrew Ng-ML-第十五章-降维

    1.数据压缩 数据压缩不仅能够减小存储空间,并且能够加速学习算法.那么什么是数据压缩呢?下面给出了一个简单的例子: 图1.数据压缩的概念 举了两个例子,一个是横轴x1是厘米,纵轴特征x2是英尺,这明显 ...

  8. rsync 常用命令

    rsync -auvrtzopgP --progress --delete --exclude-from=exclude.list SRC DST \\保留原文件属性并详细输出 删除那些DST中SRC ...

  9. Django 连接redis方法

    1. 按照redis模块 # 在cmd中 pip3 install redis 2. 测试代码 插入单挑数据 import redis conn = redis.Redis(host='10.0.0. ...

  10. ComBSTR的使用

    用 CComBSTR 进行编程 Visual Studio .NET 2003   3(共 3)对本文的评价是有帮助 - 评价此主题   ATL 类 CComBSTR 提供对 BSTR 数据类型的包装 ...