linux367移植至ok6410.docx

上传人:b****6 文档编号:7527552 上传时间:2023-01-24 格式:DOCX 页数:13 大小:257.82KB
下载 相关 举报
linux367移植至ok6410.docx_第1页
第1页 / 共13页
linux367移植至ok6410.docx_第2页
第2页 / 共13页
linux367移植至ok6410.docx_第3页
第3页 / 共13页
linux367移植至ok6410.docx_第4页
第4页 / 共13页
linux367移植至ok6410.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

linux367移植至ok6410.docx

《linux367移植至ok6410.docx》由会员分享,可在线阅读,更多相关《linux367移植至ok6410.docx(13页珍藏版)》请在冰豆网上搜索。

linux367移植至ok6410.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1