2019独角兽企业重金招聘Python工程师标准>>>
主要还是参考tekkaman的文章http://blog.chinaunix.net/u1/34474/showart.php?id=369449自己修改了网卡移植这一部分。交叉编译器用的是arm-linux-3.4.1版本。
一、将Linux2.6.22.6内核源码放到工作目录的kernel文件夹下,并解压。
#tar xzvf linux2.6.22.6.tar.gz
#pwd
/home/work/hzh1024n
# cd linux2.6.22.6
进入内核解压后的目录,以后示例中,只要是相对路径全部是相对于
/home/work/hzh1024n/linux2.6.22.6/此目录
二、修改内核源码根目录下的Makefile文件(CROSS_COMPILE =的值因个人情况而定,其他可以照做。)
#vi Makefile
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
ARCH = arm
CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-
三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。
......
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "U-Boot-1.2.0",
.size = SZ_128K,
.offset = 0,
},
[1] = {
.name = "U-Boot-1.2.0 Parameter",
.offset = SZ_128K,
.size = SZ_64K,
},
[2] = {
.name = "Linux2.6.22.2 Kernel",
.offset = SZ_128K+SZ_64K,
.size = SZ_4M+(SZ_1M-SZ_128K-SZ_64K),
},
[3] = {
.name = "Root-JFFS2",
.offset = SZ_1M * 5,
.size = SZ_1M * 5,
},
[4] = {
.name = "Boot-Root(cramfs)",
.offset = SZ_1M * 10,
.size = SZ_1M * 10,
},
[5] = {
.name = "YAFFS",
.offset = SZ_1M * 20,
.size = SZ_1M * 44,
}
/*,
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
*/
};
......
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = ,
.twrph0 = 30,
.twrph1 = ,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
......
四、 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以,我在这里选择禁止内核ECC校验。
(不过我不了解内核中的ECC码生成原理,在查资料的过程中我看到了《成功移植最新的2.6.22.3的linux kernel到S3C2410上》,链接是http://www.cnitblog.com/zouzheng/archive/2007/08/28/32545.html和http://hi.baidu.com/wangy0919/blog/item/0058652ae8c3133b5343c1cf.html,都是转载的,但都没找到原作者是谁。其中有这样一段活:
“第三步:修改ECC校验:
根据kernel官方网站上的说明,从2.6.22.3已经修改了ECC校验的问题(这也是我移植2.6.22.3的一个重要原因)。但实验下来发现,不管是用软件ECC还是硬件ECC都不行。只好改成NAND_ECC_NONE:
在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,将其中的
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE; ”
搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT为NAND_ECC_NONE
五、增加Yaffs2文件系统的支持
对于YAFFS文件系统,我在移植时查阅了许多资料。有的博客上说没有必要移植YAFFS2,因为它是为每页大于1024B的NAND Flash设计的。即使移植了YAFFS2,如果你的NAND Flash是每页512+16B的那系统也会自动挂载YAFFS。所以在这里要移植YAFFS2或是YAFFS 随你的便。我移植的是YAFFS2。
1、下载Yaffs2
URL:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
#cd yaffs2
#./patch-ker.sh c /home/work/hzh1024n/linux-2.6.22.6/
六、配置内核
在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。
#pwd
/home/work/hzh1024n/linux-2.6.22.6
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
以下是在 s3c2410_defconfig 基础上要配置的选项(有一些必须的选项在s3c2410_defconfig里已经选上了,所以我没有写出来。以下的选项非特别说明,可能不用选,我没有做实验证明哪些要、哪些不要,所以有兴趣的可以自己做实验看看,欢迎发E-Mail告诉我结果。谢谢)
General setup --->
[*] Configure standard kernel features (for small systems) --->
选上这项,否则文件系统中的一些选项不会出现
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410 留下这项就够了,其他全部“N”掉
“N”掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 里的所有选项,都是和2410无关的选项。
Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成 (noinitrd root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200 init=/linuxrc mem=64M) Default kernel command string
#说明:
#mtdblock3代表第4个flash分区,用来作根文件系统rootfs;
# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口上,波特率为115200;
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0等
# mem=64M表示内存是64M,如果是32则设为32M
在实践中,我发现“rootfstype=jffs2”这句还是挺重要的。如果没有这句,系统启动时即使分区挂载正确了,但是文件系统的类型有可能出错。在这里定义过,就不会出错了。这里的选项也和根文件系统的配置有关。(我先使用jffs2做跟文件系统,以后再换YAFFS)
Userspace binary formats --->
< > Kernel support for a.out and ECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,在ARM-Linux下一般都用ELF,所以这两种基本用不上。)
Networking --->
Networking options --->
<*> Packet socket
[*] Packet socket: mmapped IO
-我移植华硕无限网卡,所以我选了WLAN(802.11)的选项,不需的可以不选-
Wireless --->
--- Improved wireless configuration API
--- Wireless extensions
<*> Generic IEEE 802.11 Networking Stack (mac80211)
[*] Enable LED triggers
[ ] Enable debugging output (NEW)
<*> Generic IEEE 802.11 Networking Stack
[ ] Enable full debugging output (NEW)
--- IEEE 802.11 WEP encryption (802.1x)
< > IEEE 802.11i CCMP support (NEW)
< > IEEE 802.11i TKIP encryption (NEW)
<*> Software MAC add-on to the IEEE 802.11 networking stack
[ ] Enable full debugging output (NEW)
Device Drivers --->
“N”掉 Parallel port support ---> 里的所有选项。
Plug and Play support --->里的所有选项一定要“N”掉,不然编译会出错!!!!!!!!
Network device support --->
Ethernet (10 or 100Mbit) --->
选上<*> DM9000 support和< > Generic Media Independent Interface device support
-------——————————————————------
我用的是DM9000A网卡,网卡驱动移植后面介绍
-----------------------------
“N”掉 [ ] Ethernet (1000 Mbit) --->和 [ ] Ethernet (10000 Mbit) --->
Wireless LAN --->
[*] Wireless LAN (pre-802.11)
[*] Wireless LAN (IEEE 802.11)
USB Network Adapters --->
<*> Multi-purpose USB Networking Framework
<*> MMC/SD card support --->
Real Time Clock --->
“N”掉 [ ] Set system time from RTC on startup and resume
#接下来做的是针对文件系统的设置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(注意:不要试图按照旧内核的方法增加 devfs 的支持,因为在这个内核里已经彻底删除了
devfs的源代码。我曾试图将旧内核的devfs源代码复制过来,不过编译会出错!
补救的办法就是用BusyBox的mdev来代替,在讲根文件系统的建立时我会说明,你也可以到网上找mdev的资料。)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
File systems -->
< > Second extended fs support #去除对ext2的支持
< > Ext3 journalling file system support #去除对ext3的支持
<*> Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Filesystem in Userspace support
Pseudo filesystems -->
[*] Virtual memory file system support (former shm fs)
<*> Userspace-driven configuration filesystem (EXPERIMENTAL)
Miscellaneous filesystems -->
<*> YAFFS2 file system support
“N”掉[ ]Autoselect yaffs2 format 和
[ ]Cache short names in RAM ,因为这是给每页大于1024B的NAND Flash设计的
<*> Journalling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] JFFS2 summary support (EXPERIMENTAL)
[ ] JFFS2 XATTR support (EXPERIMENTAL)
[*] Advanced compression options for JFFS2
[*] JFFS2 ZLIB compression support
[*] JFFS2 RTIME compression support
[*] JFFS2 RUBIN compression support
JFFS2 default compression mode (priority) --->
Network File Systems -->
<*> NFS file system support
--以下最好选上,因为在挂载NFS时可能出现protocol不支持的情况--
[*]Provide NFSv3 client support
[*]Provide client support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 client support (EXPERIMENTAL)
[*] Allow direct I/O on NFS files
-------------------------------------------------------------------------
<*> NFS server support
[*] Provide NFSv3 server support
[*]Provide server support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 server support (EXPERIMENTAL)
--- Provide NFS server over TCP support
[*] Root file system on NFS
保存退出,产生.config文件。
七、编译内核
#make zImage
正常来说编译是不会出错的,只有一些警告。
八、移植到s3c2440
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks( 12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}