linux367移植至ok6410Word文档下载推荐.docx
《linux367移植至ok6410Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《linux367移植至ok6410Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
保存退出。
4、由于机器码ID必须和uboot的ID一致,所修改arch/arm/tools/mach-types文件,这里的作用是使我们的uboot能够识别我们移植的内核,如果不修改,即使内核被下载到正确的地址,但是uboot不能找到内核,从而会出现内核启动不了的问题。
smdk6410
MACH_SMDK6410
SMDK6410
1626
把它改成
ok6410
MACH_OK6410
OK6410
保存退出
5、修改mach-ok6410.c
5.1把文件中所有的mini6410改成ok6410,但是在MACHINE_START后面括号里的参数需要改成大写的OK,即MACHINE_START(OK6410,"
),因为这里跟我们前面配置的Kconfig和mach-types文件中的名字对应,**大小写注意必须一致
。
5.2
修改staticstructmtd_partitionok6410_nand_part
/*
[0]={
.name="
uboot"
.size=SZ_1M,
.offset=0,
},
[1]={
kernel"
.size=SZ_2M,
.offset=SZ_1M,
[2]={
rootfs"
.size=MTDPART_SIZ_FULL,
.offset=SZ_1M+SZ_2M,
},*/
改为
{
Bootloader"
.size=(2*SZ_1M),
.mask_flags=MTD_CAP_NANDFLASH,
Kernel"
.offset=(2*SZ_1M),
.size=(5*SZ_1M),
FileSystem"
.offset=(7*SZ_1M),
.size=(200*SZ_1M),
User"
.offset=MTDPART_OFS_APPEND,
}
6、当前makefile中添加我们的mach-ok6410.c
obj-$(CONFIG_MACH_OK6410)
+=
mach-ok6410.o
7、修改顶层的makefile
ARCH?
=arm
***************这里禁止在arm后出现空格或其它符号
CROSS_COMPILE?
=/usr/local/arm/4.3.2/bin/arm-linux-
********你的交叉编译器的路径
8、将arch/arm/configs/s3c6400-defconfig配置文件复制到顶层然后保存为
.config
因为只有这个配置文件与我们的最相近。
9、makemenuconfig
配置如下:
9.1先选择LoadanAlternateConfigurationFile,输入arch/arm/configs/s3c6400_defconfig
9.2选择GeneralSetup,打开Cross_compilertoolperfix,输入
/usr/local/arm/4.5.1/bin/arm-linux-
9.3选择SystemType,取消SMDK6400,A&
W6410,SMDK6410等平台,只选择OK6410
9.4选择SaveanAlternateConfigurationFile,保存为.config然后退出。
10、移植nand驱动
10.1、从开发板厂家提供的源码中找到s3c_nand.c,放到drivers/mtd/nand目录下,修改其Makefile,加入:
obj-$(CONFIG_MTD_NAND_S3C)
+=s3c_nand.o
修改Kconfig,为了和原来的NAND驱动区分开来,我把新加的驱动叫S3C64xxS5P64xx,原来的叫做S3C24xxS3C64xx.修改的地方如下:
并加入:
configMTD_NAND_S3C
tristate"
NANDsupportforSamsungS3C64xxS5P64xx"
dependson(ARCH_S3C64XX||ARCH_S5P64XX||ARCH_S5PC1XX)&
&
MTD_NAND
help
ThisenablestheNANDflashcontrollerontheS3C
Noboardspecificsupportisdonebythisdriver,eachboard
mustadvertiseaplatform_deviceforthedrivertoattach.
configMTD_NAND_S3C_DEBUG
bool"
SamsungS3C64xxS5P64xxNANDdriverdebug"
dependsonMTD_NAND_S3C
EnabledebuggingoftheS3CNANDdriver
configMTD_NAND_S3C_HWECC
SamsungS3C64xxS5P64xxNANDHardwareECC8BITS"
EnabletheuseoftheS3C'
sinternalECCgeneratorwhen
usingNAND.Earlyversionsofthechiphavehadproblemswith
incorrectECCgeneration,andifusingthese,thedefaultof
softwareECCispreferable.
IfyoulaydownadevicewiththehardwareECC,thenyouwill
currentlynotbeabletoswitchtosoftware,asthereisno
implementationforECCmethodusedbytheS3C
10.2、arch/arm/plat-samsung/include/plat/regs_nand.h加入寄存器定义:
#defineS3C_NFCONFS3C2410_NFREG(0x00)
#defineS3C_NFCONTS3C2410_NFREG(0x04)
#defineS3C_NFCMMDS3C2410_NFREG(0x08)
#defineS3C_NFADDRS3C2410_NFREG(0x0c)
#defineS3C_NFDATA8S3C2410_NFREG(0x10)
#defineS3C_NFDATAS3C2410_NFREG(0x10)
#defineS3C_NFMECCDATA0S3C2410_NFREG(0x14)
#defineS3C_NFMECCDATA1S3C2410_NFREG(0x18)
#defineS3C_NFSECCDATAS3C2410_NFREG(0x1c)
#defineS3C_NFSBLKS3C2410_NFREG(0x20)
#defineS3C_NFEBLKS3C2410_NFREG(0x24)
#defineS3C_NFSTATS3C2410_NFREG(0x28)
#defineS3C_NFMECCERR0S3C2410_NFREG(0x2c)
#defineS3C_NFMECCERR1S3C2410_NFREG(0x30)
#defineS3C_NFMECC0S3C2410_NFREG(0x34)
#defineS3C_NFMECC1S3C2410_NFREG(0x38)
#defineS3C_NFSECCS3C2410_NFREG(0x3c)
#defineS3C_NFMLCBITPTS3C2410_NFREG(0x40)
#defineS3C_NF8ECCERR0S3C2410_NFREG(0x44)
#defineS3C_NF8ECCERR1S3C2410_NFREG(0x48)
#defineS3C_NF8ECCERR2S3C2410_NFREG(0x4c)
#defineS3C_NFM8ECC0S3C2410_NFREG(0x50)
#defineS3C_NFM8ECC1S3C2410_NFREG(0x54)
#defineS3C_NFM8ECC2S3C2410_NFREG(0x58)
#defineS3C_NFM8ECC3S3C2410_NFREG(0x5c)
#defineS3C_NFMLC8BITPT0S3C2410_NFREG(0x60)
#defineS3C_NFMLC8BITPT1S3C2410_NFREG(0x64)
#defineS3C_NFCONF_NANDBOOT(1<
<
31)
#defineS3C_NFCONF_ECCCLKCON(1<
30)
#defineS3C_NFCONF_ECC_MLC(1<
24)
#defineS3C_NFCONF_ECC_1BIT(0<
23)
#defineS3C_NFCONF_ECC_4BIT(2<
#defineS3C_NFCONF_ECC_8BIT(1<
#defineS3C_NFCONF_TACLS(x)((x)<
12)
#defineS3C_NFCONF_TWRPH0(x)((x)<
8)
#defineS3C_NFCONF_TWRPH1(x)((x)<
4)
#defineS3C_NFCONF_ADVFLASH(1<
3)
#defineS3C_NFCONF_PAGESIZE(1<
2)
#defineS3C_NFCONF_ADDRCYCLE(1<
1)
#defineS3C_NFCONF_BUSWIDTH(1<
0)
#defineS3C_NFCONT_ECC_ENC(1<
18)
#defineS3C_NFCONT_LOCKTGHT(1<
17)
#defineS3C_NFCONT_LOCKSOFT(1<
16)
#defineS3C_NFCONT_MECCLOCK(1<
7)
#defineS3C_NFCONT_SECCLOCK(1<
6)
#defineS3C_NFCONT_INITMECC(1<
5)
#defineS3C_NFCONT_INITSECC(1<
#defineS3C_NFCONT_nFCE1(1<
#defineS3C_NFCONT_nFCE0(1<
#defineS3C_NFCONT_INITECC(S3C_NFCONT_INITSECC|S3C_NFCONT_INITMECC)
#defineS3C_NFSTAT_ECCENCDONE(1<
#defineS3C_NFSTAT_ECCDECDONE(1<
#defineS3C_NFSTAT_BUSY(1<
#defineS3C_NFECCERR0_ECCBUSY(1<
10.3、
修改drivers/mtd/nand/nand_base.c文件,加入
staticstructnand_ecclayoutnand_oob_218={
.eccbytes=104,
.eccpos={
24,25,26,27,28,29,30,31,32,33,
34,35,36,37,38,39,40,41,42,43,
44,45,46,47,48,49,50,51,52,53,
54,55,56,57,58,59,60,61,62,63,
64,65,66,67,68,69,70,71,72,73,
74,75,76,77,78,79,80,81,82,83,
84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,
104,105,106,107,108,109,110,111,112,113,
114,115,116,117,118,119,120,121,122,123,
124,125,126,127},
.oobfree=
{.offset=2,
.length=22
};
再找到intnand_scan_tail(structmtd_info*mtd)这个函数,在switch(mtd->
oobsize)里面加入
case218:
chip->
ecc.layout=&
nand_oob_218;
break;
找到if(!
ecc.strength){
pr_warn("
Drivermustsetecc.strengthwhenusinghardwareECC\n"
);
BUG();
}把BUG();
屏蔽掉
10.4、主目录下makemenuconfig:
找到DeviceDrivers-->
MemoryTechnologyDevice(MTD)support--->
NANDDeviceSupport--->
取消NANDsupportforSamsungS3C24xxS3C64xx,选择NANDsupportforSamsungS3C64xxS5P64xx
注意:
1、编译的时候会报错,显示add_mtd_partitions没有声明,根linux3.0.1相对比,在linux/mtd/partition.h中需要加入函数的声明:
intadd_mtd_partitions(structmtd_info*,conststructmtd_partition*,int);
intdel_mtd_partitions(structmtd_info*);
2、此时理论上nand驱动已经移植好了,但是本人在编译好内核的时候下载到板子上,nand驱动根本没有加载成功。
注意到dev_ID=38,查找这个nand的id,发现nand_ids.c根本没有这个id的定义。
说明这里原内核中不支持这种nandflash,找到linux3.0.1内核中的此文件,对比发现,飞凌加了{"
NAND2GiB1,8V8-bit"
0x38,4096,1024,512*1024,0},//MT的定义,所以把这块拷到我们这边的文件中。
注意上面的步骤,尤其注意最后添加的这两点,内核能编译通过,且下载到板子上能够显示难道的分区信息。
11、自己制作文件系统
11.1、给内核打补丁
本来纯净版的linux内核是不支持yaffs2文件系统的,所以必须打补丁。
从官方网站http:
//www.aleph1.co.uk/gitweb?
p=yaffs2.git;
a=summary下载yaffs2源码,解压后给linux3.6.7打补丁:
./patch-ker.shcm/kerneldirectory,完后看到fs目录下的Kconfig和Makefile文件都有增加yaffs2相关内容;
fs目录下也多了yaffs2文件夹。
基本上说明打补丁成功了,
makemenuconfig
DeviceDrivers配置
GenericDriverOptions选择
[*]Maintainadevtmpfsfilesystemtomountat/dev
[*]Automountdevtmpfsat/dev,afterthekernelmountedthe....
MTD-->
CachingblockdeviceaccesstoMTDdevices
FileSystems
配置
取消Secondextendedfssupport和Ext3journallingfilesystemsupport
[*]Miscellaneousfilesystems--->
选择
Bootoptions配置
输入"
noinitrdroot=/dev/mtdblock2rootfstype=yaffs2init=/linuxrcconsole=ttySAC0,115200"
11.2、制作mkyaffs2image工具
进入yaffs2源码目录下utils目录,修改mkyaff2image.c:
#definechunkSize2048
#definespareSize64
#definepagesPerBlock64
#definechunkSize4096
#definespareSize218
#definepagesPerBlock128
进入yaffs2源码目录下direct目录,修改yportenv.h
增加#defineCONFIG_YAFFS_DEFINES_TYPES
保存后make,这时就在utils目录生产mkyaffs2image文件,把这个文件拷贝到/usr/bin目录下
11.3、制作根文件系统
11.3.1、下载并解压busybox1.20.2,修改Makefile
CROSS_COMPILE?
=/usr/local/arm/4.5.1/bin/arm-linux-
ARCH?
=arm
11.3.2配置busybox菜单如下:
a、makedefconfig(默认配置)
b、makemenuconfig
BusyboxSettings--->
BuildOptions--->
(/usr/local/arm/4.5.1/bin/arm-linux-)CrossCompilerprefix
GeneralConfiguration--->
[*]Don'
tuse/usr
11.3.3
编译、安装
a、make
b、makeinstall(由于前面没设置安装位置将默认安装在本文件夹的_install文件夹下)
11.3.4
进入_install建立其他根文件系统文件夹.我写了个脚本creat_initramfs.sh
#!
/bin/sh
echo"
--------Createroot,dev......"
mkdirrootdevetcbinsbinmntsysproclibhometmpvarusr
mkdirusr/sbinusr/binusr/libusr/modulesusr/etc
mkdirmnt/usbmnt/nfsmnt/etcmnt/etc/init.d
mkdirlib/modules
chmod1777tmp
sudomknod-m600dev/consolec51
sudomknod-m666dev/nullc13
-------makedirectiondone---------"
然后保存脚本修改权限:
chmod+xcreat_initramfs.sh
运行脚本!
11.3.5建立相关文件
(1)在
etc目录下创建profile文件,内容如下
#Ashprofile
#vim:
syntax=sh
#Nocorefilesbydefault
ulimit-S-c0>
/dev/null2>
1
USER="
`id-un`"
LOGNAME=$USER
PS1='
[\u@\h\W]\#'
PATH=$P