linux367移植至ok6410.docx
《linux367移植至ok6410.docx》由会员分享,可在线阅读,更多相关《linux367移植至ok6410.docx(13页珍藏版)》请在冰豆网上搜索。
linux367移植至ok6410
Linux3.6.7移植到OK6410开发板
1、解压内核
首先下载linux3.6.7干净版本的源码,然后在Ubuntu下解压:
tar-xvjflinux-3.6.7.tar.bz2
2、在arch/arm/mach-s3c64xx/目录下的mach-mini6410.c复制一份在当前文件下命名为mach-ok6410.c(bsp文件),因为这些内核版本中没有OK6410的配置,我们只能找相近的mini6410来进行修改添加。
3、有了ok6410开发板的bsp文件之后,修改当前目录下的Kconfig文件,将我们的bsp文件添加到内核配置中加入OK6410的配置信息,此处的信息如下,只是把SMDK6410的配置复制一下,修改一下名字(把SMDK修改成OK):
configMACH_OK6410
bool"OK6410"
selectCPU_S3C6410
selectSAMSUNG_DEV_ADC
selectS3C_DEV_HSMMC
selectS3C_DEV_HSMMC1
selectS3C_DEV_I2C1
selectSAMSUNG_DEV_IDE
selectS3C_DEV_FB
selectS3C_DEV_RTC
selectSAMSUNG_DEV_TS
selectS3C_DEV_USB_HOST
selectS3C_DEV_USB_HSOTG
selectS3C_DEV_WDT
selectSAMSUNG_DEV_BACKLIGHT
selectSAMSUNG_DEV_KEYPAD
selectSAMSUNG_DEV_PWM
selectHAVE_S3C2410_WATCHDOGifWATCHDOG
selectS3C64XX_SETUP_SDHCI
selectS3C64XX_SETUP_I2C1
selectS3C64XX_SETUP_IDE
selectS3C64XX_SETUP_FB_24BPP
selectS3C64XX_SETUP_KEYPAD
selectS3C64XX_SETUP_USB_PHY
help
MachinesupportfortheSamsungOK6410
保存退出。
4、由于机器码ID必须和uboot的ID一致,所修改arch/arm/tools/mach-types文件,这里的作用是使我们的uboot能够识别我们移植的内核,如果不修改,即使内核被下载到正确的地址,但是uboot不能找到内核,从而会出现内核启动不了的问题。
smdk6410 MACH_SMDK6410 SMDK6410 1626
把它改成
ok6410 MACH_OK6410 OK6410 1626
保存退出
5、修改mach-ok6410.c
5.1把文件中所有的mini6410改成ok6410,但是在MACHINE_START后面括号里的参数需要改成大写的OK,即MACHINE_START(OK6410,"OK6410"),因为这里跟我们前面配置的Kconfig和mach-types文件中的名字对应,**大小写注意必须一致 。
5.2 修改staticstructmtd_partitionok6410_nand_part
/*
[0]={
.name="uboot",
.size=SZ_1M,
.offset=0,
},
[1]={
.name="kernel",
.size=SZ_2M,
.offset=SZ_1M,
},
[2]={
.name="rootfs",
.size=MTDPART_SIZ_FULL,
.offset=SZ_1M+SZ_2M,
},*/
改为
{
.name="Bootloader",
.offset=0,
.size=(2*SZ_1M),
.mask_flags=MTD_CAP_NANDFLASH,
},
{
.name="Kernel",
.offset=(2*SZ_1M),
.size=(5*SZ_1M),
.mask_flags=MTD_CAP_NANDFLASH,
},
{
.name="FileSystem",
.offset=(7*SZ_1M),
.size=(200*SZ_1M),
},
{
.name="User",
.offset=MTDPART_OFS_APPEND,
.size=MTDPART_SIZ_FULL,
}
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
help
EnabledebuggingoftheS3CNANDdriver
configMTD_NAND_S3C_HWECC
bool"SamsungS3C64xxS5P64xxNANDHardwareECC8BITS"
dependsonMTD_NAND_S3C
help
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<<23)
#defineS3C_NFCONF_ECC_8BIT(1<<23)
#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<<4)
#defineS3C_NFCONT_nFCE1(1<<2)
#defineS3C_NFCONT_nFCE0(1<<1)
#defineS3C_NFCONT_INITECC(S3C_NFCONT_INITSECC|S3C_NFCONT_INITMECC)
#defineS3C_NFSTAT_ECCENCDONE(1<<7)
#defineS3C_NFSTAT_ECCDECDONE(1<<6)
#defineS3C_NFSTAT_BUSY(1<<0)
#defineS3C_NFECCERR0_ECCBUSY(1<<31)
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(!
chip->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
BusyboxSettings--->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
echo"-------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