Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567912
  • 博文数量: 63
  • 博客积分: 533
  • 博客等级: 中士
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 17:56
文章分类

全部博文(63)

文章存档

2016年(1)

2014年(23)

2013年(17)

2012年(22)

分类: LINUX

2012-09-24 18:04:13

修改根目录下的Makefile文件

命令:gedit Makefile大概193行和194行

修改:

ARCH=arm

CROSS_COMPILE=arm-linux-

原因:指明体系结构为arm,采用的交叉编译器为arm-linux-,这一步一定要改完再执行make menuconfig,否则,用的是x86的make,打开的配置单不是arm的。


修改平台输入时钟

命令:gedit arch/arm/mach-s3c2440/mach-smdk2440.c 162行或163行

修改:static void _initsmdk2440_map_io()函数中的s3c24xx_init_clocks(16924400改为)s3c24xx_init_clocks(12000000)

原因:tq2440使用12MHz外部时钟输入


修改机器码

命令:gedit arch/arm/tools/mach-types 379行

修改:s3c2440一行最后的数字改为168

原因:在内核文件arch/arm/mach-s3c2440/mach-smdk2440.c中的 MACHINE_START(S3C2440,”SMDK2440”)中要使用该机器码,同时它还应该与uboot中的机器码一致


制作配置单

命令:make menuconfig

原因:一开始内核不存在.config文件,无法进行编译,只有用户按自己需求配置好内核并保存配置单为.config后,才可编译。

下面分别描述内核加入的配置。

首先加载内核提供的默认配置单,以减少内核配置的工作量。在弹出的配置界面中,选择Load an Alternate Configuration File,加载默认配置arch/arm/configs/s3c2410_defconfig

该配置单按照arm体系结构添加了一些配置,但有一些是我们不需要的或者是需要修改的,在此基础上进行进一步的配置。


General setup,该配置单下包括了内核的一些基本设置,配置时加入的功能有

System V IPC:支持system V的进程间通信对象;

Classic RCU:经典RCU(read-copy-update)支持,这是一种高级互斥机制;

(17) Kernel log buffer size (16 => 64KB, 17 => 128KB):内核日志缓冲区大小为128kb;

Optimize for size:内核大小优化,在编译时采用-O2;

Choose SLAB allocator (SLUB (Unqueued Allocator)):采用高速缓存管理(slab分配器)的高级版本SLUB;


Enable loadable module support,该配置单设置是否使用模块加载,在本配置单下选择:

Module unloading:模块可卸载,使得模块可以随时卸载和添加,当然一些不允许卸载的模块除外。


Enable the block layer,这个选项不选,因为设备中没有块设备,不需要使用块设备层,NAND flash直接通过IO口和几个控制引脚控制,也不需要块设备层。

System Type:该项是一些与平台相关的选项,选择以下几项:

ARM system type (Samsung S3C2410, S3C2412, S3C2413, S3C2440,S3C2443):选择所支持的ARM类型,这里针对开发板选择支持三星S3C2410, S3C2412, S3C2413, S3C2440,S3C2443。

ADC common driver support:与ADC与触摸屏驱动有关,选上;

Force UART FIFO on during boot process:在内核解压时保持串口打开,可用于检测内核解压的情况;

(0) S3C UART to use for low-level messages:选择输出底层信息的串口,根据开发板情况,选择0号串口;

(0) Space between gpio banks:设置GPIO bank之间的空间,用于防止访问越界,选择后会占用一部分存储空间,这个设置为0,注意编写程序,一般不会越界,可以节省存储空间;

S3C2440 Machines

SMDK2440

SMDK2440 with S3C2440 CPU module

选择S3C2440 Machines下的这两项,使得内核支持SMDK2440,SMDK2440是三星公司的官方设计参考,一般都采用这种参考。


Bus support:该选项选择总线类型,这个不选,没有合适的。


Kernel Features:该选项设置内和特性,选择以下几项:

Memory split (3G/1G user/kernel split):内存分配,一般保持该默认配置,即1G给内核空间,3G给用户空间;

Use the ARM EABI to compile the kernel:采用EABI技术编译内核,由于我们的交叉编译器支持EABI,选择该项;

(4096) Low address space to protect from user allocation:设置低端内存大小,按默认。

Boot options:引导时的相关选项,保持默认。


CPU Power Management:CPU电源管理,保持默认。


Floating point emulation:浮点仿真,保持默认。


Userspace binary formats:用户空间二进制模式,这里选择

Kernel support for ELF binaries,即采用ELF格式,ELF是可执行连接格式,是UNIX系统实验室作为应用程序二进制接口而开发和发布的。


Power management options:电源管理选项,这里不选,我们的设备要保持长时间工作,无需睡眠。


Networking support:网络设置,选择配置如下:

Networking options->

Unix domain sockets:使用UNIX套接字;

TCP/IP networking:TCP/IP网络;

IP: kernel level autoconfiguration:内核自动配置IP;

IP: DHCP support :允许本机根文件系统通过NFS(网络文件系统)挂载到其他计算机上,实现远端访问。

Wireless:无线设置,暂时保持默认,以后修改。


Device Drivers:设备驱动,保持默认,做驱动时会进行修改。

File systems:文件系统配置,选择内容如下:

DOS/FAT/NT Filesystems->

VFAT (Windows-95) fs suppor:支持挂载windows的文件系统;

(437) Default codepage for FAT:设置FAT文件系统允许代码页大小;

(iso8859-1) Default iocharset for FAT:设置FAT文件系统采用的字符类型。

Pseudo filesystems->

Virtual memory file system support (former shm fs):采用虚拟内存文件系统(Tmpfs);

Userspace-driven configuration filesystem:使用configfs,该文件系统与sysfs功能相反。

Miscellaneous filesystems:这个先不做选择,制作yaffs2文件系统后再处理。

Network File Systems->

NFS client support->

NFS client support for NFS version 3:使用第三版NFS;

Root file system on NFS:允许通过NFS挂载根文件系统。

Partition Types:划分类型,这里不选择。

Native language support->

(iso8859-1) Default NLS Option;

Codepage 437 (United States, Canada)

Simplified Chinese charset (CP936, GB2312)

NLS ISO 8859-1 (Latin 1; Western European Languages)

NLS UTF-8

给出了支持的语言及字符集类型


Kernel hacking:该项大部分是便于内核开发使用的,选择以下几项:

(1024)Warn for stack frames larger than (needs gcc 4.4):设置堆栈报警极限大小;

S3C UART to use for low-level debug:底层是用的UART端口号。


Security options:不做配置。


Cryptographic API:一些加密和校验码的设置,选择如下:

Cryptographic algorithm manager:启用加密技术必须选择这项;

ECB support:ECB支持;

CRC32c CRC algorithm:启用CRC32c算法;

AES cipher algorithms:启用AES加密算法;

ARC4 cipher algorithm:启用ARC4加密算法;

Hardware crypto devices:启用硬件加密设备;


Library routines:一些库函数选择,选择如下:

CRC ITU-T V.41 functions

CRC32 functions

CRC7 functions

这样,整个配置过程结束,选择Save an Alternate Configuration File,保存为.config即可。现在在根目录下使用make zImage即可编译出内核镜像,但为了方便,作些改动。在根目录下使用命令gedit arch/arm/boot/Makefile,进入该目录下的Makefile文件,在58行,

修改如下

$(obj)/zImage: $(obj)/compressed/vmlinux FORCE

$(call if_changed,objcopy)

@cp -f arch/arm/boot/zImage zImage.bin

@echo ' Kernel: $@ is ready'

这个指令就是将arch/arm/boot/目录下的zImage文件复制到根目录下,并重命名为zImage.bin,因为直接使用make zImage命令后zImage默认在arch/arm/boot/目录下,为了方便操作,加入该命令可将镜像复制到根目录下。

然后,修改根目录下的Makefile文件 , 在1255行如下:

distclean: mrproper

@find $(srctree) $(RCS_FIND_IGNORE) \

\( -name '*.orig' -o -name '*.rej' -o -name '*~' \

-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \

-o -name '.*.rej' -o -size 0 \

-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \

-type f -print | xargs rm –f rm -f zImage.bin

该命令是为执行make distclean清除文件时添加了一条清除任务,即将复制到根目录下的zImage.bin也清除掉。

最后,执行make zImage,编译出内核镜像。由于此时未驱动NAND flash,也没有加载文件系统,烧写进开发板以后会显示未挂载文件系统,这进一步说明是正确的。

下面对NAND flash进行分区和进行相应的配置。

首先为内核支持NAND flash添加新的配置选项:

Device Drivers->

Memory Technology Device (MTD) support->启用MTD支持,这是使用NAND flash的前提,也是使用JAFFS2文件系统的前提

MTD partitioning support:我们要对NAND flash进行分区,选中这一项;

Direct char device access to MTD devices:允许字符设备访问MTD设备;

Common interface to block layer for MTD 'translation layers':块设备层向MTD传输层接口,该项默认必须选上。

Caching block device access to MTD devices:允许缓存块设备访问MTD设备,JAFFS2为文件系统服务。

NAND Device Support->

NAND Flash support for S3C2410/S3C2440 SoC 使内核支持S3C2440 NAND flash

S3C2410 NAND Hardware ECC 采用S3C2410的硬件ECC

设置完毕,退出保存配置单。


命令:gedit arch/arm/plat-s3c24xx/common-smdk.c +109

修改内容如下:

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Rojian2440_Boot",
.size = 0x00040000,
.offset = 0x00000000,
},
[1] = {
.name = "Rojian2440_Param",
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Rojian2440_Kernel",
.offset = 0x00200000,
.size = 0x00300000,
},
[3] = {
.name = "Rojian2440_Yaffs2",
.offset = 0x00500000,
.size = MTDPART_SIZ_FULL,

}
};

然后,修改同文件的下面的代码

static struct s3c2410_platform_nand smdk_nand_info = {

.tacls = 10,

.twrph0 = 25,

.twrph1 = 10,

.nr_sets = ARRAY_SIZE(smdk_nand_sets),

.sets = smdk_nand_sets,

};

其中修改的值的确定,由NAND flash芯片手册查询相关数据,经计算得到,如下(其中HCLK=100Hz):

tacls>CLE或ALE建立时间最小值*HCLK

twrph0>nWE或nRE的持续时间最小值*HCLK-1

twrph1>写数据起作用时间*HCLK-1


最后,修改drivers/mtd/nand/s3c2410.c 669行中s3c2410_nand_init_chip函数的语句

chip->ecc.mode = NAND_ECC_NONE

这里不采用NAND flash的软件ECC校验码,因为在初始化的时候,uboot中有校验码,然后在后面yaffs2文件系统移植的时候,要选上采用S3C2440硬件校验码。

串口驱动移植

修改内核源码arch/arm/mach-s3c2440/mach-smdk2440.c 文件的第99行:

·ulcon = 0x03,

然后修改drivers/serial/samsung.c 第53行

if(port->line == 2)

{

s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);

s3c2410_gpio_pullup(S3C2410_GPH6, 1);

s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH7_RXD2);

s3c2410_gpio_pullup(S3C2410_GPH7, 1);

}

然后在修改.dev_name = "tq2440_serial",

修改了设备名。

添加配置单内容如下:

DM9000EP网卡驱动移植:

gedit arch/arm/mach-s3c2440/mach-smdk2440.c 添加头文件

#include

//如下代码置于platform_device _initdata *smdk_devs[] 数组前

static struct resource s3c_dm9k_resource[] = {

[0] = {

.start = S3C2410_CS4,

.end = S3C2410_CS4+3,

.flags = IORESOURCE_MEM,

},

[1] = {

.start = S3C2410_CS4+4,

.end = S3C2410_CS4+4+3,

.flags = IORESOURCE_MEM,

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ |IRQF_TRIGGER_RISING,

}

};

static struct dm9000_plat_data s3c_device_dm9k_platdata = {

.flags= DM9000_PLATF_16BITONLY

};

struct platform_device s3c_device_dm9000 = {

.name= "dm9000",

.id= 0,

.num_resources= ARRAY_SIZE(s3c_dm9k_resource),

.resource= s3c_dm9k_resource,

.dev= {

.platform_data = &s3c_device_dm9k_platdata,

}

};

static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_dm9000,
};

修改 gedit drivers/net/dm9000.c 在头文件处添加如下红色的代码

#include "dm9000.h"
#if defined(CONFIG_ARCH_S3C2410)
#include
#endif

修改static int __devinit dm9000_probe(struct platform_device *pdev)函数如下所示,

该函数大概位置1276行,需要修改的大概位置为1460行

db->mii.reg_num_mask = 0x1f;
db->mii.force_media = 0;
db->mii.full_duplex = 0;
db->mii.dev = ndev;
db->mii.mdio_read = dm9000_phy_read;
db->mii.mdio_write = dm9000_phy_write;
#if defined(CONFIG_ARCH_S3C2410)
printk("Now use the default MAC address: 10:23:45:67:89:ab\n");
mac_src = "tq2440";

ndev->dev_addr[0] = 0x10;
ndev->dev_addr[1] = 0x23;
ndev->dev_addr[2] = 0x45;
ndev->dev_addr[3] = 0x67;
ndev->dev_addr[4] = 0x89;
ndev->dev_addr[5] = 0xab;
#else
mac_src = "eeprom";
/* try reading the node address from the attached EEPROM */
for (i = 0; i < 6; i += 2)
dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
mac_src = "chip";
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

}

if (!is_valid_ether_addr(ndev->dev_addr))
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);

#endif(此处不能设置颜色,不知道怎么回事,这句是要添加的,对应上面的借束语句)

修改dm9000_init(void)函数如下所示,大概位置1590行

static int __init dm9000_init(void)

{
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif

printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);

return platform_driver_register(&dm9000_driver);
}

编译选项Device Drivers --->Network device support ---> Ethernet (10 or 100Mbit) --->,

<*>DM9000 Surport,

编写如下测试文件

#vi net_set

ifconfig eth0 hw ether 10:23:45:67:89:ab
#ifconfig eth0 板子的ip地址 netmask 子网掩码 up
ifconfig eth0 172.18.25.15 netmask 255.255.255.0 up
#route add default gw 网关

route add default gw 172.18.25.254
#如下显示的是调试信息,可以不要

echo ifconfig eth0 hw ether 10:23:45:67:89:ab >/dev/console
echo ifconfig eth0 172.18.25.15 netmask255.255.255.0 up >/dev/console
echo route add default gw 172.18.25.254 >/dev/console

存放改文件到

/etc/init.d/net_set

#chmod +x net_set

运行之,即可以看到如下信息

eth0: link up, 100Mbps, full-duplex, lpa 0x45E1,

继续测试,输入ping命令,拼局域网的一个主机172.18.25.9

#ping 172.18.25.9

PING 172.18.25.9 (172.18.25.9): 56 data bytes
64 bytes from 172.18.25.9: seq=0 ttl=64 time=2.128 ms
64 bytes from 172.18.25.9: seq=1 ttl=64 time=0.934 ms
64 bytes from 172.18.25.9: seq=2 ttl=64 time=0.939 ms
64 bytes from 172.18.25.9: seq=3 ttl=64 time=0.937 ms
64 bytes from 172.18.25.9: seq=4 ttl=64 time=0.867 ms
64 bytes from 172.18.25.9: seq=5 ttl=64 time=0.938 ms
64 bytes from 172.18.25.9: seq=6 ttl=64 time=0.942 ms

..............

说明移植成功

实现自启动net_set

修改inittab可以实现该功能

#vi /etc/inittab

在其中添加如下代码

::sysinit:/etc/init.d/net_set

阅读(5299) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~