基于S3C2410平台移植Linux2.6内核指南安装交叉编译工具Ø下载交叉编译工具(本文默认所有软件均下载在用户主目录下)arm-linux-gcc-3.4.1——编译内核URL:安装//将压缩包移动至根目录下#mvarm-linux-gcc-3.4.1.tar.bz2///解压,默认路径为/usr/local/arm/3.4.1#tarjxvfarm-linux-gcc-3.4.1.tar.gz2下载Linux内核Ø下载Linux2.6.22.2内核URL:Ø解压内核#cd~#tarjxvflinux-2.6.22.2.tar.bz2建立环境变量Ø将交叉编译工具路径和内核路径加入环境变量#vi/etc/profileexportKERNEL=~/linux-2.6.22.2exportPATH=/usr/local/arm/3.4.1/bin:$PATH#source/etc/profile内核移植修改Makefile#vi$KERNEL/Makefile找到ARCH与CROSS_COMPILE,修改为ARCH?=armCROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-将分区信息加入内核修改C程序文件,指明Flash分区信息,添加NANDFlash驱动支持:总共只有两个文件需要修改:/arch/arm/plat-s3c24xx/common-smdk.c/arch/arm/plat-s3c24xx/devs.c(1)指明分区信息:common-smdk.c中找到staticstructmtd_partitionsmdk_default_nand_part[],根据自己板子的分区结构修改,例如我的vivi下的分区信息为:nameoffsetsizeflag------------------------------------------------vivi:0x000000000x000200000128kparam:0x000200000x00010000064kkernel:0x000300000x0040000004Mroot:0x004300000x0020000042Myaffs:0x006300000x039cc000857M+816K我的Flash分了5个区,这个变量就应设置为:staticstructmtd_partitionsmdk_default_nand_part[]={[0]={.name=vivi,.offset=0x00000000,.size=0x00020000,},[1]={.name=param,.offset=0x00020000,.size=0x00010000,},[2]={.name=kernel,.offset=0x00030000,.size=0x00400000,},[3]={.name=root,.offset=0x00430000,.size=0x00200000,},[4]={.name=yaffs,.offset=0x00630000,.size=0x039cc000,}};与上面的信息一一对应,很容易理解;(2)建立NANDFlash芯片支持:common-smdk.c中找到staticstructs3c2410_platform_nandsmdk_nand_info,修改为:structs3c2410_platform_nandsmdk_nand_info={.tacls=0,.twrph0=30,.twrph1=0,.nr_sets=ARRAY_SIZE(smdk_nand_sets),.sets=smdk_nand_sets,};Ø指定启动时的设备初始化#vi$KERNEL/arch/arm/mach-s3c2410/mach-smdk2410.cstaticstructplatform_device*smdk2410_devices[]__initdata={s3c_device_usb,//s3c_device_lcd,//在这里取消LCD的初始化,不然启动时会有出错信息s3c_device_wdt,s3c_device_i2c,s3c_device_iis,//添加如下信息s3c_device_nand,};Ø禁止FlashECC效验内核通过vivi把数据写入NANDFlash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NANDFlash控制器产生的,所以在此必须禁用NANDFlashECC。#vi$KERNEL/drivers/mtd/nand/s3c2410.c找到s3c2410_nand_init_chip函数,将chip-ecc.mode的值修改为:NAND_ECC_NONEYaffs2加载Ø下载Yaffs2URL:=tarØ解压Yaffs2并将其加入Linux内核#cd~#tarzxvfyaffs2.tar.gz#cdyaffs2#shpatch-ker.shc$KERNEL内核配置(.config)与编译Ø内核配置(基于$KERNEL/arch/arm/configs/s3c2410_defconfig)在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。#cp$KERNEL/arch/arm/configs/s3c2410_defconfig.config#makemenuconfig以下是在s3c2410_defconfig基础上要配置的选项(有一些必须的选项在s3c2410_defconfig里已经选上了,所以我没有写出来。以下的选项非特别说明,可能不用选,Generalsetup---Configurestandardkernelfeatures(forsmallsystems)---选上这项,否则文件系统中的一些选项不会出现SystemType---S3C2410Machines---/SMDK2410/A9M2410留下这项就够了,其他全部“N”掉“N”掉S3C2412Machines---、S3C2440Machines---和S3C2443Machines---里的所有选项,都是和2410无关的选项。Bootoptions---将(root=/dev/hda1roinit=/bin/bashconsole=ttySAC0)Defaultkernelcommandstring改成(noinitrdroot=/dev/mtdblock4rootfstype=cramfsconsole=ttySAC0,115200init=/linuxrcmem=64M)Defaultkernelcommandstring#说明:#mtdblock4代表第5个flash分区,用来作根文件系统rootfs;#console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上,波特率为115200;#2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。#用户空间的串口编程针对的仍是/dev/ttyS0等#mem=64M表示内存是64M,如果是32则设为32M在实践中,我发现“rootfstype=cramfs”这句还是挺重要的。如果没有这句,系统启动时即使分区挂载正确了,但是文件系统的类型有可能出错。在这里定义过,就不会出错了。这里的选项也和根文件系统的配置有关。(我先使用cramfs做跟文件系统,以后再换JFFS2或是YAFFS)Userspacebinaryformats---Kernelsupportfora.outandECOFFbinaries(去除该选项,a.out和ECOFF是两种可执行文件的格式,在ARM-Linux下一般都用ELF,所以这两种基本用不上。)Networking---Networkingoptions---PacketsocketPacketsocket:mmappedIO-我移植斯达康的XI-735无限网卡,所以我选了WLAN(802.11)的选项,不需的可以不选-Wireless------ImprovedwirelessconfigurationAPI---WirelessextensionsGenericIEEE802.11NetworkingStack(mac80211)EnableLEDtriggers[]Enabledebuggingoutput(NEW)GenericIEEE802.11NetworkingStack[]Enablefulldebuggingoutput(NEW)---IEEE802.11WEPencryption(802.1x)IEEE802.11iCCMPsupport(NEW)IEEE802.11iTKIPencryption(NEW)SoftwareMACadd-ontotheIEEE802.11networkingstack[]Enablefulldebuggingoutput(NEW)DeviceDrivers---“N”掉Parallelportsupport---里的所有选项。PlugandPlaysupport---里的所有选项一定要“N”掉,不然编译会出错!!!!!!!!Networkdevicesupport---Ethernet(10or100Mbit)---“N”掉DM9000support和GenericMediaIndependentInterfacedevicesupport“N”掉[]Ethernet(1000Mbit)---和[]Ethernet(10000Mbit)---WirelessLAN---WirelessLAN(pre-802.11)WirelessLAN(IEEE802.11)USBNetworkAdapters---Multi-purposeUSBNetworkingFrameworkMMC/SDcardsupport---RealTimeClock---“N”掉[]SetsystemtimefromRTConstartupandresume#接下来做的是针对文件系统的设置,我实验时目标箱上要挂的根文件系统是cramfs,故做如下配置Filesystems--Secondextendedfssupport#去除对ext2的支持Ext3journallingfilesystemsupport#去除对ext3的支持KernelautomountersupportKernelautomounterversion4support(alsosupportsv3)FilesysteminUserspacesupportPseudofilesystems--Virtualmemoryfilesystemsupport(formershmfs)Userspace-drivenconfigurationfilesystem(EXPERIMENTAL)Miscellaneousfilesystems--YAFFS2filesystemsupport“N”掉[]Autoselectyaffs2format和[]CacheshortnamesinRAM,因为这是给每页大于1024B的NANDFlash设计的JournallingFlashFileSystemv2(JFFS2)support(0)JFFS2debuggingverbosity(0=qu