linux26111内核移植全纪录.docx
《linux26111内核移植全纪录.docx》由会员分享,可在线阅读,更多相关《linux26111内核移植全纪录.docx(19页珍藏版)》请在冰豆网上搜索。
linux26111内核移植全纪录
Linux-2.6.11内核及部分驱动移植过程总结
by天海一线
2009-11-24
一、环境介绍:
Host:
FedoraCore4,arm-linux-gcc-3.4.1
Client:
linux-2.6.11.1,QT2410E开发板V4
二、移植过程
1、基本移植
(1)修改Makefile文件:
ARCH?
=arm
CROSS_COMPILE?
=arm-linux-
(2)拷贝基本配置文件
cparch/arm/configs/s3c2410_defconfig.config
(3)编译测试
Make
(4)添加NANDFLASH分区信息
开发板上NAND共64M,分区为:
0-0x30000Bootloader192K(0x30000)
0x30000-0x200000Kernel1586K(0x1d0000)
0x200000-0x1800000rootfs22M(0x1600000)
0x1800000-0x4000000yaffsfs40M(0x2800000)
在arch/arm/mach-s3c2410/devs.c中添加
/*NANDController*/
#include
#include
#include
staticstructmtd_partitionpartition_info[]={
{
name:
"bootloader",
size:
0x30000,
offset:
0,
},
{
name:
"kernel",
size:
0x1d0000,
offset:
0x30000,
},
{
name:
"rootfs",
size:
0x1600000,
offset:
0x200000,
},
{
name:
"yaffsfs",
size:
0x2800000,
offset:
0x1800000,
},
};
structs3c2410_nand_setnandset={
nr_partitions:
4,
partitions:
partition_info,
};
structs3c2410_platform_nandgyhPlatform={
tacls:
0,
twrph0:
30,
twrph1:
0,
sets:
&nandset,
nr_sets:
1,
};
在s3c_device_nand结构中添加dev属性:
.dev={
.platform_data=&gyhPlatform
}
在arch/arm/mach-s3c2410/mach-smdk2410.c中的smdk2410_devices[]结构体中添加&s3c_device_nand使内核在启动的时候初始化nandflash信息。
(5)测试
make
(6)编写生成uImage的脚本mkuImage.sh
#!
/bin/sh
mkimage-Aarm–Olinux–Tkernel–Cnone–n“linux-2.6.11.1”–a30008000–e30008040–dzImageuImage
chmodu+xmkuImage.sh
./mkuImage.sh
(7)复位开发板,在minicom下,停到uboot的下载模式:
setenvwktftp30008000uImage\;nanderase300001d0000\;nandwrite30008000300001d0000
saveenv
runwk
bootm30008000
能够启动系统且分区信息正确。
2、定制系统
makemenuconfig:
Codematurityleveloptions全选
LoadablemodulesupportEnableloadablemodulesupport
Moduleunloading
Moduleversioningsupport
Automatickernelmoduleloading
GeneralsetupSupportforhot-pluggabledevices选择
SCSIdevicesupportSCSIdisksupport选择
ProbeallLUNsoneachSCSIdevice选择
InputdevicesupportTouchscreeninterface选择
Eventinterface选择
Eventdebugging选择
FilesystemsKernelautomountersupport
Kernelautomounterversion4support
Pseudofilesystems/devfilesystemsupport(OBSOLETE)
MiscellaneousfilesystemsCompressedROMfilesystemsupport(cramfs)
NetworkFileSystemsNFS相关的全面选择即可
NativeLanguageSupport选择437,cp936,Latin1,NLSUTF8
暂时只修改这些,重新编译并下载(runwk)。
3、RTC移植
执行hwclock,提示/dev/misc/rtc不存在。
在arch/arm/mach-s3c2410/mach-smdk2410.c中的smdk2410_devices[]结构体中添加&s3c_device_rtc使内核在启动的时候初始化rtc。
重新编译下载内核,执行hwclock成功。
date112415372009.20
hwclock–s
hwclock
显示TueNov2415:
39:
0520090.000000seconds(时间更新了,成功)
4、移植yaffs文件系统支持
下载yaffs文件系统源码,进入yaffs2文件夹下,执行
./patch-ker.shc~/linux-2.6.11.1/
给内核打上yaffs文件系统补丁。
回到内核目录,makemenuconfig
FileSystemsMiscellaneousfilesystemsYAFFS2filesystemsupport
Let’syaffsdoitsownECC
重新编译下载内核,可以挂在yaffs分区了,但是出现了读写NAND时未进行ECC校验的提示,找到drivers/mtd/nand/nand_base.c文件中的nand_write_page,nand_read_ecc,nand_scan三个函数,分别注释掉相应的提示语句即可消除烦人的提示了。
5、网卡CS8900A的驱动移植
(1)拷贝cs8900源码至内核目录
#cpcs8900.c./drivers/net/arm/
#cpcs8900.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
(3)修改Kconfig以允许配置
修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:
ConfigARM_CS8900
tristate"CS8900support"
dependsonNET_ETHERNET&&ARM&&ARCH_SMDK2410
help
SupportforCS8900AchipsetbasedEthernetcards.Ifyouhaveanetwork(Ethernet)cardofthistype,sayYandreadtheEthernet-HOWTO,availablefromaswellas.
Tocompilethisdriverasamodule,chooseMhereandread
.Themodulewillbe
calledcs8900.o.
(4)修改Makefile加入编译
修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_ARM_CS8900)+=cs8900.o
(5)在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]结构数组,添加如下如下内容:
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO,SZ_1M,MT_DEVICE}
应先添加头文件#include
在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容为:
#ifndef_INCLUDE_SMDK2410_H_
#define_INCLUDE_SMDK2410_H_
#include
#definepSMDK2410_ETH_IO0x19000000
#definevSMDK2410_ETH_IO0xE0000000
#defineSMDK2410_ETH_IRQIRQ_EINT9
#endif//_INCLUDE_SMDK2410_H_
(6)makemenuconfig选择CS8900A项,编译下载,CS8900可以工作了。
6、LCD移植
(1)拷贝驱动源代码
cps3c2410fb.hdrivers/video/
cps3c2410fb.cdrivers/video/
(2)修改drivers/video目录下的Kconfig文件,在最后添加如下内容:
configFB_S3C2410
tristate"S3C2410LCDsupport"
dependsonFB&&ARM&&ARCH_S3C2410
help
ThisisaframebufferdevicefortheS3C2410LCDController. IfyouplantousetheLCDdisplaywithyourS3C2410system,say Yhere.
(3)修改drivers/video目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_FB_S3C2410) +=s3c2410fb.ocfbfillrect.ocfbcopyarea.ocfbimgblt.o
(4)makemenuconfig配置LCD,重新编译并下载,看到小企鹅了。
注:
其他配置会影响LCD驱动,导致OOPS,
Codematurityleveloptions全选
LoadablemodulesupportEnableloadablemodulesupport
Moduleunloading
Moduleversioningsupport
Automatickernelmoduleloading
(5)测试
ls–l>/dev/tty1LCD上显示目录,搞定。
7、触摸屏移植
(1)拷贝驱动源文件
cps3c2410_ts.cdrivers/input/Touchscreen/
(2)修改drivers/input/Touchscreen/下Makefile文件
添加obj-$(CONFIG_TOUCHSCREEN_S3C2410)+=s3c2410_ts.o
(3)修改drivers/input/Touchscreen/下Kconfig文件,在最后添加
configTOUCHSCREEN_S
tristate"SamsungS3C2410touchscreeninputdriver"
dependsonARCH_SMDK2410&&INPUT&&INPUT_TOUCHSCREEN
selectSERIO
help
SayYhereifyouhavethes3c2410touchscreen.
Ifunsure,sayN.
Tocompilethisdriverasamodule,chooseMhere:
the
modulewillbecalleds3c2410_ts.
configTOUCHSCREEN_S3C2410_DEBUG
boolean"SamsungS3C2410touchscreendebugmessages"
dependsonTOUCHSCREEN_S3C2410
help
Selectthisifyouwantdebugmessages
(4)在arch/arm/mach-s3c2410/mach-smdk2410.c,中增加如下内容:
#include
staticstructs3c2410_ts_mach_infosbc2410_ts_cfg__initdata={
.delay=10000,
.presc=49,
.oversampling_shift=2,
};
在smdk2410_devices结构中,添加:
&s3c_device_ts,
在smdk2410_map_io函数中添加:
set_s3c2410ts_info(&sbc2410_ts_cfg);
(5)在arch/arm/mach-s3c2410/devs.h文件中添加:
externstructplatform_devices3c_device_ts;
(6)在arch/arm/mach-s3c2410/devs.c文件中添加如下几行:
#include
/*Touchscreen*/
staticstructs3c2410_ts_mach_infos3c2410ts_info;
void__initset_s3c2410ts_info(structs3c2410_ts_mach_info*hard_s3c2410ts_info)
{
memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(structs3c2410_ts_mach_info));
}
EXPORT_SYMBOL(set_s3c2410ts_info);
structplatform_devices3c_device_ts={
.name="s3c2410-ts",
.id=-1,
.dev={
.platform_data=&s3c2410ts_info,
}
};
EXPORT_SYMBOL(s3c_device_ts);
(7)创建asm/arch-s3c2410/s3c2410_ts.h文件,内容如下
#ifndef__ASM_ARM_S3C2410_TS_H
#define__ASM_ARM_S3C2410_TS_H
structs3c2410_ts_mach_info{
intdelay;
intpresc;
intoversampling_shift;
};
void__initset_s3c2410ts_info(structs3c2410_ts_mach_info*hard_s3c2410ts_info);
#endif/*__ASM_ARM_S3C2410_TS_H*/
(8)创建asm/arch-s3c2410/regs-adc.h文件,内容如下
#ifndef__ASM_ARCH_REGS_ADC_H
#define__ASM_ARCH_REGS_ADC_H"regs-adc.h"
#defineS3C2410_ADCREG(x)(x)
#defineS3C2410_ADCCONS3C2410_ADCREG(0x00)
#defineS3C2410_ADCTSCS3C2410_ADCREG(0x04)
#defineS3C2410_ADCDLYS3C2410_ADCREG(0x08)
#defineS3C2410_ADCDAT0S3C2410_ADCREG(0x0C)
#defineS3C2410_ADCDAT1S3C2410_ADCREG(0x10)
/*ADCCONRegisterBits*/
#defineS3C2410_ADCCON_ECFLG(1<<15)
#defineS3C2410_ADCCON_PRSCEN(1<<14)
#defineS3C2410_ADCCON_PRSCVL(x)(((x)&0xFF)<<6)
#defineS3C2410_ADCCON_PRSCVLMASK(0xFF<<6)
#defineS3C2410_ADCCON_SELMUX(x)(((x)&0x7)<<3)
#defineS3C2410_ADCCON_MUXMASK(0x7<<3)
#defineS3C2410_ADCCON_STDBM(1<<2)
#defineS3C2410_ADCCON_READ_START(1<<1)
#defineS3C2410_ADCCON_ENABLE_START(1<<0)
#defineS3C2410_ADCCON_STARTMASK(0x3<<0)
/*ADCTSCRegisterBits*/
#defineS3C2410_ADCTSC_YM_SEN(1<<7)
#defineS3C2410_ADCTSC_YP_SEN(1<<6)
#defineS3C2410_ADCTSC_XM_SEN(1<<5)
#defineS3C2410_ADCTSC_XP_SEN(1<<4)
#defineS3C2410_ADCTSC_PULL_UP_DISABLE(1<<3)
#defineS3C2410_ADCTSC_AUTO_PST(1<<2)
#defineS3C2410_ADCTSC_XY_PST(x)(((x)&0x3)<<0)
//#defineS3C2410_ADCTSC_XY_PST(0x3<<0)
/*ADCDAT0Bits*/
#defineS3C2410_ADCDAT0_UPDOWN(1<<15)
#defineS3C2410_ADCDAT0_AUTO_PST(1<<14)
#defineS3C2410_ADCDAT0_XY_PST(0x3<<12)
#defineS3C2410_ADCDAT0_XPDATA_MASK(0x03FF)
/*ADCDAT1Bits*/
#defineS3C2410_ADCDAT1_UPDOWN(1<<15)
#defineS3C2410_ADCDAT1_AUTO_PST(1<<14)
#defineS3C2410_ADCDAT1_XY_PST(0x3<<12)
#defineS3C2410_ADCDAT1_YPDATA_MASK(0x03FF)
#endif/*__ASM_ARCH_REGS_ADC_H*/
(9)配置内核并编译下载
(10)测试
echo8>/proc/sys/kernel/printk
cat/dev/ts0
触动触摸屏,会显示坐标信息。
8、OHCI驱动移植
(1)拷贝源文件
cpohci-s3c2410.cdrivers/usb/host/
(2)修改drivers/usb/Kconfig文件,添加
configUSB_ARCH_HAS_HCD
boolean
defaultyifUSB_ARCH_HAS_OHCI
defaultyifARM#SL-811
defaultPCI
#manynon-PCISOCchipsembedOHCI
configUSB_ARCH_HAS_OHCI
boolean
#ARM:
defaultyifSA1111
defaultyifARCH_S3C2410
defaultyifARCH_OMAP
defaultyifARCH_LH7A404
defaultyifPXA27x
#PPC:
defaultyifSTB03xxx
defaultyifPPC_MPC52xx
#MIPS:
defaultyifSOC_AU1X00
#more:
defaultPCI
(3)修改drivers/usb/host/下ohci-hcd.c文件
添加
#ifdefCONFIG_ARCH_S3C2410
#include"ohci-s3c2410.c"
#endif
修改
#if!
(defined(CONFIG_PCI)\
||defined(CONFIG_SA1111)\
||defined(CONFIG_ARCH_OMAP)\
||defined(CONFIG_ARCH_LH7A404)\
||defined(CONFIG_ARCH_S3C2410)\
||defined(CONFIG_PXA27x)\
||defined(CONFIG_SOC_AU1X00)\
)
#error"missingbusglueforohci-hcd"
#endif
(4)修改arch/arm/mach-s3c2410/mach-smdk2410.c
添加如下内容
#include
#include
#include