S3C2440 移植最新5.2linux内核
基于 移植uboot后.
1. 移植linux内核
1.1 下载源码
打开 https://www.kernel.org/ 直接肝最新的 5.2.8
下载完后,在ubuntu里解压备用.
1.2 搭建交叉编译环境
. 交叉编译环境用的是arm-linux-gcc 4.6.4的版本,这个版本挺好找的,在网上下载压缩包后,根据个人习惯解压到
/opt/ 下, . 并且修改环境变量
sudo vim /etc/profile
export PATH=/opt/gcc-4.6./bin:$PATH . 保存,然后source /etc/profile 进行更新.稳妥起见,ubuntu要注销一下,重新登录. . 确定:在窗口输入arm-linux-gcc -v 显示的是你的编译环境就可以啦.
注:是可以多版本gcc编译器 " 伪共存 " 的,我这里就是gcc 3.4 的也有一份, 需要的时候,把环境变量注释一下留下需要的版本就好了.我觉得这样很方便.
1.3 修改时钟频率和mtd分区
s3c2440 支持2中时钟晶振:12MHz 和 16MHz,我这个板子上用的是12MHz,
所以修改 arch/arm/mach-s3c2440/mach-smdk2440.c s3c24xx_init_clocks();
改为:
s3c24xx_init_clocks();
修改nand 分区
arch/arm/mach-s3c24xx/common-smdk.c static struct mtd_partition smdk_default_nand_part[] = {
[] = {
.name = "uboot",
.size = SZ_256K,
.offset = ,
},
[] = {
.name = "env",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = SZ_8M,
},
[] = {
.name = "appfs",
.offset = MTDPART_OFS_APPEND,
.size = SZ_8M,
},
}; //可自行修改,注因为内核编译完有3.4M,所以降kernel的分区改成了4M,根文件系统用的是jffs2,填充成了8M大小,所以这里是8M
1.4 配置linux内核
, 修改Makefile 搜索ARCH ,找到
ARCH ?= $(SUBARCH)
注释掉改成 ARCH ?= arm //因为要编译arm架构体系的. 这一步是代替编译的时候, make V=s ARCH=arm . 在下一行直接添加 交叉编译链
CROSS_COMPILE ?= arm-linux-
ok. 这样子,make menuconfig 就是arm架构的了.
. make menuconfig 这里我用的因为是s3c2440 的soc, 所以 选择最接近的s3c2410的模板来进行修改.
怎么查看有没有适合自己的呢?
这些config文件在: [ ./arch/arm/config/ ]下
使用: 在linux内核根目录下,执行 . make s3c2410_defconfig 就可以自动进行拷贝和更新.
. 然后make menuconfig 进行微调
. 保存: make savedefconfig 进行配置保存,
. 存档: cp davedefconfig /arch/arm/config/你想保存的型号, 我这里是s3c2440_defconfig make s3c2410_defconfig
make menuconfig
make savedefconfig
cp davedefconfig /arch/arm/config/s3c2440_defconfig
言归正传,怎么配置内核,make menuconfig 开头显示当前的交叉编译链, 如果没有配置交叉编译环境的话,当前的环境就是ubuntu的环境.
然后怎么配置:太繁琐了,附上网上的教程.
[https://blog.csdn.net/tk01044242_1/article/details/78815816]
1.5 制作uImage
make V=s 先编译看是否出错. 这里我先前编译未能通过,原因是用了3.+的gcc, 后来改成了新的编译器(4.6.)就没有再报错. 新的内核还是用新的编译器,就得内核用旧的编译器这是道理. 制作uImage
make V=s uImage
后面报错: OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
arch/arm/boot/Makefile:: recipe for target 'arch/arm/boot/uImage' failed
make[]: *** [arch/arm/boot/uImage] Error
arch/arm/Makefile:: recipe for target 'uImage' failed
make: *** [uImage] Error //可以看到,zImage是编译完成了,但是说mkimage命令不支持, 所以uImage没有生成成功 把uboot源码文件夹中的mkimage(可执行文件) 拷贝到/sys/local/bin中,这样编译器就能支持给iamge添加64k的uboot头信息.形成uImage.这个文件去下一个uboot源码中获得. 最后生成的uImage 在 /arch/arm/boot中.
不出意外的话,内核就编译完成了.
1.6 烧录测试
我用的是tftp的方式 .
我的内核是3.4M, 按4M的空间来算,就是 0x400000
所以 tftp 0x30000000 uImage //这里的0x30000000 是三星内存的起始地址,临时的一个空间,掉电后就会消失,所以下一步就是要把这个固件 写入到不会丢失的nand flash中. 当然,这个时候,bootm 0x30000000 是可以直接启动内核的,只是掉电丢失. nand flash 写入的规则是,写入前要擦除.所以 nand erase 0x60000 0x400000 //为什么是0x60000 呢, 由下:
我的uboot环境是:
// mtdparts=nandflash0:256k@0(bootloader),128k(params),4m(kernel),-(root)
可知,+128k = 384k * = = 0x60000 ,所以前面2个空间占据了[~ 0x60000]的空间,因此,内核空间从0x60000开始.
0x400000 则是有uImage镜像大小决定,取大取整就好. 然后 我原本以为是 nand write 0x30000000 0x60000 0x400000 ,这样做的时候, uboot确实校验到头部信息了,但是总是 整个内核crc失败.不知道为什么.
在百度的时候,无意间看到: nand write.jffs2 0x30000000 0x60000 0x400000 ,居然就可以了...
可见差别在 nand write 和 nand write.jffs2上.
//1. 用tftp 将uImage 拷贝到临时内存中
tftp 0x30000000 uImage //2. 擦除nand flash中 属于kernel的区域
nand erase 0x60000 0x400000 //3. 将uImage 写入到nand flash
nand write.jffs2 0x30000000 0x60000 0x400000 //4.运行的时候,要将固件搬运到内存中运行
nand read.jffs2 0x30007fc0 0x60000 0x400000 //5.从内核处启动:
bootm 0x30007fc0
因为我的uboot参数是
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 所以我将nand flash中的内核,读到内存 0x30007FC0后 ,从这个地方开始执行内核的第一条,是核对uboot加入的64K的头部信息 bytes read: OK
## Booting image at 30007fc0 ...
Image Name: Linux-5.2.
Created: -- :: UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: Bytes = 3.3 MB
Load Address:
Entry Point:
Verifying Checksum ... OK
XIP Kernel Image ... OK 这里,如果写入方式[write.jffs2]正确的话,就会通过crc校验,否则就是crc error.
如果因为启动地址和搬运地址不匹配,未能识别到64K的uboot头, 会显示magic number err.
执行到后面,会提示panic 内核崩溃,因为我们文件系统还没做,所以会提示错误.
内核部分已经完成.
下一篇介绍 文件系统 的制作, 让系统真正跑起来.
.
S3C2440 移植最新5.2linux内核的更多相关文章
- 移植Linux-3.4.2内核到S3C2440
一.BootLoader引导内核过程 1.Bootloader的工作 1.1.将内核读入内存 2.2.保存内核启动参数到指定位置,内核启动时去这个位置解析参数 3.3. ...
- 向tiny6410中移植中移植linux-4.5.1内核(最新)
下载linux-4.5.1.tar.gz 解压在任意目录下.我解压在/home/tiny6410/ # tar xvzf linux-4.5.1.tar.gz # cd linux-4.5.1/ 修改 ...
- 2.2linux内核移植简介
1,编译linux3.5出错 root@phone-desktop:/opt/FriendlyARM/tiny4412/Linux/linux-3.5# makescripts/kconfig/con ...
- (嵌入式开发)移植最新uboot
一:准备移植 1.从下面的官网下载最新的U-boot.用google英文版搜索最新的u-boot源码 ftp://ftp.denx.de/pub/u-boot/ 2.建立sourceinsight工 ...
- 从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver【转】
转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...
- ubuntu最近升级到最新的linux内核后,网络无法使用怎么办?
答:进入旧的内核中编译需要的网卡模块 1. 启动旧的内核进入系统 2. 安装新内核源码 3. 找出当前的网卡型号 4. 尝试卸载某个与网卡相关的内核模块,观察是否影响当前网卡的使用,如果有影响,那么便 ...
- 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使 ...
- s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...
- 移植最新u-boot(裁剪和修改默认参数)之韦东山笔记
1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 make ...
随机推荐
- 基于go语言结合微信小程序开发的微商城系统
最近在慕课网上录制了一门<Golang微信小程序微商城系统原型>,这门免费课程特别适合在校大学生或者刚毕业的大学生,go语言初学者以及想要从事微商城开发项目入门的小伙伴们来学习.在课程当中 ...
- webpack-dev-server 小记 原理介绍 概念解读
使用 DevServer 提供 HTTP 服务而不是使用本地文件预览 监听文件的变化并自动刷新网页,做到实时预览 支持 Source Map,以方便调试 对于这些,Webpack 都为我们考虑好了.W ...
- 剑指offer第二版-5.替换空格
面试题5:替换空格 题目要求: 实现一个函数,把字符串中的每个空格都替换成“%20”,已知原位置后面有足够的空余位置,要求改替换过程发生在原来的位置上. 思路: 首先遍历字符串求出串中空格的数量,求出 ...
- kafka介绍及安装配置(windows)
Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...
- python实现DFA模拟程序(附java实现代码)
DFA(确定的有穷自动机) 一个确定的有穷自动机M是一个五元组: M=(K,∑,f,S,Z) K是一个有穷集,它的每个元素称为一个状态. ∑是一个有穷字母表,它的每一个元素称为一个输入符号,所以也陈∑ ...
- cozmo 入坑日记及开发环境搭建
前几日,朋友在群里发了一个机器人的小视频,视频里机器人可以对话,可以推箱子,开心以后会哈哈大笑,非常有趣. 详细了解里一下,这是个叫 cozmo 的智能机器人,可以配合 SDK 用 python 编程 ...
- 五分钟了解Zabbix
Zabbix-简介 Zabbix概念 Zabbix组成 Server Zabbix server 是 Zabbix agent 向其报告可用性.系统完整性信息和统计信息的核心组件.是存储所有配置信息. ...
- Python常用的标准库以及第三方库
Python常用的标准库以及第三方库有哪些? 20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们 ...
- fjnuoj 1003 学长的QQ号
题目: //QQ是一个9位数,由1,2,3,4,5,9组成,且第1.6位数字相同,第2.4位数字相同,第5.7位数字相同. //我的QQ就在符合上诉条件中的所有9位数从小到大排第 ...
- [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
原题 题意: 根据先序和中序得到二叉树(假设无重复数字) 思路: 先手写一次转换过程,得到思路. 即从先序中遍历每个元素,(创建一个全局索引,指向当前遍历到的元素)在中序中找到该元素作为当前的root ...