linux26353内核移植s3c2440.docx
- 文档编号:4571766
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:15
- 大小:21.15KB
linux26353内核移植s3c2440.docx
《linux26353内核移植s3c2440.docx》由会员分享,可在线阅读,更多相关《linux26353内核移植s3c2440.docx(15页珍藏版)》请在冰豆网上搜索。
linux26353内核移植s3c2440
linux-2.6.35.3内核移植(s3c2440)
忙乎了一个下午,总算忙乎出来了,不过前期大量的搜索工作别人已经完成。
学习一下!
!
!
宿主机:
Fedora13
目标机:
s3c2440
交叉编译器:
arm-linux-gcc-3.4.1
交叉编译器路径:
/usr/local/arm/3.4.1
要移植的内核版本:
linux-2.6.35.3
文件系统类型:
yaffs2
一、准备工作
1、下载解压内核
从官网上下载linux-2.6.35的内核,ftp:
//ftp.kernel.org/pub/linux/kernel/v2.6/,文件不大,约85M。
新建一个工作目录s3c2440,将内核源码包拷贝至工作目录下,再解压。
2、移植yaffs2驱动
下载最新的驱动http:
//www.aleph1.co.uk/cgi-bin/...fs2.tar.gz?
view=tar 解压在工作目录s3c2440下
进入yaffs2:
cdyaffs2
给内核打补丁:
./patch-ker.sh c../linux-2.6.34
成功后打印信息:
Updating/file/fl/linux-2.6.34/fs/Kconfig
Updating/file/fl/linux-2.6.34/fs/Makefile
问题:
1、什么是补丁?
一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。
补丁是通
过diff应用程序来创建的。
为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产
生出来的以及这个补丁将要把目前的源代码树变化到什么新的版本。
这些信息或者会出现在补丁
文件的原数据中,或者可能从文件名中推断出来。
2、为什么要给内核打补丁?
因为该内核暂不支持yaff2的文件系统,打上补丁使之支持。
3、安装交叉编译环境
从http:
//www.handhelds.org/download/projects/toolchain/下载arm-linux-gcc-3.4.1.tar.bz2
解压之,su
tar vxjf arm-linux-gcc-3.4.1.tar.bz2
将交叉编译器安装到/usr/local/下。
值得注意的是:
该/usr/local目录并不是Fedora系统根
录下的/usr/local,而是刚刚生成的/usr/local目录。
这个一点要注意,否则浪费了时间不说,
也破坏了Linux系统。
二、移植
1、修改机器码
飞凌开发板的bootloader默认的机器码是193,所以我们在使用smdk2440机器的时候,需要修
改机器码。
修改内核2.6.35.3中的arch/arm/tools/mach-types。
删掉
s3c2410 ARCH_S3C2410 S3C2410 182
然后将
s3c2440 ARCH_S3C2440 S3C2440 362
修改为
s3c2440 ARCH_S3C2440 S3C2440 193
2、指定目标板machine、编译器和编译器路径
修改linux-2.6.35.3/Makefile,将
ARCH ?
=$(SUBARCH)
CROSS_COMPILE ?
=
修改成ARCH ?
=arm
CROSS_COMPILE ?
=/usr/local/arm/3.4.1/bin/arm-linux-
注意:
CROSS_COMPILE是指交叉编译器的路径,该路径一定要完整,比如本人的是:
/home/kelvin/usr
/local/arm/3.4.1/bin/arm-linux- 这个/home/kelvin就不能少,否则最后makezImage时提示文件不存在。
3、增加devfs文件管理器的支持
我们所用的文件系统使用的是devfs文件管理器。
修改fs/Kconfig,
找到
menu"Pseudofilesystems"
添加如下语句:
configDEVFS_FS
bool"/devfilesystemsupport(OBSOLETE)"
defaulty
configDEVFS_MOUNT
bool"Automaticallymountatboot"
defaulty
dependsonDEVFS_FS
帮助理解:
Kconfig就是对应着内核的配置菜单。
假如要想添加新的驱动到内核的源码中,能够修改Kconfig,
这样就能够选择这个驱动,假如想使这个驱动被编译,要修改Makefile。
4、修改晶振频率( 可解决打印信息乱码问题 )
文件:
arch/arm/mach-s3c2440/mach-smdk2440.c
/*s3c24xx_init_clocks(16934400);*/ s3c24xx_init_clocks(12000000);
5、修改MTD分区
文件:
arch/arm/plat-s3c24xx/common-smdk.c
需要和bootloader中的分区信息相同(256M),否则,启动时出错。
staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name ="boot",
.size =0x00020000,
.offset=0
},
[1]={
.name ="MyApp",
.size =0x00380000,
.offset=0x00180000,
},
[2]={
.name ="Kernel",
.size =0x00300000,
.offset=0x00500000,
},
[3]={
.name ="fs_yaffs",
.size =0x07800000,
.offset=0x00800000,
}
};
问题:
什么是MTD?
MTD(memorytechnologydevice内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。
MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。
有几点需要注意:
a、此信息需根据自己的实际分区信息修改
b、这里文件系统所在的分区标号必须与板子上root_fs的号码相同 ,否则启动会出错。
因此这里不需要将所有
的分区信息都写进来,只要位置对应即可!
6、关闭ECC校验
文件:
drivers/mtd/nand/s3c2410.c
函数:
s3c2410_nand_init_chip
/*chip->ecc.mode=NAND_ECC_SOFT;*/ chip->ecc.mode=NAND_ECC_NONE;
问题:
关于ECC:
ECC是“ErrorCorrectingCode”的简写,中文名称是“错误检查和纠正”。
ECC是一种能够实现
“错误检查和纠正”的技术,ECC内存就是应用了这种技术的内存,一般多应用在服务器及图形工作站上,这将使整个
电脑系统在工作时更趋于安全稳定。
此处为避免容易出错,将ECC关闭。
7、修改nandflash驱动,支持K9F1G08的nandflash
修改drivers/mtd/nand下面的nand_bbt.c 文件:
staticstructnand_bbt_descrlargepage_memorybased={
.options=0,
.offs=0,
.len=1, // 原数值为2,支持2K每页的flash修改为1。
K9F1G08,K9F2G08是2k每页的flash
.pattern=scan_ff_pattern
};
staticstructnand_bbt_descrlargepage_flashbased={
.options=NAND_BBT_SCAN2NDPAGE,
.offs=0,
.len=1, //原数值为2,支持2K每页的flash修改为1。
K9F1G08,K9F2G08是2k每页的flash
.pattern=scan_ff_pattern
};
8、下面,开始配置内核。
进入linux-2.6.35目录,把s3c2410的默认配置写入config文件。
makes3c2410_defconfig
makemenuconfig
配置文件系统选项
配置yaffs2文件系统
修改配置如下:
Filesystems --->
[*]Miscellaneousfilesystems --->
<*> YAFFS2filesystemsupport
-*- 512byte/pagedevices
-*- 2048byte(orlarger)/pagedevices
[*] Autoselectyaffs2format
[*] CacheshortnamesinRAM
配置cpu相关选项
修改配置如下:
SystemType --->
S3C2440Machines --->
[*]SMDK2440
[*]SMDK2440withS3C2440CPUmodule
去掉S3C2400Machines、S3C2410Machines、S3C2412Machines、S3C2442Machines的所有选项 ,
否则会报错。
如果现在编译内核,下载到开发板中,内核就可以正常启动了.有了雏形,继续移植设备驱动。
这里,内核选项*代表编译至内核,M代表编译为模块 。
9、移植USBhost驱动
在这个版本的linux内核,已经对USB驱动进行来很好的支持,仅仅需要修改配置。
DeviceDrivers --->
[*]USBsupport --->
{*} SupportforHost-sideUSB
[*] USBdevicefilesystem(DEPRECATED)
[*] USBdeviceclass-devices(DEPRECATED)
<*> OHCIHCDsupport
<*> USBMassStoragesupport
[*]HIDDevices --->
{*} GenericHIDsupport
[*] /dev/hidrawrawHIDdevicesupport
SCSIdevicesupport --->
<*>SCSIdevicesupport
[*]legacy/proc/scsi/support
<*>SCSIdisksupport
<*>SCSItapesupport
10、移植RTC驱动
在这个版本的linux内核,已经对RTC驱动进行来很好的支持,不需要修改配置。
相应配置如下
DeviceDrivers --->
<*>RealTimeClock --->
[*] SetsystemtimefromRTConstartupandresume
(rtc0) RTCusedtosetthesystemtime
[] RTCdebugsupport
***RTCinterfaces***
[*] /sys/class/rtc/rtcN(sysfs)
[*] /proc/driver/rtc(procfsforrtc0)
[*] /dev/rtcN(characterdevices)
<*> SamsungS3CseriesSoCRTC
然后添加对设备的支持
打开arch/arm/mach-s3c2440/mach-smdk2440.c ,添加设备,代码如下:
staticstructplatform_device*smdk2440_devices[]__initdata={
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc,
};
11、移植UDA1341驱动
在平台上添加和配置UDA1341:
修改arch/arm/mach-s3c2440/mach-smdk2440.c ,在开始添加头文件
#include
#include
添加设备配置
staticstructs3c24xx_uda134x_platform_datas3c24xx_uda134x_data={
.l3_clk=S3C2410_GPB(4),
.l3_data=S3C2410_GPB(3),
.l3_mode=S3C2410_GPB
(2),
.model=UDA134X_UDA1341,
};
staticstructplatform_devices3c24xx_uda134x={
.name="s3c24xx_uda134x",
.dev={
.platform_data =&s3c24xx_uda134x_data,
}
};
把设备添加到平台当中
staticstructplatform_device*smdk2440_devices[]__initdata={
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc,
&s3c24xx_uda134x,
};
内核配置如下
DeviceDrivers --->
<*>Soundcardsupport --->
<*> AdvancedLinuxSoundArchitecture --->
<*> OSSMixerAPI
<*> OSSPCM(digitalaudio)API
[*] OSSPCM(digitalaudio)API-Includepluginsystem
[*] SupportoldALSAAPI
[*] Verboseprocfscontents
[*] Verboseprintk
[*] Genericsounddevices --->
<*> ALSAforSoCaudiosupport --->
<*> SoCAudiofortheSamsungS3C24XXchips
<*> SoCI2SAudiosupportUDA134XwiredtoaS3C24XX
12、移植DM9000驱动
a、修改 drivers/net/dm9000.c 文件:
头文件增加:
#include
#include
#include
在dm9000_probe 函数 开始增加:
unsignedcharne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};
staticvoid*bwscon;
staticvoid*gpfcon;
staticvoid*extint0;
staticvoid*intmsk;
#defineBWSCON (0x48000000)
#defineGPFCON (0x56000050)
#defineEXTINT0 (0x56000088)
#defineINTMSK (0x4A000008)
bwscon=ioremap_nocache(BWSCON,0x0000004);
gpfcon=ioremap_nocache(GPFCON,0x0000004);
extint0=ioremap_nocache(EXTINT0,0x0000004);
intmsk=ioremap_nocache(INTMSK,0x0000004);
writel(readl(bwscon)|0xc0000,bwscon);
writel((readl(gpfcon)&~(0x3<<14))|(0x2<<14),gpfcon);
writel(readl(gpfcon)|(0x1<<7),gpfcon);//Disablepull-up
writel((readl(extint0)&~(0xf<<28))|(0x4<<28),extint0);//risingedge
writel((readl(intmsk)) &~0x80,intmsk);
在这个函数的最后需要修改:
if(!
is_valid_ether_addr(ndev->dev_addr)){
/*tryreadingfrommac*/
mac_src="chip";
for(i=0;i<6;i++)
//ndev->dev_addr[i]=ior(db,i+DM9000_PAR);
ndev->dev_addr[i]=ne_def_eth_mac_addr[i];
}
b、修改arch/arm/mach-s3c2440/mach-smdk2440.c ,添加设备
staticstructplatform_device*smdk2440_devices[]__initdata={
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc,
&s3c24xx_uda134x,
&s3c_device_dm9000,
};
c、修改 arch/arm/plat-s3c24xx/devs.c
添加头文件
#include
添加以下代码
staticstructresources3c_dm9000_resource[]={
[0]={
.start=S3C24XX_PA_DM9000,
.end =S3C24XX_PA_DM9000+0x3,
.flags=IORESOURCE_MEM
},
[1]={
.start=S3C24XX_PA_DM9000+0x4,//CMDpinisA2
.end=S3C24XX_PA_DM9000+0x4+0x7c,
.flags=IORESOURCE_ME
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux26353 内核 移植 s3c2440