Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1207871
  • 博文数量: 322
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3276
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-17 09:21
文章分类

全部博文(322)

文章存档

2010年(155)

2009年(167)

我的朋友

分类: 嵌入式

2010-04-15 11:16:39

文件: cs8900(linux-2.6.14).zip
大小: 8KB
下载: 下载
由于要学习《Linux设备驱动开发详解》,找了一个和书中相近的内核版本linux-2.6.15.4进行移植。

修改Makefile
注释掉以下内容:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
增加如下内容:
ARCH  ?= arm
CROSS_COMPILE ?= /work/cross/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-

修改arch\arm\mach-s3c2410\devs.c文件

增加头文件定义
/***********add here***********/
#include

#include

#include

/**************end add********/

增加nand flash分区信息

/*****************************add here***************************/
static int chip0_map[] = { 0 };

struct mtd_partition s3c_nand_part[] = {
 [0] = {
     .name   = "Boot Agent",
     .size = SZ_256K,
     .offset    = 0,
 },
 [1] = {
     .name   = "Linux Kernel",
     .offset = SZ_256K,
     .size = SZ_2M - SZ_256K,
 },
 [2] = {
     .name   = "File System",
     .offset = SZ_2M,
     .size = SZ_32M - SZ_2M,
 },
 [3] = {
     .name   = "Other",
     .offset    = SZ_32M,
     .size = SZ_32M,
 }
};

static struct s3c2410_nand_set s3c_nand_sets[] = {
[0] = {
.name = "chip0",
.nr_chips = 1,
.nr_map = chip0_map,
.nr_partitions = ARRAY_SIZE(s3c_nand_part),
.partitions = s3c_nand_part
}
};

static struct s3c2410_platform_nand s3c_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(s3c_nand_sets),
.sets = s3c_nand_sets,
};

/********************************end add****************************/

添加下面红色部分

struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
/***********add here****************/
.dev = {
.platform_data = &s3c_nand_info
}
/**************end here************/

};

可以交叉编译内核了
make mrproper //清楚所有config信息
make clean //清楚中间代码
make smdk2410_defconfig //使用默认2410配置
make menuconfig //配置
make


内核配置选择:

配置部分可以参考:Linux2.6.14.1内核移植手记 
arm@localhost linux2.6.14]$
cp arch/arm/configs/smdk2410_defconfig .config
[arm@localhost linux2.6.14]$
make menuconfig
在smdk2410_defconfig基础上,我所增删的内核配置项如下:
Loadable module support >
[*] Enable loadable module support
[*] Automatic kernel module loading
System Type >
[*] S3C2410 DMA support
Boot options >
Default kernel command string:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
#说明:mtdblock2代表我的第3个flash分区,它是我的rootfs
# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上.
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0等
Floating point emulation >
[*] NWFPE math emulation
This is necessary to run most binaries!!!
#接下来要做的是对内核MTD子系统的设置
Device Drivers >
Memory Technology Devices (MTD) >
[*] MTD partitioning support
#支持MTD分区,这样我们在前面设置的分区才有意义
[*] Command line partition table parsing
#支持从命令行设置flash分区信息,灵活
RAM/ROM/Flash chip drivers >
<*> Detect flash chips by Common Flash
Interface (CFI) probe
<*> Detect nonCFI
AMD/JEDECcompatible
flash chips
<*> Support for Intel/Sharp flash chips
<*> Support for AMD/Fujitsu flash chips
<*> Support for ROM chips in bus mapping
NAND Flash Device Drivers >
<*> NAND Device Support
<*> NAND Flash support for S3C2410/S3C2440 SoC
Character devices >
[*] Nonstandard
serial port support
[*] S3C2410 RTC Driver
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是cramfs,故做如下配置
File systems >
<> Second extended fs support #去除对ext2的支持
Pseudo filesystems >
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
[*] /dev file system support (OBSOLETE)
[*] Automatically mount at boot (NEW)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
<*> NFS file system support
保存退出,产生.config文件.
.config文件能从提供的2.6.15.4的内核包中找到,文件名为config.back.

我在网上找了很久才找到CS8900的原码,现在把它上传,见附件,方便大家使用。我在实验板上试过,CS8900在linux-2.6.15上的移植,很简单,按下面的方法,如果硬件没问题的话,很容易就成功。

1. 拷贝文件cs8900.c cs8900.h到 linux-2.6.15.4/drivers/net/

进入目录cs8900
cp cs8900.c ../linux-2.6.15.4/drivers/net/
cp cs8900.h ../linux-2.6.15.4/drivers/net/

把cs8900.c中#include "asm/arch/smdk2410.h"改为#include "asm/arch/regs-cs8900.h"

2. 修改Kconfig

vi ../linux-2.6.15.4/drivers/net/Kconfig
找到
config NET_ETHERNET
        bool "Ethernet (10 or 100Mbit)"

加入以下内容
config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help

3. 修改Makefile文件

vi ../linux-2.6.15.4/drivers/net/Makefile

找到 obj-$(CONFIG_CS89x0) += cs89x0.o
加入以下内容
obj-$(CONFIG_ARM_CS8900) +=cs8900.o

4.加入cs8900在内存中的位置

   在 linux-2.6.15.4/include/asm-arm/arch-s3c2410 中创建regs-cs8900.h ,其内容如下

#ifndef _INCLUDE_REGS_CS8900_H

#define _INCLUDE_REGS_CS8900_H

#include

#define pSMDK2410_ETH_IO 0x19000000
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ IRQ_EINT9

#endif // _INCLUDE_REGS_CS8900_H

   pSMDK2410_ETH_IO 的具体地址要参考你的实验板,我的试验板是由nGCS3和A24口组合控制芯片的IO读写或内存读写,在我的开发板上是IO读写。虚拟地址参考了系统板自 带内核中设定的地址,没有改动。看网上有人说虚拟地址可以随便设只要不冲突就行,具体是否可行,没有试过,如果有人试过,告述我一声,大家一块学习。呵 呵...中断源也要看你的试验板连了哪跟中断口。

5 加入cs8900虚拟地址到物理地址的转换
  vi linux-2.6.14.1/arch/arm/mach-s3c2410/mach-smdk2410.c

加入头文件
#include

加入地址转换信息, 找到smdk2410_iodesc[]结构数组,加入

{vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE},


6 编译内核选择:
Device Drivers --->
Network device support --->
Ethernet (10 or 100Mbit) --->
[*] CS8900 support


到这里,cs8900的移植就完工了。

linux_cmd_line 配置为 console=ttySAC0,115200 men=64M init=/linuxrc root=/dev/nfs nfsroot=192.168.2.2:/work/nfs/rootfsln ip=192.168.2.3:192.168.2.2:192.168.2.255:255.255.255.0:DaiQ:eth0:off

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