免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1489 | 回复: 0
打印 上一主题 下一主题

移植MMC/SD驱动到 linux-2.6.28 内核 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 18:03 |只看该作者 |倒序浏览
移植MMC/SD驱动到 linux-2.6.28 内核
                                                                                           2009-02-01
宿主机:
Fedora 9 (linux-2.6.25-14)
gcc-3.4.1

目标机:s3c2440

交叉编译器:arm-linux-gcc-3.4.1

要移植的内核版本:linux-2.6.28

文件系统:cramfs

目的:本来开发板上到内核是2.6.12的版本,支持最大1G的SD卡,需要解决支持4G以上的大容量的SD卡的问题,google了相关的资料,有文章说2.6.20以上版本的内核就支持4G以上的SD卡,于是就下载较高版本的内核进行移植,期间也遇到了很多问题,甚至考虑到了SD卡的中断位。不过最终还是成功移植了2.6.24.4 2.6.26和2.6.27,当前最新的内核版本是2.6.28的,就顺便移植了2.6.28的内核,其基本思路和方法是基本相同的,下面简要描述移植linux-2.6.28(以此版本为例)的步骤和方法,以备忘。

准备知识:
Linux支持多种平台架构。在其源码的arch目录下,已经将各种支持的平台架构的源码分门别类。为了配置方便,在各种平台架构的目录下,一般都配有一个名为configs的目录。其中,放置着许多已经初步配置好的defconfig文件。通过这些defconfig文件,加快了我们配置内核的速度。比如我所用的是一个arm架构的s3c2440板,那我就可以从arch/arm/configs/中找到s3c2410_defconfig,这是目前最匹配2440的一个默认配置文件了。使用:
#make s3c2410_defconfig

#cp arch/arm/configs/s3c2410_defconfig ./.config
执行上述命令后,将会在源码目录下生成相应的.config配置文件。通过
#make menuconfig

#make xconfig
可以进一步配置内核。最后执行
#make zImage
生成我们所需的烧录文件。

内核编译基本命令:
make mrproper --- 清理全部文件,包括.config和一些备份文件
make clean --- 清理生成文件,但会保留.config和一些模块文件
make defconfig --- 生成包含全部默认选项的.config文件。这里用make s3c2410_defconfig替代
make oldconfig --- 在旧的.config基础上生成新的.config。如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦
make config --- 基于文本的最为传统的配置界面,不推荐使用
make menuconfig --- 基于文本选单的配置界面,字符终端下推荐使用
make xconfig --- 基于图形窗口模式的配置界面,Xwindow下推荐使用

目的都是生成一个.config文件,这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用 make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。

make --- 默认编译
make bzImage --- 编译生成压缩的内核二进制文件,也会用make zImage替代



移植linux-2.6.28内核(假设已下载linux-2.6.28.tar.gz)

1. 解压源代码
我将已下载的linux-2.6.28.tar.gz放置在/usr/local/arm目录下,所以,进入/usr/local/arm目录,解压内核源代码:
#cd /usr/local/arm
#tar zxvf linux-2.6.28.tar.gz
#cd linux-2.6.28
2. 更改Makefile
#ARCH              ?= $(SUBARCH)
#CROSS_COMPILE  ?=
ARCH                ?= arm
CROSS_COMPILE    ?= arm-linux-
或者:CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-
我是将交叉编译器安装在/usr/local/arm目录下的。
3. 生成默认配置
#make s3c2410_defconfig
执行后,在终端打印出如下信息:

[root@localhost linux-2.6.28]# make s3c2410_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
[root@localhost linux-2.6.28]#

4. 增加devfs文件系统支持linux2.6.28已经去掉devfs,为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs的Kconfig文件。linux-2.6.28/fs/Kconfig修改的内容:
找到menu "Pseudo filesystems"
添加如下语句:
config DEVFS_FS
         bool "/dev file system support (OBSOLETE)"
         default y   
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS

5. 修改晶振( 可解决打印信息乱码问题 )
文件:arch/arm/mach-s3c2440/mach-smdk2440.c
/*s3c24xx_init_clocks(16934400);*/
s3c24xx_init_clocks(12000000);

6. 添加sdi设备,&s3c_device_sdi, 解决SD卡匹配问题,否则,插入SD卡没反应。
文件:arch/arm/mach-s3c2440/mach-smdk2440.c

static struct platform_device *smdk2440_devices[] __initdata = {
         &s3c_device_usb,
         &s3c_device_lcd,
         &s3c_device_wdt,
         &s3c_device_i2c,
         &s3c_device_iis,
         &s3c_device_sdi,  //添加这一行,否则,插入SD卡没反应
};

7. 修改MTD分区
文件: arch/arm/plat-s3c24xx/common-smdk.c
需要和bootloader中的分区信息相同,否则,启动时出错。
static struct mtd_partition smdk_default_nand_part[] = {

         [0] = {
                   .name        = "Boot",
                   .size  = 0x00030000,
                   .offset       = 0
         },

         [1] = {
                   .name        = "MyApp",
                   .size  = 0x00100000,
                   .offset       = 0x00030000,
         },

         [2] = {
                   .name        = "Kernel",
                   .size  = 0x002d0000,
                   .offset       = 0x00130000,
         },

         [3] = {
                   .name        = "fs_cramfs_20M",
                   .size  = 0x01400000,    //20M
                   .offset       = 0x00400000,
         },

         [4] = {
                   .name        = "fs_yaffs_38M",
                   .size  = 0x02600000,    //38M
                   .offset       = 0x01800000,
         },      

         [5] = {
                   .name        = "WINCE_2M",    //2M
                   .size  = 0x00200000,
                   .offset       = 0x03e00000,
         }

};

8. 关闭ECC校验
文件:drivers/mtd/nand/s3c2410.c
函数:s3c2410_nand_init_chip
/*chip->ecc.mode = NAND_ECC_SOFT; */
chip->ecc.mode = NAND_ECC_NONE;

9.  配置内核
#make xconfig

终端中打印出:

[root@localhost linux-2.6.28]# make s3c2410_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
[root@localhost linux-2.6.28]# make xconfig

  CHECK   qt

sed  scripts/kconfig/lkc_defs.h 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'

  HOSTCC  scripts/kconfig/kconfig_load.o

/usr/lib/qt-3.3/bin/moc -i scripts/kconfig/qconf.h -o scripts/kconfig/qconf.moc

  HOSTCXX scripts/kconfig/qconf.o

  HOSTLD  scripts/kconfig/qconf

scripts/kconfig/qconf arch/arm/Kconfig




然后弹出配置界面:

其中有几项一定要修改的,分别是:
a. 启动
|---Boot options| |---Default kernel command string: [root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc console=ttySAC0,115200 devfs=mount mem=64]
分析:
/dev/mtdblock3 : 表示MTD分区的第3个分区存储根文件系统
rootfstype=cramfs : 分区是cramfs类型,这项不加应该关系不大
init=/linuxrc : 启动的首个脚本即根目录下的linuxrc
console=ttySAC0,115200 : 使用串口1作为串口调试,波特率设置为115200; 现在已经摒弃了以前使用ttyS0的写法
devfs=mount : 在/sbin/init运行之前能自动挂载/dev为devfs文件系统
mem=64 : 存储器大小为64M

b. 增加devfs文件系统支持
这几项都是必选的

c. 芯片及系统类型
支持2440时,这一项也是必选的,否则会编译不过
d. DMA  Engine support
需要将此项选择,否则编译会出错。
e. MMC/SD/SDIO card support
选中此项进行对MMC/SD/SDIO的支持

f. 去掉Ethernet (1000 Mbit)和Ethernet (10000 Mbit)
也可不去,为了压缩内核大小,我去掉了这两项。

10.  保存配置并退出xconfig,生成zImage文件

#make zImage

OK,将生成的zImage文件烧到开发板上就可以了,只是现在这个内核还不能支持yaffs文件系统,待以后完善。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86665/showart_1831744.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP