我使用的实验箱是Embest EDUKIT-III,板上资源CPU:SAMSUNG S3C2410A、FLASH:K9F5608U0(Samsung NAND 32MiB),烧录工具:embest flash programmer。因为厂家自带的是2.4的内核,目前学习开发用的基本上都是2.6内核,这两者改动还是比较大的。电话咨询过技术支持后,对方说只想在板子上跑系统的话还是比较好移植的。于是决心自己动手移植内核。不然今后的驱动编写,都没有合适的运行环境,影响进度。所以工欲善其事,必先 利其器,前期的这些准备还是很有必要的。那几天刚好ubuntu10.10发布,满怀期待的我升完级后,结果悲剧了,中文显示变得发虚模糊,主题颜色也极度不适,还有那个ubuntu one的ribbon,恶心了好几天后,也没改好,都怪自己手贱,用的好好的系统升什么级啊。最终重装了系统,结果依然不行,崩溃啊,以为是驱动的问题,后来发现是language里没有安装中文支持,我倒。重新配置了各种开发工具后,下面开始步入正题。

(一)首先是bootloader的移植,这里选择的是vivi-20030929(实验箱带的源码包),韩国人的产品,相比uboot比较简单,据说针对S3c2410做了设计。在网上参考了CalmArrow的vivi专题文章。victor_tlh的移植过程

 <1> 修改Makefile

ARCH := arm
LINUX_INCLUDE_DIR =/usr/host/arm/2.95.3/include
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS =/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
LINUX_INCLUDE_DIR -- 更改为交叉编译器的include文件夹
CROSS_COMPILE     -- 交叉编译器的可执行文件的路径
ARM_GCC_LIBS      -- 交叉编译器的lib库文件的路径
     <2> 修改arch/s3c2410/smdk.c    这一部分主要是提供flash分区的信息。

#ifdef CONFIG_S3C2410_NAND_BOOT
mtd_partition_t default_mtd_partitions[] = {
{
name: "vivi",
offset: 0,
size: 0x00020000,
//vivi size 128k
flag: 0
}, {
name: "param",
offset: 0x00020000,
size: 0x00010000,
//param size 64k
flag: 0
}, {
name: "kernel",
offset: 0x00030000,
size: 0x002d0000,
//kernel size 2m+832k
flag: 0
}, {
name: "root",
offset: 0x00300000,
size: 0x00300000,
//root size 3m
flag: MF_BONFS
}, {
name: "jffs2",
offset: 0x00600000,
size: 0x01000000,
//user size 16m
flag: MF_JFFS2
}
};
#endif

并没有使用全部的flash。

将此文件中的linux_cmd[ ]改为

char linux_cmd[] = "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0";

noinitrd:不使用initrd文件
root=/dev/mtdblock3:代表nand flash的第4个分区,作为rootfs
init=/linuxrc:启动初始化文件位置
console=ttySAC0:控制台使用串口1

这是一条传递给内核的信息,用于内核初始化。

在这个文件夹下还有一处要改就是head.s ,不然vivi启动后,蜂鸣器会叫个不停。我把代码插在了#ifdef CONFIG_S3C2410_SMDK 之后,

@@@@@@@@@@@@@@@@@@ Modified Start @@@@@@@@@@@@@@@@@@@@@

@ buzzer off
ldr r1, =0x56000010 @ GPBCON
ldr r2, =0x155559
str r2, [r1]
ldr r2, =0x7ff
str r2, [r1, #8]
orr r2, r2, #0x01 @ buzzer off when high voltage(PWM1)
str r2, [r1, #4]
@@@@@@@@@@@@@@@@@@ Modified End @@@@@@@@@@@@@@@@@@@@@@@@@

修改蜂鸣器也可以在别的地方,可以参考CalmArrow的文章。

在init/version.c 中可以添加启动提示信息,

const char *vivi_banner =
"\n\r ^_^ well done! Go on --> \n\r\n\r"
"VIVI version " VIVI_RELEASE " (" VIVI_COMPILE_BY "@"
VIVI_COMPILE_HOST ") (" VIVI_COMPILER ") " UTS_VERSION "\r\n";

<3> 接下来就是

配置交叉编译vivi ,在vivi目录下生成vivi程序。

#make distclean

#make menuconfig

#make

接下来可以烧录vivi ,重启电源后通过part show 查看分区信息。

(二) 2.6.18 内核的修改编译

1.修改MTD分区信息

修改linux-2.6.18.3/arch/arm/mach-s3c2410/common-smdk.c 文件中的分区信息,必须与开发板上的flash分区信息一致。

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {

.name = "vivi",

.size = SZ_128K,

.offset = 0,

},

[1] = {

.name = "param",

.offset = SZ_128K,

.size = SZ_64K,

},

[2] = {

.name = "kernel",

.offset = SZ_128K + SZ_64K,

.size = SZ_2M + SZ_64K * 13,

},

[3] = {

.name = "root",

.offset = SZ_1M * 3,

.size = SZ_1M * 3,

},

[4] = {

.name = "jffs2",

.offset = SZ_1M * 6,

.size = SZ_1M * 16,

}
};

2.去掉nand flash 的ECC

因为内核通过bootloader把数据写入NAND Flash,而vivi的ECC校验算法和内核不同,内核的校验码由nand flash 控制器产生,所以在此禁用NAND Flash 的ECC 。

所以修改 drivers/mtd/nand/s3c2410.c 搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里
修改NAND_ECC_SOFT为NAND_ECC_NONE。

3.修改fs/Kconfig支持启动时挂载devfs

因为2.6.12 以后的内核取消了devfs 的配置选项。缺少了它,内核找不到mtdblock设备。所以我们需要修改fs/Kconfig这个文件。

打开fs/ Kconfig文件,找到menu “Pseudo filesystem”
在其中添加:

config DEVFS_FS
bool “/dev file system support (OBSOLETE)”
default y

config DEVFS_MOUNT

bool “Automatically mount at boot”
default y

depends on DEVFS_FS

注意:bool default 与 depends前面是Table键

4.修改Makefile文件

ARCH ?=arm
CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-

5.配置内核产生.config文件
为简化配置内核文件的复杂度,先复制到arch/arm/configs/smdk2410_defconfig到内核根目录下。

#cp arch/arm/configs/smdk2410_defconfig .config

#make menuconfig

smdk2410_defconfig是内核源码中提供的一个s3c2410平台的配置信息,基本上是可以直接用的,也可以在这个配置的基础上加上自己需要的配置。

内核配置:

增删的内核配置选项如下:

Loadablemodule suport--->

[*]Enableloadable module suport

[*]Automatickernel module loading

SystemType--->[*]S3C2410 DMA suport

Bootoptions --->Default kernel command string:

noinitrdroot=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

mtdblock3代表第四个flash分区,为root分区

Floatingpoint emulation---->

[*]NWFPEmath emulation

#MTD子系统的配置

DeviceDrivers--->

Memory Technology Devices(MTD)--->

............................................

[*]MTDpartitioning support

[*]Commandline partition table parsing

............................................

[*]RAM/ROM/Flashchip drivers-->

<*>Detectflash chip by Common Flash Interface(CFI) prob

<*>Detectnon-CFI AMD/JEDEC-compatible flash chip

<*>Supportfor Intel/Sharp flash chip

<*>Supportfor AMD/Fujitsu flash chip

<*>Supportfor ROM chip in bus mapping

NAND FlashDevice Drivers--->

................................

<*>NANDDevice Support

<*>NANDFlash support foe S3C2410/S3C2440 Soc

Characterdevices--->

.............................

[*]Non-standardserial port support

[*]S3C2410RTC Driver

Filesystems--->

<>Secondextended fs support #去除ext2支持

Pseudofilesystems--->

[*]Virtualmemory file system support(former shm fs)

[*]/devfile system support(OBSOLETE)

[*]Automaticallymount at boot(NEW)

Miscellaneousfilesystems--->

............................

<*>JFFS2

<*>cramfs

.............................

NetworkFile Systems---->

<*>NFSfile system support

保存退出

6.编译内核

#make zImage

(三)根文件系统的制作

<1> 编译busybox

有人用的是busybox1.6.0的版本,我编译的时候用的是arm-linux-gcc3.4.1 没有生成busybox_unstripped,link时出错。 没有解决,看邮件列表说busybox1.8以后修正了这个bug,

试了很多版本都没有成功,后来以为是工具链的问题,因为网上用的是4.1.1的版本,于是又开始自己制作工具链,安装是gcc需要低版本,安装gcc编译出错。遂放弃了这个方法。

后来选择了,busybox1.1.3 成功。

make menuconfig
Busybox Settings >
General Configuration >
[*] Support for devfs
Build Options >
[*] Build BusyBox as a static binary (no shared libs)
/* 将busybox编译为静态连接,少了启动时找动态库的麻烦 */
[*] Do you want to build BusyBox with a Cross Compiler?
(/usr/local/arm/3.3.2/bin/armlinux)Cross Compiler prefix

Init Utilities >
[*] init
[*] Support reading an inittab file
/* 支持init读取/etc/inittab配置文件,一定要选上 */
Shells >
Choose your default shell (ash) >
/* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件
* linuxrc脚本的头一句:
* #!/bin/sh 是由bin/sh来解释执行的
*/
[*] ash
Coreutils >
[*] cp
[*] cat
[*] ls
[*] mkdir
[*] echo (basic SuSv3 version taking no options)
[*] env
[*] mv
[*] pwd
[*] rm
[*] touch
Editors >
[*] vi
Linux System Utilities >
[*] mount
[*] umount
[*] Support loopback mounts
[*] Support for the old /etc/mtab file

linux install >

[*]Don’t use /usr //这项也要选中

Networking Utilities >
[*] inetd
/*
* 支持inetd超级服务器
* inetd的配置文件为/etc/inetd.conf文件,
*/
 编译并安装Busybox
[arm@localhost busybox1.1.3]$
make TARGET_ARCH=arm

#make install

在 busybox-1.1.3/_install/目录生成需要的 bin sbin usr 目录及相关文件。

2.创建根文件系统必要的目录,编写相关的配置文件

#mkdir myrootfs

以myrootfs为目标根文件系统的根目录

#cd myrootfs

#mkdir dev etc home lib mnt proc sbin sys tmp root usr

#mkdir etc/init.d

#touch linuxrc

将编译busybox生成的usr sbin bin三个目录拷贝到myrootfs下

编写myrootfs目录下的linuxrc 脚本

#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -n -t ramfs ramfs /etc

/bin/cp -a /mnt/etc/* /etc/

echo "re-create the /etc/mtab entries"

/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /

/bin/mount -f -t ramfs ramfs /etc

/bin/cp -a /mnt/etc/* /etc/

exec /sbin/init

#chmod 775 linuxrc

进入etc目录,编辑inittab 文件

#cd etc

#vi inittab

::sysinit:/etc/init.d/rcS

::askfirst:/bin/sh

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

tty4::askfirst:-/bin/sh

tty0::askfirst:-/bin/sh

::restart:/sbin/init

::ctrlaltdel:/sbin/init

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

编辑 fstab 文件

#vi fstab

devpts                  /dev/pts                devpts mode=620        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

sysfs                   /sys                    sysfs   defaults        0 0

进入etc/init.d目录,编辑rcS 脚本

#cd init.d

#vi rcS

echo "mount tmpfs /dev"

/bin/mount -t tmpfs mdev /dev

echo "mount devpts /dev/pts"

/bin/mkdir /dev/shm

/bin/mkdir /dev/pts

/bin/mount -t devpts devpts /dev/pts

echo "mount sysfs /sys"

/bin/mount -t sysfs sysfs /sys

echo /bin/mdev > /proc/sys/kernel/hotplug

echo "mdev -s"

/bin/mdev -s

echo "yaffs is mounted"

/bin/mount -t yaffs /dev/mtdblock/4 /mnt/yaffs

/bin/mount -a

#chmod 775 rcS

在dev 下建立console 和 null设备节点

# mknod console c 5 1

#mknod null c 1 3

#chmod 660 console

#chmod 660 null

也可以将一些常用的lib文件复制到rootfs/lib/目录下,比如:ld-2.5.so libc-2.5.so libcrypt.so.1 libgcc_s.so.1 libm.so.6 ld-linux.so.3 libcrypt-2.5.so libc.so.6 libm-2.5.so等文件或符号连接,在复制时应该注意采用图形化的界面复制活打包后解包方式复制。

也可一将PC机系统中etc目录下的 passwd shadow group profile hosts services 等配置文件拷贝到myrootfs的etc目录下,将etc目录拷贝到mnt目录下,在mnt目录下建立yaffs目录

这两步我没做。

<3>生成cramfs 文件

#mkcramfs myrootfs root.cramfs

至此根文件系统做好了。

(四)将vivi zImage root.cramfs烧写到开发板

在windows下 打开超级终端,启动vivi;

这时需要对flash重新分区,分区格式为bon

vivi> bon part 0 128K 192K 3M:m 6M 22M

数字表示每个分区的偏移量,:m 表示为MTDblock,用于根文件系统。

通过vivi load命令将vivi, zImage ,rootfs.cramfs 烧写进flash中。

vivi>load flash vivi x

vivi>load flash kernel x

vivi>load flash root x

断电重启后,enter就应该可以进入shell

  期间遇到了boot kernel ... 后无反应,

  linuxrc 无法启动等问题。 整个移植过程从头到尾工作量其实并不是很大,但出错总是很讨厌。出错时,不着急,分析后google百度一下,在几将放弃之时也许就找到了解决的办法。

下一步可以将jffs2做一下,开发板上资源的驱动。

参考:

http://hi.baidu.com/victor_tlh/blog/item/8aaadaee89ea0effb2fb95ae.html
http://wenku.baidu.com/view/28125e6baf1ffc4ffe47ac2e.html
http://blog.chinaunix.net/u/21948/showart_344254.html
http://linux.chinaunix.net/techdoc/develop/2008/10/14/1038166.shtml
http://hi.baidu.com/victor_tlh/blog/item/8409b79bd6b300b1c9eaf4af.html
http://blog.chinaunix.net/u/22968/showart_336079.html
http://hi.baidu.com/kdwyc/blog/item/eef1492a3c3cfd355243c174.html
http://blog.csdn.net/JiangBo_HIT/archive/2009/05/06/4154436.aspx
http://blog.csdn.net/Linux_Hunter/archive/2009/10/03/4630961.aspx

转载于:https://www.cnblogs.com/catcher/archive/2010/10/19/1855890.html

linux2.6.18内核S3C2410平台移植笔记相关推荐

  1. 基于S3C2410平台移植Linux 2.6内核指南

    安装交叉编译工具 Ø        下载交叉编译工具 (本文默认所有软件均下载在用户主目录下) arm-linux-gcc-3.4.1 -- 编译内核 URL: ftp://ftp.handhelds ...

  2. linux2.4.18内核定时器的使用

    Linux2.4下驱动中定时器的应用 我的内核是2.4.18的.Linux的内核中定义了一个定时器的结构: #include<linux/timer.h> struct timer_lis ...

  3. MPU9250 使用 DMP 输出姿态角:DMP 库到 STM32 平台移植笔记

    本文开发环境: MCU型号:STM32F103C8T6 IDE环境: MDK 5.27 代码生成工具:STM32CubeMx 5.6.1 HAL库版本:STM32Cube_FW_F1_V1.8.0 本 ...

  4. 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植

    移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...

  5. linux内核修改工程环境,linux2.6.33内核移植s3c2410以和交叉环境编译搭建最终修改版.pdf...

    Linux2.6.33 内核移植S3C2410 以及搭建交叉编译环境 (最终修改完善版本) 作者:胡峰 整理亍2010-3-13嵌入式实验室 嵌入式助理工程师 所需软件以及工具:wmware work ...

  6. linux26内核,基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  7. 基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  8. 转载:基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  9. linux io映射,【原创】Linux 文件系统移植全解密以linux-2.6.35内核源码为例说明一下IO静态映射的过程...

    最近不断有人跟我说起静态映射的问题,今天就以linux-2.6.35内核源码为例说明一下IO静态映射的过程(ARM平台). //init/main.c asmlinkage void __init s ...

最新文章

  1. BZOJ 3781: 小B的询问 [莫队]
  2. 根据BAPI_PO_CREATE1创建采购订单
  3. hadoop SecondaryNameNode和NameNode
  4. SQLite的基本使用一
  5. Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties
  6. 面试项目亮点_程序员面试时这样介绍自己的项目经验,等于成功了一大半
  7. java扑克牌排序_扑克牌排列 运用List ArrayList Arrays
  8. Hyper-V 3 限定虚拟机可用的CPU利用率
  9. Drawbot赋能商家: 智能助手主打上新详情
  10. Java关于抽象类是否可以实例化问题
  11. SHELLEXECUTEINFO学习
  12. 谦虚的向大家问个技术问题,树型结构的排序问题
  13. 如何利用COOC软件绘制动态交互图?
  14. 弗洛伊德(floyd)算法核心代码
  15. 什么是电子表格(Spreadsheet)?
  16. 2023 目标,与君共勉
  17. 解决no matching host key type found. Their offer: ssh-rsa报错信息具体方法
  18. IntelliJ idea使用
  19. sessionStorage存储数据和取数据
  20. html5 td上下居中显示,css表格垂直居中怎么设置?

热门文章

  1. 为什么“ Hello World”是您将编写的最重要的程序
  2. DBeaver连接mysql错误:The server time zone value ‘Öйú±ê׼ʱ¼ä‘ is unrecognized or represents more than
  3. js-函数式编程总结-核心思想curry
  4. 苹果库乐队怎么玩_ios库乐队旧版本下载-苹果库乐队12版本下载1.0 免费版
  5. Bakkt机构托管业务获批;吉林省高级人民法院成全国首批加入“司法链”法院
  6. ASR平台资料 ASR1802开发测试环境搭建
  7. csgo准星设置代码_CSGO一键切换准星的设置方法
  8. PHP题库系统源码,PHP在线考试系统源码下载
  9. 因子分析(EFA)和主成分分析(PCA)学习
  10. Kotlin Flow响应式编程,操作符函数进阶