基于S3C2410X的Linux-2.6.14.1系统移植

基于S3C2410XLinux-2.6.14.1系统移植

TARGET
CPU:S3C2410X
SDRAM:HY57V561620(32MB)× 2
FLASH:K9F1208(64MB)
NET:CS8900
HOST
LinuxRealseVersion:FecoraCore6linux-2.6.18
CrossCompiler:gcc-4.1.1/arm-linux-gcc-3.4.1
一、内核移植(2.6.14.1)
下载内核2.6.14 和交叉编译工具3.4.1,详细参考这个文档:
http://www.hfrk.net/S3C2410/kaifa/05122311085973789_56.htm
1修改linux2.6.14.1下面的makefile文件
找到ARCHCROSS_COMPILE,修改
ARCH?=arm
CROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-
(此处为你交叉编译的路径)
2设置flash分区
arch/arm/machs3c2410/devs.c文件中添加头文件
#include<linux/mtd/partitions.h>
#include<linux/mtd/nand.h>
#include<asm/arch/nand.h>
然后建立分区表

staticstructmtd_partitionpartition_info[]={
{
name:"vivi", //分区名字,任意
size:0x00020000, //分区大小
offset:0x0,//分区的起始地址,相对于0x0的偏移
},{
name:"param",
size:0x00010000,
offset:0x00020000,
},{
name:"kernel",
size:0x00200000,
offset:0x000b0000,
},{
name:"root",
size:0x01e00000,
offset:0x002b0000,
},{
name:"user",
size:0x01e80000,
offset:0x020b0000,
}
};

structs3c2410_nand_setnandset={
nr_partitions:5, //分区数量
partitions:partition_info, //分区表
};

structs3c2410_platform_nandsuperlpplatform={
//NANDFlash芯片支持
//参数意义可参考S3C2410手册
tacls:0,
twrph0:30,
twrph1:0,
sets:&nandset,
nr_sets:1,
};

structplatform_devices3c_device_nand={
.name="s3c2410-nand",

.id=-1,

.num_resources=ARRAY_SIZE(s3c_nand_resource),
.resource=s3c_nand_resource,

.dev={
.platform_data=&superlpplatform
}
};
指定启动时初始化
arch/arm/machs-3c2410/mach-smdk2410.c文件
找到platform_device*smdk2410_devices[]__initdata函数,在该函数体最后
加上一条语句:
&s3c_device_nand,
禁用禁止FlashECC校验(有不同说法)
修改drivers/mtd/nand/s3c2410.c
找到chip->eccmode=NAND_ECC_SOFT;
改为chip->eccmode=NAND_ECC_NONE;
支持启动挂载devfs
修改fs/Kconfig文件
找到menu"Pseudofilesystems"添加
configDEVFS_FS
bool"/devfilesystemsupport(OBSOLETE)"
defaulty
configDEVFS_MOUNT
bool"Automaticallymountatboot"
defaulty
dependsonDEVFS_FS
3Yaffs2文件系统支持
详细请看这个贴:http://www.hfrk.net/S3C2410/kaifa/061400335345164_30.htm
为了让开发板可以使用可读可写的文件系统,进行yaffs移植,首下载
yaffs2.tar.gz源码包,解压源码,并进入目录执行
#./patch-ker.shc/linux-2.6.14.1/ (注:假定内核源码/linux-2.6.14.1/)
编译内核,makemenuconfig
filesystem中的
Miscellaneousfilesystems --->里面的yaffs选项如下进行选择
<*>YAFFS2filesystemsupport
-*- 512byte/pagedevices
[] Useolder-styleon-NANDdataformatwith
pageStatusbyte
[*] LetsYaffsdoitsownECC
[*] UsethesameeccbyteorderasStevenHill's
nand_ecc.c
-*- 2048byte(orlarger)/pagedevices
[*] Autoselectyaffs2format
[*] Disablelazyloading
[*] Turnoffwidetnodes
[*] Forcechunkerasecheck
[*] CacheshortnamesinRAM
最主要是选这个LetsYaffsdoitsownECC,没选就会有n多的错误。
这样yaffs就移植成功了,把/driver/mtd/nand/nand_base.c里面的
printk(KERN_WARNING"WritingdatawithoutECCtoNAND-FLASHisnot
recommended/n")
printk(KERN_WARNING"ReadingdatafromNANDFLASHwithoutECCisnot
recommended/n");
这两句话注释掉,不注释的话那个ECC警告会烦死人的。
4编译配置内核
首先需要load一个默认的内核
#cp/linux-2.6.14.1/arch/arm/configs/s3c2410_defconfig/linux-2.6.14.1/.config,
在这个配置文件上改
Loadablemodulesupport>
[*]Enableloadablemodulesupport
[*]Automatickernelmoduleloading
SystemType>
[*]S3C2410DMAsupport
Bootoptions>
Defaultkernelcommandstring:
noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0,115200
Floatingpointemulation>
[*]NWFPEmathemulation
DeviceDrivers>
MemoryTechnologyDevices(MTD)>
[*]MTDpartitioningsupport
#支持MTD分区,这样我们在前面设置的分区才有意义
[*]Commandlinepartitiontableparsing
#支持从命令行设置flash分区信息,灵活
RAM/ROM/Flashchipdrivers>
<*>DetectflashchipsbyCommonFlashInterface(CFI)probe
<*>DetectnonCFIAMD/JEDECcompatibleflashchips
<*>SupportforIntel/Sharpflashchips
<*>SupportforAMD/Fujitsuflashchips
<*>SupportforROMchipsinbusmapping
NANDFlashDeviceDrivers>
<*>NANDDeviceSupport
<*>NANDFlashsupportforS3C2410/S3C2440SoC
Characterdevices>
[*]Nonstandardserialportsupport
[*]S3C2410RTCDriver
Filesystems>
<>Secondextendedfssupport#去除对ext2的支持
Pseudofilesystems>
[*]/devfilesystemsupport(OBSOLETE)
[*]Automaticallymountatboot(NEW)
[*]/procfilesystemsupport
[*]Virtualmemoryfilesystemsupport(formershmfs)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneousfilesystems>
<*>YAFFS2filesystemsupport#支持yaffs2
<*>CompressedROMfilesystemsupport(cramfs)#支持cramfs
NetworkFileSystems>
<*>NFSfilesystemsupport
然后就可以Make了。编译完成后在arch/arm/boot下会有一个zImage。这
样就有了个最最基本的内核,已经是可以启动的。
二、LCD驱动移植
1arch/arm/mach-s3c2410/mach-smdk2410.c中添加
//lcd
#include<asm/arch/regs-lcd.h>
#include<asm/arch-s3c2410/fb.h>
//-------------------------------------------lcd
staticstructs3c2410fb_mach_infos3c2410_lcd_info__initdata={
.fixed_syncs=0,
.regs={
//对于寄存器的设置是关键,可参考S3C2410X的手册
//LCD技术手册中对于LCD技术指标的描述来进行设置。
//其中,寄存器值的宏定义在regs-lcd.h文件中。

.lcdcon1=S3C2410_LCDCON1_TFT16BPP
|S3C2410_LCDCON1_TFT|S3C2410_LCDCON1_CLKVAL(1),
.lcdcon2=S3C2410_LCDCON2_VBPD(1)
|S3C2410_LCDCON2_VFPD(2)|S3C2410_LCDCON2_VSPW(1),
.lcdcon3=S3C2410_LCDCON3_HBPD(6)
|S3C2410_LCDCON3_HFPD(2),
.lcdcon4=S3C2410_LCDCON4_MVAL(13)
|S3C2410_LCDCON4_HSPW(4),
.lcdcon5=S3C2410_LCDCON5_FRM565
|S3C2410_LCDCON5_INVVLINE|S3C2410_LCDCON5_HWSWP
|S3C2410_LCDCON5_PWREN|S3C2410_LCDCON5_INVVFRAME,
},
.lpcsel=0x0,
.gpccon=0xaaaaaaaa,
.gpccon_mask=0xffffffff,
.gpcup=0xffffffff,
.gpcup_mask=0xffffffff,
.gpdcon=0xaaaaaaaa,
.gpdcon_mask=0x0,
.gpdup=0xffffffff,
.gpdup_mask=0xffffffff,
.width=640,
.height=480,
.xres={640,640,640},
.yres={480,480,480},
.bpp={16,16,16},
};
staticvoid__initsmdk2410_lcd_init(void)
{
set_s3c2410fb_info(&s3c2410_lcd_info);
}
2在文件最后MACHINE_END之前添加
.init_machine=smdk2410_lcd_init
3编译内核,选中所装驱动
#makemenuconfig
DeviceDrivers>
Graphicssupport--->
<*>supportforframebufferdevices
<*>S3C2410LCDframebuffersupport
Logoconfiguration--->//开机画面的选择,可据个人需要更改
[*]Bootuplogo
[*]Standard224-colorlinuxlogo
4开机画面的选择
首先把要开机Logo图片(png格式)放在linux2.6.14文件中的
drivers/video/logo中,终端选择进入drivers/video/logo目录,进行以下操作:
(假设开机图片名为linux.png)
#pngtopnmlinux.png>linuxlogo.pnm
#pnmquant224linuxlogo.pnm>linuxlogo224.pnm
#pnmtoplainpnmlinuxlogo224.pnm>linuxlogo224.ppm
#mvlinuxlogo224.ppmlogo_linux_clut224.ppm//替换原来的启动文件
三、根文件系统制作(Busybox1.9.2)
1建一个目录myfs用来装文件系统
2#mkdirbindevetchomelibmntprocrootsbintmpusrvar
#mkdirusr/binusr/sbin
#mkdirmnttmpvar
#chmod1777tmp
#mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
#mkdirvar/libvar/lockvar/logvar/runvar/tmp
#chmod1777var/tmp
#mkdirhomerootboot
3到系统/dev把所有的device打一个包,拷贝到dev下面(最省事的做法);
或者使用mknod来自己建所需要的device,
举例:
#mknod-m600dev/consolec51
#mknod-m666dev/nullc13
4应用程序定制
标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用
的空间也很大,这对存储容量空间有限的开发板来说就不是理想的选择,在嵌入
式开发过程中,经常用BusyBox来定制应用程序。BusyBox具有shell的功能,它
能提供系统所需要的大部分工具,包括编辑工具、网络工具、模块加载工具、压
缩解压缩工具、查找工具、帐号密码管理工具和进程相关工具等。
目前BusyBox的最新版本是BusyBox-1.9.2版本,下载解压,切换到BusyBox
的根目录下,修改Makefile,找到ARCHCROSSCOMPILE修改如下:
ARCH?=arm
CROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-
5修改编译配置选项。
#makedefconfig
#makemenuconfig
在默认的选项前提之下,选项设置如下:
BusyBoxSettings--->
BuildOptions--->(采用静态编译)
[*]BuildBusyBoxasastaticbinary(nosharedlibs)
注意,启用这个选项的时候,要把/busybox-1.9.2/applets/applets.c中的
一段话注释掉,就是下面那段

Installoptin-->
[*]Don'tuse/usr//可以不选,选了则没有/usr文件夹
BusyboxLibraryTuning--->
(2)MD5:TradeBytesforSpeed
[*]Faster/procscanningcode(+100bytes)
[*]Supportfor/etc/networks
[*]Additionaleditingkeys
[*]vi-stylelineeditingcommands
[*]Historysaving
[*]Tabcompletion
[*]Usernamecompletion
[*]Fancyshellprompts
LinuxModuleUtilities--->
[]Supportversion2.2.xto2.4.xLinuxkernels//不能选
[*]Supportversion2.6.xLinuxkernels
LinuxSystemUtilities--->
[*]Supportfortheold/etc/mtabfile//不确定
MiscellaneousUtilities--->
[*]devfs(obsolete)//不确定
[*]Usedevfsnamesforalldevice(obsolete)//不确定
Shell--->
Chooseyourdefaultshell(ash)-->
---ash//下面的选项全部选择
6编译busybox
makeinstall
busybox/_install目录下会生成我们需要的文件。
busybox1.9.2/_install里面的全部文件拷贝到该目录,注意用命令拷,
#cp–abusybox1.9.2/_install/*/myfs
否则一些软链接可能会出错,或者权限方面会出问题
修改_install/bin/busybox的属性。为4755
#chmod4755./_install/bin/busybox
必须要修改属性,否则在busybox中很多命令会受限。
将编译好的busybox拷贝到/bin下面。拷贝时带上参数-arf或者-dpR
除了busybox外,所有其他的命令都是他的link
/sbin下面也是busyboxlink
7非常重要之/lib,务必重视
/lib的库其实就是进行busybox编译的库,即交叉编译器的库,我们这里使用的
3.4.1(位置/usr/local/arm/3.4.1)
# cd /usr/local/arm/3.4.1/arm-linux/lib
# for file in libc libcrypt libdl libm libpthread libresolv libutil
> do
> cp $file-*.so rootfs/lib (复制到你做的文件系统的/lib目录下)
> cp -d $file.so.[*0-9] rootfs/lib
> done
# cp -d ld*.so* rootfs/lib
8系统配置文件的建立
系统配置文件放在/etc目录下
(1)profile文件
#Setsearchlibrarypath
exportLD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
#Setuserpath
PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH
aliasll='ls-l'
#SetPS1USER=”`id–un`”
LOGNAME=$USER
PS1=’[/u@/h/W]/$’
PATH=$PATH
exportUSERLOGNAMEPS1PATH
(2)fstab文件
proc/procprocdefaults00
none/tmpramfsdefaults00
mdev/devramfsdefaults00
sysfs/syssysfsdefaults00
(3)inittab文件
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/bin/umount-a-r
::shutdown:/bin/umount-a-r
::shutdown:/sbin/swapoff-a
(4)创建/etc/init.d文件夹和rcS,在rcS中添加
#!/bin/sh
#设置主机名,需要在etc建立文件host
./etc/host
hostname${HOSTNAME}
#mountallfilesystemdefinedin“fstab”
echo"#mountall..........."
/bin/mount-a
echo"#Startingmdev........."
/bin/echo/sbin/mdev>/proc/sys/kernel/hotplug
mdev–s
(5)host文件
HOSTNAME=Hasotech
(6)创建mdev.conf文件(空文件)
(7)复制主机/etc/下面的文件passwd,group,shadow文件到/etc
#cp/etc/group.
#cp/etc/passwd.
#cp/etc/shadow.
修改passwd中用户使用的shell名称。FC6上默认的为bash,vivi只支持
ash
root:x:0:0:root:/root:/bin/bash-->
root:x:0:0:root:/root:/bin/ash
(8)修改各文件和文件夹的权限
#chmod755/rootfs/etc/init.d/rcS
#chmod755/rootfs/etc/host
9cramfs文件系统映像的制作(cramfs压缩率比较高)
FTP中下载cramfs-1.1.tar.gz,解压到自己设定的目录下,如:
tarxzvfcramfs-1.1.tar.gz–C/home/
进入生成有mkcramfs文件的目录下(一定要进入此目录,否则会提示找不到该命
令)
输入命令:#./mkcramfs/rootfsrootfs.cramfs
在当前目录下即生成rootfs.cramfs映像文件。到此Linux操作系统移植完
毕。
10yaffs文件系统映像文件的制作
使用mkyaffsimg程序可以把一个目录做成一个yaffs映像文件,然后使用usb
下载到
板子上。进入文件系统目录层,使用以下命令。
#mkyaffsimgrootfsrootfs.img
这样就会在该目录下生成rootfs.img映像文件,下载到开发板运行即可。
PSvivi设置
1SBC2410xVIVI已经被友善之臂自动加入了USB功能,这个小功能省去了我们
很多麻烦。所以建议大家先把板子的USB驱动装上。
重新分区
分区名称分区大小
vivi 128k
param 64k
kernel 2M
root 30M
user 30M+512k
vivi命令行下输入如下命令
partshow
然后输入: partdel<name>
参数name为各个显示分区的名字,一直到把所有分区都删除为止,然后依次
输入:
partaddvivi0x00x000200000
partaddparam0x000200000x000100000
partaddkernel0x000b00000x002000000
partaddroot0x002b00000x01e000000
partadduser0x020b00000x01e800000
partsave
现在分区就已经完毕了。
vivi的分区一定要与内核里的分区设置一致,即与
arch/arm/machs3c2410/devs.cstaticstructmtd_partition
partition_info[]分区一致,至少是kernel后的地址一致,这个需特别注意。
2设置启动参数
执行: paramshow
就可以见到你现在的所有VIVI参数,其中linuxcommandline为传递给linux
内核
的启动参数。因2.42.6在参数方面有变动,所以输入如下命令:
paramsetlinux_cmd_line“noinitrdroot=/dev/mtdblock3init=/linuxrc
console=ttySAC0,115200”
paramsave
网卡安装
14的网卡和24的有差别,注意别用错了。
1.cs8900.ccs8900.h放到/drivers/net/arm/
2.cs8900.c中的cs8900_probe()函数中,memset(&priv,0,sizeof
(cs8900_t));函数之后添加如下两条语句:
__raw_writel(0x2211d110,S3C2410_BWSCON);
__raw_writel(0x1f7c,S3C2410_BANKCON3);
添加头文件#include<asm/arch/regs-mem.h>
3.修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:
configARM_CS8900
tristate"CS8900support"
dependsonNET_ETHERNET&&ARM&&ARCH_SMDK2410
help
4.修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_ARM_CS8900) +=cs8900.o
5. /arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到
smdk2410_iodesc[]结构数组,添加如下如下内容:{vSMDK2410_ETH_IO,
0x19000000,SZ_1M,MT_DEVICE}
添加头文件#inlcude<asm/arch/smdk2410.h> 其实这个就是下面的
那个头文件的链接/include/asm-arm/arch-s3c2410/smdk2410.h
6.include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容
为:
#ifndef_INCLUDE_SMDK2410_H_
#define_INCLUDE_SMDK2410_H_
#include
#definepSMDK2410_ETH_IO 0x19000000
#definevSMDK2410_ETH_IO 0xE0000000
#defineSMDK2410_ETH_IRQ IRQ_EINT9
#endif//_INCLUDE_SMDK2410_H_
7.编译内核,选中所装驱动
#makemenuconfig
Networkingsupport --->
Ethernet(10or100Mbit) --->
[*] CS8900support
然后内核make即可
衷心感谢所有对本文有所帮助的人。本文仅供交流,无意侵权
特别感谢
1 kenn LarryChan 阿牛哥()
2 Jisong 裴智松大连东软信息学院QQ: 165179274
3 最深的蓝王奇锋
4 Kevin 随风Email: zhang8083@163.com QQ: 21744485
http://blog.chinaunix.net/u2/63560/showart_511924.html
http://blog.chinaunix.net/u2/63560/showart_518011.html.
5 jiuzhuaxiong
http://blog.chinaunix.net/u2/63379/showart_515773.html
http://dev.21tx.com/2007/09/29/10920.html
6 linux_mig_release.pdf

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值